Rename DOMDataTreeChangeService
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / dom / adapter / test / AbstractSchemaAwareTest.java
index 4e061f8fc306bac322f344da5e1ad5b49d5b8c8b..286aa99547a530bbbc9e9f0a45e6962b113a4768 100644 (file)
@@ -7,37 +7,86 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter.test;
 
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
+import java.util.ServiceLoader;
+import java.util.Set;
+import org.eclipse.jdt.annotation.NonNull;
 import org.junit.Before;
-import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
+import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
-import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
-public abstract class AbstractSchemaAwareTest  {
+public abstract class AbstractSchemaAwareTest {
+    private static final LoadingCache<Set<YangModuleInfo>, BindingRuntimeContext> RUNTIME_CONTEXT_CACHE =
+            CacheBuilder.newBuilder().weakValues().build(
+                new CacheLoader<Set<YangModuleInfo>, BindingRuntimeContext>() {
+                    @Override
+                    public BindingRuntimeContext load(final Set<YangModuleInfo> key) {
+                        return BindingRuntimeHelpers.createRuntimeContext(key);
+                    }
+                });
+    private static final LoadingCache<ClassLoader, ImmutableSet<YangModuleInfo>> MODULE_INFO_CACHE =
+        CacheBuilder.newBuilder().weakKeys().weakValues().build(
+            new CacheLoader<ClassLoader, ImmutableSet<YangModuleInfo>>() {
+                @Override
+                public ImmutableSet<YangModuleInfo> load(final ClassLoader key) {
+                    return BindingRuntimeHelpers.loadModuleInfos(key);
+                }
+            });
 
-    private Iterable<YangModuleInfo> moduleInfos;
-    private SchemaContext schemaContext;
 
+    @Before
+    public final void setup() throws Exception {
+        setupWithRuntimeContext(getRuntimeContext());
+    }
+
+    protected Set<YangModuleInfo> getModuleInfos() throws Exception {
+        return cacheModuleInfos(Thread.currentThread().getContextClassLoader());
+    }
 
-    protected Iterable<YangModuleInfo> getModuleInfos() throws Exception {
-        return BindingReflections.loadModuleInfos();
+    protected BindingRuntimeContext getRuntimeContext() throws Exception {
+        return RUNTIME_CONTEXT_CACHE.getUnchecked(getModuleInfos());
     }
 
+    protected EffectiveModelContext modelContext() throws Exception {
+        return getRuntimeContext().modelContext();
+    }
 
-    @Before
-    public final void setup() throws Exception {
-        moduleInfos = getModuleInfos();
-        ModuleInfoBackedContext moduleContext = ModuleInfoBackedContext.create();
-        moduleContext.addModuleInfos(moduleInfos);
-        schemaContext = moduleContext.tryToCreateSchemaContext().get();
-        setupWithSchema(schemaContext);
+    protected void setupWithRuntimeContext(final BindingRuntimeContext runtimeContext) {
+        setupWithSchema(runtimeContext.modelContext());
     }
 
     /**
-     * Setups test with Schema context.
+     * Setups test with EffectiveModelContext.
      *
      * @param context schema context
      */
-    protected abstract void setupWithSchema(SchemaContext context);
+    protected void setupWithSchema(final EffectiveModelContext context) {
+        // No-op
+    }
 
+    /**
+     * Loads {@link YangModuleInfo} instances available on supplied {@link ClassLoader}, assuming the set of available
+     * information does not change. Subsequent accesses may return cached values.
+     *
+     * <p>
+     * {@link YangModuleInfo} are discovered using {@link ServiceLoader} for {@link YangModelBindingProvider}.
+     * {@link YangModelBindingProvider} are simple classes which holds only pointers to actual instance
+     * {@link YangModuleInfo}.
+     *
+     * <p>
+     * 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.
+     */
+    protected static final @NonNull ImmutableSet<YangModuleInfo> cacheModuleInfos(final ClassLoader loader) {
+        return MODULE_INFO_CACHE.getUnchecked(loader);
+    }
 }