*/
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;
- for (ListenerRegistration<? extends SchemaContextListener> listener : listeners.getRegistrations()) {
- listener.getInstance().onGlobalContextUpdated(schemaContext);
- }
+ public synchronized CurrentAdapterSerializer currentSerializer() {
+ return verifyNotNull(serializer);
}
}