From 588818489d93c5551a0bd6521713f60449a5756a Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 17 Feb 2020 22:50:45 +0100 Subject: [PATCH] Promote BindingRuntimeContext to binding-generator-api BindingRuntimeContext only requires BindingRuntimeTypes, make them required in factory method and have users take care of implementation binding. This allows us to promote it to an API utility, reducing cross-implementation clutter. This refactor also shows that BindingCodecTreeFactory is mixing apples and oranges, forcing users to deal with things that should readily come from BindingRuntimeContext -- we refactor that support code so that it is hosted in ModuleInfoBackedContext instead. JIRA: MDSAL-392 Change-Id: I6381c889c7a1911f9e524aadf1c06c61e99fd75f Signed-off-by: Robert Varga --- .../adapter/BindingToNormalizedNodeCodec.java | 33 +++++++------- .../binding/dom/adapter/FutureSchema.java | 2 +- .../binding/dom/adapter/ActionLookupTest.java | 5 ++- .../adapter/BindingDOMAdapterLoaderTest.java | 7 +-- ...ursorAwareWriteTransactionAdapterTest.java | 7 +-- ...ngDOMDataTreeChangeServiceAdapterTest.java | 5 ++- ...ingDOMDataTreeCommitCohortAdapterTest.java | 6 ++- ...dingDOMDataTreeWriteCursorAdapterTest.java | 6 ++- ...indingDOMMountPointServiceAdapterTest.java | 7 +-- ...BindingDOMTransactionChainAdapterTest.java | 7 +-- .../adapter/BindingMountPointAdapterTest.java | 9 ++-- .../adapter/BindingNormalizedCodecTest.java | 8 ++-- .../BindingToNormalizedNodeCodecTest.java | 13 +++--- .../adapter/LazyDataTreeModificationTest.java | 8 ++-- .../AbstractDataBrokerTestCustomizer.java | 6 +-- .../adapter/test/util/BindingTestContext.java | 5 +-- .../codec/api/BindingCodecTreeFactory.java | 19 +------- .../osgi/BindingRuntimeContextListener.java | 2 +- .../osgi/BindingRuntimeContextService.java | 2 +- .../SimpleBindingRuntimeContextService.java | 7 +-- .../dom/codec/impl/BindingCodecContext.java | 2 +- .../BindingNormalizedNodeCodecRegistry.java | 22 +--------- .../codec/impl/DataContainerCodecContext.java | 2 +- .../binding/dom/codec/impl/IdentityCodec.java | 2 +- .../dom/codec/impl/NodeCodecContext.java | 2 +- .../impl/AbstractBindingRuntimeTest.java | 16 ++++--- ...entationClassDiscoveredAfterCodecTest.java | 12 ++--- .../codec/impl/ExceptionReportingTest.java | 10 +++-- binding/mdsal-binding-generator-api/pom.xml | 6 ++- .../generator/api}/BindingRuntimeContext.java | 44 +++++++------------ .../impl/ModuleInfoBackedContext.java | 8 ++++ .../generator/test/BaseCompilationTest.java | 9 +--- .../test/ClassCodeGeneratorTest.java | 6 +-- .../mdsal-eos-binding-adapter/pom.xml | 6 +++ ...gDOMEntityOwnershipServiceAdapterTest.java | 9 ++-- .../rfc7895/YangModuleLibrarySupport.java | 9 ++-- .../YangModuleLibrarySupportFactory.java | 17 ++++++- .../yanglib/rfc8525/YangLibrarySupport.java | 9 ++-- .../rfc8525/YangLibrarySupportFactory.java | 17 ++++++- 39 files changed, 194 insertions(+), 178 deletions(-) rename binding/{mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/util => mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api}/BindingRuntimeContext.java (91%) diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java index 951d7c4c3e..0d92e3fc1b 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java @@ -41,8 +41,9 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; import org.opendaylight.mdsal.binding.dom.codec.api.MissingSchemaException; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.mdsal.binding.spec.naming.BindingMapping; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; @@ -100,27 +101,31 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, }); private final BindingNormalizedNodeCodecRegistry codecRegistry; private final ClassLoadingStrategy classLoadingStrategy; + private final BindingRuntimeGenerator generator; private final FutureSchema futureSchema; + private ListenerRegistration listenerRegistration; @Inject - public BindingToNormalizedNodeCodec(final ClassLoadingStrategy classLoadingStrategy, - final BindingNormalizedNodeCodecRegistry codecRegistry) { - this(classLoadingStrategy, codecRegistry, false); + public BindingToNormalizedNodeCodec(final BindingRuntimeGenerator generator, + final ClassLoadingStrategy classLoadingStrategy, final BindingNormalizedNodeCodecRegistry codecRegistry) { + this(generator, classLoadingStrategy, codecRegistry, false); } - public BindingToNormalizedNodeCodec(final ClassLoadingStrategy classLoadingStrategy, - final BindingNormalizedNodeCodecRegistry codecRegistry, final boolean waitForSchema) { + public BindingToNormalizedNodeCodec(final BindingRuntimeGenerator generator, + final ClassLoadingStrategy classLoadingStrategy, final BindingNormalizedNodeCodecRegistry codecRegistry, + final boolean waitForSchema) { + this.generator = requireNonNull(generator, "generator"); this.classLoadingStrategy = requireNonNull(classLoadingStrategy, "classLoadingStrategy"); this.codecRegistry = requireNonNull(codecRegistry, "codecRegistry"); this.futureSchema = FutureSchema.create(WAIT_DURATION_SEC, TimeUnit.SECONDS, waitForSchema); } - public static BindingToNormalizedNodeCodec newInstance(final ClassLoadingStrategy classLoadingStrategy, - final DOMSchemaService schemaService) { + public static BindingToNormalizedNodeCodec newInstance(final BindingRuntimeGenerator generator, + final ClassLoadingStrategy classLoadingStrategy, final DOMSchemaService schemaService) { final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(); - BindingToNormalizedNodeCodec instance = new BindingToNormalizedNodeCodec( - classLoadingStrategy, codecRegistry, true); + BindingToNormalizedNodeCodec instance = new BindingToNormalizedNodeCodec(generator, classLoadingStrategy, + codecRegistry, true); instance.listenerRegistration = schemaService.registerSchemaContextListener(instance); return instance; } @@ -304,7 +309,8 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, @Override public void onGlobalContextUpdated(final SchemaContext context) { - final BindingRuntimeContext runtimeContext = BindingRuntimeContext.create(classLoadingStrategy, context); + final BindingRuntimeContext runtimeContext = BindingRuntimeContext.create( + generator.generateTypeMapping(context), classLoadingStrategy); codecRegistry.onBindingRuntimeContextUpdated(runtimeContext); futureSchema.onRuntimeContextUpdated(runtimeContext); } @@ -405,11 +411,6 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, return codecRegistry.create(context); } - @Override - public final BindingCodecTree create(final SchemaContext context, final Class... bindingClasses) { - return codecRegistry.create(context, bindingClasses); - } - protected @NonNull Entry, BindingDataObjectCodecTreeNode> getSubtreeCodec( final YangInstanceIdentifier domIdentifier) { diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/FutureSchema.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/FutureSchema.java index 877f23c4e2..a4269e42e8 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/FutureSchema.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/FutureSchema.java @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Predicate; import org.checkerframework.checker.lock.qual.GuardedBy; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.common.QNameModule; diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java index 71de2ebc18..9dc6e64650 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java @@ -14,6 +14,7 @@ import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Cont; @@ -32,8 +33,8 @@ public class ActionLookupTest { ctx.addModuleInfos(BindingReflections.loadModuleInfos()); final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class); - CODEC = new BindingToNormalizedNodeCodec(ctx, registry); - CODEC.onGlobalContextUpdated(ctx.tryToCreateSchemaContext().get()); + CODEC = new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(), ctx, registry); + CODEC.onGlobalContextUpdated(ctx.tryToCreateModelContext().get()); } @AfterClass diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoaderTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoaderTest.java index 8d897453b3..d0a623a85e 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoaderTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoaderTest.java @@ -22,6 +22,7 @@ import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMService; @@ -41,9 +42,9 @@ public class BindingDOMAdapterLoaderTest { @Before public void setUp() { doReturn(ImmutableClassToInstanceMap.of()).when(domService).getExtensions(); - bindingDOMAdapterLoader = new BindingDOMAdapterLoader( - new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), - mockCodecRegistry)) { + bindingDOMAdapterLoader = new BindingDOMAdapterLoader(new BindingToNormalizedNodeCodec( + new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), + mockCodecRegistry)) { @Override protected DOMService getDelegate(final Class reqDeleg) { return domService; diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMCursorAwareWriteTransactionAdapterTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMCursorAwareWriteTransactionAdapterTest.java index 8daeeab309..6a058d4bb1 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMCursorAwareWriteTransactionAdapterTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMCursorAwareWriteTransactionAdapterTest.java @@ -17,6 +17,7 @@ import static org.mockito.Mockito.verify; import org.junit.Test; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeCursorAwareTransaction; @@ -26,13 +27,13 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; public class BindingDOMCursorAwareWriteTransactionAdapterTest { - @Test public void basicTest() throws Exception { final DOMDataTreeCursorAwareTransaction delegate = mock(DOMDataTreeCursorAwareTransaction.class); final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class); - final BindingToNormalizedNodeCodec codec = - new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), registry); + final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec( + new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), + registry); final YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty(); doReturn(yangInstanceIdentifier).when(registry).toYangInstanceIdentifier(any()); doReturn(mock(DOMDataTreeWriteCursor.class)).when(delegate).createCursor(any()); diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapterTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapterTest.java index e3a6b13dc9..149eed6b57 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapterTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapterTest.java @@ -26,6 +26,7 @@ import org.opendaylight.mdsal.binding.api.DataTreeChangeService; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.api.DataTreeModification; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener; @@ -69,8 +70,8 @@ public class BindingDOMDataTreeChangeServiceAdapterTest { @Test public void testRegisterDataTreeChangeListener() { - final BindingToNormalizedNodeCodec codec = - new BindingToNormalizedNodeCodec(this.classLoadingStrategy, this.codecRegistry); + final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec( + new DefaultBindingRuntimeGenerator(), classLoadingStrategy, codecRegistry); final DataTreeChangeService service = BindingDOMDataTreeChangeServiceAdapter.create(codec, this.mockDOMService); diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeCommitCohortAdapterTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeCommitCohortAdapterTest.java index 1e3b699a49..ee6d06c814 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeCommitCohortAdapterTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeCommitCohortAdapterTest.java @@ -23,6 +23,7 @@ import org.opendaylight.mdsal.binding.api.DataTreeCommitCohort; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree; import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.common.api.PostCanCommitStep; @@ -39,8 +40,9 @@ public class BindingDOMDataTreeCommitCohortAdapterTest { public void canCommitTest() throws Exception { final DataTreeCommitCohort cohort = mock(DataTreeCommitCohort.class); final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class); - final BindingToNormalizedNodeCodec codec = - new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), registry); + final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec( + new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), + registry); final BindingDOMDataTreeCommitCohortAdapter adapter = new BindingDOMDataTreeCommitCohortAdapter<>(codec, cohort); diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeWriteCursorAdapterTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeWriteCursorAdapterTest.java index 5b3b178293..9d6d2605df 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeWriteCursorAdapterTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeWriteCursorAdapterTest.java @@ -21,6 +21,7 @@ import java.util.Deque; import org.junit.Test; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteCursor; @@ -40,8 +41,9 @@ public class BindingDOMDataTreeWriteCursorAdapterTest { InstanceIdentifier.create(DataObject.class)); final DOMDataTreeWriteCursor delegate = mock(DOMDataTreeWriteCursor.class); final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class); - final BindingToNormalizedNodeCodec codec = - new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), registry); + final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec( + new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), + registry); final BindingDOMDataTreeWriteCursorAdapter adapter = new BindingDOMDataTreeWriteCursorAdapter<>(identifier, delegate, codec); diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMMountPointServiceAdapterTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMMountPointServiceAdapterTest.java index 973ef77215..65abe9edbf 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMMountPointServiceAdapterTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMMountPointServiceAdapterTest.java @@ -18,6 +18,7 @@ import java.util.Optional; import org.junit.Test; import org.opendaylight.mdsal.binding.api.MountPointService.MountPointListener; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.dom.api.DOMMountPoint; import org.opendaylight.mdsal.dom.api.DOMMountPointService; @@ -26,12 +27,12 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; public class BindingDOMMountPointServiceAdapterTest { - @Test public void basicTest() throws Exception { final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class); - final BindingToNormalizedNodeCodec codec = - new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), registry); + final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec( + new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), + registry); doReturn(YangInstanceIdentifier.empty()).when(registry).toYangInstanceIdentifier(any()); final DOMMountPointService mountPointService = mock(DOMMountPointService.class); diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapterTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapterTest.java index 666ba79678..0ffbf52f93 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapterTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapterTest.java @@ -23,6 +23,7 @@ import org.mockito.junit.MockitoJUnitRunner; import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.mdsal.binding.api.TransactionChainListener; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.dom.api.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction; @@ -52,9 +53,9 @@ public class BindingDOMTransactionChainAdapterTest { doReturn(transactionChain).when(domService).createTransactionChain(any()); doReturn(ImmutableClassToInstanceMap.of()).when(domService).getExtensions(); - BindingDOMAdapterLoader bindingDOMAdapterLoader = new BindingDOMAdapterLoader( - new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), - mockCodecRegistry)) { + BindingDOMAdapterLoader bindingDOMAdapterLoader = new BindingDOMAdapterLoader(new BindingToNormalizedNodeCodec( + new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), + mockCodecRegistry)) { @Override protected DOMService getDelegate(final Class reqDeleg) { return domService; diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingMountPointAdapterTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingMountPointAdapterTest.java index 87ae80619b..8cd1c876fb 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingMountPointAdapterTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingMountPointAdapterTest.java @@ -13,16 +13,15 @@ import static org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadin import org.junit.Test; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; -import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.dom.api.DOMMountPoint; public class BindingMountPointAdapterTest { - @Test public void basicTest() throws Exception { - final GeneratedClassLoadingStrategy loading = getTCCLClassLoadingStrategy(); - final BindingNormalizedNodeCodecRegistry codecRegistry = mock(BindingNormalizedNodeCodecRegistry.class); - final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec(loading, codecRegistry); + final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec( + new DefaultBindingRuntimeGenerator(), getTCCLClassLoadingStrategy(), + mock(BindingNormalizedNodeCodecRegistry.class)); final DOMMountPoint domMountPoint = mock(DOMMountPoint.class); final BindingMountPointAdapter bindingMountPointAdapter = new BindingMountPointAdapter(codec, domMountPoint); assertNull(bindingMountPointAdapter.getIdentifier()); diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingNormalizedCodecTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingNormalizedCodecTest.java index afa6eb2151..a448a33610 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingNormalizedCodecTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingNormalizedCodecTest.java @@ -5,7 +5,6 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.mdsal.binding.dom.adapter; import static org.junit.Assert.assertEquals; @@ -28,6 +27,7 @@ import java.util.concurrent.atomic.AtomicReference; import org.junit.Test; import org.opendaylight.mdsal.binding.dom.adapter.test.AbstractSchemaAwareTest; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.rpcservice.rev140701.OpendaylightTestRpcServiceService; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment; @@ -66,9 +66,9 @@ public class BindingNormalizedCodecTest extends AbstractSchemaAwareTest { @Override protected void setupWithSchema(final SchemaContext schemaContext) { this.context = schemaContext; - final BindingNormalizedNodeCodecRegistry registry = new BindingNormalizedNodeCodecRegistry(); - this.codec = new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), - registry, true); + this.codec = new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(), + GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), new BindingNormalizedNodeCodecRegistry(), + true); } @Test diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java index 6094b485f2..acfabd1f99 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java @@ -18,8 +18,10 @@ import java.util.List; import java.util.Map.Entry; import org.junit.Test; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.QName; @@ -37,7 +39,6 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; public class BindingToNormalizedNodeCodecTest { - /** * Positive test. * @@ -116,10 +117,12 @@ public class BindingToNormalizedNodeCodecTest { final SchemaContext schemaCtx) { final GeneratedClassLoadingStrategy classLoadingStrategy = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(); - final BindingRuntimeContext ctx = BindingRuntimeContext.create(classLoadingStrategy, schemaCtx); + final BindingRuntimeGenerator generator = new DefaultBindingRuntimeGenerator(); + final BindingRuntimeContext ctx = BindingRuntimeContext.create( + generator.generateTypeMapping(schemaCtx), classLoadingStrategy); final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(ctx); - final BindingToNormalizedNodeCodec codec = - new BindingToNormalizedNodeCodec(classLoadingStrategy, codecRegistry); + final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec( + generator, classLoadingStrategy, codecRegistry); final List pathArgs = new ArrayList<>(); pathArgs.add(NodeIdentifier.create(QName.create("urn:test", "2017-01-01", "cont"))); diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModificationTest.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModificationTest.java index d54862ad35..35608e81b2 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModificationTest.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModificationTest.java @@ -16,6 +16,7 @@ import org.junit.Test; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree; import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataTreeCandidate; @@ -26,12 +27,12 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode; public class LazyDataTreeModificationTest { - @Test public void basicTest() throws Exception { final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class); - final BindingToNormalizedNodeCodec codec = - new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), registry); + final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec( + new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), + registry); final DOMDataTreeCandidate domDataTreeCandidate = mock(DOMDataTreeCandidate.class); final DOMDataTreeIdentifier domDataTreeIdentifier = new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.empty()); @@ -45,5 +46,4 @@ public class LazyDataTreeModificationTest { assertNotNull(LazyDataTreeModification.create(codec, domDataTreeCandidate)); } - } \ No newline at end of file diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractDataBrokerTestCustomizer.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractDataBrokerTestCustomizer.java index f1a2b66ac1..2ed7574b7c 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractDataBrokerTestCustomizer.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractDataBrokerTestCustomizer.java @@ -19,6 +19,7 @@ import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceA import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec; import org.opendaylight.mdsal.binding.dom.adapter.test.util.MockSchemaService; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.mdsal.dom.api.DOMDataBroker; @@ -46,9 +47,8 @@ public abstract class AbstractDataBrokerTestCustomizer { public AbstractDataBrokerTestCustomizer() { this.schemaService = new MockSchemaService(); - final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(); - final GeneratedClassLoadingStrategy loading = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(); - this.bindingToNormalized = new BindingToNormalizedNodeCodec(loading, codecRegistry); + this.bindingToNormalized = new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(), + GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), new BindingNormalizedNodeCodecRegistry()); this.schemaService.registerSchemaContextListener(this.bindingToNormalized); this.domNotificationRouter = DOMNotificationRouter.create(16); } diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java index 777c55cd42..22c41ca22e 100644 --- a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java +++ b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java @@ -29,6 +29,7 @@ import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcProviderServiceAd import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcServiceAdapter; import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; @@ -50,8 +51,6 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; @Beta public class BindingTestContext implements AutoCloseable { - - private BindingToNormalizedNodeCodec codec; private final ListeningExecutorService executor; @@ -141,7 +140,7 @@ public class BindingTestContext implements AutoCloseable { public void startBindingToDomMappingService() { final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(); final GeneratedClassLoadingStrategy loading = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(); - codec = new BindingToNormalizedNodeCodec(loading, codecRegistry); + codec = new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(), loading, codecRegistry); mockSchemaService.registerSchemaContextListener(codec); } diff --git a/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTreeFactory.java b/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTreeFactory.java index 6ac1ddd1fa..2b215c0531 100644 --- a/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTreeFactory.java +++ b/binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTreeFactory.java @@ -7,9 +7,7 @@ */ package org.opendaylight.mdsal.binding.dom.codec.api; -import com.google.common.annotations.Beta; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; public interface BindingCodecTreeFactory { /** @@ -21,19 +19,4 @@ public interface BindingCodecTreeFactory { * @return Binding Codec Tree for specified Binding runtime context. */ BindingCodecTree create(BindingRuntimeContext context); - - /** - * Creates Binding Codec Tree for specified Binding runtime context. - * - * @param context - * Binding Runtime Context for which Binding codecs should be - * instantiated. - * @param bindingClasses - * Binding Runtime Context will be constructed using bindings - * which contains specified classes, in order to support - * deserialization in multi-classloader environment. - * @return Binding Codec Tree for specified Binding runtime context. - */ - @Beta - BindingCodecTree create(SchemaContext context, Class... bindingClasses); } diff --git a/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextListener.java b/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextListener.java index 7537e25dd2..5e3dfc6039 100644 --- a/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextListener.java +++ b/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextListener.java @@ -8,7 +8,7 @@ package org.opendaylight.mdsal.binding.dom.codec.osgi; import java.util.EventListener; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; @Deprecated public interface BindingRuntimeContextListener extends EventListener { diff --git a/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextService.java b/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextService.java index 86ba87be1c..1fbb7ffd62 100644 --- a/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextService.java +++ b/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextService.java @@ -8,7 +8,7 @@ package org.opendaylight.mdsal.binding.dom.codec.osgi; import com.google.common.annotations.Beta; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; diff --git a/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/SimpleBindingRuntimeContextService.java b/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/SimpleBindingRuntimeContextService.java index 550e7ca355..1f2062aab4 100644 --- a/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/SimpleBindingRuntimeContextService.java +++ b/binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/SimpleBindingRuntimeContextService.java @@ -8,15 +8,15 @@ package org.opendaylight.mdsal.binding.dom.codec.osgi.impl; import static com.google.common.base.Preconditions.checkState; -import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; import com.google.common.util.concurrent.ListenableFuture; import org.checkerframework.checker.lock.qual.GuardedBy; import org.opendaylight.mdsal.binding.dom.codec.osgi.BindingRuntimeContextListener; import org.opendaylight.mdsal.binding.dom.codec.osgi.BindingRuntimeContextService; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; @@ -57,7 +57,8 @@ final class SimpleBindingRuntimeContextService extends } void updateBindingRuntimeContext(final SchemaContext schemaContext) { - final BindingRuntimeContext next = verifyNotNull(BindingRuntimeContext.create(strategy, schemaContext)); + final BindingRuntimeContext next = BindingRuntimeContext.create( + new DefaultBindingRuntimeGenerator().generateTypeMapping(schemaContext), strategy); final BindingRuntimeContextListener[] listeners; synchronized (lock) { diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java index 0a045000e1..ada3311998 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java @@ -40,7 +40,7 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter; import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory; import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader; import org.opendaylight.mdsal.binding.dom.codec.util.BindingSchemaMapping; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; import org.opendaylight.mdsal.binding.model.api.GeneratedType; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.concepts.Delegator; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java index 30aea995cb..247ee2d9f4 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java @@ -31,9 +31,7 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSeriali import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeWriterFactory; import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter; import org.opendaylight.mdsal.binding.dom.codec.util.AbstractBindingLazyContainerNode; -import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; -import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; import org.opendaylight.yangtools.yang.binding.Action; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -54,7 +52,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.ValueNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; 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.SchemaPath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -308,23 +305,6 @@ public class BindingNormalizedNodeCodecRegistry implements DataObjectSerializerR return new BindingCodecContext(context, this); } - @Override - @SuppressWarnings("checkstyle:illegalCatch") - public BindingCodecTree create(final SchemaContext context, final Class... bindingClasses) { - final ModuleInfoBackedContext strategy = ModuleInfoBackedContext.create(); - for (final Class bindingCls : bindingClasses) { - try { - strategy.registerModuleInfo(BindingReflections.getModuleInfo(bindingCls)); - } catch (final Exception e) { - throw new IllegalStateException( - "Could not create BindingRuntimeContext from class " + bindingCls.getName(), e); - } - } - final BindingRuntimeContext runtimeCtx = BindingRuntimeContext.create(strategy, context); - return create(runtimeCtx); - } - - private static final class DeserializeFunction implements Function>, Optional> { private final DataObjectCodecContext ctx; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java index a6ffaaedd8..760e75bb3b 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java @@ -27,8 +27,8 @@ import org.opendaylight.mdsal.binding.dom.codec.api.IncorrectNestingException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingClassInLoadingStrategyException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingSchemaException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingSchemaForClassException; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.BindingObject; import org.opendaylight.yangtools.yang.binding.DataObject; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java index e314870470..5636287637 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java @@ -11,7 +11,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import org.opendaylight.mdsal.binding.dom.codec.api.BindingIdentityCodec; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yangtools.concepts.AbstractIllegalArgumentCodec; import org.opendaylight.yangtools.yang.binding.BaseIdentity; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java index 351da8f2c5..fabe3c6536 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java @@ -14,7 +14,7 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingRuntimeTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingRuntimeTest.java index 980b1c589c..a8e0ddd532 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingRuntimeTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingRuntimeTest.java @@ -9,22 +9,24 @@ package org.opendaylight.mdsal.binding.dom.codec.impl; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; public abstract class AbstractBindingRuntimeTest { - - private static SchemaContext schemaContext; + private static EffectiveModelContext schemaContext; private static BindingRuntimeContext runtimeContext; @BeforeClass public static void beforeClass() { ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create(); ctx.addModuleInfos(BindingReflections.loadModuleInfos()); - schemaContext = ctx.tryToCreateSchemaContext().get(); - runtimeContext = BindingRuntimeContext.create(ctx, schemaContext); + schemaContext = ctx.tryToCreateModelContext().get(); + + runtimeContext = BindingRuntimeContext.create( + new DefaultBindingRuntimeGenerator().generateTypeMapping(schemaContext), ctx); } @AfterClass @@ -33,7 +35,7 @@ public abstract class AbstractBindingRuntimeTest { runtimeContext = null; } - public static final SchemaContext getSchemaContext() { + public static final EffectiveModelContext getSchemaContext() { return schemaContext; } diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationClassDiscoveredAfterCodecTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationClassDiscoveredAfterCodecTest.java index bd95da644e..a96b7e038a 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationClassDiscoveredAfterCodecTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationClassDiscoveredAfterCodecTest.java @@ -16,9 +16,10 @@ import java.util.Set; import org.junit.Before; import org.junit.Test; import org.opendaylight.mdsal.binding.dom.codec.api.MissingClassInLoadingStrategyException; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; 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.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugment; @@ -30,7 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; /** * This sets of tests are designed in way, that schema context contains models for all augmentations, but backing class @@ -41,7 +42,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; */ public class AugmentationClassDiscoveredAfterCodecTest { - private SchemaContext schemaContext; + private EffectiveModelContext schemaContext; private BindingRuntimeContext runtimeContext; private ClassExcludingClassLoadingStrategy mockedContext; private BindingNormalizedNodeCodecRegistry registry; @@ -51,8 +52,9 @@ public class AugmentationClassDiscoveredAfterCodecTest { final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create(); ctx.addModuleInfos(BindingReflections.loadModuleInfos()); mockedContext = new ClassExcludingClassLoadingStrategy(ctx); - schemaContext = ctx.tryToCreateSchemaContext().get(); - runtimeContext = BindingRuntimeContext.create(mockedContext, schemaContext); + schemaContext = ctx.tryToCreateModelContext().get(); + runtimeContext = BindingRuntimeContext.create( + new DefaultBindingRuntimeGenerator().generateTypeMapping(schemaContext), mockedContext); registry = new BindingNormalizedNodeCodecRegistry(runtimeContext); } diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java index e1e9a04af4..f876e2e98d 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java @@ -11,8 +11,9 @@ import org.junit.Test; import org.opendaylight.mdsal.binding.dom.codec.api.IncorrectNestingException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingSchemaException; import org.opendaylight.mdsal.binding.dom.codec.api.MissingSchemaForClassException; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugment; @@ -24,7 +25,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; public class ExceptionReportingTest { private static final BindingNormalizedNodeCodecRegistry CODEC_WITHOUT_TOP = codec(LowestLevel1.class); @@ -86,8 +87,9 @@ public class ExceptionReportingTest { throw new IllegalStateException(e); } } - final SchemaContext schema = ctx.tryToCreateSchemaContext().get(); - final BindingRuntimeContext runtimeCtx = BindingRuntimeContext.create(ctx, schema); + final EffectiveModelContext schema = ctx.tryToCreateModelContext().get(); + final BindingRuntimeContext runtimeCtx = BindingRuntimeContext.create( + new DefaultBindingRuntimeGenerator().generateTypeMapping(schema), ctx); final BindingNormalizedNodeCodecRegistry registry = new BindingNormalizedNodeCodecRegistry(runtimeCtx); return registry; } diff --git a/binding/mdsal-binding-generator-api/pom.xml b/binding/mdsal-binding-generator-api/pom.xml index a5bf3b9b75..465ca79476 100644 --- a/binding/mdsal-binding-generator-api/pom.xml +++ b/binding/mdsal-binding-generator-api/pom.xml @@ -23,7 +23,11 @@ org.opendaylight.yangtools - yang-model-api + yang-model-util + + + org.opendaylight.yangtools + yang-data-api org.opendaylight.mdsal diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/util/BindingRuntimeContext.java b/binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api/BindingRuntimeContext.java similarity index 91% rename from binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/util/BindingRuntimeContext.java rename to binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api/BindingRuntimeContext.java index 4e87533ec1..bb594e8dcf 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/util/BindingRuntimeContext.java +++ b/binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api/BindingRuntimeContext.java @@ -5,12 +5,13 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.mdsal.binding.generator.util; +package org.opendaylight.mdsal.binding.generator.api; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; +import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -25,12 +26,9 @@ import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; -import java.util.ServiceLoader; import java.util.Set; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator; -import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeTypes; -import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; import org.opendaylight.mdsal.binding.model.api.DefaultType; import org.opendaylight.mdsal.binding.model.api.GeneratedType; import org.opendaylight.mdsal.binding.model.api.MethodSignature; @@ -60,28 +58,19 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Runtime Context for Java YANG Binding classes + * Runtime Context for Java YANG Binding classes. It provides information derived from the backing effective model, + * which is not captured in generated classes (and hence cannot be obtained from {@code BindingReflections}. * - *

Runtime Context provides additional insight in Java YANG Binding, - * binding classes and underlying YANG schema, it contains - * runtime information, which could not be derived from generated - * classes alone using {@link org.opendaylight.mdsal.binding.spec.reflect.BindingReflections}. - * - *

Some of this information are for example list of all available - * children for cases {@link #getChoiceCaseChildren(DataNodeContainer)}, since - * choices are augmentable and new choices may be introduced by additional models. - * - *

Same goes for all possible augmentations. + *

Some of this information are for example list of all available children for cases + * {@link #getChoiceCaseChildren(DataNodeContainer)}, since choices are augmentable and new choices may be introduced + * by additional models. Same goes for all possible augmentations. */ +@Beta public final class BindingRuntimeContext implements SchemaContextProvider, Immutable { private static final Logger LOG = LoggerFactory.getLogger(BindingRuntimeContext.class); - private static final BindingRuntimeGenerator GENERATOR = ServiceLoader.load(BindingRuntimeGenerator.class) - .findFirst() - .orElseThrow(() -> new IllegalStateException("No BindingRuntimeGenerator implementation found")); - - private final BindingRuntimeTypes runtimeTypes; - private final ClassLoadingStrategy strategy; + private final @NonNull BindingRuntimeTypes runtimeTypes; + private final @NonNull ClassLoadingStrategy strategy; private final LoadingCache> identityClasses = CacheBuilder.newBuilder().weakValues().build( new CacheLoader>() { @@ -106,11 +95,12 @@ public final class BindingRuntimeContext implements SchemaContextProvider, Immut * Creates Binding Runtime Context from supplied class loading strategy and schema context. * * @param strategy Class loading strategy to retrieve generated Binding classes - * @param ctx Schema Context which describes YANG model and to which Binding classes should be mapped - * @return Instance of BindingRuntimeContext for supplied schema context. + * @param runtimeTypes Binding classes to YANG schema mapping + * @return A new instance */ - public static BindingRuntimeContext create(final ClassLoadingStrategy strategy, final SchemaContext ctx) { - return new BindingRuntimeContext(GENERATOR.generateTypeMapping(ctx), strategy); + public static @NonNull BindingRuntimeContext create(final BindingRuntimeTypes runtimeTypes, + final ClassLoadingStrategy strategy) { + return new BindingRuntimeContext(runtimeTypes, strategy); } /** @@ -119,7 +109,7 @@ public final class BindingRuntimeContext implements SchemaContextProvider, Immut * * @return Class loading strategy. */ - public ClassLoadingStrategy getStrategy() { + public @NonNull ClassLoadingStrategy getStrategy() { return strategy; } diff --git a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java index f9fbfebf48..75cefbf11c 100644 --- a/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java +++ b/binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java @@ -32,6 +32,8 @@ import java.util.Set; import org.checkerframework.checker.lock.qual.GuardedBy; import org.checkerframework.checker.lock.qual.Holding; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; import org.opendaylight.mdsal.binding.generator.api.ModuleInfoRegistry; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; @@ -211,6 +213,12 @@ public final class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy } } + @Beta + public @NonNull BindingRuntimeContext createRuntimeContext(final BindingRuntimeGenerator generator) { + return BindingRuntimeContext.create(generator.generateTypeMapping(tryToCreateModelContext().orElseThrow()), + this); + } + // TODO finish schema parsing and expose as SchemaService // Unite with current SchemaService diff --git a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/BaseCompilationTest.java b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/BaseCompilationTest.java index 12cfa8292d..fbc86ec706 100644 --- a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/BaseCompilationTest.java +++ b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/BaseCompilationTest.java @@ -19,10 +19,9 @@ import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; -import java.util.ServiceLoader; import java.util.function.Supplier; import org.junit.BeforeClass; -import org.opendaylight.mdsal.binding.generator.api.BindingGenerator; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingGenerator; import org.opendaylight.mdsal.binding.java.api.generator.GeneratorJavaFile; import org.opendaylight.mdsal.binding.java.api.generator.YangModuleInfoTemplate; import org.opendaylight.mdsal.binding.model.api.Type; @@ -33,8 +32,6 @@ import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; public abstract class BaseCompilationTest { - private static BindingGenerator BINDING_GENERATOR; - @BeforeClass public static void createTestDirs() { if (CompilationTestUtils.TEST_DIR.exists()) { @@ -42,8 +39,6 @@ public abstract class BaseCompilationTest { } assertTrue(CompilationTestUtils.GENERATOR_OUTPUT_DIR.mkdirs()); assertTrue(CompilationTestUtils.COMPILER_OUTPUT_DIR.mkdirs()); - - BINDING_GENERATOR = ServiceLoader.load(BindingGenerator.class).findFirst().orElseThrow(); } protected static final void generateTestSources(final List types, final File sourcesOutputDir) @@ -63,7 +58,7 @@ public abstract class BaseCompilationTest { throws IOException, URISyntaxException { final List sourceFiles = CompilationTestUtils.getSourceFiles(resourceDirPath); final EffectiveModelContext context = YangParserTestUtils.parseYangFiles(sourceFiles); - final List types = BINDING_GENERATOR.generateTypes(context); + final List types = new DefaultBindingGenerator().generateTypes(context); generateTestSources(types, sourcesOutputDir); // Also generate YangModuleInfo diff --git a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/ClassCodeGeneratorTest.java b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/ClassCodeGeneratorTest.java index d5485e0149..447e812aa6 100644 --- a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/ClassCodeGeneratorTest.java +++ b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/ClassCodeGeneratorTest.java @@ -13,9 +13,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.List; -import java.util.ServiceLoader; import org.junit.Test; -import org.opendaylight.mdsal.binding.generator.api.BindingGenerator; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingGenerator; import org.opendaylight.mdsal.binding.java.api.generator.TOGenerator; import org.opendaylight.mdsal.binding.model.api.GeneratedProperty; import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject; @@ -36,8 +35,7 @@ public class ClassCodeGeneratorTest { final SchemaContext context = YangParserTestUtils.parseYangResource("/list-composite-key.yang"); assertNotNull(context); - final BindingGenerator bindingGen = ServiceLoader.load(BindingGenerator.class).findFirst().orElseThrow(); - final List genTypes = bindingGen.generateTypes(context); + final List genTypes = new DefaultBindingGenerator().generateTypes(context); assertTrue(genTypes != null); assertEquals(7, genTypes.size()); diff --git a/entityownership/mdsal-eos-binding-adapter/pom.xml b/entityownership/mdsal-eos-binding-adapter/pom.xml index b0ed30e76a..3c6428f6e4 100644 --- a/entityownership/mdsal-eos-binding-adapter/pom.xml +++ b/entityownership/mdsal-eos-binding-adapter/pom.xml @@ -55,11 +55,17 @@ org.osgi org.osgi.core + org.apache.commons commons-lang3 test + + org.opendaylight.mdsal + mdsal-binding-generator-impl + test + scm:git:http://git.opendaylight.org/gerrit/controller.git diff --git a/entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapterTest.java b/entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapterTest.java index ff8f44d6ee..64c1823340 100644 --- a/entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapterTest.java +++ b/entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapterTest.java @@ -25,6 +25,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; +import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.eos.binding.api.Entity; import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration; @@ -68,8 +69,8 @@ public class BindingDOMEntityOwnershipServiceAdapterTest { DOM_ENTITY.getIdentifier()); this.adapter = new BindingDOMEntityOwnershipServiceAdapter(this.mockDOMService, - new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), - this.mockCodecRegistry)); + new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(), + GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), mockCodecRegistry)); } @Test @@ -140,8 +141,8 @@ public class BindingDOMEntityOwnershipServiceAdapterTest { public void testOwnershipChangeWithException() throws Exception { final DOMEntityOwnershipListenerAdapter domEntityOwnershipListenerAdapter = new DOMEntityOwnershipListenerAdapter(mock(EntityOwnershipListener.class), - new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), - this.mockCodecRegistry)); + new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(), + GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), mockCodecRegistry)); final DOMEntityOwnershipChange domOwnershipChange = mock(DOMEntityOwnershipChange.class); doThrow(IllegalStateException.class).when(domOwnershipChange).getEntity(); domEntityOwnershipListenerAdapter.ownershipChanged(domOwnershipChange); diff --git a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupport.java b/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupport.java index 922798fdbd..70fdd8d7ba 100644 --- a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupport.java +++ b/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupport.java @@ -19,7 +19,8 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree; import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator; import org.opendaylight.mdsal.yanglib.api.SchemaContextResolver; import org.opendaylight.mdsal.yanglib.api.YangLibSupport; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160621.$YangModuleInfoImpl; @@ -43,8 +44,8 @@ public final class YangModuleLibrarySupport implements YangLibSupport { private final EffectiveModelContext context; @Inject - public YangModuleLibrarySupport(final @Reference YangParserFactory parserFactory) - throws YangParserException, IOException { + public YangModuleLibrarySupport(final @Reference YangParserFactory parserFactory, + final @Reference BindingRuntimeGenerator generator) throws YangParserException, IOException { final YangModuleInfo yangLibModule = $YangModuleInfoImpl.getInstance(); context = parserFactory.createParser() @@ -53,7 +54,7 @@ public final class YangModuleLibrarySupport implements YangLibSupport { .addSource(createSource(yangLibModule)) .buildEffectiveModel(); final BindingCodecTree codecTree = new BindingNormalizedNodeCodecRegistry(BindingRuntimeContext.create( - SimpleStrategy.INSTANCE, context)).getCodecContext(); + generator.generateTypeMapping(context), SimpleStrategy.INSTANCE)).getCodecContext(); this.codec = verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(ModulesState.class))); } diff --git a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupportFactory.java b/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupportFactory.java index bd0a4ab557..a6e38c60c5 100644 --- a/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupportFactory.java +++ b/yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupportFactory.java @@ -7,9 +7,13 @@ */ package org.opendaylight.mdsal.yanglib.rfc7895; +import static java.util.Objects.requireNonNull; + import java.io.IOException; +import java.util.ServiceLoader; import org.eclipse.jdt.annotation.NonNullByDefault; import org.kohsuke.MetaInfServices; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator; import org.opendaylight.mdsal.yanglib.api.YangLibSupport; import org.opendaylight.mdsal.yanglib.api.YangLibSupportFactory; import org.opendaylight.yangtools.yang.model.parser.api.YangParserException; @@ -18,9 +22,20 @@ import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory; @MetaInfServices @NonNullByDefault public final class YangModuleLibrarySupportFactory implements YangLibSupportFactory { + private final BindingRuntimeGenerator generator; + + public YangModuleLibrarySupportFactory() { + this(ServiceLoader.load(BindingRuntimeGenerator.class).findFirst() + .orElseThrow(() -> new IllegalStateException("Failed to find a BindingRuntimeGenerator service"))); + } + + public YangModuleLibrarySupportFactory(final BindingRuntimeGenerator generator) { + this.generator = requireNonNull(generator); + } + @Override public YangLibSupport createYangLibSupport(final YangParserFactory parserFactory) throws YangParserException, IOException { - return new YangModuleLibrarySupport(parserFactory); + return new YangModuleLibrarySupport(parserFactory, generator); } } diff --git a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java index c6f4e1f843..a92ba781fe 100644 --- a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java +++ b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java @@ -20,7 +20,8 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree; import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.api.BindingIdentityCodec; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; -import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator; import org.opendaylight.mdsal.yanglib.api.SchemaContextResolver; import org.opendaylight.mdsal.yanglib.api.YangLibSupport; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.$YangModuleInfoImpl; @@ -48,8 +49,8 @@ public final class YangLibrarySupport implements YangLibSupport { private final EffectiveModelContext context; @Inject - public YangLibrarySupport(final @Reference YangParserFactory parserFactory) - throws YangParserException, IOException { + public YangLibrarySupport(final @Reference YangParserFactory parserFactory, + final @Reference BindingRuntimeGenerator generator) throws YangParserException, IOException { final YangModuleInfo yangLibModule = $YangModuleInfoImpl.getInstance(); context = parserFactory.createParser() @@ -58,7 +59,7 @@ public final class YangLibrarySupport implements YangLibSupport { .addSource(createSource(yangLibModule)) .buildEffectiveModel(); final BindingCodecTree codecTree = new BindingNormalizedNodeCodecRegistry(BindingRuntimeContext.create( - SimpleStrategy.INSTANCE, context)).getCodecContext(); + generator.generateTypeMapping(context), SimpleStrategy.INSTANCE)).getCodecContext(); this.identityCodec = codecTree.getIdentityCodec(); this.codec = verifyNotNull(codecTree.getSubtreeCodec(InstanceIdentifier.create(YangLibrary.class))); diff --git a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportFactory.java b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportFactory.java index 047df36f5b..03a6d93f44 100644 --- a/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportFactory.java +++ b/yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportFactory.java @@ -7,9 +7,13 @@ */ package org.opendaylight.mdsal.yanglib.rfc8525; +import static java.util.Objects.requireNonNull; + import java.io.IOException; +import java.util.ServiceLoader; import org.eclipse.jdt.annotation.NonNullByDefault; import org.kohsuke.MetaInfServices; +import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator; import org.opendaylight.mdsal.yanglib.api.YangLibSupport; import org.opendaylight.mdsal.yanglib.api.YangLibSupportFactory; import org.opendaylight.yangtools.yang.model.parser.api.YangParserException; @@ -18,9 +22,20 @@ import org.opendaylight.yangtools.yang.model.parser.api.YangParserFactory; @MetaInfServices @NonNullByDefault public final class YangLibrarySupportFactory implements YangLibSupportFactory { + private final BindingRuntimeGenerator generator; + + public YangLibrarySupportFactory() { + this(ServiceLoader.load(BindingRuntimeGenerator.class).findFirst() + .orElseThrow(() -> new IllegalStateException("Failed to find a BindingRuntimeGenerator service"))); + } + + public YangLibrarySupportFactory(final BindingRuntimeGenerator generator) { + this.generator = requireNonNull(generator); + } + @Override public YangLibSupport createYangLibSupport(final YangParserFactory parserFactory) throws YangParserException, IOException { - return new YangLibrarySupport(parserFactory); + return new YangLibrarySupport(parserFactory, generator); } } -- 2.36.6