Split out mdsal-binding-runtime-{api,spi} 09/87909/5
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 19 Feb 2020 11:29:37 +0000 (12:29 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 19 Feb 2020 16:33:27 +0000 (17:33 +0100)
There are a number of runtime details being carried in generator-api
which are pure runtime details.

Split these out, so that we can properly separate the concerns
and cleanup lifecycle. That in turn allows us to create more focused
users and eliminate code duplication.

JIRA: MDSAL-392
Change-Id: I7fe59a3b5f43516d2fcee7344efa97731ebb7215
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
64 files changed:
artifacts/pom.xml
binding/mdsal-binding-dom-adapter/pom.xml
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/FutureSchema.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoaderTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMCursorAwareWriteTransactionAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeCommitCohortAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeWriteCursorAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMMountPointServiceAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingMountPointAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingNormalizedCodecTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModificationTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractDataBrokerTestCustomizer.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/AbstractSchemaAwareTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java
binding/mdsal-binding-dom-codec-api/pom.xml
binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTreeFactory.java
binding/mdsal-binding-dom-codec-osgi/pom.xml
binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextListener.java
binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/BindingRuntimeContextService.java
binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/Activator.java
binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/OsgiModuleInfoRegistry.java
binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/SimpleBindingRuntimeContextService.java
binding/mdsal-binding-dom-codec/pom.xml
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/IdentityCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingRuntimeTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationClassDiscoveredAfterCodecTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java
binding/mdsal-binding-generator-api/pom.xml
binding/mdsal-binding-generator-impl/pom.xml
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/Activator.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/DefaultBindingRuntimeGenerator.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/RuntimeTypeGenerator.java
binding/mdsal-binding-runtime-api/pom.xml [new file with mode: 0644]
binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/binding/runtime/api/BindingRuntimeContext.java [moved from binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api/BindingRuntimeContext.java with 99% similarity]
binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/binding/runtime/api/BindingRuntimeGenerator.java [moved from binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api/BindingRuntimeGenerator.java with 91% similarity]
binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/binding/runtime/api/BindingRuntimeTypes.java [moved from binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api/BindingRuntimeTypes.java with 98% similarity]
binding/mdsal-binding-runtime-api/src/main/java/org/opendaylight/binding/runtime/api/ClassLoadingStrategy.java [moved from binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api/ClassLoadingStrategy.java with 72% similarity]
binding/mdsal-binding-runtime-spi/pom.xml [new file with mode: 0644]
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/BindingRuntimeHelpers.java [new file with mode: 0644]
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/GeneratedClassLoadingStrategy.java [moved from binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/GeneratedClassLoadingStrategy.java with 83% similarity]
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/ModuleInfoBackedContext.java [moved from binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/ModuleInfoBackedContext.java with 92% similarity]
binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/ModuleInfoRegistry.java [moved from binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api/ModuleInfoRegistry.java with 85% similarity]
binding/mdsal-binding-runtime-spi/src/test/java/org/opendaylight/binding/runtime/spi/BindingRuntimeHelpersTest.java [moved from binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/generator/api/package-info.java with 57% similarity]
binding/mdsal-binding-test-utils/pom.xml
binding/pom.xml
docs/pom.xml
entityownership/mdsal-eos-binding-adapter/pom.xml
entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapterTest.java
yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/SimpleStrategy.java
yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupport.java
yanglib/mdsal-yanglib-rfc7895/src/main/java/org/opendaylight/mdsal/yanglib/rfc7895/YangModuleLibrarySupportFactory.java
yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/SimpleStrategy.java
yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupport.java
yanglib/mdsal-yanglib-rfc8525/src/main/java/org/opendaylight/mdsal/yanglib/rfc8525/YangLibrarySupportFactory.java

index 6609d73360f0f6e6be4b932bf159d7542fd00a72..65f8d03883a502dbcad75da4e1897d98d05b3c9e 100644 (file)
                 <artifactId>mdsal-binding-dom-codec-osgi</artifactId>
                 <version>6.0.0-SNAPSHOT</version>
             </dependency>
+            <dependency>
+                <groupId>org.opendaylight.mdsal</groupId>
+                <artifactId>mdsal-binding-runtime-api</artifactId>
+                <version>6.0.0-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>org.opendaylight.mdsal</groupId>
+                <artifactId>mdsal-binding-runtime-spi</artifactId>
+                <version>6.0.0-SNAPSHOT</version>
+            </dependency>
             <dependency>
                 <groupId>org.opendaylight.mdsal</groupId>
                 <artifactId>mdsal-binding-spi</artifactId>
index 4e51157998fe4ceefbebb57a141f36ea1cff6b5e..552f7a68232cbd5876b237addea8cafa3c7fbd27 100644 (file)
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-model-util</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.opendaylight.yangtools</groupId>
-            <artifactId>yang-test-util</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
 
         <dependency>
             <groupId>org.opendaylight.yangtools</groupId>
-            <artifactId>yang-parser-impl</artifactId>
-            <scope>test</scope>
+            <artifactId>yang-test-util</artifactId>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-generator-impl</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-spi</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-test-model</artifactId>
index 0d92e3fc1b4f98dee68be8d126809180fbd1263f..15f48b28e2903748ac83c67c39cbc9cbd7b42ff8 100644 (file)
@@ -11,6 +11,7 @@ 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.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
@@ -32,6 +33,9 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeGenerator;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
@@ -41,9 +45,6 @@ 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.spec.naming.BindingMapping;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
@@ -112,6 +113,18 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory,
         this(generator, classLoadingStrategy, codecRegistry, false);
     }
 
