From 0803bc02293d0121ed58635529ed96b41ae7d828 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 23 Jun 2019 23:54:34 +0200 Subject: [PATCH] Migrate ModuleInfo cache to BindingReflections Reflections are using a cache already, so adding another one does not really hurt. This allows code reuse between our test suite and downstreams. JIRA: MDSAL-418 Change-Id: Id4474a0754f33b880afaff333279969f947df494 Signed-off-by: Robert Varga --- .../adapter/test/AbstractSchemaAwareTest.java | 9 +---- .../spec/reflect/BindingReflections.java | 38 +++++++++++++++++-- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java index 1c558b33b7..8d01ed15c2 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java @@ -19,13 +19,6 @@ import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.opendaylight.yangtools.yang.model.api.SchemaContext; public abstract class AbstractSchemaAwareTest { - private static final LoadingCache> MODULE_INFO_CACHE = CacheBuilder.newBuilder() - .weakKeys().weakValues().build(new CacheLoader>() { - @Override - public Set load(final ClassLoader key) { - return BindingReflections.loadModuleInfos(key); - } - }); private static final LoadingCache, SchemaContext> SCHEMA_CONTEXT_CACHE = CacheBuilder.newBuilder().weakValues().build(new CacheLoader, SchemaContext>() { @Override @@ -42,7 +35,7 @@ public abstract class AbstractSchemaAwareTest { } protected Set getModuleInfos() throws Exception { - return MODULE_INFO_CACHE.getUnchecked(Thread.currentThread().getContextClassLoader()); + return BindingReflections.cacheModuleInfos(Thread.currentThread().getContextClassLoader()); } protected SchemaContext getSchemaContext() throws Exception { diff --git a/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java index 5875f17b91..ed9070f278 100644 --- a/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java +++ b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Optional; import java.util.ServiceLoader; import java.util.Set; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -68,6 +69,15 @@ public final class BindingReflections { .expireAfterAccess(EXPIRATION_TIME, TimeUnit.SECONDS) .build(new ClassToQNameLoader()); + private static final LoadingCache> MODULE_INFO_CACHE = + CacheBuilder.newBuilder().weakKeys().weakValues().build( + new CacheLoader>() { + @Override + public ImmutableSet load(final ClassLoader key) { + return loadModuleInfos(key); + } + }); + private BindingReflections() { throw new UnsupportedOperationException("Utility class."); } @@ -331,9 +341,10 @@ public final class BindingReflections { * When {@link YangModuleInfo} is available, all dependencies are recursively collected into returning set by * collecting results of {@link YangModuleInfo#getImportedModules()}. * - * @param loader - * Classloader for which {@link YangModuleInfo} should be - * retrieved. + *

+ * Consider using {@link #cacheModuleInfos(ClassLoader)} if the classloader is known to be immutable. + * + * @param loader Classloader for which {@link YangModuleInfo} should be retrieved. * @return Set of {@link YangModuleInfo} available for supplied classloader. */ public static ImmutableSet loadModuleInfos(final ClassLoader loader) { @@ -348,6 +359,27 @@ public final class BindingReflections { return moduleInfoSet.build(); } + /** + * Loads {@link YangModuleInfo} instances available on supplied {@link ClassLoader}, assuming the set of available + * information does not change. Subsequent accesses may return cached values. + * + *

+ * {@link YangModuleInfo} are discovered using {@link ServiceLoader} for {@link YangModelBindingProvider}. + * {@link YangModelBindingProvider} are simple classes which holds only pointers to actual instance + * {@link YangModuleInfo}. + * + *

+ * When {@link YangModuleInfo} is available, all dependencies are recursively collected into returning set by + * collecting results of {@link YangModuleInfo#getImportedModules()}. + * + * @param loader Class loader for which {@link YangModuleInfo} should be retrieved. + * @return Set of {@link YangModuleInfo} available for supplied classloader. + */ + @Beta + public static ImmutableSet cacheModuleInfos(final ClassLoader loader) throws ExecutionException { + return MODULE_INFO_CACHE.get(loader); + } + private static void collectYangModuleInfo(final YangModuleInfo moduleInfo, final Builder moduleInfoSet) { moduleInfoSet.add(moduleInfo); -- 2.36.6