X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-model-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fmodel%2Frepo%2Futil%2FInMemorySchemaSourceCache.java;h=141cdb52bbe0c8a02806d1073d8aef6d099f090c;hb=6b5d20f6513bc3e6e5db4a2058ee81308edaa9c8;hp=ac820d28d70dc788d38e06d8d9b0be7c87541793;hpb=df568194d106efa63c3138f0cc699dd53735cf44;p=yangtools.git diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/InMemorySchemaSourceCache.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/InMemorySchemaSourceCache.java index ac820d28d7..141cdb52bb 100644 --- a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/InMemorySchemaSourceCache.java +++ b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/InMemorySchemaSourceCache.java @@ -1,19 +1,23 @@ /* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.yangtools.yang.model.repo.util; -import com.google.common.base.Preconditions; +import com.google.common.annotations.Beta; +import com.google.common.base.FinalizablePhantomReference; +import com.google.common.base.FinalizableReferenceQueue; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import com.google.common.cache.RemovalListener; -import com.google.common.cache.RemovalNotification; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.Futures; - +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; import org.opendaylight.yangtools.yang.model.repo.api.MissingSchemaSourceException; import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException; import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceRepresentation; @@ -22,47 +26,64 @@ import org.opendaylight.yangtools.yang.model.repo.spi.PotentialSchemaSource.Cost import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistration; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceRegistry; -public class InMemorySchemaSourceCache extends AbstractSchemaSourceCache { - private static final class CacheEntry { - private final SchemaSourceRegistration reg; - private final T source; +@Beta +public class InMemorySchemaSourceCache extends AbstractSchemaSourceCache implements AutoCloseable { + private final List> regs = Collections.synchronizedList(new ArrayList<>()); + private final FinalizableReferenceQueue queue = new FinalizableReferenceQueue(); + private final Cache cache; - public CacheEntry(final T source, final SchemaSourceRegistration reg) { - this.source = Preconditions.checkNotNull(source); - this.reg = Preconditions.checkNotNull(reg); - } + protected InMemorySchemaSourceCache(final SchemaSourceRegistry consumer, final Class representation, final CacheBuilder builder) { + super(consumer, representation, Costs.IMMEDIATE); + cache = builder.build(); } - private static final RemovalListener> LISTENER = new RemovalListener>() { - @Override - public void onRemoval(final RemovalNotification> notification) { - notification.getValue().reg.close(); - } - }; - - private final Cache> cache; + public static InMemorySchemaSourceCache createSoftCache(final SchemaSourceRegistry consumer, final Class representation) { + return new InMemorySchemaSourceCache<>(consumer, representation, CacheBuilder.newBuilder().softValues()); + } - protected InMemorySchemaSourceCache(final SchemaSourceRegistry consumer, final Class representation, final int maxSize) { - super(consumer, representation, Costs.IMMEDIATE); - cache = CacheBuilder.newBuilder().softValues().maximumSize(maxSize).removalListener(LISTENER).build(); + public static InMemorySchemaSourceCache createSoftCache( + final SchemaSourceRegistry consumer, final Class representation, final long lifetime, final TimeUnit units) { + return new InMemorySchemaSourceCache<>(consumer, representation, CacheBuilder.newBuilder().softValues() + .expireAfterAccess(lifetime, units)); } @Override public CheckedFuture getSource(final SourceIdentifier sourceIdentifier) { - final CacheEntry present = cache.getIfPresent(sourceIdentifier); + final T present = cache.getIfPresent(sourceIdentifier); if (present != null) { - return Futures.immediateCheckedFuture(present.source); + return Futures.immediateCheckedFuture(present); } - return Futures.immediateFailedCheckedFuture(new MissingSchemaSourceException("Source not found")); + return Futures.immediateFailedCheckedFuture(new MissingSchemaSourceException("Source not found", sourceIdentifier)); } @Override protected void offer(final T source) { - final CacheEntry present = cache.getIfPresent(source.getIdentifier()); + final T present = cache.getIfPresent(source.getIdentifier()); if (present == null) { + cache.put(source.getIdentifier(), source); + final SchemaSourceRegistration reg = register(source.getIdentifier()); - cache.put(source.getIdentifier(), new CacheEntry(source, reg)); + final FinalizablePhantomReference ref = new FinalizablePhantomReference(source, queue) { + @Override + public void finalizeReferent() { + reg.close(); + regs.remove(this); + } + }; + + regs.add(ref); } } + + @Override + public void close() { + while (!regs.isEmpty()) { + final FinalizablePhantomReference ref = regs.get(0); + ref.finalizeReferent(); + } + + cache.invalidateAll(); + queue.close(); + } }