Bump yangtools to 13.0.0
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / dom / adapter / test / util / MockSchemaService.java
index a75d987c04fd7b768335c4c385be3dfddd2fc697..313a16eb45faed451e0942d88ae219565c42b58d 100644 (file)
@@ -7,50 +7,59 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter.test.util;
 
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ImmutableClassToInstanceMap;
-import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.mdsal.dom.api.DOMSchemaServiceExtension;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.util.ListenerRegistry;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
-import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
+import static com.google.common.base.Verify.verifyNotNull;
 
-public final class MockSchemaService implements DOMSchemaService, SchemaContextProvider {
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import java.util.ServiceLoader;
+import java.util.function.Consumer;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
+import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecFactory;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
+import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.mdsal.dom.api.DOMSchemaService;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.util.ObjectRegistry;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
-    private SchemaContext schemaContext;
+public final class MockSchemaService implements DOMSchemaService, AdapterContext {
+    // Codec has some amount of non-trivial state, such as generated classes. Its operation should not be affected by
+    // anything except BindingRuntimeContext, hence we should be able to reuse it.
+    private static final LoadingCache<BindingRuntimeContext, BindingDOMCodecServices> CODEC_CACHE =
+        CacheBuilder.newBuilder().weakKeys().weakValues().build(
+            new CacheLoader<BindingRuntimeContext, BindingDOMCodecServices>() {
+                @Override
+                public BindingDOMCodecServices load(final BindingRuntimeContext key) {
+                    return ServiceLoader.load(BindingDOMCodecFactory.class)
+                            .findFirst().orElseThrow().createBindingDOMCodec(key);
+                }
+            });
 
-    final ListenerRegistry<SchemaContextListener> listeners = ListenerRegistry.create();
+    private EffectiveModelContext modelContext;
+    private CurrentAdapterSerializer serializer;
 
-    @Override
-    public synchronized SchemaContext getGlobalContext() {
-        return schemaContext;
-    }
+    final ObjectRegistry<Consumer<EffectiveModelContext>> listeners = ObjectRegistry.createConcurrent("mock schema");
 
     @Override
-    public synchronized SchemaContext getSessionContext() {
-        return schemaContext;
+    public synchronized EffectiveModelContext getGlobalContext() {
+        return modelContext;
     }
 
     @Override
-    public ListenerRegistration<SchemaContextListener> registerSchemaContextListener(
-            final SchemaContextListener listener) {
+    public Registration registerSchemaContextListener(final Consumer<EffectiveModelContext> listener) {
         return listeners.register(listener);
     }
 
-    @Override
-    public synchronized SchemaContext getSchemaContext() {
-        return schemaContext;
+    public synchronized void changeSchema(final BindingRuntimeContext newContext) {
+        serializer = new CurrentAdapterSerializer(CODEC_CACHE.getUnchecked(newContext));
+        modelContext = newContext.modelContext();
+        listeners.streamObjects().forEach(listener -> listener.accept(modelContext));
     }
 
     @Override
-    public ClassToInstanceMap<DOMSchemaServiceExtension> getExtensions() {
-        return ImmutableClassToInstanceMap.of();
-    }
-
-    public synchronized void changeSchema(final SchemaContext newContext) {
-        schemaContext = newContext;
-        listeners.streamListeners().forEach(listener -> listener.onGlobalContextUpdated(schemaContext));
+    public synchronized CurrentAdapterSerializer currentSerializer() {
+        return verifyNotNull(serializer);
     }
 }