From 20142c021b939f7c4386f4d53d98c87d8811b1b8 Mon Sep 17 00:00:00 2001 From: manuedelf Date: Tue, 18 Aug 2020 09:00:02 +0200 Subject: [PATCH] Migrate common module to Aluminium Step 2 mostly to use EffectiveModelContext instead of SchemaContext JIRA: TRNSPRTPCE-292 TRNSPRTPCE-297 TRNSPRTPCE-306 Signed-off-by: guillaume.lambert Change-Id: I393d935c0d27d45fe068895e327baf7ff6408bcf --- .../transportpce/common/DataStoreContext.java | 8 +- .../common/DataStoreContextImpl.java | 135 +++++++----------- .../AbstractDataObjectConverter.java | 9 +- .../converter/JSONDataObjectConverter.java | 11 +- .../converter/XMLDataObjectConverter.java | 10 +- 5 files changed, 69 insertions(+), 104 deletions(-) diff --git a/common/src/main/java/org/opendaylight/transportpce/common/DataStoreContext.java b/common/src/main/java/org/opendaylight/transportpce/common/DataStoreContext.java index 9c8e8f5f4..1f2a5fd14 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/DataStoreContext.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/DataStoreContext.java @@ -10,9 +10,9 @@ package org.opendaylight.transportpce.common; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.mdsal.binding.api.NotificationService; -import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; public interface DataStoreContext { @@ -24,9 +24,9 @@ public interface DataStoreContext { NotificationPublishService createNotificationPublishService(); - SchemaContext getSchemaContext(); + EffectiveModelContext getSchemaContext(); - BindingNormalizedNodeCodecRegistry getBindingToNormalizedNodeCodec(); + BindingNormalizedNodeSerializer getBindingToNormalizedNodeCodec(); NotificationService getNotificationService(); diff --git a/common/src/main/java/org/opendaylight/transportpce/common/DataStoreContextImpl.java b/common/src/main/java/org/opendaylight/transportpce/common/DataStoreContextImpl.java index aed65339b..c5f5aa006 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/DataStoreContextImpl.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/DataStoreContextImpl.java @@ -8,27 +8,29 @@ package org.opendaylight.transportpce.common; import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.ServiceLoader; import java.util.concurrent.Executors; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.binding.runtime.api.BindingRuntimeContext; +import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.NotificationPublishService; import org.opendaylight.mdsal.binding.api.NotificationService; +import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext; import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter; import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationPublishServiceAdapter; import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceAdapter; -import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec; -import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; -import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; -import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.dom.adapter.ConstantAdapterContext; +import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; +import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMSchemaService; @@ -41,9 +43,9 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.util.ListenerRegistry; import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; -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 org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,22 +61,17 @@ public class DataStoreContextImpl implements DataStoreContext { private final NotificationService notificationService; private final NotificationPublishService notificationPublishService; - public DataStoreContextImpl() { - this(false); - } - public DataStoreContextImpl(boolean fromClasspath) { - this.mockedSchemaContext = new SchemaContextHolder(fromClasspath); + public DataStoreContextImpl() { + this.mockedSchemaContext = new SchemaContextHolder(); this.datastores = createDatastores(); this.domNotificationRouter = DOMNotificationRouter.create(16); this.domDataBroker = createDOMDataBroker(); this.dataBroker = createDataBroker(); this.notificationService = createNotificationService(); this.notificationPublishService = createNotificationPublishService(); - for (ListenerRegistration listener : - this.mockedSchemaContext.listeners.getRegistrations()) { - listener.getInstance().onGlobalContextUpdated(this.mockedSchemaContext.schemaContext); - } + this.mockedSchemaContext.listeners.streamListeners() + .forEach(l -> l.onModelContextUpdated(this.mockedSchemaContext.schemaContext)); } @Override @@ -89,23 +86,23 @@ public class DataStoreContextImpl implements DataStoreContext { @Override public NotificationService createNotificationService() { - return new BindingDOMNotificationServiceAdapter(this.domNotificationRouter, - this.mockedSchemaContext.bindingStreamCodecs); + return new BindingDOMNotificationServiceAdapter(this.mockedSchemaContext.adapterContext, + this.domNotificationRouter); } @Override public NotificationPublishService createNotificationPublishService() { - return new BindingDOMNotificationPublishServiceAdapter(this.domNotificationRouter, - this.mockedSchemaContext.bindingToNormalized); + return new BindingDOMNotificationPublishServiceAdapter(this.mockedSchemaContext.adapterContext, + this.domNotificationRouter); } @Override - public SchemaContext getSchemaContext() { + public EffectiveModelContext getSchemaContext() { return this.mockedSchemaContext.schemaContext; } @Override - public BindingNormalizedNodeCodecRegistry getBindingToNormalizedNodeCodec() { + public BindingNormalizedNodeSerializer getBindingToNormalizedNodeCodec() { return this.mockedSchemaContext.bindingStreamCodecs; } @@ -129,7 +126,7 @@ public class DataStoreContextImpl implements DataStoreContext { } private DataBroker createDataBroker() { - return new BindingDOMDataBrokerAdapter(getDOMDataBroker(), this.mockedSchemaContext.bindingToNormalized); + return new BindingDOMDataBrokerAdapter(this.mockedSchemaContext.adapterContext, getDOMDataBroker()); } private Map createDatastores() { @@ -150,62 +147,30 @@ public class DataStoreContextImpl implements DataStoreContext { return store; } - private static final class SchemaContextHolder implements DOMSchemaService, SchemaContextProvider { + private static final class SchemaContextHolder implements DOMSchemaService, EffectiveModelContextProvider { - private final SchemaContext schemaContext; - private final ListenerRegistry listeners; - private final BindingNormalizedNodeCodecRegistry bindingStreamCodecs; - private final BindingToNormalizedNodeCodec bindingToNormalized; - private final ModuleInfoBackedContext moduleInfoBackedCntxt; + private final EffectiveModelContext schemaContext; + private final ListenerRegistry listeners; + private final BindingNormalizedNodeSerializer bindingStreamCodecs; + private final CurrentAdapterSerializer bindingToNormalized; + private final AdapterContext adapterContext; - private SchemaContextHolder(boolean fromClasspath) { + private SchemaContextHolder() { List moduleInfos = loadModuleInfos(); - this.moduleInfoBackedCntxt = ModuleInfoBackedContext.create(); - this.schemaContext = getSchemaContext(moduleInfos); + this.schemaContext = BindingRuntimeHelpers.createEffectiveModel(moduleInfos); this.listeners = ListenerRegistry.create(); - this.bindingStreamCodecs = createBindingRegistry(); - GeneratedClassLoadingStrategy loading = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(); - this.bindingToNormalized = new BindingToNormalizedNodeCodec(loading, this.bindingStreamCodecs); - registerSchemaContextListener(this.bindingToNormalized); - } - - @Override - public SchemaContext getSchemaContext() { - return this.schemaContext; - } - - /** - * Get the schemacontext from loaded modules on classpath. - * - * @param moduleInfos a list of Yang module Infos - * @return SchemaContext a schema context - */ - private SchemaContext getSchemaContext(List moduleInfos) { - this.moduleInfoBackedCntxt.addModuleInfos(moduleInfos); - Optional tryToCreateSchemaContext = - this.moduleInfoBackedCntxt.tryToCreateSchemaContext(); - if (!tryToCreateSchemaContext.isPresent()) { - LOG.error("Could not create the initial schema context. Schema context is empty"); - throw new IllegalStateException(); - } - return tryToCreateSchemaContext.get(); - } - - @Override - public SchemaContext getGlobalContext() { - return this.schemaContext; + BindingRuntimeContext bindingContext = + BindingRuntimeHelpers.createRuntimeContext(); + this.bindingStreamCodecs = new BindingCodecContext(bindingContext); + this.bindingToNormalized = new CurrentAdapterSerializer(new BindingCodecContext(bindingContext)); + adapterContext = new ConstantAdapterContext(this.bindingToNormalized); } @Override - public SchemaContext getSessionContext() { + public EffectiveModelContext getGlobalContext() { return this.schemaContext; } - @Override - public ListenerRegistration registerSchemaContextListener( - SchemaContextListener listener) { - return this.listeners.register(listener); - } /** * Loads all {@link YangModelBindingProvider} on the classpath. @@ -223,26 +188,22 @@ public class DataStoreContextImpl implements DataStoreContext { return moduleInfos; } - /** - * Creates binding registry. - * - * @return BindingNormalizedNodeCodecRegistry the resulting binding registry - */ - private BindingNormalizedNodeCodecRegistry createBindingRegistry() { - BindingRuntimeContext bindingContext = - BindingRuntimeContext.create(this.moduleInfoBackedCntxt, this.schemaContext); - BindingNormalizedNodeCodecRegistry bindingNormalizedNodeCodecRegistry = - new BindingNormalizedNodeCodecRegistry(bindingContext); - return bindingNormalizedNodeCodecRegistry; + @Override + public ListenerRegistration registerSchemaContextListener( + EffectiveModelContextListener listener) { + return this.listeners.register(listener); + } + + @Override + public @NonNull EffectiveModelContext getEffectiveModelContext() { + return this.schemaContext; } - /* (non-Javadoc) - * @see org.opendaylight.mdsal.dom.api.DOMExtensibleService#getExtensions() - */ @Override public @NonNull ClassToInstanceMap getExtensions() { - // TODO Auto-generated method stub - return null; + return ImmutableClassToInstanceMap.of(); } + + } } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/converter/AbstractDataObjectConverter.java b/common/src/main/java/org/opendaylight/transportpce/common/converter/AbstractDataObjectConverter.java index 3a003b011..e07ef9e91 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/converter/AbstractDataObjectConverter.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/converter/AbstractDataObjectConverter.java @@ -23,7 +23,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,7 +36,7 @@ public abstract class AbstractDataObjectConverter implements DataObjectConverter private static final Logger LOG = LoggerFactory.getLogger(AbstractDataObjectConverter.class); - private final SchemaContext schemaContext; + private final EffectiveModelContext schemaContext; private final BindingNormalizedNodeSerializer codecRegistry; /** @@ -46,12 +46,13 @@ public abstract class AbstractDataObjectConverter implements DataObjectConverter * @param codecRegistry codec registry used for converting * */ - protected AbstractDataObjectConverter(SchemaContext schemaContext, BindingNormalizedNodeSerializer codecRegistry) { + protected AbstractDataObjectConverter(EffectiveModelContext schemaContext, + BindingNormalizedNodeSerializer codecRegistry) { this.schemaContext = schemaContext; this.codecRegistry = codecRegistry; } - public SchemaContext getSchemaContext() { + public EffectiveModelContext getSchemaContext() { return schemaContext; } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/converter/JSONDataObjectConverter.java b/common/src/main/java/org/opendaylight/transportpce/common/converter/JSONDataObjectConverter.java index 306b18d1a..2177d1e43 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/converter/JSONDataObjectConverter.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/converter/JSONDataObjectConverter.java @@ -18,7 +18,7 @@ import java.io.Writer; import java.nio.charset.StandardCharsets; import java.util.Optional; import javax.annotation.Nonnull; -import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.transportpce.common.DataStoreContext; import org.opendaylight.transportpce.common.converter.api.DataObjectConverter; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -33,7 +33,7 @@ import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamW import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +42,8 @@ public final class JSONDataObjectConverter extends AbstractDataObjectConverter { private static final Logger LOG = LoggerFactory.getLogger(JSONDataObjectConverter.class); - private JSONDataObjectConverter(SchemaContext schemaContext, BindingNormalizedNodeCodecRegistry codecRegistry) { + private JSONDataObjectConverter(EffectiveModelContext schemaContext, + BindingNormalizedNodeSerializer codecRegistry) { super(schemaContext, codecRegistry); } @@ -64,8 +65,8 @@ public final class JSONDataObjectConverter extends AbstractDataObjectConverter { * @param codecRegistry codec registry used for converting * @return converter */ - public static DataObjectConverter createWithSchemaContext(@Nonnull SchemaContext schemaContext, - @Nonnull BindingNormalizedNodeCodecRegistry codecRegistry) { + public static DataObjectConverter createWithSchemaContext(@Nonnull EffectiveModelContext schemaContext, + @Nonnull BindingNormalizedNodeSerializer codecRegistry) { return new JSONDataObjectConverter(schemaContext, codecRegistry); } diff --git a/common/src/main/java/org/opendaylight/transportpce/common/converter/XMLDataObjectConverter.java b/common/src/main/java/org/opendaylight/transportpce/common/converter/XMLDataObjectConverter.java index afcccda9a..1e18cd8ae 100644 --- a/common/src/main/java/org/opendaylight/transportpce/common/converter/XMLDataObjectConverter.java +++ b/common/src/main/java/org/opendaylight/transportpce/common/converter/XMLDataObjectConverter.java @@ -32,10 +32,11 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter; import org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter; +import org.opendaylight.yangtools.yang.data.codec.xml.XmlCodecFactory; import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.SchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.slf4j.Logger; @@ -55,7 +56,7 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter { * @param codecRegistry codec registry used for converting * */ - private XMLDataObjectConverter(SchemaContext schemaContext, BindingNormalizedNodeSerializer codecRegistry) { + private XMLDataObjectConverter(EffectiveModelContext schemaContext, BindingNormalizedNodeSerializer codecRegistry) { super(schemaContext, codecRegistry); this.xmlInputFactory = XMLInputFactory.newInstance(); // set external DTD and schema to null to avoid vulnerability (sonar report) @@ -82,7 +83,7 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter { * @param codecRegistry codec registry used for converting * @return new {@link XMLDataObjectConverter} */ - public static XMLDataObjectConverter createWithSchemaContext(@Nonnull SchemaContext schemaContext, + public static XMLDataObjectConverter createWithSchemaContext(@Nonnull EffectiveModelContext schemaContext, @Nonnull BindingNormalizedNodeSerializer codecRegistry) { return new XMLDataObjectConverter(schemaContext, codecRegistry); } @@ -192,7 +193,8 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter { XMLStreamReader reader, SchemaNode parentSchemaNode) { NormalizedNodeResult result = new NormalizedNodeResult(); try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result); - XmlParserStream xmlParser = XmlParserStream.create(streamWriter, getSchemaContext(), parentSchemaNode)) { + XmlParserStream xmlParser = XmlParserStream + .create(streamWriter, XmlCodecFactory.create(getSchemaContext()), parentSchemaNode)) { xmlParser.parse(reader); } catch (XMLStreamException | URISyntaxException | IOException | SAXException e) { LOG.warn("An error occured during parsing XML input stream", e); -- 2.36.6