+    @Beta
+    public BindingToNormalizedNodeCodec(final BindingRuntimeContext runtimeContext) {
+        generator = (final SchemaContext context) -> {
+            throw new UnsupportedOperationException("Static context assigned");
+        };
+        classLoadingStrategy = runtimeContext.getStrategy();
+        codecRegistry = new BindingNormalizedNodeCodecRegistry(runtimeContext);
+        // TODO: this should have a specialized constructor or not be needed
+        futureSchema = FutureSchema.create(0, TimeUnit.SECONDS, false);
+        futureSchema.onRuntimeContextUpdated(runtimeContext);
+    }
+
     public BindingToNormalizedNodeCodec(final BindingRuntimeGenerator generator,
             final ClassLoadingStrategy classLoadingStrategy, final BindingNormalizedNodeCodecRegistry codecRegistry,
             final boolean waitForSchema) {
index a4269e42e80b23efe99e252ab9e336190d503e14..a5a6fd2a0fb91c733be3eebbfc3376999188ba34 100644 (file)
@@ -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.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 
index 9dc6e64650d35fb1c24c38e31d5808da4063db51..3e5a2a83d0c84f61c1d6cd0433f60d3c150493c2 100644 (file)
@@ -8,15 +8,12 @@
 package org.opendaylight.mdsal.binding.dom.adapter;
 
 import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
 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;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Grpcont;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Othercont;
@@ -29,12 +26,8 @@ public class ActionLookupTest {
 
     @BeforeClass
     public static void beforeClass() {
-        final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
-        ctx.addModuleInfos(BindingReflections.loadModuleInfos());
-
-        final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class);
-        CODEC = new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(), ctx, registry);
-        CODEC.onGlobalContextUpdated(ctx.tryToCreateModelContext().get());
+        CODEC = new BindingToNormalizedNodeCodec(
+            BindingRuntimeHelpers.createRuntimeContext(new DefaultBindingRuntimeGenerator()));
     }
 
     @AfterClass
index d0a623a85e4a6b3c8f5cd3c1b1792cde04689cba..1da337dda4f02b6c155794b8a15c1cc206797216 100644 (file)
@@ -19,11 +19,11 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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;
 
index 6a058d4bb1a1793ae28712997073dffa27f25738..43d6033dc651b32392538b4c0be2404f174bf4ad 100644 (file)
@@ -15,10 +15,10 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
 import org.junit.Test;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteCursor;
index 149eed6b5792b37b7ed879f4e019d464aa859850..7dba2f3888d7bf60d0074ba05cdc2ccbc359a2d1 100644 (file)
@@ -20,6 +20,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeService;
@@ -27,7 +28,6 @@ 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;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
index ee6d06c814ab8767c81f026c0d33f8f9a1c54424..b31e9c95ec751c382befc6eb11b4031ed27463cf 100644 (file)
@@ -19,12 +19,12 @@ import java.util.Arrays;
 import java.util.Collection;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeCandidate;
index 9d6d2605dfd2916d909ef11e08cfa1db7f54a99d..2b5e33ee123669306e5bebdf9ebad0f1455e5cc8 100644 (file)
@@ -19,10 +19,10 @@ import com.google.common.collect.ImmutableList;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.Deque;
 import org.junit.Test;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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;
 import org.opendaylight.yangtools.yang.binding.DataObject;
index 65abe9edbfb6e250cb8fdf6699f2bf82630a4d9b..6d6bfcf9b40c675ddd12cd5bc298fd8a54788875 100644 (file)
@@ -16,10 +16,10 @@ import static org.mockito.Mockito.mock;
 
 import java.util.Optional;
 import org.junit.Test;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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;
 import org.opendaylight.yangtools.yang.binding.DataObject;
index 0ffbf52f9320c479c0126544aaa5422b68341a95..d3cbffe8fdf4233ae682b9c2b0a47d207e73b31c 100644 (file)
@@ -20,11 +20,11 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
index 8cd1c876fbb11982da4886bee7026ca8d2ee0d96..ecf99d3b5afe7a3c7ea9c768717ee23f23779c08 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.mdsal.binding.dom.adapter;
 
 import static org.junit.Assert.assertNull;
 import static org.mockito.Mockito.mock;
-import static org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy;
+import static org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy;
 
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
index a448a33610a36d091d1e44e9f28aecae6b65a7b3..e19d958e98b8433b0a1e1a7f49df504cb9ffd56f 100644 (file)
@@ -25,10 +25,10 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 import org.junit.Test;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugment;
index acfabd1f9963831618fc510cb8561daf6ec5ffb0..802c039659504294ee816a6c894a8eea04d002c3 100644 (file)
@@ -17,11 +17,11 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
 import org.junit.Test;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeGenerator;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.QName;
index 35608e81b2411a9be394fb746d3b689c3627e03e..90e4fd3a5400cc58e75d34c41a49cfc1cda56c3c 100644 (file)
@@ -13,11 +13,11 @@ import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
 import org.junit.Test;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
