import static com.google.common.base.Verify.verifyNotNull;
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ImmutableClassToInstanceMap;
+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.impl.BindingCodecContext;
+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.mdsal.dom.api.DOMSchemaServiceExtension;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.util.ListenerRegistry;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.util.ObjectRegistry;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
-public final class MockSchemaService implements DOMSchemaService, EffectiveModelContextProvider, AdapterContext {
- private EffectiveModelContext 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);
+ }
+ });
+
+ private EffectiveModelContext modelContext;
private CurrentAdapterSerializer serializer;
- final ListenerRegistry<EffectiveModelContextListener> listeners = ListenerRegistry.create();
+ final ObjectRegistry<Consumer<EffectiveModelContext>> listeners = ObjectRegistry.createConcurrent("mock schema");
@Override
public synchronized EffectiveModelContext getGlobalContext() {
- return schemaContext;
+ return modelContext;
}
@Override
- public ListenerRegistration<EffectiveModelContextListener> registerSchemaContextListener(
- final EffectiveModelContextListener listener) {
+ public Registration registerSchemaContextListener(final Consumer<EffectiveModelContext> listener) {
return listeners.register(listener);
}
- @Override
- public synchronized EffectiveModelContext getEffectiveModelContext() {
- return schemaContext;
- }
-
- @Override
- public ClassToInstanceMap<DOMSchemaServiceExtension> getExtensions() {
- return ImmutableClassToInstanceMap.of();
- }
-
public synchronized void changeSchema(final BindingRuntimeContext newContext) {
- serializer = new CurrentAdapterSerializer(new BindingCodecContext(newContext));
- schemaContext = newContext.getEffectiveModelContext();
- listeners.streamListeners().forEach(listener -> listener.onModelContextUpdated(schemaContext));
+ serializer = new CurrentAdapterSerializer(CODEC_CACHE.getUnchecked(newContext));
+ modelContext = newContext.modelContext();
+ listeners.streamObjects().forEach(listener -> listener.accept(modelContext));
}
@Override