import static com.google.common.base.Verify.verifyNotNull;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.ImmutableClassToInstanceMap;
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.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.yang.model.api.EffectiveModelContextProvider;
public final class MockSchemaService implements DOMSchemaService, EffectiveModelContextProvider, 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 new BindingCodecContext(key);
+ }
+ });
+
private EffectiveModelContext schemaContext;
private CurrentAdapterSerializer serializer;
}
public synchronized void changeSchema(final BindingRuntimeContext newContext) {
- serializer = new CurrentAdapterSerializer(new BindingCodecContext(newContext));
+ serializer = new CurrentAdapterSerializer(CODEC_CACHE.getUnchecked(newContext));
schemaContext = newContext.getEffectiveModelContext();
listeners.streamListeners().forEach(listener -> listener.onModelContextUpdated(schemaContext));
}