index 2ed7574b7cceb8c0d1ecef693c8bd60662918cb6..05112678edec00ade859d04a78e22e6e30e382c5 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.mdsal.binding.dom.adapter.test;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.mdsal.binding.api.NotificationService;
@@ -20,7 +21,6 @@ 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;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
index f327ae1a6ab46570e8537ceb100549bedced0215..9b8505325df0f303f8d7761d10e1e78be3566667 100644 (file)
@@ -13,8 +13,8 @@ import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableSet;
 import java.util.Set;
 import org.junit.Before;
-import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
-import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
+import org.opendaylight.binding.runtime.spi.ModuleInfoBackedContext;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
@@ -26,7 +26,7 @@ public abstract class AbstractSchemaAwareTest {
                 public SchemaContext load(final Set<YangModuleInfo> key) {
                     return ModuleInfoBackedContext.cacheContext(
                         GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), ImmutableSet.copyOf(key))
-                            .tryToCreateSchemaContext().get();
+                            .tryToCreateModelContext().get();
                 }
             });
 
index 22c41ca22e150d270698dd04ae8d9634ac897d7a..fff796002e5c6d9eadc5a1409371ce5de49ad191 100644 (file)
@@ -15,6 +15,8 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Set;
+import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.MountPointService;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
@@ -30,8 +32,6 @@ 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;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
@@ -145,13 +145,7 @@ public class BindingTestContext implements AutoCloseable {
     }
 
     private void updateYangSchema(final Set<YangModuleInfo> moduleInfos) {
-        mockSchemaService.changeSchema(getContext(moduleInfos));
-    }
-
-    private static SchemaContext getContext(final Set<YangModuleInfo> moduleInfos) {
-        final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
-        ctx.addModuleInfos(moduleInfos);
-        return ctx.tryToCreateSchemaContext().get();
+        mockSchemaService.changeSchema(BindingRuntimeHelpers.createEffectiveModel(moduleInfos));
     }
 
     public SchemaContext getContext() {
index 11d358532c95bc6a5637e50b6826a5e87aee6975..d5805f5b0adf7f7cecea54b11fead2105f4626e7 100644 (file)
@@ -30,7 +30,7 @@
         </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
-            <artifactId>mdsal-binding-generator-api</artifactId>
+            <artifactId>mdsal-binding-runtime-api</artifactId>
         </dependency>
 
         <dependency>
index 2b215c0531cbf5d4b3034a1468faf02007364902..934e92aba2bf658a85a2992a35f709e0837c5f40 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.api;
 
-import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 
 public interface BindingCodecTreeFactory {
     /**
index f33c6fbffc04ceaeaf3650423dfe2aad94097f7e..104a21ccc92c74945839d84b1c37904b5554e4af 100644 (file)
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-generator-impl</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-spi</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
index 5e3dfc6039b2e7144897a045d56f8db3c776b04a..42d5bca3939bbf6e990ec4cc6a16a16b8eea4348 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.mdsal.binding.dom.codec.osgi;
 
 import java.util.EventListener;
-import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 
 @Deprecated
 public interface BindingRuntimeContextListener extends EventListener {
index 1fbb7ffd6291dde05661519342b0a602a2412886..76bb58f9bc1e0170c68ac3168d5bab4c39b1ce60 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.mdsal.binding.dom.codec.osgi;
 
 import com.google.common.annotations.Beta;
-import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
 import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider;
 
index 14138ee9b688f8e6c153772265aa9e0bba842ab5..82d0e5af8718536533b3ebe0390c41123bfe3a0d 100644 (file)
@@ -9,9 +9,10 @@ package org.opendaylight.mdsal.binding.dom.codec.osgi.impl;
 
 import java.util.ArrayList;
 import java.util.List;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
+import org.opendaylight.binding.runtime.spi.ModuleInfoBackedContext;
 import org.opendaylight.mdsal.binding.dom.codec.osgi.BindingRuntimeContextService;
-import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
-import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
@@ -30,8 +31,9 @@ public final class Activator implements BundleActivator {
     public void start(final BundleContext context) {
         LOG.info("Binding-DOM codec starting");
 
-        // XXX: this will use thread-context class loader, which is probably appropriate
-        final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create();
+        final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create(
+            // FIXME: This is the fallback strategy, it should not be needed
+            GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
 
         service = new SimpleBindingRuntimeContextService(context, moduleInfoBackedContext, moduleInfoBackedContext);
 
index 3489cb729b6be756a0846445327df1b729bb6d10..f8ff801e18165fdf7f6d359d693741aabd819180 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.mdsal.binding.dom.codec.osgi.impl;
 import static java.util.Objects.requireNonNull;
 
 import org.checkerframework.checker.lock.qual.GuardedBy;
-import org.opendaylight.mdsal.binding.generator.api.ModuleInfoRegistry;
+import org.opendaylight.binding.runtime.spi.ModuleInfoRegistry;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
index 1f2062aab4d0e669d13edf98071a6357638e0fd3..708ce6817e31ca186b816eec6cd041aad3dc17b0 100644 (file)
@@ -12,10 +12,10 @@ import static java.util.Objects.requireNonNull;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import org.checkerframework.checker.lock.qual.GuardedBy;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 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.impl.DefaultBindingRuntimeGenerator;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
index 102016a6313edc90dae54c091b21f53bc8074aa5..efd677f1f74b8e430aec6e317ccec884e102a7cc 100644 (file)
             <artifactId>mdsal-binding-generator-impl</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-spi</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
index 0c8ee001b17ed12df54e436d6b307ce3bc81ebd9..352193bb1d01f607741deb36fa182e57eca34edf 100644 (file)
@@ -33,6 +33,7 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
@@ -40,7 +41,6 @@ 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.spi.BindingSchemaMapping;
-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;
index ef85694e0e5658b868f9b50167449902b922e05a..480eff6db0d3f4880ba3df68117bcaed459efe79 100644 (file)
@@ -23,6 +23,7 @@ import java.util.function.BiFunction;
 import java.util.function.Function;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
@@ -31,7 +32,6 @@ 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.spi.AbstractBindingLazyContainerNode;
-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;
index 760e75bb3bed66e654368f758bcfb13226104588..e32aa88c80d9ddd769e31f37723fb324e1e11b0c 100644 (file)
@@ -20,6 +20,8 @@ import java.util.Optional;
 import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCachingCodec;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter;
@@ -27,8 +29,6 @@ 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.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.BindingObject;
 import org.opendaylight.yangtools.yang.binding.DataObject;
index c213188daea222b56a2150be4d783b71b57d4a8b..22a2f33bf2d11f797c6bf2e6a15b2a60b0c55e5f 100644 (file)
@@ -28,8 +28,8 @@ import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.dom.codec.api.IncorrectNestingException;
-import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
index 5636287637dfad122414ff1a7c628f9e700f4d3b..b18c416a8dedf916e1fc2b31f9e2bdc9cc96983e 100644 (file)
@@ -10,8 +10,8 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingIdentityCodec;
-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;
index fabe3c65364030c61772ddd525dea70cc344a9c7..35fb46550b4d843b740f235da2bb0281958e79d3 100644 (file)
@@ -12,9 +12,9 @@ import java.lang.reflect.Method;
 import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
 import org.opendaylight.mdsal.binding.dom.codec.loader.CodecClassLoader;
-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;
index a8e0ddd532934b18267283c5ccb8eb6cbe338bd4..9401a1913549f008e6dbe22c883bc029ee1d0636 100644 (file)
@@ -9,36 +9,23 @@ 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.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
 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.yangtools.yang.model.api.EffectiveModelContext;
 
 public abstract class AbstractBindingRuntimeTest {
-    private static EffectiveModelContext schemaContext;
     private static BindingRuntimeContext runtimeContext;
 
     @BeforeClass
     public static void beforeClass() {
-        ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
-        ctx.addModuleInfos(BindingReflections.loadModuleInfos());
-        schemaContext = ctx.tryToCreateModelContext().get();
-
-        runtimeContext = BindingRuntimeContext.create(
-            new DefaultBindingRuntimeGenerator().generateTypeMapping(schemaContext), ctx);
+        runtimeContext = BindingRuntimeHelpers.createRuntimeContext(new DefaultBindingRuntimeGenerator());
     }
 
     @AfterClass
     public static void afterClass() {
-        schemaContext = null;
         runtimeContext = null;
     }
 
-    public static final EffectiveModelContext getSchemaContext() {
-        return schemaContext;
-    }
-
     public static final BindingRuntimeContext getRuntimeContext() {
         return runtimeContext;
     }
index a96b7e038ac09175c3be1665efd352b6b9a71293..2c916b7e71357cb898828225779c1e924ae7ca4d 100644 (file)
@@ -15,12 +15,11 @@ import java.util.Map.Entry;
 import java.util.Set;
 import org.junit.Before;
 import org.junit.Test;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
+import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
 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.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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeLeafOnlyAugmentBuilder;
@@ -31,7 +30,6 @@ 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.EffectiveModelContext;
 
 /**
  * This sets of tests are designed in way, that schema context contains models for all augmentations, but backing class
@@ -41,21 +39,18 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
  * The idea of this suite is to test that codecs will work even if situation like this happens.
  */
 public class AugmentationClassDiscoveredAfterCodecTest {
-
-    private EffectiveModelContext schemaContext;
-    private BindingRuntimeContext runtimeContext;
-    private ClassExcludingClassLoadingStrategy mockedContext;
     private BindingNormalizedNodeCodecRegistry registry;
+    private FilteringClassLoadingStrategy filter;
 
     @Before
     public void setup() {
-        final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
-        ctx.addModuleInfos(BindingReflections.loadModuleInfos());
-        mockedContext = new ClassExcludingClassLoadingStrategy(ctx);
-        schemaContext = ctx.tryToCreateModelContext().get();
-        runtimeContext = BindingRuntimeContext.create(
-            new DefaultBindingRuntimeGenerator().generateTypeMapping(schemaContext), mockedContext);
-        registry = new BindingNormalizedNodeCodecRegistry(runtimeContext);
+        // Baseline state: strategy is cognizant of the classes
+        final BindingRuntimeContext delegate = BindingRuntimeHelpers.createRuntimeContext(
+            new DefaultBindingRuntimeGenerator());
+
+        // Class loading filter, manipulated by tests
+        filter = new FilteringClassLoadingStrategy(delegate.getStrategy());
+        registry = new BindingNormalizedNodeCodecRegistry(BindingRuntimeContext.create(delegate.getTypes(), filter));
     }
 
     private static final TopLevelListKey TOP_FOO_KEY = new TopLevelListKey("foo");
@@ -64,19 +59,16 @@ public class AugmentationClassDiscoveredAfterCodecTest {
     private static final InstanceIdentifier<TreeLeafOnlyAugment> BA_TREE_LEAF_ONLY = BA_TOP_LEVEL_LIST
             .augmentation(TreeLeafOnlyAugment.class);
 
-
-
     @Test(expected = MissingClassInLoadingStrategyException.class)
     public void testCorrectExceptionThrown() {
         materializeWithExclusions(TreeLeafOnlyAugment.class, TreeComplexUsesAugment.class);
         registry.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY);
     }
 
-
     @Test
     public void testUsingBindingInstanceIdentifier() {
         materializeWithExclusions(TreeLeafOnlyAugment.class, TreeComplexUsesAugment.class);
-        mockedContext.includeClass(TreeLeafOnlyAugment.class);
+        filter.includeClass(TreeLeafOnlyAugment.class);
         final YangInstanceIdentifier domYY = registry.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY);
         assertNotNull(domYY);
     }
@@ -84,7 +76,7 @@ public class AugmentationClassDiscoveredAfterCodecTest {
     @Test
     public void testUsingBindingData() {
         materializeWithExclusions(TreeLeafOnlyAugment.class, TreeComplexUsesAugment.class);
-        mockedContext.includeClass(TreeLeafOnlyAugment.class);
+        filter.includeClass(TreeLeafOnlyAugment.class);
         final TopLevelList data =
                 new TopLevelListBuilder()
                         .withKey(TOP_FOO_KEY)
@@ -95,18 +87,20 @@ public class AugmentationClassDiscoveredAfterCodecTest {
         assertNotNull(domData);
     }
 
-
     private void materializeWithExclusions(final Class<?>... clzToExclude) {
         for (final Class<?> clz : clzToExclude) {
-            mockedContext.excludeClass(clz);
+            filter.excludeClass(clz);
         }
         registry.toYangInstanceIdentifier(BA_TOP_LEVEL_LIST);
     }
 
-    private static class ClassExcludingClassLoadingStrategy extends GeneratedClassLoadingStrategy {
-
+    private static final class FilteringClassLoadingStrategy implements ClassLoadingStrategy {
         private final Set<String> exclusions = new HashSet<>();
-        private final GeneratedClassLoadingStrategy delegate;
+        private final ClassLoadingStrategy delegate;
+
+        FilteringClassLoadingStrategy(final ClassLoadingStrategy delegate) {
+            this.delegate = requireNonNull(delegate);
+        }
 
         void excludeClass(final Class<?> clz) {
             exclusions.add(clz.getName());
@@ -116,10 +110,6 @@ public class AugmentationClassDiscoveredAfterCodecTest {
             exclusions.remove(clz.getName());
         }
 
-        protected ClassExcludingClassLoadingStrategy(final GeneratedClassLoadingStrategy delegate) {
-            this.delegate = requireNonNull(delegate);
-        }
-
         @Override
         public Class<?> loadClass(final String fullyQualifiedName) throws ClassNotFoundException {
             if (exclusions.contains(fullyQualifiedName)) {
index f876e2e98dc4d280cccdc194466e5d44e1b2676d..86183a8e610b539541370000a75c67480f026b8c 100644 (file)
@@ -8,13 +8,11 @@
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import org.junit.Test;
+import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
 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.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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
@@ -22,10 +20,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.yangtools.test.union.rev150121.LowestLevel1;
 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.EffectiveModelContext;
 
 public class ExceptionReportingTest {
     private static final BindingNormalizedNodeCodecRegistry CODEC_WITHOUT_TOP = codec(LowestLevel1.class);
@@ -77,20 +73,7 @@ public class ExceptionReportingTest {
 
     @SuppressWarnings("checkstyle:illegalCatch")
     private static BindingNormalizedNodeCodecRegistry codec(final Class<?>... classes) {
-        final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
-        for (final Class<?> clazz : classes) {
-            YangModuleInfo modInfo;
-            try {
-                modInfo = BindingReflections.getModuleInfo(clazz);
-                ctx.registerModuleInfo(modInfo);
-            } catch (final Exception e) {
-                throw new IllegalStateException(e);
-            }
-        }
-        final EffectiveModelContext schema = ctx.tryToCreateModelContext().get();
-        final BindingRuntimeContext runtimeCtx = BindingRuntimeContext.create(
-            new DefaultBindingRuntimeGenerator().generateTypeMapping(schema), ctx);
-        final BindingNormalizedNodeCodecRegistry registry = new BindingNormalizedNodeCodecRegistry(runtimeCtx);
-        return registry;
+        return new BindingNormalizedNodeCodecRegistry(BindingRuntimeHelpers.createRuntimeContext(
+            new DefaultBindingRuntimeGenerator(), classes));
     }
 }
index 6e9ac4ec06c1d763d14de5abb233b7c127b63248..ba4bfa5601ebf3c3400106a62aede4ec3e7648da 100644 (file)
     <dependencies>
         <dependency>
             <groupId>org.opendaylight.yangtools</groupId>
-            <artifactId>yang-model-util</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.opendaylight.yangtools</groupId>
-            <artifactId>yang-data-api</artifactId>
+            <artifactId>yang-model-api</artifactId>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
index a56dc23b02484fc4c53ebe8499c40cdcbc453486..e4211ba5dc2df72f9d941659fd8d136b36d83ca1 100644 (file)
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-data-api</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.opendaylight.yangtools</groupId>
-            <artifactId>yang-parser-impl</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-generator-api</artifactId>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-generator-util</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-api</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>javax.inject</groupId>
index 96fbda42858f403baed2a174c3653106965dd6e3..072610718be9ce7109c8ed54e208d6a32c267ddd 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.mdsal.binding.generator.impl;
 
 import com.google.common.annotations.Beta;
-import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator;
+import org.opendaylight.binding.runtime.api.BindingRuntimeGenerator;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 
index 261f9fc2af9529ed4cdeed79042dd7e5ca099a63..768f29360f0ae16e37a4099ed9e47bbd1e5f6d04 100644 (file)
@@ -12,8 +12,8 @@ import java.util.IdentityHashMap;
 import java.util.Map;
 import javax.inject.Singleton;
 import org.kohsuke.MetaInfServices;
-import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeGenerator;
-import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeTypes;
+import org.opendaylight.binding.runtime.api.BindingRuntimeGenerator;
+import org.opendaylight.binding.runtime.api.BindingRuntimeTypes;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
index 6e0320c5fd5f064b6348ab11ef0a117cd4db1577..1402fda03799d6cf059270856c12e74f4873ed80 100644 (file)
@@ -17,7 +17,7 @@ import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.generator.api.BindingRuntimeTypes;
+import org.opendaylight.binding.runtime.api.BindingRuntimeTypes;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
diff --git a/binding/mdsal-binding-runtime-api/pom.xml b/binding/mdsal-binding-runtime-api/pom.xml
new file mode 100644 (file)
index 0000000..a382d2e
--- /dev/null
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.opendaylight.mdsal</groupId>
+        <artifactId>dom-parent</artifactId>
+        <version>6.0.0-SNAPSHOT</version>
+        <relativePath>../../dom/dom-parent</relativePath>
+    </parent>
+
+    <artifactId>mdsal-binding-runtime-api</artifactId>
+    <packaging>bundle</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-data-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-model-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-spec-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-generator-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>mockito-configuration</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <Automatic-Module-Name>org.opendaylight.mdsal.binding.runtime.api</Automatic-Module-Name>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
@@ -5,7 +5,7 @@
  * 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.api;
+package org.opendaylight.binding.runtime.api;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
@@ -113,6 +113,10 @@ public final class BindingRuntimeContext implements SchemaContextProvider, Immut
         return strategy;
     }
 
+    public @NonNull BindingRuntimeTypes getTypes() {
+        return runtimeTypes;
+    }
+
     /**
      * Returns an stable immutable view of schema context associated with this Binding runtime context.
      *
@@ -5,10 +5,11 @@
  * 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.api;
+package org.opendaylight.binding.runtime.api;
 
 import com.google.common.annotations.Beta;
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.mdsal.binding.generator.api.BindingGenerator;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 /**
@@ -5,7 +5,7 @@
  * 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.api;
+package org.opendaylight.binding.runtime.api;
 
 import static java.util.Objects.requireNonNull;
 
@@ -5,13 +5,15 @@
  * 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.api;
+package org.opendaylight.binding.runtime.api;
 
 import org.opendaylight.mdsal.binding.model.api.Type;
 
 public interface ClassLoadingStrategy {
 
-    Class<?> loadClass(Type type) throws ClassNotFoundException;
+    default Class<?> loadClass(final Type type) throws ClassNotFoundException {
+        return loadClass(type.getFullyQualifiedName());
+    }
 
     Class<?> loadClass(String fullyQualifiedName) throws ClassNotFoundException;
 }
diff --git a/binding/mdsal-binding-runtime-spi/pom.xml b/binding/mdsal-binding-runtime-spi/pom.xml
new file mode 100644 (file)
index 0000000..0e01dd9
--- /dev/null
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.opendaylight.mdsal</groupId>
+        <artifactId>dom-parent</artifactId>
+        <version>6.0.0-SNAPSHOT</version>
+        <relativePath>../../dom/dom-parent</relativePath>
+    </parent>
+
+    <artifactId>mdsal-binding-runtime-spi</artifactId>
+    <packaging>bundle</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-data-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-parser-impl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-spec-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>mockito-configuration</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-test-model</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-generator-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <Automatic-Module-Name>org.opendaylight.mdsal.binding.runtime.spi</Automatic-Module-Name>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/BindingRuntimeHelpers.java b/binding/mdsal-binding-runtime-spi/src/main/java/org/opendaylight/binding/runtime/spi/BindingRuntimeHelpers.java
new file mode 100644 (file)
index 0000000..d2a0f0b
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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.binding.runtime.spi;
+
+import com.google.common.annotations.Beta;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeGenerator;
+import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
+import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+
+/**
+ * Simple helpers to help with reconstruction of BindingRuntimeContext from generated binding classes. These involve
+ * reflection and YANG model assembly, hence should not be used without any caching whatsoever or any support for
+ * dynamic schema updates.
+ */
+@Beta
+public final class BindingRuntimeHelpers {
+    private BindingRuntimeHelpers() {
+
+    }
+
+    public static @NonNull EffectiveModelContext createEffectiveModel(final Class<?>... classes) {
+        return createEffectiveModel(Arrays.stream(classes)
+            .map(BindingRuntimeHelpers::extractYangModuleInfo)
+            .collect(Collectors.toList()));
+    }
+
+    public static @NonNull EffectiveModelContext createEffectiveModel(
+            final Iterable<? extends YangModuleInfo> moduleInfos) {
+        return prepareContext(moduleInfos).tryToCreateModelContext().orElseThrow();
+    }
+
+    public static @NonNull BindingRuntimeContext createRuntimeContext(final BindingRuntimeGenerator generator) {
+        final ModuleInfoBackedContext ctx = prepareContext(BindingReflections.loadModuleInfos());
+        return BindingRuntimeContext.create(generator.generateTypeMapping(ctx.tryToCreateModelContext().orElseThrow()),
+            ctx);
+    }
+
+    public static @NonNull BindingRuntimeContext createRuntimeContext(final BindingRuntimeGenerator generator,
+            final Class<?>... classes) {
+        final ModuleInfoBackedContext ctx = prepareContext(Arrays.stream(classes)
+            .map(BindingRuntimeHelpers::extractYangModuleInfo)
+            .collect(Collectors.toList()));
+        return BindingRuntimeContext.create(generator.generateTypeMapping(ctx.tryToCreateModelContext().orElseThrow()),
+            ctx);
+    }
+
+    @SuppressWarnings("checkstyle:IllegalCatch")
+    static YangModuleInfo extractYangModuleInfo(final Class<?> clazz) {
+        try {
+            return BindingReflections.getModuleInfo(clazz);
+        } catch (Exception e) {
+            throw new IllegalStateException("Failed to extract module info from " + clazz, e);
+        }
+    }
+
+    private static ModuleInfoBackedContext prepareContext(final Iterable<? extends YangModuleInfo> moduleInfos) {
+        final ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create(
+            // FIXME: This is the fallback strategy, it should not be needed
+            GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
+        ctx.addModuleInfos(moduleInfos);
+        return ctx;
+    }
+}
@@ -5,13 +5,14 @@
  * 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.impl;
+package org.opendaylight.binding.runtime.spi;
 
+import com.google.common.annotations.Beta;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
-import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 import org.opendaylight.yangtools.util.ClassLoaderUtils;
 
+@Beta
 public abstract class GeneratedClassLoadingStrategy implements ClassLoadingStrategy {
     private static final class AlwaysFailClassLoadingStrategy extends GeneratedClassLoadingStrategy {
         static final @NonNull AlwaysFailClassLoadingStrategy INSTANCE = new AlwaysFailClassLoadingStrategy();
@@ -42,9 +43,4 @@ public abstract class GeneratedClassLoadingStrategy implements ClassLoadingStrat
     public static final @NonNull GeneratedClassLoadingStrategy getAlwaysFailClassLoadingStrategy() {
         return AlwaysFailClassLoadingStrategy.INSTANCE;
     }
-
-    @Override
-    public Class<?> loadClass(final Type type) throws ClassNotFoundException {
-        return loadClass(type.getFullyQualifiedName());
-    }
 }
@@ -5,7 +5,7 @@
  * 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.impl;
+package org.opendaylight.binding.runtime.spi;
 
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
@@ -32,10 +32,9 @@ 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.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeGenerator;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
@@ -43,8 +42,7 @@ import org.opendaylight.yangtools.util.ClassLoaderUtils;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
 import org.opendaylight.yangtools.yang.model.parser.api.YangSyntaxErrorException;
 import org.opendaylight.yangtools.yang.model.repo.api.RevisionSourceIdentifier;
 import org.opendaylight.yangtools.yang.model.repo.api.SchemaSourceException;
@@ -56,8 +54,9 @@ import org.opendaylight.yangtools.yang.parser.repo.YangTextSchemaSourceRegistrat
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Beta
 public final class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy
-        implements ModuleInfoRegistry, SchemaContextProvider, SchemaSourceProvider<YangTextSchemaSource> {
+        implements ModuleInfoRegistry, EffectiveModelContextProvider, SchemaSourceProvider<YangTextSchemaSource> {
     private abstract static class AbstractRegisteredModuleInfo {
         final YangTextSchemaSourceRegistration reg;
         final YangModuleInfo info;
@@ -151,17 +150,13 @@ public final class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy
         return CONTEXT_CACHES.getUnchecked(loadingStrategy).getUnchecked(infos);
     }
 
-    public static ModuleInfoBackedContext create() {
-        return new ModuleInfoBackedContext(getTCCLClassLoadingStrategy());
-    }
-
     public static ModuleInfoBackedContext create(final ClassLoadingStrategy loadingStrategy) {
         return new ModuleInfoBackedContext(loadingStrategy);
     }
 
     @Override
-    public SchemaContext getSchemaContext() {
-        final Optional<? extends SchemaContext> contextOptional = tryToCreateSchemaContext();
+    public EffectiveModelContext getEffectiveModelContext() {
+        final Optional<? extends EffectiveModelContext> contextOptional = tryToCreateModelContext();
         checkState(contextOptional.isPresent(), "Unable to recreate SchemaContext, error while parsing");
         return contextOptional.get();
     }
@@ -185,14 +180,7 @@ public final class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy
             }
 
             final Class<?> cls = backingLoadingStrategy.loadClass(fullyQualifiedName);
-            final YangModuleInfo moduleInfo;
-            try {
-                moduleInfo = BindingReflections.getModuleInfo(cls);
-            } catch (Exception e) {
-                throw new IllegalStateException("Failed to resolve module information for class " + cls, e);
-            }
-
-            registerImplicitModuleInfo(requireNonNull(moduleInfo));
+            registerImplicitModuleInfo(BindingRuntimeHelpers.extractYangModuleInfo(cls));
             return cls;
         }
     }
@@ -222,11 +210,6 @@ public final class ModuleInfoBackedContext extends GeneratedClassLoadingStrategy
     // TODO finish schema parsing and expose as SchemaService
     // Unite with current SchemaService
 
-    @Deprecated
-    public Optional<? extends SchemaContext> tryToCreateSchemaContext() {
-        return ctxResolver.getSchemaContext();
-    }
-
     public Optional<? extends EffectiveModelContext> tryToCreateModelContext() {
         return ctxResolver.getEffectiveModelContext();
     }
@@ -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.binding.runtime.spi;
 
-package org.opendaylight.mdsal.binding.generator.api;
-
+import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 
+@Beta
 public interface ModuleInfoRegistry {
 
     ObjectRegistration<YangModuleInfo> registerModuleInfo(YangModuleInfo yangModuleInfo);
@@ -1,8 +1,12 @@
 /*
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * 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.api;
\ No newline at end of file
+package org.opendaylight.binding.runtime.spi;
+
+public class BindingRuntimeHelpersTest {
+
+}
index 0168f84f5d2e705b560df9a5319bcb053b4c0543..ba5bfe7a64b77fbe95d1d225154d20330177a174 100644 (file)
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-generator-impl</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-spi</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-dom-adapter</artifactId>
index f781e931140289af3a05018a16e0ba47c2e88760..bdcb0f4892ff24ca71d59ddd28cdee8dff5300c2 100644 (file)
         <module>yang-binding</module>
         <module>mdsal-binding-spec-util</module>
 
+        <!-- Binding Runtime Services, dealing with class/schema mapping -->
+        <module>mdsal-binding-runtime-api</module>
+        <module>mdsal-binding-runtime-spi</module>
+
         <module>mdsal-binding-test-model</module>
         <module>mdsal-binding-dom-codec</module>
         <module>mdsal-binding-dom-codec-api</module>
index 323ea8ca760d3f1746bead3f0731c11d9a5823bf..8f59477f5791f95ebe4c30a1ebeb4d82540b3047 100644 (file)
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-dom-codec-osgi</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-spi</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>mdsal-binding-spi</artifactId>
index 3c6428f6e432b189b255d696aeaaedae145f9898..1603a21de20938294f778e2727fabd9ac7650a5c 100644 (file)
             <artifactId>mdsal-binding-generator-impl</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.mdsal</groupId>
+            <artifactId>mdsal-binding-runtime-spi</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
     <scm>
         <connection>scm:git:http://git.opendaylight.org/gerrit/controller.git</connection>
index 64c1823340de491f427a324de7d8c69f86e2f523..a01a53e12411b0500d40180f9172cc85a808b876 100644 (file)
@@ -23,10 +23,10 @@ import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
 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;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipChange;
index 7b1e463317737b4b9354a7821b3b1c1b7351b9af..9de03a0e50046663fc1342b562ba9de7778ceab5 100644 (file)
@@ -7,17 +7,11 @@
  */
 package org.opendaylight.mdsal.yanglib.rfc7895;
 
-import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
-import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 
 final class SimpleStrategy implements ClassLoadingStrategy {
     static final SimpleStrategy INSTANCE = new SimpleStrategy();
 
-    @Override
-    public Class<?> loadClass(final Type type) throws ClassNotFoundException {
-        return loadClass(type.getFullyQualifiedName());
-    }
-
     @Override
     public Class<?> loadClass(final String fullyQualifiedName) throws ClassNotFoundException {
         return SimpleStrategy.class.getClassLoader().loadClass(fullyQualifiedName);
index 70fdd8d7bac2d3e5381f92019f8ee165a973530b..0adca0f5131e28104c97db38e1844ce7f4bf681c 100644 (file)
@@ -16,11 +16,11 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.aries.blueprint.annotation.service.Reference;
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeGenerator;
 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.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;
index a6e38c60c568fc1a1cd6371fe3308639197e58a3..3d1592627ae2522f4b616d8fce0eb5786441eaf8 100644 (file)
@@ -13,7 +13,7 @@ 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.binding.runtime.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;
index f2f2b0c6c4111afc4c69a11ce5587230e5b0685c..4d1a55e6a68af00c45fbd4fa66c5ea6c127b5b85 100644 (file)
@@ -7,17 +7,11 @@
  */
 package org.opendaylight.mdsal.yanglib.rfc8525;
 
-import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
-import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 
 final class SimpleStrategy implements ClassLoadingStrategy {
     static final SimpleStrategy INSTANCE = new SimpleStrategy();
 
-    @Override
-    public Class<?> loadClass(final Type type) throws ClassNotFoundException {
-        return loadClass(type.getFullyQualifiedName());
-    }
-
     @Override
     public Class<?> loadClass(final String fullyQualifiedName) throws ClassNotFoundException {
         return SimpleStrategy.class.getClassLoader().loadClass(fullyQualifiedName);
index a92ba781fe6d01ef4aa3a788a3209c004fcea561..3ab15f18fc8ab72e6709591ee56d63f76e841ee0 100644 (file)
@@ -16,12 +16,12 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.aries.blueprint.annotation.service.Reference;
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.binding.runtime.api.BindingRuntimeGenerator;
 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.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;
index 03a6d93f445437801ee55c4defc0f281b9abe295..b5aa7dd4e1f56fba8166c40a2c2982fb41dc1108 100644 (file)
@@ -13,7 +13,7 @@ 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.binding.runtime.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;