Refactor binding-dom-adapter 40/89040/10
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 12 Apr 2020 11:35:02 +0000 (13:35 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 16 Apr 2020 10:57:11 +0000 (12:57 +0200)
BindingNormalizedNodeCodecRegistry is a serializer which allows
dynamic updates to its backing codec. Rather than referencing this
implementation, reference either BindingNormalizedNodeSerializer
(interface) or BindingCodecContext, which is the simple implentation.

This makes it obvious we are not using BindingNormalizedNodeCodecRegistry
in the context of mdsal-binding-dom-codec at all, making it a good
candidate to move to mdsal-binding-dom-adapter. Except we do not want
to just move it, but refactor so that it is properly controlled.

Change-Id: I2be67ed78ac89da5c5b5ec7322d03e769d2826c6
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
108 files changed:
binding/mdsal-binding-dom-adapter/pom.xml
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractAdapterFactory.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractBindingAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractBindingLoadingAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractForwardedTransaction.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionProviderServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AdapterContext.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingAdapterFactory.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingClusteredDOMDataTreeChangeListenerAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterBuilder.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMAdapterLoader.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMCursorAwareWriteTransactionAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataBrokerAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeListenerAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeChangeServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeCommitCohortAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeCommitCohortRegistryAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeListenerAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeProducerAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeWriteCursorAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMMountPointListenerAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMMountPointServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationListenerAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationPublishServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadTransactionAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMReadWriteTransactionAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcProviderServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMTransactionChainAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMWriteTransactionAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingMountPointAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingOperationFluentFuture.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java [deleted file]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ConstantAdapterContext.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/OSGiBindingAdapterFactory.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/OSGiBlockingBindingNormalizer.java [new file with mode: 0644]
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/osgi/DynamicBindingAdapter.java
binding/mdsal-binding-dom-adapter/src/main/resources/org/opendaylight/blueprint/binding-adapter.xml [deleted file]
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractAdapterTest.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/BindingDOMDataTreeCommitCohortRegistryAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeProducerAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMDataTreeServiceAdapterTest.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/BindingDOMMountPointListenerAdapterTest.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/BindingDOMRpcImplementationAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcIntegrationTest.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 [deleted file]
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/CurrentAdapterSerializerTest.java [moved from binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodecTest.java with 74% similarity]
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDOMRpcResultFutureTest.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/LazySerializedContainerNodeTest.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/AbstractNotificationBrokerTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Mdsal500Test.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/BindingTestContext.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/MockAdapterContext.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec-osgi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/osgi/impl/GlobalBindingDOMCodecServices.java
binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/BindingDOMCodecServices.java
binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/ForwardingBindingDOMCodecServices.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 [deleted file]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/RpcInputCodec.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingCodecTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ActionSerializeDeserializeTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnydataLeafTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/AnyxmlLeafTest.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/AugmentationSubstitutionTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/BinaryKeyTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5524augmentUses.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Bug5845booleanKeyTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingCodecTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/CaseSubstitutionTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/EmptyLeafTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/ExceptionReportingTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/InstanceIdentifierSerializeDeserializeTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/InstanceIdentifierTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/KeyInheritenceTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/LeafReferenceTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/LeafrefSerializeDeserializeTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/NormalizedNodeSerializeDeserializeTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationProcessingTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/RpcDataSerializationTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/TopLevelContainerViaUsesTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/TypedefTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionTypeTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionTypeWithIdentityrefTest.java
entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapter.java
entityownership/mdsal-eos-binding-adapter/src/main/java/org/opendaylight/mdsal/eos/binding/dom/adapter/DOMEntityOwnershipListenerAdapter.java
entityownership/mdsal-eos-binding-adapter/src/main/resources/org/opendaylight/blueprint/eos-binding.xml
entityownership/mdsal-eos-binding-adapter/src/test/java/org/opendaylight/mdsal/eos/binding/dom/adapter/BindingDOMEntityOwnershipServiceAdapterTest.java

index 552f7a68232cbd5876b237addea8cafa3c7fbd27..6dfaba269fd57e00daf1588bb18c94d876443452 100644 (file)
     <packaging>bundle</packaging>
 
     <dependencies>
-        <dependency>
-            <groupId>javax.inject</groupId>
-            <artifactId>javax.inject</artifactId>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>javax.annotation</groupId>
-            <artifactId>javax.annotation-api</artifactId>
-            <optional>true</optional>
-        </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
             <groupId>org.opendaylight.yangtools</groupId>
             <artifactId>yang-model-util</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.kohsuke.metainf-services</groupId>
+            <artifactId>metainf-services</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>javax.inject</groupId>
+            <artifactId>javax.inject</artifactId>
+            <optional>true</optional>
+        </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.cmpn</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.opendaylight.yangtools</groupId>
diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractAdapterFactory.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractAdapterFactory.java
new file mode 100644 (file)
index 0000000..2865d33
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * 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.dom.adapter;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.api.ActionProviderService;
+import org.opendaylight.mdsal.binding.api.ActionService;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeService;
+import org.opendaylight.mdsal.binding.api.MountPointService;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.mdsal.binding.dom.adapter.spi.AdapterFactory;
+import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
+import org.opendaylight.mdsal.dom.api.DOMActionService;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
+import org.opendaylight.mdsal.dom.api.DOMMountPointService;
+import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
+import org.opendaylight.mdsal.dom.api.DOMNotificationService;
+import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
+import org.opendaylight.mdsal.dom.api.DOMRpcService;
+
+abstract class AbstractAdapterFactory implements AdapterFactory {
+    @Override
+    public final DataBroker createDataBroker(final DOMDataBroker domService) {
+        return new BindingDOMDataBrokerAdapter(context(), domService);
+    }
+
+    @Override
+    public final DataTreeService createDataTreeService(final DOMDataTreeService domService) {
+        return new BindingDOMDataTreeServiceAdapter(context(), domService);
+    }
+
+    @Override
+    public final MountPointService createMountPointService(final DOMMountPointService domService) {
+        return new BindingDOMMountPointServiceAdapter(context(), domService);
+    }
+
+    @Override
+    public final NotificationService createNotificationService(final DOMNotificationService domService) {
+        return new BindingDOMNotificationServiceAdapter(context(), domService);
+    }
+
+    @Override
+    public final NotificationPublishService createNotificationPublishService(
+            final DOMNotificationPublishService domService) {
+        return new BindingDOMNotificationPublishServiceAdapter(context(), domService);
+    }
+
+    @Override
+    public final RpcConsumerRegistry createRpcConsumerRegistry(final DOMRpcService domService) {
+        return new BindingDOMRpcServiceAdapter(context(), domService);
+    }
+
+    @Override
+    public final RpcProviderService createRpcProviderService(final DOMRpcProviderService domService) {
+        return new BindingDOMRpcProviderServiceAdapter(context(), domService);
+    }
+
+    @Override
+    public final ActionService createActionService(final DOMActionService domService) {
+        return new ActionServiceAdapter(context(), domService);
+    }
+
+    @Override
+    public final ActionProviderService createActionProviderService(final DOMActionProviderService domService) {
+        return new ActionProviderServiceAdapter(context(), domService);
+    }
+
+    abstract @NonNull AdapterContext context();
+}
index 3aa8ad6581a5d91305b140a3d038d9a918dd8433..b94aedd1d53ff5c3c6984a62b9976d8598e40586 100644 (file)
@@ -14,11 +14,11 @@ import org.opendaylight.yangtools.concepts.Delegator;
 
 @NonNullByDefault
 abstract class AbstractBindingAdapter<T> implements Delegator<T> {
-    private final BindingToNormalizedNodeCodec codec;
+    private final AdapterContext adapterContext;
     private final T delegate;
 
-    AbstractBindingAdapter(final BindingToNormalizedNodeCodec codec, final T delegate) {
-        this.codec = requireNonNull(codec);
+    AbstractBindingAdapter(final AdapterContext adapterContext, final T delegate) {
+        this.adapterContext = requireNonNull(adapterContext);
         this.delegate = requireNonNull(delegate);
     }
 
@@ -27,7 +27,11 @@ abstract class AbstractBindingAdapter<T> implements Delegator<T> {
         return delegate;
     }
 
-    protected final BindingToNormalizedNodeCodec getCodec() {
-        return codec;
+    protected final AdapterContext adapterContext() {
+        return adapterContext;
+    }
+
+    protected final CurrentAdapterSerializer currentSerializer() {
+        return adapterContext.currentSerializer();
     }
 }
index 2f960c034dbe30e91bd6e639c5b32ef09649cfa4..04534ae6f8a66e6fd14d66b136d025852e895491 100644 (file)
@@ -22,8 +22,8 @@ abstract class AbstractBindingLoadingAdapter<D, K, V> extends AbstractBindingAda
             }
         });
 
-    AbstractBindingLoadingAdapter(final BindingToNormalizedNodeCodec codec, final D delegate) {
-        super(codec, delegate);
+    AbstractBindingLoadingAdapter(final AdapterContext adapterContext, final D delegate) {
+        super(adapterContext, delegate);
     }
 
     final V getAdapter(final K key) {
index 28b63ec8b9e16856fb21b1bf423b301d194c2c8f..18f7e790566a1718e68922065ed2b8a8d8f94377 100644 (file)
@@ -22,16 +22,17 @@ import org.opendaylight.yangtools.concepts.Delegator;
 import org.opendaylight.yangtools.concepts.Identifiable;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 
 abstract class AbstractForwardedTransaction<T extends DOMDataTreeTransaction> implements Delegator<T>,
         Identifiable<Object> {
 
-    private final @NonNull BindingToNormalizedNodeCodec codec;
+    private final @NonNull AdapterContext adapterContext;
     private final @NonNull T delegate;
 
-    AbstractForwardedTransaction(final T delegateTx, final BindingToNormalizedNodeCodec codec) {
+    AbstractForwardedTransaction(final AdapterContext adapterContext, final T delegateTx) {
+        this.adapterContext = requireNonNull(adapterContext, "Codec must not be null");
         this.delegate = requireNonNull(delegateTx, "Delegate must not be null");
-        this.codec = requireNonNull(codec, "Codec must not be null");
     }
 
     @Override
@@ -49,8 +50,8 @@ abstract class AbstractForwardedTransaction<T extends DOMDataTreeTransaction> im
         return txType.cast(delegate);
     }
 
-    protected final BindingToNormalizedNodeCodec getCodec() {
-        return codec;
+    protected final AdapterContext adapterContext() {
+        return adapterContext;
     }
 
     protected final <D extends DataObject> @NonNull FluentFuture<Optional<D>> doRead(
@@ -58,13 +59,17 @@ abstract class AbstractForwardedTransaction<T extends DOMDataTreeTransaction> im
             final InstanceIdentifier<D> path) {
         checkArgument(!path.isWildcarded(), "Invalid read of wildcarded path %s", path);
 
-        return readOps.read(store, codec.toYangInstanceIdentifierBlocking(path))
-                .transform(codec.getCodecRegistry().deserializeFunction(path)::apply, MoreExecutors.directExecutor());
+        final CurrentAdapterSerializer codec = adapterContext.currentSerializer();
+        final YangInstanceIdentifier domPath = codec.toYangInstanceIdentifier(path);
+
+        return readOps.read(store, domPath)
+                .transform(optData -> optData.map(domData -> (D) codec.fromNormalizedNode(domPath, domData).getValue()),
+                    MoreExecutors.directExecutor());
     }
 
     protected final @NonNull FluentFuture<Boolean> doExists(final DOMDataTreeReadOperations readOps,
             final LogicalDatastoreType store, final InstanceIdentifier<?> path) {
         checkArgument(!path.isWildcarded(), "Invalid exists of wildcarded path %s", path);
-        return readOps.exists(store, codec.toYangInstanceIdentifierBlocking(path));
+        return readOps.exists(store, adapterContext.currentSerializer().toYangInstanceIdentifier(path));
     }
 }
index 7cfc1a7adb115d86ef66511780382ca793d798f4..adcc42423697cd7076b668544f295f3149b18500 100644 (file)
@@ -34,15 +34,16 @@ final class ActionAdapter extends AbstractBindingAdapter<DOMActionService> imple
     private final NodeIdentifier inputName;
     private final SchemaPath schemaPath;
 
-    ActionAdapter(final BindingToNormalizedNodeCodec codec, final DOMActionService delegate,
+    ActionAdapter(final AdapterContext codec, final DOMActionService delegate,
             final Class<? extends Action<?, ?, ?>> type) {
         super(codec, delegate);
         this.type = requireNonNull(type);
-        this.schemaPath = getCodec().getActionPath(type);
+        this.schemaPath = currentSerializer().getActionPath(type);
         this.inputName = NodeIdentifier.create(operationInputQName(schemaPath.getLastComponent().getModule()));
     }
 
-    @Override public @Nullable Object invoke(final @Nullable Object proxy, final @Nullable Method method,
+    @Override
+    public @Nullable Object invoke(final @Nullable Object proxy, final @Nullable Method method,
             final Object @Nullable [] args) throws Throwable {
         switch (method.getName()) {
             case "equals":
@@ -64,10 +65,11 @@ final class ActionAdapter extends AbstractBindingAdapter<DOMActionService> imple
                 if (args.length == 2) {
                     final InstanceIdentifier<?> path = (InstanceIdentifier<?>) requireNonNull(args[0]);
                     final RpcInput input = (RpcInput) requireNonNull(args[1]);
+                    final CurrentAdapterSerializer serializer = currentSerializer();
                     final ListenableFuture<? extends DOMActionResult> future = getDelegate().invokeAction(schemaPath,
                         new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL,
-                            getCodec().toYangInstanceIdentifier(path)),
-                        getCodec().toLazyNormalizedNodeActionInput(type, inputName, input));
+                            serializer.toYangInstanceIdentifier(path)),
+                        serializer.toLazyNormalizedNodeActionInput(type, inputName, input));
 
                     // Invocation returned a future we know about -- return that future instead
                     if (ENABLE_CODEC_SHORTCUT && future instanceof BindingRpcFutureAware) {
@@ -76,8 +78,9 @@ final class ActionAdapter extends AbstractBindingAdapter<DOMActionService> imple
 
                     return Futures.transform(future,
                         dom -> RpcResultUtil.rpcResultFromDOM(dom.getErrors(), dom.getOutput()
-                            .map(output -> getCodec().fromNormalizedNodeActionOutput(type, output))
-                            .orElse(null)), MoreExecutors.directExecutor());
+                            .map(output -> serializer.fromNormalizedNodeActionOutput(type, output))
+                            .orElse(null)),
+                        MoreExecutors.directExecutor());
                 }
                 break;
             default:
index ee4663240b93521a424ebfe5c1e50f641a25e212..a5e9e4bbd247499030c1f6f8dea25b80c0ab9188 100644 (file)
@@ -7,19 +7,17 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.annotations.Beta;
 import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.Set;
 import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.api.ActionProviderService;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMAdapterBuilder.Factory;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMActionImplementation;
 import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
@@ -37,17 +35,18 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
-@Beta
 @NonNullByDefault
-// FIXME: make this class non-public once the controller user is gone
 public final class ActionProviderServiceAdapter extends AbstractBindingAdapter<DOMActionProviderService>
         implements ActionProviderService {
     private static final class Builder extends BindingDOMAdapterBuilder<ActionProviderService> {
+        Builder(final AdapterContext adapterContext) {
+            super(adapterContext);
+        }
+
         @Override
-        protected ActionProviderService createInstance(final @Nullable BindingToNormalizedNodeCodec codec,
-                final ClassToInstanceMap<DOMService> delegates) {
-            final DOMActionProviderService domAction = delegates.getInstance(DOMActionProviderService.class);
-            return new ActionProviderServiceAdapter(requireNonNull(codec), domAction);
+        protected ActionProviderService createInstance(final ClassToInstanceMap<DOMService> delegates) {
+            return new ActionProviderServiceAdapter(adapterContext(),
+                delegates.getInstance(DOMActionProviderService.class));
         }
 
         @Override
@@ -58,27 +57,20 @@ public final class ActionProviderServiceAdapter extends AbstractBindingAdapter<D
 
     static final Factory<ActionProviderService> BUILDER_FACTORY = Builder::new;
 
-    ActionProviderServiceAdapter(final BindingToNormalizedNodeCodec codec, final DOMActionProviderService delegate) {
-        super(codec, delegate);
-    }
-
-    @Deprecated
-    public static ActionProviderServiceAdapter create(final BindingToNormalizedNodeCodec codec,
-            final DOMActionProviderService delegate) {
-        return new ActionProviderServiceAdapter(codec, delegate);
+    ActionProviderServiceAdapter(final AdapterContext adapterContext, final DOMActionProviderService delegate) {
+        super(adapterContext, delegate);
     }
 
     @Override
-    public <O extends DataObject, P extends InstanceIdentifier<O>,
-        T extends org.opendaylight.yangtools.yang.binding.Action<P, ?, ?>, S extends T>
-        ObjectRegistration<S> registerImplementation(final Class<T> actionInterface, final S implementation,
+    public <O extends DataObject, P extends InstanceIdentifier<O>, T extends Action<P, ?, ?>, S extends T>
+            ObjectRegistration<S> registerImplementation(final Class<T> actionInterface, final S implementation,
                 final LogicalDatastoreType datastore, final Set<DataTreeIdentifier<O>> validNodes) {
-        final SchemaPath path = getCodec().getActionPath(actionInterface);
+        final SchemaPath path = currentSerializer().getActionPath(actionInterface);
         final ObjectRegistration<DOMActionImplementation> reg = getDelegate().registerActionImplementation(
-            new Impl(getCodec(),
+            new Impl(adapterContext(),
                 NodeIdentifier.create(YangConstants.operationOutputQName(path.getLastComponent().getModule())),
                 actionInterface, implementation), ImmutableSet.of());
-        return new AbstractObjectRegistration<S>(implementation) {
+        return new AbstractObjectRegistration<>(implementation) {
             @Override
             protected void removeRegistration() {
                 reg.close();
@@ -88,13 +80,13 @@ public final class ActionProviderServiceAdapter extends AbstractBindingAdapter<D
 
     private static final class Impl implements DOMActionImplementation {
         private final Class<? extends Action<?, ?, ?>> actionInterface;
+        private final AdapterContext adapterContext;
         private final Action implementation;
-        private final BindingNormalizedNodeSerializer codec;
         private final NodeIdentifier outputName;
 
-        Impl(final BindingNormalizedNodeSerializer codec, final NodeIdentifier outputName,
+        Impl(final AdapterContext adapterContext, final NodeIdentifier outputName,
                 final Class<? extends Action<?, ?, ?>> actionInterface, final Action<?, ?, ?> implementation) {
-            this.codec = requireNonNull(codec);
+            this.adapterContext = requireNonNull(adapterContext);
             this.outputName = requireNonNull(outputName);
             this.actionInterface = requireNonNull(actionInterface);
             this.implementation = requireNonNull(implementation);
@@ -104,8 +96,10 @@ public final class ActionProviderServiceAdapter extends AbstractBindingAdapter<D
         @SuppressWarnings({ "rawtypes", "unchecked" })
         public ListenableFuture<? extends DOMActionResult> invokeAction(final SchemaPath type,
                 final DOMDataTreeIdentifier path, final ContainerNode input) {
+            final CurrentAdapterSerializer codec = adapterContext.currentSerializer();
+
             final ListenableFuture<RpcResult<?>> userFuture = implementation.invoke(
-                codec.fromYangInstanceIdentifier(path.getRootIdentifier()),
+                verifyNotNull(codec.fromYangInstanceIdentifier(path.getRootIdentifier())),
                 codec.fromNormalizedNodeActionInput(actionInterface, input));
             if (userFuture instanceof BindingOperationFluentFuture) {
                 // If we are looping back through our future we can skip wrapping. This can happen if application
@@ -113,7 +107,7 @@ public final class ActionProviderServiceAdapter extends AbstractBindingAdapter<D
                 return (BindingOperationFluentFuture) userFuture;
             }
 
-            return new BindingOperationFluentFuture(userFuture, actionInterface, outputName, codec);
+            return new BindingOperationFluentFuture(userFuture, actionInterface, outputName, adapterContext);
         }
     }
 }
index 72f7276801522e213cd9d358ebff10963ebd961d..deabcd10c4d999b9dd5365fe7513609333e830d5 100644 (file)
@@ -11,14 +11,12 @@ 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.collect.ClassToInstanceMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.lang.reflect.Proxy;
 import java.util.Set;
 import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.api.ActionService;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMAdapterBuilder.Factory;
@@ -34,24 +32,24 @@ import org.opendaylight.yangtools.yang.binding.RpcInput;
 import org.opendaylight.yangtools.yang.binding.RpcOutput;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
-@Beta
 @NonNullByDefault
-// FIXME: make this class non-public once the controller user is gone
-public final class ActionServiceAdapter
+final class ActionServiceAdapter
         extends AbstractBindingLoadingAdapter<DOMActionService, Class<? extends Action<?, ?, ?>>, ActionAdapter>
         implements ActionService {
     private static final class Builder extends BindingDOMAdapterBuilder<ActionService> {
-        @Override
-        protected ActionService createInstance(final @Nullable BindingToNormalizedNodeCodec codec,
-                final ClassToInstanceMap<DOMService> delegates) {
-            final DOMActionService domAction = delegates.getInstance(DOMActionService.class);
-            return new ActionServiceAdapter(requireNonNull(codec), domAction);
+        Builder(final AdapterContext adapterContext) {
+            super(adapterContext);
         }
 
         @Override
         public Set<? extends Class<? extends DOMService>> getRequiredDelegates() {
             return ImmutableSet.of(DOMActionService.class);
         }
+
+        @Override
+        protected ActionService createInstance(final ClassToInstanceMap<DOMService> delegates) {
+            return new ActionServiceAdapter(adapterContext(), delegates.getInstance(DOMActionService.class));
+        }
     }
 
     private static final class ConstrainedAction implements Delegator<Action<?, ?, ?>>,
@@ -79,14 +77,8 @@ public final class ActionServiceAdapter
 
     static final Factory<ActionService> BUILDER_FACTORY = Builder::new;
 
-    ActionServiceAdapter(final BindingToNormalizedNodeCodec codec, final DOMActionService delegate) {
-        super(codec, delegate);
-    }
-
-    @Deprecated
-    public static ActionServiceAdapter create(final BindingToNormalizedNodeCodec codec,
-            final DOMActionService delegate) {
-        return new ActionServiceAdapter(codec, delegate);
+    ActionServiceAdapter(final AdapterContext adapterContext, final DOMActionService delegate) {
+        super(adapterContext, delegate);
     }
 
     @Override
@@ -101,6 +93,6 @@ public final class ActionServiceAdapter
     ActionAdapter loadAdapter(final Class<? extends Action<?, ?, ?>> key) {
         checkArgument(BindingReflections.isBindingClass(key));
         checkArgument(key.isInterface(), "Supplied Action type must be an interface.");
-        return new ActionAdapter(getCodec(), getDelegate(), key);
+        return new ActionAdapter(adapterContext(), getDelegate(), key);
     }
 }
diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AdapterContext.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/AdapterContext.java
new file mode 100644 (file)
index 0000000..3679ed9
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * 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.dom.adapter;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.eclipse.jdt.annotation.NonNull;
+
+@VisibleForTesting
+public interface AdapterContext {
+
+    @NonNull CurrentAdapterSerializer currentSerializer();
+}
index 692164fb989d355e14220045aae1d7c47d27b1b0..be127044093970b892a19685da25d569de27aa36 100644 (file)
@@ -10,28 +10,12 @@ package org.opendaylight.mdsal.binding.dom.adapter;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
+import java.util.ServiceLoader;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.opendaylight.mdsal.binding.api.ActionProviderService;
-import org.opendaylight.mdsal.binding.api.ActionService;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.DataTreeService;
-import org.opendaylight.mdsal.binding.api.MountPointService;
-import org.opendaylight.mdsal.binding.api.NotificationPublishService;
-import org.opendaylight.mdsal.binding.api.NotificationService;
-import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.kohsuke.MetaInfServices;
 import org.opendaylight.mdsal.binding.dom.adapter.spi.AdapterFactory;
-import org.opendaylight.mdsal.dom.api.DOMActionProviderService;
-import org.opendaylight.mdsal.dom.api.DOMActionService;
-import org.opendaylight.mdsal.dom.api.DOMDataBroker;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
-import org.opendaylight.mdsal.dom.api.DOMMountPointService;
-import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
-import org.opendaylight.mdsal.dom.api.DOMNotificationService;
-import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
-import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.yangtools.concepts.Immutable;
 
 /**
@@ -40,107 +24,24 @@ import org.opendaylight.yangtools.concepts.Immutable;
  * @author Robert Varga
  */
 @Beta
+@MetaInfServices(value = AdapterFactory.class)
 @NonNullByDefault
 @Singleton
-public final class BindingAdapterFactory implements AdapterFactory, Immutable {
-    private final BindingToNormalizedNodeCodec codec;
+public final class BindingAdapterFactory extends AbstractAdapterFactory implements Immutable {
+    private final AdapterContext codec;
 
-    @Inject
-    public BindingAdapterFactory(final BindingToNormalizedNodeCodec codec) {
-        this.codec = requireNonNull(codec);
-    }
-
-    /**
-     * Create a {@link DataBroker} backed by a {@link DOMDataBroker}.
-     *
-     * @param domService Backing DOMDataBroker
-     * @return A DataBroker
-     * @throws NullPointerException if {@code domService} is null
-     */
-    @Override
-    public DataBroker createDataBroker(final DOMDataBroker domService) {
-        return new BindingDOMDataBrokerAdapter(domService, codec);
-    }
-
-    /**
-     * Create a {@link DataTreeService} backed by a {@link DOMDataTreeService}.
-     *
-     * @param domService Backing DOMDataTreeService
-     * @return A DataTreeService
-     * @throws NullPointerException if {@code domService} is null
-     */
-    @Override
-    public DataTreeService createDataTreeService(final DOMDataTreeService domService) {
-        return BindingDOMDataTreeServiceAdapter.create(domService, codec);
-    }
-
-    /**
-     * Create a {@link MountPointService} backed by a {@link DOMMountPointService}.
-     *
-     * @param domService Backing DOMMountPointService
-     * @return A MountPointService
-     * @throws NullPointerException if {@code domService} is null
-     */
-    @Override
-    public MountPointService createMountPointService(final DOMMountPointService domService) {
-        return new BindingDOMMountPointServiceAdapter(domService, codec);
-    }
-
-    /**
-     * Create a {@link DataBroker} backed by a {@link DOMDataBroker}.
-     *
-     * @param domService Backing DOMDataBroker
-     * @return A DataBroker
-     * @throws NullPointerException if {@code domService} is null
-     */
-    @Override
-    public NotificationService createNotificationService(final DOMNotificationService domService) {
-        return new BindingDOMNotificationServiceAdapter(domService, codec);
-    }
-
-    /**
-     * Create a {@link NotificationPublishService} backed by a {@link DOMNotificationPublishService}.
-     *
-     * @param domService Backing DOMNotificationPublishService
-     * @return A NotificationPublishService
-     * @throws NullPointerException if {@code domService} is null
-     */
-    @Override
-    public NotificationPublishService createNotificationPublishService(final DOMNotificationPublishService domService) {
-        return new BindingDOMNotificationPublishServiceAdapter(domService, codec);
-    }
-
-    /**
-     * Create a {@link RpcConsumerRegistry} backed by a {@link DOMRpcService}.
-     *
-     * @param domService Backing DOMRpcService
-     * @return A RpcConsumerRegistry
-     * @throws NullPointerException if {@code domService} is null
-     */
-    @Override
-    public RpcConsumerRegistry createRpcConsumerRegistry(final DOMRpcService domService) {
-        return new BindingDOMRpcServiceAdapter(domService, codec);
+    public BindingAdapterFactory() {
+        this(ServiceLoader.load(AdapterContext.class).findFirst()
+            .orElseThrow(() -> new IllegalStateException("Failed to load BlockingBindingNormalizer")));
     }
 
-    /**
-     * Create a {@link RpcProviderService} backed by a {@link DOMRpcProviderService}.
-     *
-     * @param domService Backing DOMRpcProviderService
-     * @return A RpcProviderService
-     * @throws NullPointerException if {@code domService} is null
-     */
-    @Override
-    public RpcProviderService createRpcProviderService(final DOMRpcProviderService domService) {
-        return new BindingDOMRpcProviderServiceAdapter(domService, codec);
-    }
-
-    @Override
-    public ActionService createActionService(final DOMActionService domService) {
-        return new ActionServiceAdapter(codec, domService);
+    @Inject
+    public BindingAdapterFactory(final AdapterContext codec) {
+        this.codec = requireNonNull(codec);
     }
 
     @Override
-    public ActionProviderService createActionProviderService(final DOMActionProviderService domService) {
-        return new ActionProviderServiceAdapter(codec, domService);
+    AdapterContext context() {
+        return codec;
     }
 }
index c82fb9d581dcaba33f9aff22d0aad59d99f42daa..cc031c0bdb0ab5a45227d06ea4a7c7a13f414ef4 100644 (file)
@@ -21,8 +21,8 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
  */
 final class BindingClusteredDOMDataTreeChangeListenerAdapter<T extends DataObject>
         extends BindingDOMDataTreeChangeListenerAdapter<T> implements ClusteredDOMDataTreeChangeListener {
-    BindingClusteredDOMDataTreeChangeListenerAdapter(BindingToNormalizedNodeCodec codec,
-            ClusteredDataTreeChangeListener<T> listener, LogicalDatastoreType store) {
+    BindingClusteredDOMDataTreeChangeListenerAdapter(final AdapterContext codec,
+            final ClusteredDataTreeChangeListener<T> listener, final LogicalDatastoreType store) {
         super(codec, listener, store);
     }
 }
index a76bd498f1cdc1ba25faf4e68ff4084fe8f4b3bd..be5503b8af876760d664135762d0eefe3a791a5c 100644 (file)
@@ -7,8 +7,8 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ClassToInstanceMap;
+import static java.util.Objects.requireNonNull;
+
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.BindingService;
 import org.opendaylight.mdsal.dom.api.DOMService;
@@ -18,21 +18,16 @@ abstract class BindingDOMAdapterBuilder<T extends BindingService> extends Adapte
     @FunctionalInterface
     interface Factory<T extends BindingService> {
 
-        BindingDOMAdapterBuilder<T> newBuilder();
+        @NonNull BindingDOMAdapterBuilder<T> newBuilder(@NonNull AdapterContext adapterContext);
     }
 
-    private BindingToNormalizedNodeCodec codec;
+    private final @NonNull AdapterContext adapterContext;
 
-    void setCodec(final BindingToNormalizedNodeCodec codec) {
-        this.codec = codec;
+    BindingDOMAdapterBuilder(final AdapterContext adapterContext) {
+        this.adapterContext = requireNonNull(adapterContext);
     }
 
-    @Override
-    protected final T createInstance(final ClassToInstanceMap<DOMService> delegates) {
-        Preconditions.checkState(codec != null);
-        return createInstance(codec, delegates);
+    protected final @NonNull AdapterContext adapterContext() {
+        return adapterContext;
     }
-
-    abstract T createInstance(BindingToNormalizedNodeCodec myCodec,
-            @NonNull ClassToInstanceMap<@NonNull DOMService> delegates);
 }
index 2a84702a2e63027f1d13dda251b17d83134ff867..c2adb18742c1941e3642dbcbc337eb8fe5f6f367 100644 (file)
@@ -7,7 +7,9 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
-import com.google.common.base.Preconditions;
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import org.opendaylight.mdsal.binding.api.ActionProviderService;
@@ -31,19 +33,17 @@ public abstract class BindingDOMAdapterLoader extends AdapterLoader<BindingServi
             .put(ActionProviderService.class, ActionProviderServiceAdapter.BUILDER_FACTORY)
             .build();
 
-    private final BindingToNormalizedNodeCodec codec;
+    private final AdapterContext codec;
 
-    public BindingDOMAdapterLoader(final BindingToNormalizedNodeCodec codec) {
-        this.codec = codec;
+    public BindingDOMAdapterLoader(final AdapterContext codec) {
+        this.codec = requireNonNull(codec);
     }
 
     @Override
     protected final AdapterBuilder<? extends BindingService, DOMService> createBuilder(
                 final Class<? extends BindingService> key) {
         final Factory<?> factory = FACTORIES.get(key);
-        Preconditions.checkArgument(factory != null, "Unsupported service type %s", key);
-        final BindingDOMAdapterBuilder<?> builder = factory.newBuilder();
-        builder.setCodec(codec);
-        return builder;
+        checkArgument(factory != null, "Unsupported service type %s", key);
+        return factory.newBuilder(codec);
     }
 }
index 3f9263687b167e2bdc2d9a2250d3b6c7551f254d..7288aba96d700bbacafbf21410fafea371407c80 100644 (file)
@@ -19,19 +19,18 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteCursor;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 
-public class BindingDOMCursorAwareWriteTransactionAdapter<T extends DOMDataTreeCursorAwareTransaction>
+final class BindingDOMCursorAwareWriteTransactionAdapter<T extends DOMDataTreeCursorAwareTransaction>
         extends AbstractBindingAdapter<T> implements CursorAwareWriteTransaction {
-
-    public BindingDOMCursorAwareWriteTransactionAdapter(final T delegate, final BindingToNormalizedNodeCodec codec) {
-        super(codec, delegate);
+    BindingDOMCursorAwareWriteTransactionAdapter(final AdapterContext adapterContext, final T delegate) {
+        super(adapterContext, delegate);
     }
 
     @Override
     public <P extends DataObject> DataTreeWriteCursor createCursor(final DataTreeIdentifier<P> path) {
-        final YangInstanceIdentifier yPath = getCodec().toYangInstanceIdentifier(path.getRootIdentifier());
+        final YangInstanceIdentifier yPath = currentSerializer().toYangInstanceIdentifier(path.getRootIdentifier());
         final DOMDataTreeWriteCursor cursor = getDelegate().createCursor(
                 new DOMDataTreeIdentifier(path.getDatastoreType(), yPath));
-        return new BindingDOMDataTreeWriteCursorAdapter<>(path, cursor, getCodec());
+        return new BindingDOMDataTreeWriteCursorAdapter<>(adapterContext(), cursor, path);
     }
 
     @Override
index 92dcfac6b22e9b9e74c3c1b25f4979710e57bb9a..f1abd001c6ecd3209780bba2a49eb6fa31e4097a 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.collect.ImmutableSet;
 import java.util.Set;
@@ -36,60 +37,60 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
  * Besides this the DataBrokerImpl and it's collaborators also cache data that is already transformed from the binding
  * independent to binding aware format.
  */
+@VisibleForTesting
 public class BindingDOMDataBrokerAdapter extends AbstractBindingAdapter<@NonNull DOMDataBroker> implements DataBroker,
         DataTreeChangeService {
 
     static final Factory<DataBroker> BUILDER_FACTORY = Builder::new;
     private final DataTreeChangeService treeChangeService;
 
-    public BindingDOMDataBrokerAdapter(final DOMDataBroker domDataBroker, final BindingToNormalizedNodeCodec codec) {
-        super(codec, domDataBroker);
+    public BindingDOMDataBrokerAdapter(final AdapterContext adapterContext, final DOMDataBroker domDataBroker) {
+        super(adapterContext, domDataBroker);
         final DOMDataTreeChangeService domTreeChange = domDataBroker.getExtensions()
                 .getInstance(DOMDataTreeChangeService.class);
-        if (domTreeChange != null) {
-            treeChangeService = BindingDOMDataTreeChangeServiceAdapter.create(codec, domTreeChange);
-        } else {
-            treeChangeService = null;
-        }
+        treeChangeService = domTreeChange == null ? null
+                : new BindingDOMDataTreeChangeServiceAdapter(adapterContext, domTreeChange);
     }
 
     @Override
     public ReadTransaction newReadOnlyTransaction() {
-        return new BindingDOMReadTransactionAdapter(getDelegate().newReadOnlyTransaction(), getCodec());
+        return new BindingDOMReadTransactionAdapter(adapterContext(), getDelegate().newReadOnlyTransaction());
     }
 
     @Override
     public WriteTransaction newWriteOnlyTransaction() {
-        return new BindingDOMWriteTransactionAdapter<>(getDelegate().newWriteOnlyTransaction(), getCodec());
+        return new BindingDOMWriteTransactionAdapter<>(adapterContext(), getDelegate().newWriteOnlyTransaction());
     }
 
     @Override
     public ReadWriteTransaction newReadWriteTransaction() {
-        return new BindingDOMReadWriteTransactionAdapter(getDelegate().newReadWriteTransaction(), getCodec());
+        return new BindingDOMReadWriteTransactionAdapter(adapterContext(), getDelegate().newReadWriteTransaction());
     }
 
     @Override
     public TransactionChain createTransactionChain(final TransactionChainListener listener) {
-        return new BindingDOMTransactionChainAdapter(getDelegate()::createTransactionChain, getCodec(), listener);
+        return new BindingDOMTransactionChainAdapter(getDelegate()::createTransactionChain, adapterContext(), listener);
     }
 
     @Override
     public TransactionChain createMergingTransactionChain(final TransactionChainListener listener) {
-        return new BindingDOMTransactionChainAdapter(getDelegate()::createMergingTransactionChain, getCodec(),
+        return new BindingDOMTransactionChainAdapter(getDelegate()::createMergingTransactionChain, adapterContext(),
             listener);
     }
 
     private static class Builder extends BindingDOMAdapterBuilder<DataBroker> {
+        Builder(final AdapterContext adapterContext) {
+            super(adapterContext);
+        }
+
         @Override
         public Set<? extends Class<? extends DOMService>> getRequiredDelegates() {
             return ImmutableSet.of(DOMDataBroker.class);
         }
 
         @Override
-        protected DataBroker createInstance(final BindingToNormalizedNodeCodec codec,
-                final ClassToInstanceMap<DOMService> delegates) {
-            final DOMDataBroker domDataBroker = delegates.getInstance(DOMDataBroker.class);
-            return new BindingDOMDataBrokerAdapter(domDataBroker, codec);
+        protected DataBroker createInstance(final ClassToInstanceMap<DOMService> delegates) {
+            return new BindingDOMDataBrokerAdapter(adapterContext(), delegates.getInstance(DOMDataBroker.class));
         }
     }
 
index 046536511f67b5bbb51e4fcc6f4c748a01f87a44..1372e1cf13bf312a7087ad49d47f56d25d32753f 100644 (file)
@@ -11,7 +11,6 @@ import static java.util.Objects.requireNonNull;
 
 import java.util.Collection;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
-import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -22,23 +21,21 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
  * and translated DOM events to their Binding equivalent.
  */
 class BindingDOMDataTreeChangeListenerAdapter<T extends DataObject> implements DOMDataTreeChangeListener {
-
-    private final BindingToNormalizedNodeCodec codec;
+    private final AdapterContext adapterContext;
     private final DataTreeChangeListener<T> listener;
     private final LogicalDatastoreType store;
 
-    BindingDOMDataTreeChangeListenerAdapter(final BindingToNormalizedNodeCodec codec,
+    BindingDOMDataTreeChangeListenerAdapter(final AdapterContext adapterContext,
             final DataTreeChangeListener<T> listener, final LogicalDatastoreType store) {
-        this.codec = requireNonNull(codec);
+        this.adapterContext = requireNonNull(adapterContext);
         this.listener = requireNonNull(listener);
         this.store = requireNonNull(store);
     }
 
     @Override
     public void onDataTreeChanged(final Collection<DataTreeCandidate> domChanges) {
-        final Collection<DataTreeModification<T>> bindingChanges = LazyDataTreeModification.from(codec, domChanges,
-            store);
-        listener.onDataTreeChanged(bindingChanges);
+        listener.onDataTreeChanged(LazyDataTreeModification.from(adapterContext.currentSerializer(), domChanges,
+            store));
     }
 
     @Override
index b63f3c45b935ccb55d1a593e64946c8eb94612dd..1bde0b4b0ce8b0fd8eeb480d6aad6fa3d838b00b 100644 (file)
@@ -16,7 +16,6 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 
 /**
  * Adapter exposing Binding {@link DataTreeChangeService} and wrapping a {@link DOMDataTreeChangeService} and is
@@ -27,15 +26,9 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
  */
 final class BindingDOMDataTreeChangeServiceAdapter extends AbstractBindingAdapter<DOMDataTreeChangeService>
         implements DataTreeChangeService {
-
-    private BindingDOMDataTreeChangeServiceAdapter(final BindingToNormalizedNodeCodec codec,
-            final DOMDataTreeChangeService dataTreeChangeService) {
-        super(codec, dataTreeChangeService);
-    }
-
-    static DataTreeChangeService create(final BindingToNormalizedNodeCodec codec,
+    BindingDOMDataTreeChangeServiceAdapter(final AdapterContext adapterContext,
             final DOMDataTreeChangeService dataTreeChangeService) {
-        return new BindingDOMDataTreeChangeServiceAdapter(codec, dataTreeChangeService);
+        super(adapterContext, dataTreeChangeService);
     }
 
     @Override
@@ -46,8 +39,8 @@ final class BindingDOMDataTreeChangeServiceAdapter extends AbstractBindingAdapte
         final BindingDOMDataTreeChangeListenerAdapter<T> domListener =
                 listener instanceof ClusteredDataTreeChangeListener
                         ? new BindingClusteredDOMDataTreeChangeListenerAdapter<>(
-                                getCodec(), (ClusteredDataTreeChangeListener<T>) listener, storeType)
-                        : new BindingDOMDataTreeChangeListenerAdapter<>(getCodec(), listener, storeType);
+                                adapterContext(), (ClusteredDataTreeChangeListener<T>) listener, storeType)
+                        : new BindingDOMDataTreeChangeListenerAdapter<>(adapterContext(), listener, storeType);
 
         final ListenerRegistration<BindingDOMDataTreeChangeListenerAdapter<T>> domReg =
                 getDelegate().registerDataTreeChangeListener(domIdentifier, domListener);
@@ -55,7 +48,7 @@ final class BindingDOMDataTreeChangeServiceAdapter extends AbstractBindingAdapte
     }
 
     private DOMDataTreeIdentifier toDomTreeIdentifier(final DataTreeIdentifier<?> treeId) {
-        final YangInstanceIdentifier domPath = getCodec().toYangInstanceIdentifierBlocking(treeId.getRootIdentifier());
-        return new DOMDataTreeIdentifier(treeId.getDatastoreType(), domPath);
+        return new DOMDataTreeIdentifier(treeId.getDatastoreType(),
+            currentSerializer().toYangInstanceIdentifier(treeId.getRootIdentifier()));
     }
 }
index 789e0d18ad9907ab6af0320fb0541b917a6a1f36..695383c4d3cb823b8b14129b8e9eb2234d2f966a 100644 (file)
@@ -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 com.google.common.util.concurrent.FluentFuture;
@@ -19,19 +18,18 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeCommitCohort;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
-class BindingDOMDataTreeCommitCohortAdapter<T extends DataObject>
+final class BindingDOMDataTreeCommitCohortAdapter<T extends DataObject>
         extends AbstractBindingAdapter<DataTreeCommitCohort<T>> implements DOMDataTreeCommitCohort {
-
-    BindingDOMDataTreeCommitCohortAdapter(final BindingToNormalizedNodeCodec codec,
-            final DataTreeCommitCohort<T> cohort) {
+    BindingDOMDataTreeCommitCohortAdapter(final AdapterContext codec, final DataTreeCommitCohort<T> cohort) {
         super(codec, cohort);
     }
 
     @Override
     public FluentFuture<PostCanCommitStep> canCommit(final Object txId,
             final SchemaContext ctx, final Collection<DOMDataTreeCandidate> candidates) {
-        final Collection<DataTreeModification<T>> modifications = candidates.stream().map(
-            candidate -> LazyDataTreeModification.<T>create(getCodec(), candidate)).collect(Collectors.toList());
+        final Collection<DataTreeModification<T>> modifications = candidates.stream()
+                .map(candidate -> LazyDataTreeModification.<T>create(currentSerializer(), candidate))
+                .collect(Collectors.toList());
         return getDelegate().canCommit(txId, modifications);
     }
 }
index 6f9159a47c1e553bad2dcacc3e0d21514b8dc634..3cf014857cb1a9608c9045318f2c56b0cea473da 100644 (file)
@@ -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 org.opendaylight.mdsal.binding.api.DataTreeCommitCohort;
@@ -17,27 +16,22 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 
-public class BindingDOMDataTreeCommitCohortRegistryAdapter
+final class BindingDOMDataTreeCommitCohortRegistryAdapter
         extends AbstractBindingAdapter<DOMDataTreeCommitCohortRegistry> implements DataTreeCommitCohortRegistry {
 
-    BindingDOMDataTreeCommitCohortRegistryAdapter(final BindingToNormalizedNodeCodec codec,
+    BindingDOMDataTreeCommitCohortRegistryAdapter(final AdapterContext codec,
             final DOMDataTreeCommitCohortRegistry registry) {
         super(codec, registry);
     }
 
-    static DataTreeCommitCohortRegistry from(final BindingToNormalizedNodeCodec codec,
-            final DOMDataTreeCommitCohortRegistry registry) {
-        return new BindingDOMDataTreeCommitCohortRegistryAdapter(codec, registry);
-    }
-
     @Override
     public <D extends DataObject, T extends DataTreeCommitCohort<D>> ObjectRegistration<T> registerCommitCohort(
             final DataTreeIdentifier<D> subtree, final T cohort) {
         final BindingDOMDataTreeCommitCohortAdapter<D> adapter =
-                new BindingDOMDataTreeCommitCohortAdapter<>(getCodec(), cohort);
-        final DOMDataTreeIdentifier domPath = getCodec().toDOMDataTreeIdentifier(subtree);
+                new BindingDOMDataTreeCommitCohortAdapter<>(adapterContext(), cohort);
+        final DOMDataTreeIdentifier domPath = currentSerializer().toDOMDataTreeIdentifier(subtree);
         final DOMDataTreeCommitCohortRegistration<?> domReg = getDelegate().registerCommitCohort(domPath, adapter);
-        return new ObjectRegistration<T>() {
+        return new ObjectRegistration<>() {
 
             @Override
             public T getInstance() {
index 91ca03256d38da8046752b9f61bb9403d66d8c4e..cda53a7ff60b6285999d595b96412bad737ea223 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeListeningException;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeListener;
@@ -33,8 +34,8 @@ public class BindingDOMDataTreeListenerAdapter extends AbstractBindingAdapter<Da
 
     private final LogicalDatastoreType store;
 
-    protected BindingDOMDataTreeListenerAdapter(final DataTreeListener delegate,
-            final BindingToNormalizedNodeCodec codec, final LogicalDatastoreType store) {
+    protected BindingDOMDataTreeListenerAdapter(final DataTreeListener delegate, final AdapterContext codec,
+            final LogicalDatastoreType store) {
         super(codec, delegate);
         this.store = requireNonNull(store, "store");
     }
@@ -42,28 +43,27 @@ public class BindingDOMDataTreeListenerAdapter extends AbstractBindingAdapter<Da
     @Override
     public void onDataTreeChanged(final Collection<DataTreeCandidate> domChanges,
             final Map<DOMDataTreeIdentifier, NormalizedNode<?, ?>> domSubtrees) {
-
-        final Collection<DataTreeModification<?>> changes = toBinding(domChanges);
-        final Map<DataTreeIdentifier<?>, DataObject> subtrees = toBinding(domSubtrees);
-
-        getDelegate().onDataTreeChanged(changes, subtrees);
+        final CurrentAdapterSerializer serializer = currentSerializer();
+        getDelegate().onDataTreeChanged(toBinding(serializer, domChanges), toBinding(serializer, domSubtrees));
     }
 
-    private Map<DataTreeIdentifier<?>, DataObject> toBinding(
+    private Map<DataTreeIdentifier<?>, DataObject> toBinding(final BindingNormalizedNodeSerializer serializer,
             final Map<DOMDataTreeIdentifier, NormalizedNode<?, ?>> domSubtrees) {
         // FIXME: Introduce lazy translating map
         final Map<DataTreeIdentifier<?>, DataObject> ret = Maps.newHashMapWithExpectedSize(domSubtrees.size());
+
         for (final Entry<DOMDataTreeIdentifier, NormalizedNode<?, ?>> domEntry : domSubtrees.entrySet()) {
             final Entry<InstanceIdentifier<?>, DataObject> bindingEntry =
-                    getCodec().fromNormalizedNode(domEntry.getKey().getRootIdentifier(), domEntry.getValue());
+                    serializer.fromNormalizedNode(domEntry.getKey().getRootIdentifier(), domEntry.getValue());
             ret.put(DataTreeIdentifier.create(store, bindingEntry.getKey()), bindingEntry.getValue());
         }
         return ret;
     }
 
     @SuppressWarnings("unchecked")
-    private Collection<DataTreeModification<?>> toBinding(final Collection<DataTreeCandidate> domChanges) {
-        return Collection.class.cast(LazyDataTreeModification.from(getCodec(), domChanges, store));
+    private Collection<DataTreeModification<?>> toBinding(final CurrentAdapterSerializer serializer,
+            final Collection<DataTreeCandidate> domChanges) {
+        return Collection.class.cast(LazyDataTreeModification.from(serializer, domChanges, store));
     }
 
     @Override
index 7eb26ca626eb0971d9692305e6173af4cc102842..57a239ab2e8fa62ec0139770a0cc9caab3b4c4fb 100644 (file)
@@ -17,28 +17,23 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerException;
 
-class BindingDOMDataTreeProducerAdapter extends AbstractBindingAdapter<DOMDataTreeProducer>
+final class BindingDOMDataTreeProducerAdapter extends AbstractBindingAdapter<DOMDataTreeProducer>
         implements DataTreeProducer {
-
-    BindingDOMDataTreeProducerAdapter(final BindingToNormalizedNodeCodec codec, final DOMDataTreeProducer delegate) {
-        super(codec, delegate);
+    BindingDOMDataTreeProducerAdapter(final AdapterContext adapterContext, final DOMDataTreeProducer delegate) {
+        super(adapterContext, delegate);
     }
 
     @Override
     public CursorAwareWriteTransaction createTransaction(final boolean isolated) {
         final DOMDataTreeCursorAwareTransaction domTx = getDelegate().createTransaction(isolated);
-        return new BindingDOMCursorAwareWriteTransactionAdapter<>(domTx, getCodec());
-    }
-
-    static DataTreeProducer create(final DOMDataTreeProducer domProducer, final BindingToNormalizedNodeCodec codec) {
-        return new BindingDOMDataTreeProducerAdapter(codec, domProducer);
+        return new BindingDOMCursorAwareWriteTransactionAdapter<>(adapterContext(), domTx);
     }
 
     @Override
     public DataTreeProducer createProducer(final Collection<DataTreeIdentifier<?>> subtrees) {
-        final Collection<DOMDataTreeIdentifier> domSubtrees = getCodec().toDOMDataTreeIdentifiers(subtrees);
+        final Collection<DOMDataTreeIdentifier> domSubtrees = currentSerializer().toDOMDataTreeIdentifiers(subtrees);
         final DOMDataTreeProducer domChildProducer = getDelegate().createProducer(domSubtrees);
-        return BindingDOMDataTreeProducerAdapter.create(domChildProducer, getCodec());
+        return new BindingDOMDataTreeProducerAdapter(adapterContext(), domChildProducer);
     }
 
     @Override
index 9301453fea7fedefce9576ce3412f1d4e9a5212a..8afd127847250d9ceca9f8fcddb1bab196d4d717 100644 (file)
@@ -18,23 +18,17 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeService;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 
-public final class BindingDOMDataTreeServiceAdapter extends AbstractBindingAdapter<DOMDataTreeService>
+final class BindingDOMDataTreeServiceAdapter extends AbstractBindingAdapter<DOMDataTreeService>
         implements DataTreeService {
-    private BindingDOMDataTreeServiceAdapter(final BindingToNormalizedNodeCodec codec,
-            final DOMDataTreeService delegate) {
-        super(codec, delegate);
-    }
-
-    public static BindingDOMDataTreeServiceAdapter create(final DOMDataTreeService domService,
-            final BindingToNormalizedNodeCodec codec) {
-        return new BindingDOMDataTreeServiceAdapter(codec, domService);
+    BindingDOMDataTreeServiceAdapter(final AdapterContext adapterContext, final DOMDataTreeService delegate) {
+        super(adapterContext, delegate);
     }
 
     @Override
     public DataTreeProducer createProducer(final Collection<DataTreeIdentifier<?>> subtrees) {
-        final Collection<DOMDataTreeIdentifier> domSubtrees = getCodec().toDOMDataTreeIdentifiers(subtrees);
+        final Collection<DOMDataTreeIdentifier> domSubtrees = currentSerializer().toDOMDataTreeIdentifiers(subtrees);
         final DOMDataTreeProducer domChildProducer = getDelegate().createProducer(domSubtrees);
-        return BindingDOMDataTreeProducerAdapter.create(domChildProducer, getCodec());
+        return new BindingDOMDataTreeProducerAdapter(adapterContext(), domChildProducer);
     }
 
     @Override
index 5988a0c8ac7ff01d6de121a032d93c968cafdd4c..b0b2a0e1a7f50a4bfb55f2e8e4d1101324d975c0 100644 (file)
@@ -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 com.google.common.annotations.VisibleForTesting;
@@ -21,20 +20,20 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
-public class BindingDOMDataTreeWriteCursorAdapter<T extends DOMDataTreeWriteCursor>
+final class BindingDOMDataTreeWriteCursorAdapter<T extends DOMDataTreeWriteCursor>
         extends AbstractBindingAdapter<T> implements DataTreeWriteCursor {
     private final Deque<PathArgument> stack = new ArrayDeque<>();
 
-    public BindingDOMDataTreeWriteCursorAdapter(final DataTreeIdentifier<?> path, final T delegate,
-            final BindingToNormalizedNodeCodec codec) {
-        super(codec, delegate);
+    BindingDOMDataTreeWriteCursorAdapter(final AdapterContext adapterContext, final T delegate,
+            final DataTreeIdentifier<?> path) {
+        super(adapterContext, delegate);
         path.getRootIdentifier().getPathArguments().forEach(stack::push);
     }
 
     private YangInstanceIdentifier.PathArgument convertToNormalized(final PathArgument child) {
         stack.push(child);
         final InstanceIdentifier<?> iid = InstanceIdentifier.create(stack);
-        final YangInstanceIdentifier ret = getCodec().toYangInstanceIdentifier(iid);
+        final YangInstanceIdentifier ret = currentSerializer().toYangInstanceIdentifier(iid);
         stack.pop();
         return ret.getLastPathArgument();
     }
@@ -44,7 +43,7 @@ public class BindingDOMDataTreeWriteCursorAdapter<T extends DOMDataTreeWriteCurs
         stack.push(child);
         final InstanceIdentifier<?> iid = InstanceIdentifier.create(stack);
         @SuppressWarnings({ "unchecked", "rawtypes" })
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = getCodec().toNormalizedNode(
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = currentSerializer().toNormalizedNode(
             (InstanceIdentifier) iid, data);
         stack.pop();
         return entry;
index 0e9148efffe879b3ca1e769712079682a8a98d95..40601545b06f09b59d009f83bae8b81c7e5796a8 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
-import java.util.Optional;
+import static java.util.Objects.requireNonNull;
+
 import org.opendaylight.mdsal.binding.api.MountPointService.MountPointListener;
 import org.opendaylight.mdsal.dom.api.DOMMountPointListener;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
@@ -25,12 +26,12 @@ final class BindingDOMMountPointListenerAdapter<T extends MountPointListener> im
 
     private final T listener;
     private final ListenerRegistration<DOMMountPointListener> registration;
-    private final BindingToNormalizedNodeCodec codec;
+    private final AdapterContext adapterContext;
 
-    BindingDOMMountPointListenerAdapter(final T listener, final BindingToNormalizedNodeCodec codec,
+    BindingDOMMountPointListenerAdapter(final T listener, final AdapterContext adapterContext,
             final DOMMountPointService mountService) {
-        this.listener = listener;
-        this.codec = codec;
+        this.listener = requireNonNull(listener);
+        this.adapterContext = requireNonNull(adapterContext);
         this.registration = mountService.registerProvisionListener(this);
     }
 
@@ -54,16 +55,6 @@ final class BindingDOMMountPointListenerAdapter<T extends MountPointListener> im
         }
     }
 
-    private InstanceIdentifier<? extends DataObject> toBinding(final YangInstanceIdentifier path)
-            throws DeserializationException {
-        final Optional<InstanceIdentifier<? extends DataObject>> instanceIdentifierOptional = codec.toBinding(path);
-        if (instanceIdentifierOptional.isPresent()) {
-            return instanceIdentifierOptional.get();
-        }
-
-        throw new DeserializationException("Deserialization unsuccessful, " + instanceIdentifierOptional);
-    }
-
     @Override
     public void onMountPointRemoved(final YangInstanceIdentifier path) {
         try {
@@ -73,4 +64,20 @@ final class BindingDOMMountPointListenerAdapter<T extends MountPointListener> im
             LOG.error("Unable to translate mountPoint path {}. Omitting event.", path, e);
         }
     }
+
+    private InstanceIdentifier<? extends DataObject> toBinding(final YangInstanceIdentifier path)
+            throws DeserializationException {
+        final InstanceIdentifier<?> binding;
+        try {
+            binding = adapterContext.currentSerializer().fromYangInstanceIdentifier(path);
+        } catch (IllegalArgumentException e) {
+            throw new DeserializationException("Deserialization unsuccessful, " + path, e);
+        }
+        if (binding == null) {
+            throw new DeserializationException("Deserialization unsuccessful, " + path);
+        }
+        return binding;
+    }
+
+
 }
\ No newline at end of file
index c4ce0255bc272a5cf94c75838c79f8b865e406df..75742fb76612ddc33c100e12514796339766025a 100644 (file)
@@ -19,14 +19,14 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 public class BindingDOMMountPointServiceAdapter
         extends AbstractBindingLoadingAdapter<DOMMountPointService, DOMMountPoint, BindingMountPointAdapter>
         implements MountPointService {
-    public BindingDOMMountPointServiceAdapter(final DOMMountPointService mountService,
-            final BindingToNormalizedNodeCodec codec) {
-        super(codec, mountService);
+    public BindingDOMMountPointServiceAdapter(final AdapterContext adapterContext,
+            final DOMMountPointService mountService) {
+        super(adapterContext, mountService);
     }
 
     @Override
     public Optional<MountPoint> getMountPoint(final InstanceIdentifier<?> mountPoint) {
-        YangInstanceIdentifier domPath = getCodec().toYangInstanceIdentifierBlocking(mountPoint);
+        YangInstanceIdentifier domPath = currentSerializer().toCachedYangInstanceIdentifier(mountPoint);
         Optional<DOMMountPoint> domMount = getDelegate().getMountPoint(domPath);
         return domMount.map(this::getAdapter);
     }
@@ -34,11 +34,11 @@ public class BindingDOMMountPointServiceAdapter
     @Override
     public <T extends MountPointListener> ListenerRegistration<T> registerListener(final InstanceIdentifier<?> path,
             final T listener) {
-        return new BindingDOMMountPointListenerAdapter<>(listener, getCodec(), getDelegate());
+        return new BindingDOMMountPointListenerAdapter<>(listener, adapterContext(), getDelegate());
     }
 
     @Override
     BindingMountPointAdapter loadAdapter(final DOMMountPoint key) {
-        return new BindingMountPointAdapter(getCodec(), key);
+        return new BindingMountPointAdapter(adapterContext(), key);
     }
 }
index 558a6a87d11402e15916508f2829d94f09381055..b2e515923c36f16d27ec5f5cbb73ce4bf71dc1ab 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.collect.ImmutableMap;
 import com.google.common.reflect.TypeToken;
 import java.lang.reflect.Method;
@@ -15,7 +17,6 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.dom.adapter.invoke.NotificationListenerInvoker;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.mdsal.dom.api.DOMEvent;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
@@ -27,14 +28,13 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 class BindingDOMNotificationListenerAdapter implements DOMNotificationListener {
 
-    private final BindingNormalizedNodeSerializer codec;
+    private final AdapterContext adapterContext;
     private final NotificationListener delegate;
     private final ImmutableMap<SchemaPath, NotificationListenerInvoker> invokers;
 
-    BindingDOMNotificationListenerAdapter(final BindingNormalizedNodeSerializer codec,
-            final NotificationListener delegate) {
-        this.codec = codec;
-        this.delegate = delegate;
+    BindingDOMNotificationListenerAdapter(final AdapterContext adapterContext, final NotificationListener delegate) {
+        this.adapterContext = requireNonNull(adapterContext);
+        this.delegate = requireNonNull(delegate);
         this.invokers = createInvokerMapFor(delegate.getClass());
     }
 
@@ -51,9 +51,11 @@ class BindingDOMNotificationListenerAdapter implements DOMNotificationListener {
             //       okay, for now at least.
             return ((LazySerializedDOMNotification) notification).getBindingData();
         }
-        return notification instanceof DOMEvent ? codec.fromNormalizedNodeNotification(notification.getType(),
+
+        final CurrentAdapterSerializer serializer = adapterContext.currentSerializer();
+        return notification instanceof DOMEvent ? serializer.fromNormalizedNodeNotification(notification.getType(),
             notification.getBody(), ((DOMEvent) notification).getEventInstant())
-                : codec.fromNormalizedNodeNotification(notification.getType(), notification.getBody());
+                : serializer.fromNormalizedNodeNotification(notification.getType(), notification.getBody());
     }
 
     private NotificationListenerInvoker getInvoker(final SchemaPath type) {
index 3ce2684d01bae73cf8a8f13b1d224bce33848c69..58c44c171ef54c60874f4c702a7759580c10ae1a 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -22,24 +23,15 @@ import org.opendaylight.mdsal.dom.api.DOMService;
 import org.opendaylight.yangtools.yang.binding.EventInstantAware;
 import org.opendaylight.yangtools.yang.binding.Notification;
 
+@VisibleForTesting
 public class BindingDOMNotificationPublishServiceAdapter extends AbstractBindingAdapter<DOMNotificationPublishService>
         implements NotificationPublishService {
 
     static final Factory<NotificationPublishService> BUILDER_FACTORY = Builder::new;
 
-    public BindingDOMNotificationPublishServiceAdapter(final DOMNotificationPublishService domPublishService,
-            final BindingToNormalizedNodeCodec codec) {
-        super(codec, domPublishService);
-    }
-
-    @Deprecated
-    public BindingDOMNotificationPublishServiceAdapter(final BindingToNormalizedNodeCodec codec,
+    public BindingDOMNotificationPublishServiceAdapter(final AdapterContext adapterContext,
             final DOMNotificationPublishService domPublishService) {
-        this(domPublishService, codec);
-    }
-
-    public BindingToNormalizedNodeCodec getCodecRegistry() {
-        return getCodec();
+        super(adapterContext, domPublishService);
     }
 
     public DOMNotificationPublishService getDomPublishService() {
@@ -72,20 +64,23 @@ public class BindingDOMNotificationPublishServiceAdapter extends AbstractBinding
     private @NonNull DOMNotification toDomNotification(final Notification notification) {
         final Instant instant = notification instanceof EventInstantAware
                 ? ((EventInstantAware) notification).eventInstant() : Instant.now();
-        return LazySerializedDOMNotification.create(getCodec(), notification, instant);
+        return LazySerializedDOMNotification.create(currentSerializer(), notification, instant);
     }
 
     protected static class Builder extends BindingDOMAdapterBuilder<NotificationPublishService> {
+        Builder(final AdapterContext adapterContext) {
+            super(adapterContext);
+        }
+
         @Override
         public Set<Class<? extends DOMService>> getRequiredDelegates() {
             return ImmutableSet.of(DOMNotificationPublishService.class);
         }
 
         @Override
-        protected NotificationPublishService createInstance(final BindingToNormalizedNodeCodec codec,
-                final ClassToInstanceMap<DOMService> delegates) {
-            final DOMNotificationPublishService domPublish = delegates.getInstance(DOMNotificationPublishService.class);
-            return new BindingDOMNotificationPublishServiceAdapter(codec, domPublish);
+        protected NotificationPublishService createInstance(final ClassToInstanceMap<DOMService> delegates) {
+            return new BindingDOMNotificationPublishServiceAdapter(adapterContext(),
+                delegates.getInstance(DOMNotificationPublishService.class));
         }
     }
 }
index 71620cb202b35bc5307c6130226806639b8d6c98..7f935e6aa108dd5739564afb230f23072223d1e3 100644 (file)
@@ -7,41 +7,37 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.collect.ImmutableSet;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMAdapterBuilder.Factory;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
 import org.opendaylight.mdsal.dom.api.DOMService;
 import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.NotificationListener;
 
+@VisibleForTesting
 public class BindingDOMNotificationServiceAdapter implements NotificationService {
-
     public static final Factory<NotificationService> BUILDER_FACTORY = Builder::new;
 
-    private final BindingNormalizedNodeSerializer codec;
+    private final AdapterContext adapterContext;
     private final DOMNotificationService domNotifService;
 
-    public BindingDOMNotificationServiceAdapter(final DOMNotificationService domNotifService,
-            final BindingNormalizedNodeSerializer codec) {
-        this.codec = codec;
-        this.domNotifService = domNotifService;
-    }
-
-    @Deprecated
-    public BindingDOMNotificationServiceAdapter(final BindingNormalizedNodeSerializer codec,
+    public BindingDOMNotificationServiceAdapter(final AdapterContext adapterContext,
             final DOMNotificationService domNotifService) {
-        this(domNotifService, codec);
+        this.adapterContext = requireNonNull(adapterContext);
+        this.domNotifService = domNotifService;
     }
 
     @Override
     public <T extends NotificationListener> ListenerRegistration<T> registerNotificationListener(final T listener) {
         final BindingDOMNotificationListenerAdapter domListener
-                = new BindingDOMNotificationListenerAdapter(codec, listener);
+                = new BindingDOMNotificationListenerAdapter(adapterContext, listener);
         final ListenerRegistration<BindingDOMNotificationListenerAdapter> domRegistration =
                 domNotifService.registerNotificationListener(domListener, domListener.getSupportedNotifications());
         return new ListenerRegistrationImpl<>(listener, domRegistration);
@@ -63,12 +59,14 @@ public class BindingDOMNotificationServiceAdapter implements NotificationService
     }
 
     private static class Builder extends BindingDOMAdapterBuilder<NotificationService> {
+        Builder(final AdapterContext adapterContext) {
+            super(adapterContext);
+        }
 
         @Override
-        protected NotificationService createInstance(final BindingToNormalizedNodeCodec codec,
-                final ClassToInstanceMap<DOMService> delegates) {
+        protected NotificationService createInstance(final ClassToInstanceMap<DOMService> delegates) {
             final DOMNotificationService domNotification = delegates.getInstance(DOMNotificationService.class);
-            return new BindingDOMNotificationServiceAdapter(codec.getCodecRegistry(), domNotification);
+            return new BindingDOMNotificationServiceAdapter(adapterContext(), domNotification);
         }
 
         @Override
index a088ac00d0168b91e3a7a1d11be72fcd8156550c..5a844bbb4f7e2260f9222c968170ed40d33b7434 100644 (file)
@@ -15,12 +15,10 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-final class BindingDOMReadTransactionAdapter extends AbstractForwardedTransaction<DOMDataTreeReadTransaction> implements
-        ReadTransaction {
-
-    protected BindingDOMReadTransactionAdapter(final DOMDataTreeReadTransaction delegate,
-            final BindingToNormalizedNodeCodec codec) {
-        super(delegate, codec);
+final class BindingDOMReadTransactionAdapter extends AbstractForwardedTransaction<DOMDataTreeReadTransaction>
+        implements ReadTransaction {
+    BindingDOMReadTransactionAdapter(final AdapterContext adapterContext, final DOMDataTreeReadTransaction delegate) {
+        super(adapterContext, delegate);
     }
 
     @Override
@@ -38,5 +36,4 @@ final class BindingDOMReadTransactionAdapter extends AbstractForwardedTransactio
     public void close() {
         getDelegate().close();
     }
-
 }
index a8868b6547c85417f219600e22fa8b6e8fcae4de..7a9fa019faa4ce35e19f6bac308e4af998d71030 100644 (file)
@@ -17,10 +17,9 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 class BindingDOMReadWriteTransactionAdapter extends BindingDOMWriteTransactionAdapter<DOMDataTreeReadWriteTransaction>
         implements ReadWriteTransaction {
-
-    BindingDOMReadWriteTransactionAdapter(final DOMDataTreeReadWriteTransaction delegateTx,
-            final BindingToNormalizedNodeCodec codec) {
-        super(delegateTx, codec);
+    BindingDOMReadWriteTransactionAdapter(final AdapterContext adapterContext,
+            final DOMDataTreeReadWriteTransaction delegateTx) {
+        super(adapterContext, delegateTx);
     }
 
     @Override
index 0002e0c8905453c9b1ad8e50d9769d7783e9f271..35b2d8b97022946855378de8f941818b61aa4abe 100644 (file)
@@ -20,7 +20,6 @@ import java.util.Map.Entry;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.dom.adapter.invoke.RpcServiceInvoker;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
 import org.opendaylight.mdsal.dom.api.DOMRpcImplementation;
@@ -34,19 +33,19 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
-public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation {
+final class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation {
     private static final Cache<Class<?>, RpcServiceInvoker> SERVICE_INVOKERS = CacheBuilder.newBuilder().weakKeys()
             .build();
 
     // Default implementations are 0, we need to perform some translation, hence we have a slightly higher cost
     private static final int COST = 1;
 
-    private final BindingNormalizedNodeSerializer codec;
+    private final AdapterContext adapterContext;
     private final RpcServiceInvoker invoker;
     private final RpcService delegate;
     private final QName inputQname;
 
-    <T extends RpcService> BindingDOMRpcImplementationAdapter(final BindingNormalizedNodeSerializer codec,
+    <T extends RpcService> BindingDOMRpcImplementationAdapter(final AdapterContext adapterContext,
             final Class<T> type, final Map<SchemaPath, Method> localNameToMethod, final T delegate) {
         try {
             this.invoker = SERVICE_INVOKERS.get(type, () -> {
@@ -61,7 +60,7 @@ public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation
             throw new IllegalArgumentException("Failed to create invokers for type " + type, e);
         }
 
-        this.codec = requireNonNull(codec);
+        this.adapterContext = requireNonNull(adapterContext);
         this.delegate = requireNonNull(delegate);
         inputQname = YangConstants.operationInputQName(BindingReflections.getQNameModule(type)).intern();
     }
@@ -69,9 +68,10 @@ public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation
     @Override
     public ListenableFuture<DOMRpcResult> invokeRpc(final DOMRpcIdentifier rpc, final NormalizedNode<?, ?> input) {
         final SchemaPath schemaPath = rpc.getType();
-        final DataObject bindingInput = input != null ? deserialize(rpc.getType(), input) : null;
+        final CurrentAdapterSerializer serializer = adapterContext.currentSerializer();
+        final DataObject bindingInput = input != null ? deserialize(serializer, schemaPath, input) : null;
         final ListenableFuture<RpcResult<?>> bindingResult = invoke(schemaPath, bindingInput);
-        return LazyDOMRpcResultFuture.create(codec, bindingResult);
+        return LazyDOMRpcResultFuture.create(serializer, bindingResult);
     }
 
     @Override
@@ -79,12 +79,13 @@ public class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation
         return COST;
     }
 
-    private DataObject deserialize(final SchemaPath rpcPath, final NormalizedNode<?, ?> input) {
+    private DataObject deserialize(final CurrentAdapterSerializer serializer, final SchemaPath rpcPath,
+            final NormalizedNode<?, ?> input) {
         if (ENABLE_CODEC_SHORTCUT && input instanceof BindingLazyContainerNode) {
             return ((BindingLazyContainerNode<?>) input).getDataObject();
         }
         final SchemaPath inputSchemaPath = rpcPath.createChild(inputQname);
-        return codec.fromNormalizedNodeRpcData(inputSchemaPath, (ContainerNode) input);
+        return serializer.fromNormalizedNodeRpcData(inputSchemaPath, (ContainerNode) input);
     }
 
     private ListenableFuture<RpcResult<?>> invoke(final SchemaPath schemaPath, final DataObject input) {
index d4f20e567e1f7e58dcbcb72323b9335a2a5b4173..c03d50a1a96a87b36c31b08b08e3ac7650d56b2a 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -24,13 +25,14 @@ import org.opendaylight.yangtools.yang.binding.RpcService;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
+@VisibleForTesting
 public class BindingDOMRpcProviderServiceAdapter extends AbstractBindingAdapter<DOMRpcProviderService>
         implements RpcProviderService {
     private static final ImmutableSet<YangInstanceIdentifier> GLOBAL = ImmutableSet.of(YangInstanceIdentifier.empty());
 
-    public BindingDOMRpcProviderServiceAdapter(final DOMRpcProviderService domRpcRegistry,
-            final BindingToNormalizedNodeCodec codec) {
-        super(codec, domRpcRegistry);
+    public BindingDOMRpcProviderServiceAdapter(final AdapterContext adapterContext,
+            final DOMRpcProviderService domRpcRegistry) {
+        super(adapterContext, domRpcRegistry);
     }
 
     @Override
@@ -47,10 +49,10 @@ public class BindingDOMRpcProviderServiceAdapter extends AbstractBindingAdapter<
 
     private <S extends RpcService, T extends S> ObjectRegistration<T> register(final Class<S> type,
             final T implementation, final Collection<YangInstanceIdentifier> rpcContextPaths) {
-        final Map<SchemaPath, Method> rpcs = getCodec().getRpcMethodToSchemaPath(type).inverse();
+        final Map<SchemaPath, Method> rpcs = currentSerializer().getRpcMethodToSchemaPath(type).inverse();
 
-        final BindingDOMRpcImplementationAdapter adapter = new BindingDOMRpcImplementationAdapter(
-            getCodec().getCodecRegistry(), type, rpcs, implementation);
+        final BindingDOMRpcImplementationAdapter adapter = new BindingDOMRpcImplementationAdapter(adapterContext(),
+            type, rpcs, implementation);
         final Set<DOMRpcIdentifier> domRpcs = createDomRpcIdentifiers(rpcs.keySet(), rpcContextPaths);
         final DOMRpcImplementationRegistration<?> domReg = getDelegate().registerRpcImplementation(adapter, domRpcs);
         return new BindingRpcAdapterRegistration<>(implementation, domReg);
@@ -69,8 +71,9 @@ public class BindingDOMRpcProviderServiceAdapter extends AbstractBindingAdapter<
 
     private Collection<YangInstanceIdentifier> toYangInstanceIdentifiers(final Set<InstanceIdentifier<?>> identifiers) {
         final Collection<YangInstanceIdentifier> ret = new ArrayList<>(identifiers.size());
+        final CurrentAdapterSerializer serializer = currentSerializer();
         for (final InstanceIdentifier<?> binding : identifiers) {
-            ret.add(getCodec().toYangInstanceIdentifierCached(binding));
+            ret.add(serializer.toCachedYangInstanceIdentifier(binding));
         }
         return ret;
     }
index 3faeade1457fcc7f8eba89aea6935ad643dd0393..e9dfe32d3dfd4013a98edc14589ba9ea553d5688 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.dom.adapter;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.collect.ImmutableSet;
 import java.util.Set;
@@ -19,14 +20,14 @@ import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMService;
 import org.opendaylight.yangtools.yang.binding.RpcService;
 
+@VisibleForTesting
 public class BindingDOMRpcServiceAdapter
         extends AbstractBindingLoadingAdapter<DOMRpcService, Class<? extends RpcService>, RpcServiceAdapter>
         implements RpcConsumerRegistry {
+    static final Factory<RpcConsumerRegistry> BUILDER_FACTORY = Builder::new;
 
-    protected static final Factory<RpcConsumerRegistry> BUILDER_FACTORY = Builder::new;
-
-    public BindingDOMRpcServiceAdapter(final DOMRpcService domService, final BindingToNormalizedNodeCodec codec) {
-        super(codec, domService);
+    public BindingDOMRpcServiceAdapter(final AdapterContext adapterContext, final DOMRpcService domService) {
+        super(adapterContext, domService);
     }
 
     @SuppressWarnings("unchecked")
@@ -40,20 +41,22 @@ public class BindingDOMRpcServiceAdapter
     RpcServiceAdapter loadAdapter(final Class<? extends RpcService> key) {
         checkArgument(BindingReflections.isBindingClass(key));
         checkArgument(key.isInterface(), "Supplied RPC service type must be interface.");
-        return new RpcServiceAdapter(key, getCodec(), getDelegate());
+        return new RpcServiceAdapter(key, adapterContext(), getDelegate());
     }
 
     private static final class Builder extends BindingDOMAdapterBuilder<RpcConsumerRegistry> {
-        @Override
-        protected RpcConsumerRegistry createInstance(final BindingToNormalizedNodeCodec codec,
-                final ClassToInstanceMap<DOMService> delegates) {
-            final DOMRpcService domRpc = delegates.getInstance(DOMRpcService.class);
-            return new BindingDOMRpcServiceAdapter(domRpc  , codec);
+        Builder(final AdapterContext adapterContext) {
+            super(adapterContext);
         }
 
         @Override
         public Set<? extends Class<? extends DOMService>> getRequiredDelegates() {
             return ImmutableSet.of(DOMRpcService.class);
         }
+
+        @Override
+        protected RpcConsumerRegistry createInstance(final ClassToInstanceMap<DOMService> delegates) {
+            return new BindingDOMRpcServiceAdapter(adapterContext(), delegates.getInstance(DOMRpcService.class));
+        }
     }
 }
index 2a8702fbb364506ccd4fbfb7416d9629d886a188..9ccb36df532dcb320e02bf2d7b0cc36fdc740100 100644 (file)
@@ -18,7 +18,6 @@ import com.google.common.util.concurrent.MoreExecutors;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.function.Function;
 import java.util.function.Supplier;
-import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
 import org.opendaylight.mdsal.binding.api.TransactionChain;
@@ -41,17 +40,17 @@ final class BindingDOMTransactionChainAdapter implements TransactionChain, Deleg
     private static final Logger LOG = LoggerFactory.getLogger(BindingDOMTransactionChainAdapter.class);
 
     private final DOMTransactionChain delegate;
-    private final BindingToNormalizedNodeCodec codec;
+    private final AdapterContext adapterContext;
     private final DelegateChainListener domListener;
     private final TransactionChainListener bindingListener;
 
     BindingDOMTransactionChainAdapter(final Function<DOMTransactionChainListener, DOMTransactionChain> chainFactory,
-            final BindingToNormalizedNodeCodec codec, final TransactionChainListener listener) {
+            final AdapterContext codec, final TransactionChainListener listener) {
         requireNonNull(chainFactory, "DOM Transaction chain factory must not be null");
         this.domListener = new DelegateChainListener();
         this.bindingListener = listener;
         this.delegate = chainFactory.apply(domListener);
-        this.codec = codec;
+        this.adapterContext = requireNonNull(codec);
     }
 
     @Override
@@ -61,15 +60,16 @@ final class BindingDOMTransactionChainAdapter implements TransactionChain, Deleg
 
     @Override
     public ReadTransaction newReadOnlyTransaction() {
-        return new BindingDOMReadTransactionAdapter(createTransaction(delegate::newReadOnlyTransaction), codec);
+        return new BindingDOMReadTransactionAdapter(adapterContext,
+            createTransaction(delegate::newReadOnlyTransaction));
     }
 
     @Override
     public WriteTransaction newWriteOnlyTransaction() {
         final DOMDataTreeWriteTransaction delegateTx = createTransaction(delegate::newWriteOnlyTransaction);
-        return new BindingDOMWriteTransactionAdapter<DOMDataTreeWriteTransaction>(delegateTx, codec) {
+        return new BindingDOMWriteTransactionAdapter<>(adapterContext, delegateTx) {
             @Override
-            public @NonNull FluentFuture<? extends @NonNull CommitInfo> commit() {
+            public FluentFuture<? extends CommitInfo> commit() {
                 return listenForFailure(this, super.commit());
             }
         };
@@ -78,9 +78,9 @@ final class BindingDOMTransactionChainAdapter implements TransactionChain, Deleg
     @Override
     public ReadWriteTransaction newReadWriteTransaction() {
         final DOMDataTreeReadWriteTransaction delegateTx = createTransaction(delegate::newReadWriteTransaction);
-        return new BindingDOMReadWriteTransactionAdapter(delegateTx, codec) {
+        return new BindingDOMReadWriteTransactionAdapter(adapterContext, delegateTx) {
             @Override
-            public @NonNull FluentFuture<? extends @NonNull CommitInfo> commit() {
+            public FluentFuture<? extends CommitInfo> commit() {
                 return listenForFailure(this, super.commit());
             }
         };
@@ -141,7 +141,6 @@ final class BindingDOMTransactionChainAdapter implements TransactionChain, Deleg
              * of this transaction chain), instead of DOM transaction
              * which is known only to this chain, binding transaction implementation
              * and underlying transaction chain.
-             *
              */
             LOG.debug("Transaction chain {} failed. Failed DOM Transaction {}",this,transaction,cause);
         }
index 8f1e639436c9e3afaa3cddb5a60f5bcea14539d2..35edcd0bf5e6f07de807139d184510506aaa4d30 100644 (file)
@@ -23,8 +23,8 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 
 class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> extends AbstractForwardedTransaction<T>
         implements WriteTransaction {
-    BindingDOMWriteTransactionAdapter(final T delegateTx, final BindingToNormalizedNodeCodec codec) {
-        super(delegateTx, codec);
+    BindingDOMWriteTransactionAdapter(final AdapterContext adapterContext, final T delegateTx) {
+        super(adapterContext, delegateTx);
     }
 
     @Override
@@ -37,9 +37,10 @@ class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> e
     @Override
     public final <U extends DataObject> void mergeParentStructurePut(final LogicalDatastoreType store,
             final InstanceIdentifier<U> path, final U data) {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("put",
-            path, data);
-        ensureParentsByMerge(store, normalized.getKey(), path);
+        final CurrentAdapterSerializer serializer = adapterContext().currentSerializer();
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized(serializer, "put", path,
+            data);
+        ensureParentsByMerge(serializer, store, normalized.getKey(), path);
         getDelegate().put(store, normalized.getKey(), normalized.getValue());
     }
 
@@ -53,17 +54,17 @@ class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> e
     @Override
     public final <U extends DataObject> void mergeParentStructureMerge(final LogicalDatastoreType store,
             final InstanceIdentifier<U> path, final U data) {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized("merge", path, data);
-        ensureParentsByMerge(store, normalized.getKey(), path);
+        final CurrentAdapterSerializer serializer = adapterContext().currentSerializer();
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalized = toNormalized(serializer, "merge", path,
+            data);
+        ensureParentsByMerge(serializer, store, normalized.getKey(), path);
         getDelegate().merge(store, normalized.getKey(), normalized.getValue());
     }
 
     @Override
     public final void delete(final LogicalDatastoreType store, final InstanceIdentifier<?> path) {
         checkArgument(!path.isWildcarded(), "Cannot delete wildcarded path %s", path);
-
-        final YangInstanceIdentifier normalized = getCodec().toYangInstanceIdentifierBlocking(path);
-        getDelegate().delete(store, normalized);
+        getDelegate().delete(store, adapterContext().currentSerializer().toYangInstanceIdentifier(path));
     }
 
     @Override
@@ -84,19 +85,25 @@ class BindingDOMWriteTransactionAdapter<T extends DOMDataTreeWriteTransaction> e
      * @param domPath an instance of YangInstanceIdentifier
      * @param path an instance of InstanceIdentifier
      */
-    private void ensureParentsByMerge(final LogicalDatastoreType store, final YangInstanceIdentifier domPath,
-            final InstanceIdentifier<?> path) {
+    private void ensureParentsByMerge(final CurrentAdapterSerializer serializer, final LogicalDatastoreType store,
+            final YangInstanceIdentifier domPath, final InstanceIdentifier<?> path) {
         final YangInstanceIdentifier parentPath = domPath.getParent();
         if (parentPath != null && !parentPath.isEmpty()) {
             final NormalizedNode<?, ?> parentNode = ImmutableNodes.fromInstanceId(
-                getCodec().runtimeContext().getSchemaContext(), parentPath);
+                serializer.getRuntimeContext().getSchemaContext(), parentPath);
             getDelegate().merge(store, YangInstanceIdentifier.create(parentNode.getIdentifier()), parentNode);
         }
     }
 
     private <U extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalized(
             final String operation, final InstanceIdentifier<U> path, final U data) {
+        return toNormalized(adapterContext().currentSerializer(), operation, path, data);
+    }
+
+    private static <U extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalized(
+            final CurrentAdapterSerializer serializer, final String operation, final InstanceIdentifier<U> path,
+            final U data) {
         checkArgument(!path.isWildcarded(), "Cannot %s data into wildcarded path %s", operation, path);
-        return getCodec().toNormalizedNode(path, data);
+        return serializer.toNormalizedNode(path, data);
     }
 }
index 1b8966927ea15100848f810d1f5bdb81defc2a7b..3f978cd6ea263ce179c2ea9dd6096a9cbb36b5f2 100644 (file)
@@ -20,8 +20,8 @@ final class BindingMountPointAdapter implements MountPoint {
     private final InstanceIdentifier<?> identifier;
     private final LoadingCache<Class<? extends BindingService>, Optional<BindingService>> services;
 
-    BindingMountPointAdapter(final BindingToNormalizedNodeCodec codec, final DOMMountPoint domMountPoint) {
-        identifier = codec.fromYangInstanceIdentifier(domMountPoint.getIdentifier());
+    BindingMountPointAdapter(final AdapterContext codec, final DOMMountPoint domMountPoint) {
+        identifier = codec.currentSerializer().fromYangInstanceIdentifier(domMountPoint.getIdentifier());
         services = CacheBuilder.newBuilder().build(new BindingDOMAdapterLoader(codec) {
             @Override
             protected DOMService getDelegate(final Class<? extends DOMService> reqDeleg) {
index 9e79b8d73258ff42d6ffbb99397621a0b4c08450..74072ee4cfd30d36db565d302c9e6dc672e6e545 100644 (file)
@@ -14,7 +14,6 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.concurrent.ExecutionException;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.dom.api.DOMActionResult;
 import org.opendaylight.mdsal.dom.spi.SimpleDOMActionResult;
 import org.opendaylight.yangtools.yang.binding.Action;
@@ -28,15 +27,15 @@ final class BindingOperationFluentFuture<O extends RpcOutput> extends AbstractFu
     private final Class<? extends Action<?, ?, O>> action;
     private final NodeIdentifier identifier;
 
-    private BindingNormalizedNodeSerializer codec;
+    private AdapterContext adapterContext;
 
     BindingOperationFluentFuture(final ListenableFuture<RpcResult<O>> userFuture,
             final Class<? extends Action<?, ?, O>> action, final NodeIdentifier identifier,
-            final BindingNormalizedNodeSerializer codec) {
+            final AdapterContext adapterContext) {
         this.userFuture = requireNonNull(userFuture);
         this.action = requireNonNull(action);
         this.identifier = requireNonNull(identifier);
-        this.codec = requireNonNull(codec);
+        this.adapterContext = requireNonNull(adapterContext);
         userFuture.addListener(this::userFutureCompleted, MoreExecutors.directExecutor());
     }
 
@@ -53,23 +52,23 @@ final class BindingOperationFluentFuture<O extends RpcOutput> extends AbstractFu
         try {
             final RpcResult<O> bindingResult = Futures.getDone(userFuture);
             if (bindingResult.getResult() != null) {
-                domResult = new SimpleDOMActionResult(
-                        codec.toLazyNormalizedNodeActionOutput(action, identifier, bindingResult.getResult()),
-                        bindingResult.getErrors());
+                domResult = new SimpleDOMActionResult(adapterContext.currentSerializer()
+                    .toLazyNormalizedNodeActionOutput(action, identifier, bindingResult.getResult()),
+                    bindingResult.getErrors());
             } else {
                 domResult = new SimpleDOMActionResult(bindingResult.getErrors());
             }
         } catch (ExecutionException e) {
-            codec = null;
+            adapterContext = null;
             setException(e.getCause());
             return;
         } catch (RuntimeException | Error e) {
-            codec = null;
+            adapterContext = null;
             setException(e);
             return;
         }
 
-        codec = null;
+        adapterContext = null;
         set(domResult);
     }
 }
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
deleted file mode 100644 (file)
index d296fa2..0000000
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Copyright (c) 2014 Cisco Systems, Inc. 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.dom.adapter;
-
-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;
-import com.google.common.collect.ImmutableBiMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterators;
-import java.lang.reflect.Method;
-import java.time.Instant;
-import java.util.AbstractMap.SimpleEntry;
-import java.util.Collection;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-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.binding.runtime.api.DefaultBindingRuntimeContext;
-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;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
-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.spec.naming.BindingMapping;
-import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
-import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
-import org.opendaylight.mdsal.dom.api.DOMSchemaService;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.Action;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.binding.Notification;
-import org.opendaylight.yangtools.yang.binding.RpcInput;
-import org.opendaylight.yangtools.yang.binding.RpcOutput;
-import org.opendaylight.yangtools.yang.binding.RpcService;
-import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
-import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A combinations of {@link BindingCodecTreeFactory} and {@link BindingNormalizedNodeSerializer}, with internal
- * caching of instance identifiers.
- *
- * <p>
- * NOTE: this class is non-final to allow controller adapter migration without duplicated code.
- */
-@Singleton
-public class BindingToNormalizedNodeCodec implements BindingNormalizedNodeSerializer, EffectiveModelContextListener,
-        AutoCloseable {
-
-    private static final long WAIT_DURATION_SEC = 5;
-    private static final Logger LOG = LoggerFactory.getLogger(BindingToNormalizedNodeCodec.class);
-
-    private final LoadingCache<InstanceIdentifier<?>, YangInstanceIdentifier> iiCache = CacheBuilder.newBuilder()
-            .softValues().build(new CacheLoader<InstanceIdentifier<?>, YangInstanceIdentifier>() {
-                @Override
-                public YangInstanceIdentifier load(final InstanceIdentifier<?> key) {
-                    return toYangInstanceIdentifierBlocking(key);
-                }
-            });
-    private final BindingNormalizedNodeCodecRegistry codecRegistry;
-    private final ClassLoadingStrategy classLoadingStrategy;
-    private final BindingRuntimeGenerator generator;
-    private final FutureSchema futureSchema;
-
-    private ListenerRegistration<?> listenerRegistration;
-
-    @Inject
-    public BindingToNormalizedNodeCodec(final BindingRuntimeGenerator generator,
-            final ClassLoadingStrategy classLoadingStrategy, final BindingNormalizedNodeCodecRegistry codecRegistry) {
-        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) {
-        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 BindingRuntimeGenerator generator,
-            final ClassLoadingStrategy classLoadingStrategy, final DOMSchemaService schemaService) {
-        final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry();
-        BindingToNormalizedNodeCodec instance = new BindingToNormalizedNodeCodec(generator, classLoadingStrategy,
-            codecRegistry, true);
-        instance.listenerRegistration = schemaService.registerSchemaContextListener(instance);
-        return instance;
-    }
-
-    protected YangInstanceIdentifier toYangInstanceIdentifierBlocking(
-            final InstanceIdentifier<? extends DataObject> binding) {
-        try {
-            return codecRegistry.toYangInstanceIdentifier(binding);
-        } catch (final MissingSchemaException e) {
-            waitForSchema(decompose(binding), e);
-            return codecRegistry.toYangInstanceIdentifier(binding);
-        }
-    }
-
-    @Override
-    public final YangInstanceIdentifier toYangInstanceIdentifier(final InstanceIdentifier<?> binding) {
-        return codecRegistry.toYangInstanceIdentifier(binding);
-    }
-
-    protected YangInstanceIdentifier toYangInstanceIdentifierCached(final InstanceIdentifier<?> binding) {
-        return iiCache.getUnchecked(binding);
-    }
-
-    @Override
-    public final <T extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> toNormalizedNode(
-            final InstanceIdentifier<T> path, final T data) {
-        try {
-            return codecRegistry.toNormalizedNode(path, data);
-        } catch (final MissingSchemaException e) {
-            waitForSchema(decompose(path), e);
-            return codecRegistry.toNormalizedNode(path, data);
-        }
-    }
-
-    @Override
-    public final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode(final YangInstanceIdentifier path,
-            final NormalizedNode<?, ?> data) {
-        return codecRegistry.fromNormalizedNode(path, data);
-    }
-
-    @Override
-    public final Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data) {
-        return codecRegistry.fromNormalizedNodeNotification(path, data);
-    }
-
-    @Override
-    public final Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data,
-            final Instant eventInstant) {
-        return codecRegistry.fromNormalizedNodeNotification(path, data, eventInstant);
-    }
-
-    @Override
-    public final DataObject fromNormalizedNodeRpcData(final SchemaPath path, final ContainerNode data) {
-        return codecRegistry.fromNormalizedNodeRpcData(path, data);
-    }
-
-    @Override
-    public <T extends RpcInput> T fromNormalizedNodeActionInput(final Class<? extends Action<?, ?, ?>> action,
-            final ContainerNode input) {
-        return codecRegistry.fromNormalizedNodeActionInput(action, input);
-    }
-
-    @Override
-    public <T extends RpcOutput> T fromNormalizedNodeActionOutput(final Class<? extends Action<?, ?, ?>> action,
-            final ContainerNode output) {
-        return codecRegistry.fromNormalizedNodeActionOutput(action, output);
-    }
-
-    @Override
-    public final <T extends DataObject> InstanceIdentifier<T> fromYangInstanceIdentifier(
-            final YangInstanceIdentifier dom) {
-        return codecRegistry.fromYangInstanceIdentifier(dom);
-    }
-
-    @Override
-    public final ContainerNode toNormalizedNodeNotification(final Notification data) {
-        return codecRegistry.toNormalizedNodeNotification(data);
-    }
-
-    @Override
-    public final ContainerNode toNormalizedNodeRpcData(final DataContainer data) {
-        return codecRegistry.toNormalizedNodeRpcData(data);
-    }
-
-    @Override
-    public ContainerNode toNormalizedNodeActionInput(final Class<? extends Action<?, ?, ?>> action,
-            final RpcInput input) {
-        return codecRegistry.toNormalizedNodeActionInput(action, input);
-    }
-
-    @Override
-    public ContainerNode toNormalizedNodeActionOutput(final Class<? extends Action<?, ?, ?>> action,
-            final RpcOutput output) {
-        return codecRegistry.toNormalizedNodeActionOutput(action, output);
-    }
-
-    @Override
-    public BindingLazyContainerNode<RpcInput> toLazyNormalizedNodeActionInput(
-            final Class<? extends Action<?, ?, ?>> action, final NodeIdentifier identifier, final RpcInput input) {
-        return codecRegistry.toLazyNormalizedNodeActionInput(action, identifier, input);
-    }
-
-    @Override
-    public BindingLazyContainerNode<RpcOutput> toLazyNormalizedNodeActionOutput(
-            final Class<? extends Action<?, ?, ?>> action, final NodeIdentifier identifier, final RpcOutput output) {
-        return codecRegistry.toLazyNormalizedNodeActionOutput(action, identifier, output);
-    }
-
-    /**
-     * Returns a Binding-Aware instance identifier from normalized
-     * instance-identifier if it is possible to create representation.
-     *
-     * <p>
-     * Returns Optional.empty for cases where target is mixin node except
-     * augmentation.
-     */
-    public final Optional<InstanceIdentifier<? extends DataObject>> toBinding(final YangInstanceIdentifier normalized)
-                    throws DeserializationException {
-        try {
-            return Optional.ofNullable(codecRegistry.fromYangInstanceIdentifier(normalized));
-        } catch (final IllegalArgumentException e) {
-            return Optional.empty();
-        }
-    }
-
-    @Override
-    public void onModelContextUpdated(final EffectiveModelContext newModelContext) {
-        final BindingRuntimeContext runtimeContext = DefaultBindingRuntimeContext.create(
-            generator.generateTypeMapping(newModelContext), classLoadingStrategy);
-        codecRegistry.onBindingRuntimeContextUpdated(runtimeContext);
-        futureSchema.onRuntimeContextUpdated(runtimeContext);
-    }
-
-    public final BindingNormalizedNodeCodecRegistry getCodecRegistry() {
-        return codecRegistry;
-    }
-
-    @Override
-    @PreDestroy
-    public void close() {
-        if (listenerRegistration != null) {
-            listenerRegistration.close();
-        }
-    }
-
-    // FIXME: This should be probably part of Binding Runtime context
-    public final ImmutableBiMap<Method, SchemaPath> getRpcMethodToSchemaPath(final Class<? extends RpcService> key) {
-        final Module module = getModuleBlocking(key);
-        final ImmutableBiMap.Builder<Method, SchemaPath> ret = ImmutableBiMap.builder();
-        try {
-            for (final RpcDefinition rpcDef : module.getRpcs()) {
-                final Method method = findRpcMethod(key, rpcDef);
-                ret.put(method, rpcDef.getPath());
-            }
-        } catch (final NoSuchMethodException e) {
-            throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e);
-        }
-        return ret.build();
-    }
-
-    protected ImmutableBiMap<Method, RpcDefinition> getRpcMethodToSchema(final Class<? extends RpcService> key) {
-        final Module module = getModuleBlocking(key);
-        final ImmutableBiMap.Builder<Method, RpcDefinition> ret = ImmutableBiMap.builder();
-        try {
-            for (final RpcDefinition rpcDef : module.getRpcs()) {
-                final Method method = findRpcMethod(key, rpcDef);
-                ret.put(method, rpcDef);
-            }
-        } catch (final NoSuchMethodException e) {
-            throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e);
-        }
-        return ret.build();
-    }
-
-    private Module getModuleBlocking(final Class<?> modeledClass) {
-        final QNameModule moduleName = BindingReflections.getQNameModule(modeledClass);
-        BindingRuntimeContext localRuntimeContext = runtimeContext();
-        Module module = localRuntimeContext == null ? null :
-            localRuntimeContext.getSchemaContext().findModule(moduleName).orElse(null);
-        if (module == null && futureSchema.waitForSchema(moduleName)) {
-            localRuntimeContext = runtimeContext();
-            checkState(localRuntimeContext != null, "BindingRuntimeContext is not available.");
-            module = localRuntimeContext.getSchemaContext().findModule(moduleName).orElse(null);
-        }
-        if (module != null) {
-            return module;
-        }
-
-        LOG.debug("Schema for {} is not available; expected module name: {}; BindingRuntimeContext: {}",
-                modeledClass, moduleName, localRuntimeContext);
-        throw new IllegalStateException(String.format("Schema for %s is not available; expected module name: %s; "
-                + "full BindingRuntimeContext available in debug log", modeledClass, moduleName));
-    }
-
-    private void waitForSchema(final Collection<Class<?>> binding, final MissingSchemaException exception) {
-        LOG.warn("Blocking thread to wait for schema convergence updates for {} {}", futureSchema.getDuration(),
-            futureSchema.getUnit());
-        if (!futureSchema.waitForSchema(binding)) {
-            throw exception;
-        }
-    }
-
-    private Method findRpcMethod(final Class<? extends RpcService> key, final RpcDefinition rpcDef)
-            throws NoSuchMethodException {
-        final String methodName = BindingMapping.getRpcMethodName(rpcDef.getQName());
-        final Class<?> inputClz = runtimeContext().getClassForSchema(rpcDef.getInput());
-        return key.getMethod(methodName, inputClz);
-    }
-
-    protected @NonNull Entry<InstanceIdentifier<?>, BindingDataObjectCodecTreeNode<?>> getSubtreeCodec(
-            final YangInstanceIdentifier domIdentifier) {
-
-        final BindingCodecTree currentCodecTree = codecRegistry.getCodecContext();
-        final InstanceIdentifier<?> bindingPath = codecRegistry.fromYangInstanceIdentifier(domIdentifier);
-        checkArgument(bindingPath != null);
-        /**
-         * If we are able to deserialize YANG instance identifier, getSubtreeCodec must
-         * return non-null value.
-         */
-        final BindingDataObjectCodecTreeNode<?> codecContext = currentCodecTree.getSubtreeCodec(bindingPath);
-        return new SimpleEntry<>(bindingPath, codecContext);
-    }
-
-    final SchemaPath getActionPath(final Class<? extends Action<?, ?, ?>> type) {
-        final ActionDefinition schema = runtimeContext().getActionDefinition(type);
-        checkArgument(schema != null, "Failed to find schema for %s", type);
-        return schema.getPath();
-    }
-
-    final BindingRuntimeContext runtimeContext() {
-        return futureSchema.runtimeContext();
-    }
-
-    private static Collection<Class<?>> decompose(final InstanceIdentifier<?> path) {
-        return ImmutableSet.copyOf(Iterators.transform(path.getPathArguments().iterator(), PathArgument::getType));
-    }
-
-    protected Collection<DOMDataTreeIdentifier> toDOMDataTreeIdentifiers(
-            final Collection<DataTreeIdentifier<?>> subtrees) {
-        return subtrees.stream().map(this::toDOMDataTreeIdentifier).collect(Collectors.toSet());
-    }
-
-    protected DOMDataTreeIdentifier toDOMDataTreeIdentifier(final DataTreeIdentifier<?> path) {
-        final YangInstanceIdentifier domPath = toYangInstanceIdentifierBlocking(path.getRootIdentifier());
-        return new DOMDataTreeIdentifier(path.getDatastoreType(), domPath);
-    }
-}
diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ConstantAdapterContext.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ConstantAdapterContext.java
new file mode 100644 (file)
index 0000000..ac04d99
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * 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.dom.adapter;
+
+import com.google.common.annotations.Beta;
+import java.util.ServiceLoader;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.eclipse.jdt.annotation.NonNull;
+import org.kohsuke.MetaInfServices;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
+
+/**
+ * A simple, constant implementation of the BlockingBindingNormalizer contract. This implementation is appropriate
+ * in contexts where the backing context cannot change.
+ */
+@Beta
+@MetaInfServices
+@Singleton
+public final class ConstantAdapterContext implements AdapterContext {
+    private final @NonNull CurrentAdapterSerializer serializer;
+
+    public ConstantAdapterContext() {
+        this(ServiceLoader.load(BindingDOMCodecServices.class).findFirst()
+            .orElseThrow(() -> new IllegalStateException("Cannot load BindingDOMCodecServices")));
+    }
+
+    @Inject
+    public ConstantAdapterContext(final BindingDOMCodecServices codec) {
+        this.serializer = new CurrentAdapterSerializer(codec);
+    }
+
+    @Override
+    public CurrentAdapterSerializer currentSerializer() {
+        return serializer;
+    }
+}
diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java
new file mode 100644 (file)
index 0000000..b0980fd
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * 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.dom.adapter;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Verify.verifyNotNull;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.annotations.Beta;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableBiMap;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.stream.Collectors;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
+import org.opendaylight.mdsal.binding.dom.codec.spi.ForwardingBindingDOMCodecServices;
+import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
+import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
+import org.opendaylight.yangtools.yang.binding.Action;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.RpcService;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Beta
+@VisibleForTesting
+public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecServices {
+    private static final Logger LOG = LoggerFactory.getLogger(CurrentAdapterSerializer.class);
+
+    private final LoadingCache<InstanceIdentifier<?>, YangInstanceIdentifier> cache = CacheBuilder.newBuilder()
+            .softValues().build(new CacheLoader<InstanceIdentifier<?>, YangInstanceIdentifier>() {
+                @Override
+                public YangInstanceIdentifier load(final InstanceIdentifier<?> key) {
+                    return toYangInstanceIdentifier(key);
+                }
+            });
+
+    private final @NonNull BindingDOMCodecServices delegate;
+
+    public CurrentAdapterSerializer(final BindingDOMCodecServices delegate) {
+        this.delegate = requireNonNull(delegate);
+    }
+
+    @Override
+    protected BindingDOMCodecServices delegate() {
+        return delegate;
+    }
+
+    @NonNull YangInstanceIdentifier toCachedYangInstanceIdentifier(final @NonNull InstanceIdentifier<?> path) {
+        return cache.getUnchecked(path);
+    }
+
+    <T extends DataObject> @NonNull InstanceIdentifier<T> coerceInstanceIdentifier(final YangInstanceIdentifier dom) {
+        return verifyNotNull(fromYangInstanceIdentifier(dom));
+    }
+
+    DOMDataTreeIdentifier toDOMDataTreeIdentifier(final DataTreeIdentifier<?> path) {
+        return new DOMDataTreeIdentifier(path.getDatastoreType(), toYangInstanceIdentifier(path.getRootIdentifier()));
+    }
+
+    Collection<DOMDataTreeIdentifier> toDOMDataTreeIdentifiers(final Collection<DataTreeIdentifier<?>> subtrees) {
+        return subtrees.stream().map(this::toDOMDataTreeIdentifier).collect(Collectors.toSet());
+    }
+
+    @NonNull SchemaPath getActionPath(final @NonNull Class<? extends Action<?, ?, ?>> type) {
+        final ActionDefinition schema = getRuntimeContext().getActionDefinition(type);
+        checkArgument(schema != null, "Failed to find schema for %s", type);
+        return schema.getPath();
+    }
+
+    // FIXME: This should be probably part of Binding Runtime context
+    ImmutableBiMap<Method, RpcDefinition> getRpcMethodToSchema(final Class<? extends RpcService> key) {
+        final Module module = getModule(key);
+        final ImmutableBiMap.Builder<Method, RpcDefinition> ret = ImmutableBiMap.builder();
+        try {
+            for (final RpcDefinition rpcDef : module.getRpcs()) {
+                final Method method = findRpcMethod(key, rpcDef);
+                ret.put(method, rpcDef);
+            }
+        } catch (final NoSuchMethodException e) {
+            throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e);
+        }
+        return ret.build();
+    }
+
+    // FIXME: This should be probably part of Binding Runtime context
+    ImmutableBiMap<Method, SchemaPath> getRpcMethodToSchemaPath(final Class<? extends RpcService> key) {
+        final Module module = getModule(key);
+        final ImmutableBiMap.Builder<Method, SchemaPath> ret = ImmutableBiMap.builder();
+        try {
+            for (final RpcDefinition rpcDef : module.getRpcs()) {
+                final Method method = findRpcMethod(key, rpcDef);
+                ret.put(method, rpcDef.getPath());
+            }
+        } catch (final NoSuchMethodException e) {
+            throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e);
+        }
+        return ret.build();
+    }
+
+    private Module getModule(final Class<?> modeledClass) {
+        final QNameModule moduleName = BindingReflections.getQNameModule(modeledClass);
+        final BindingRuntimeContext localRuntimeContext = getRuntimeContext();
+        final Module module = localRuntimeContext.getSchemaContext().findModule(moduleName).orElse(null);
+        if (module != null) {
+            return module;
+        }
+
+        LOG.trace("Schema for {} is not available; expected module name: {}; BindingRuntimeContext: {}",
+                modeledClass, moduleName, localRuntimeContext);
+        throw new IllegalStateException(String.format("Schema for %s is not available; expected module name: %s; "
+                + "full BindingRuntimeContext available in trace log", modeledClass, moduleName));
+    }
+
+    private Method findRpcMethod(final Class<? extends RpcService> key, final RpcDefinition rpcDef)
+            throws NoSuchMethodException {
+        final String methodName = BindingMapping.getRpcMethodName(rpcDef.getQName());
+        final Class<?> inputClz = getRuntimeContext().getClassForSchema(rpcDef.getInput());
+        return key.getMethod(methodName, inputClz);
+    }
+}
index 82c99140e559a2f41b7a3a2c5b134d2d933e60f0..95aec5e11099f8d281d9e63507311acc9a1a7725 100644 (file)
@@ -13,7 +13,6 @@ import com.google.common.base.MoreObjects;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map.Entry;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
@@ -21,6 +20,7 @@ import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeCandidate;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
@@ -42,30 +42,26 @@ final class LazyDataTreeModification<T extends DataObject> implements DataTreeMo
     }
 
     @SuppressWarnings({"unchecked", "rawtypes"})
-    static <T extends DataObject> DataTreeModification<T> create(final BindingToNormalizedNodeCodec codec,
+    static <T extends DataObject> DataTreeModification<T> create(final CurrentAdapterSerializer serializer,
             final DataTreeCandidate domChange, final LogicalDatastoreType datastoreType) {
-        final Entry<InstanceIdentifier<?>, BindingDataObjectCodecTreeNode<?>> codecCtx = codec.getSubtreeCodec(
-            domChange.getRootPath());
-        final DataTreeIdentifier<?> path = DataTreeIdentifier.create(datastoreType, codecCtx.getKey());
-        final DataObjectModification<?> modification = LazyDataObjectModification.create(codecCtx.getValue(),
-            domChange.getRootNode());
-        return new LazyDataTreeModification(path, modification);
+        final InstanceIdentifier<?> bindingPath = serializer.coerceInstanceIdentifier(domChange.getRootPath());
+        final BindingDataObjectCodecTreeNode<?> codec = serializer.getSubtreeCodec(bindingPath);
+        final DataTreeIdentifier<?> path = DataTreeIdentifier.create(datastoreType, bindingPath);
+        return new LazyDataTreeModification(path, LazyDataObjectModification.create(codec, domChange.getRootNode()));
     }
 
     @SuppressWarnings({"unchecked", "rawtypes"})
-    static <T extends DataObject> DataTreeModification<T> create(final BindingToNormalizedNodeCodec codec,
+    static <T extends DataObject> DataTreeModification<T> create(final CurrentAdapterSerializer serializer,
             final DOMDataTreeCandidate candidate) {
-        final Entry<InstanceIdentifier<?>, BindingDataObjectCodecTreeNode<?>> codecCtx = codec.getSubtreeCodec(
-            candidate.getRootPath().getRootIdentifier());
-        final DataTreeIdentifier<?> path = DataTreeIdentifier.create(candidate.getRootPath().getDatastoreType(),
-            codecCtx.getKey());
-        final DataObjectModification<?> modification = LazyDataObjectModification.create(codecCtx.getValue(),
-            candidate.getRootNode());
-        return new LazyDataTreeModification(path, modification);
+        final DOMDataTreeIdentifier domRootPath = candidate.getRootPath();
+        final InstanceIdentifier<?> bindingPath = serializer.coerceInstanceIdentifier(domRootPath.getRootIdentifier());
+        final BindingDataObjectCodecTreeNode<?> codec = serializer.getSubtreeCodec(bindingPath);
+        return new LazyDataTreeModification(DataTreeIdentifier.create(domRootPath.getDatastoreType(), bindingPath),
+            LazyDataObjectModification.create(codec, candidate.getRootNode()));
     }
 
     static <T extends DataObject> @NonNull Collection<DataTreeModification<T>> from(
-            final BindingToNormalizedNodeCodec codec, final Collection<DataTreeCandidate> domChanges,
+            final CurrentAdapterSerializer codec, final Collection<DataTreeCandidate> domChanges,
             final LogicalDatastoreType datastoreType) {
         final List<DataTreeModification<T>> result = new ArrayList<>(domChanges.size());
         for (final DataTreeCandidate domChange : domChanges) {
diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/OSGiBindingAdapterFactory.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/OSGiBindingAdapterFactory.java
new file mode 100644 (file)
index 0000000..998d427
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * 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.dom.adapter;
+
+import static com.google.common.base.Verify.verifyNotNull;
+
+import com.google.common.annotations.Beta;
+import org.opendaylight.mdsal.binding.dom.adapter.spi.AdapterFactory;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Beta
+@Component(immediate = true, service = AdapterFactory.class)
+// TODO: once we have constructor injection, unify this with BindingAdapterFactory
+public final class OSGiBindingAdapterFactory extends AbstractAdapterFactory {
+    private static final Logger LOG = LoggerFactory.getLogger(OSGiBindingAdapterFactory.class);
+
+    @Reference
+    AdapterContext codec = null;
+
+    @Override
+    AdapterContext context() {
+        return verifyNotNull(codec);
+    }
+
+    @Activate
+    @SuppressWarnings("static-method")
+    void activate() {
+        LOG.info("Binding Adapter Factory activated");
+    }
+
+    @Deactivate
+    @SuppressWarnings("static-method")
+    void deactivate() {
+        LOG.info("Binding Adapter Factory deactivated");
+    }
+}
diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/OSGiBlockingBindingNormalizer.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/OSGiBlockingBindingNormalizer.java
new file mode 100644 (file)
index 0000000..17f0771
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * 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.dom.adapter;
+
+import static com.google.common.base.Verify.verifyNotNull;
+
+import com.google.common.annotations.Beta;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Beta
+@Component(immediate = true, service = AdapterContext.class)
+public final class OSGiBlockingBindingNormalizer implements AdapterContext {
+    private static final Logger LOG = LoggerFactory.getLogger(OSGiBlockingBindingNormalizer.class);
+
+    @Reference(updated = "update")
+    volatile BindingDOMCodecServices codec = null;
+
+    private volatile CurrentAdapterSerializer serializer;
+
+    @Override
+    public CurrentAdapterSerializer currentSerializer() {
+        return verifyNotNull(serializer);
+    }
+
+    @Activate
+    void activate() {
+        serializer = new CurrentAdapterSerializer(codec);
+        LOG.info("Binding/DOM adapter activated");
+    }
+
+    @Deactivate
+    void deactivate() {
+        serializer = null;
+        LOG.info("Binding/DOM adapter deactivated");
+    }
+
+    void update() {
+        serializer = new CurrentAdapterSerializer(codec);
+        LOG.info("Binding/DOM adapter updated");
+    }
+}
index 8174f6c861fbfb3b4e983e7907f39e7881e1f628..a66aab8a9a02a5b4927b51e34ec5bcdddac717de 100644 (file)
@@ -11,7 +11,9 @@ import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
 import static org.opendaylight.mdsal.binding.dom.adapter.StaticConfiguration.ENABLE_CODEC_SHORTCUT;
 
+import com.google.common.collect.ImmutableBiMap;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
@@ -44,17 +46,20 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 class RpcServiceAdapter implements InvocationHandler {
     private final ImmutableMap<Method, RpcInvocationStrategy> rpcNames;
     private final Class<? extends RpcService> type;
-    private final BindingToNormalizedNodeCodec codec;
+    private final AdapterContext adapterContext;
     private final DOMRpcService delegate;
     private final RpcService proxy;
 
-    RpcServiceAdapter(final Class<? extends RpcService> type, final BindingToNormalizedNodeCodec codec,
+    RpcServiceAdapter(final Class<? extends RpcService> type, final AdapterContext adapterContext,
             final DOMRpcService domService) {
         this.type = requireNonNull(type);
-        this.codec = requireNonNull(codec);
+        this.adapterContext = requireNonNull(adapterContext);
         this.delegate = requireNonNull(domService);
-        final ImmutableMap.Builder<Method, RpcInvocationStrategy> rpcBuilder = ImmutableMap.builder();
-        for (final Entry<Method, RpcDefinition> rpc : codec.getRpcMethodToSchema(type).entrySet()) {
+
+        final ImmutableBiMap<Method, RpcDefinition> methods = adapterContext.currentSerializer()
+                .getRpcMethodToSchema(type);
+        final Builder<Method, RpcInvocationStrategy> rpcBuilder = ImmutableMap.builderWithExpectedSize(methods.size());
+        for (final Entry<Method, RpcDefinition> rpc : methods.entrySet()) {
             rpcBuilder.put(rpc.getKey(), createStrategy(rpc.getKey(), rpc.getValue()));
         }
         rpcNames = rpcBuilder.build();
@@ -113,10 +118,9 @@ class RpcServiceAdapter implements InvocationHandler {
     }
 
     private abstract class RpcInvocationStrategy {
-
         private final SchemaPath rpcName;
 
-        protected RpcInvocationStrategy(final SchemaPath path) {
+        RpcInvocationStrategy(final SchemaPath path) {
             rpcName = path;
         }
 
@@ -140,7 +144,7 @@ class RpcServiceAdapter implements InvocationHandler {
                 return ((BindingRpcFutureAware) result).getBindingFuture();
             }
 
-            return transformFuture(schemaPath, result, codec.getCodecRegistry());
+            return transformFuture(schemaPath, result, adapterContext.currentSerializer());
         }
 
         private ListenableFuture<RpcResult<?>> transformFuture(final SchemaPath rpc,
@@ -162,24 +166,21 @@ class RpcServiceAdapter implements InvocationHandler {
     }
 
     private final class NonRoutedStrategy extends RpcInvocationStrategy {
-
-        protected NonRoutedStrategy(final SchemaPath path) {
+        NonRoutedStrategy(final SchemaPath path) {
             super(path);
         }
 
         @Override
         ContainerNode serialize(final DataObject input) {
-            return LazySerializedContainerNode.create(getRpcName(), input, codec.getCodecRegistry());
+            return LazySerializedContainerNode.create(getRpcName(), input, adapterContext.currentSerializer());
         }
-
     }
 
     private final class RoutedStrategy extends RpcInvocationStrategy {
-
         private final ContextReferenceExtractor refExtractor;
         private final NodeIdentifier contextName;
 
-        protected RoutedStrategy(final SchemaPath path, final Method rpcMethod, final QName leafName) {
+        RoutedStrategy(final SchemaPath path, final Method rpcMethod, final QName leafName) {
             super(path);
             final Optional<Class<? extends DataContainer>> maybeInputType =
                     BindingReflections.resolveRpcInputClass(rpcMethod);
@@ -192,13 +193,14 @@ class RpcServiceAdapter implements InvocationHandler {
         @Override
         ContainerNode serialize(final DataObject input) {
             final InstanceIdentifier<?> bindingII = refExtractor.extract(input);
+            final CurrentAdapterSerializer serializer = adapterContext.currentSerializer();
+
             if (bindingII != null) {
-                final YangInstanceIdentifier yangII = codec.toYangInstanceIdentifierCached(bindingII);
+                final YangInstanceIdentifier yangII = serializer.toCachedYangInstanceIdentifier(bindingII);
                 final LeafNode<?> contextRef = ImmutableNodes.leafNode(contextName, yangII);
-                return LazySerializedContainerNode.withContextRef(getRpcName(), input, contextRef,
-                        codec.getCodecRegistry());
+                return LazySerializedContainerNode.withContextRef(getRpcName(), input, contextRef, serializer);
             }
-            return LazySerializedContainerNode.create(getRpcName(), input, codec.getCodecRegistry());
+            return LazySerializedContainerNode.create(getRpcName(), input, serializer);
         }
 
     }
index a2992732e0d81d0fd04d66b012f061c4d3e79e03..3109e46759b3893ee1c95c808992dfcbd7d17ccb 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.mdsal.binding.dom.adapter.osgi;
 
 import com.google.common.collect.ImmutableList;
 import java.util.List;
-import org.checkerframework.checker.lock.qual.GuardedBy;
 import org.opendaylight.mdsal.binding.api.ActionProviderService;
 import org.opendaylight.mdsal.binding.api.ActionService;
 import org.opendaylight.mdsal.binding.api.BindingService;
@@ -32,6 +31,10 @@ import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.mdsal.dom.api.DOMService;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.osgi.util.tracker.ServiceTracker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,13 +45,17 @@ import org.slf4j.LoggerFactory;
  *
  * @author Robert Varga
  */
-public final class DynamicBindingAdapter implements AutoCloseable {
+@Component(immediate = true)
+public final class DynamicBindingAdapter {
     private static final Logger LOG = LoggerFactory.getLogger(DynamicBindingAdapter.class);
 
-    @GuardedBy("this")
-    private List<AdaptingTracker<?, ?>> trackers;
+    private List<AdaptingTracker<?, ?>> trackers = ImmutableList.of();
 
-    public DynamicBindingAdapter(final AdapterFactory factory, final BundleContext ctx) {
+    @Reference
+    AdapterFactory factory = null;
+
+    @Activate
+    void activate(final BundleContext ctx) {
         trackers = ImmutableList.of(
             new AdaptingTracker<>(ctx, DOMDataBroker.class, DataBroker.class, factory::createDataBroker),
             new AdaptingTracker<>(ctx, DOMDataTreeService.class, DataTreeService.class, factory::createDataTreeService),
@@ -71,18 +78,13 @@ public final class DynamicBindingAdapter implements AutoCloseable {
         LOG.info("{} DOMService trackers started", trackers.size());
     }
 
-    @Override
-    public void close() {
-        final List<AdaptingTracker<?, ?>> toClose;
-        synchronized (this) {
-            toClose = trackers;
-            trackers = ImmutableList.of();
-        }
-
-        LOG.debug("Stopping {} DOMService trackers", toClose.size());
-        if (!toClose.isEmpty()) {
-            toClose.forEach(AdaptingTracker::close);
-            LOG.info("{} DOMService trackers stopped", toClose.size());
+    @Deactivate
+    void deactivate() {
+        LOG.debug("Stopping {} DOMService trackers", trackers.size());
+        if (!trackers.isEmpty()) {
+            trackers.forEach(AdaptingTracker::close);
+            LOG.info("{} DOMService trackers stopped", trackers.size());
         }
+        trackers = ImmutableList.of();
     }
 }
diff --git a/binding/mdsal-binding-dom-adapter/src/main/resources/org/opendaylight/blueprint/binding-adapter.xml b/binding/mdsal-binding-dom-adapter/src/main/resources/org/opendaylight/blueprint/binding-adapter.xml
deleted file mode 100644 (file)
index 5f2a73b..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
-
-  <!-- Runtime binding/normalized mapping service -->
-  <reference id="classLoadingStrategy" interface="org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy"/>
-  <reference id="schemaService" interface="org.opendaylight.mdsal.dom.api.DOMSchemaService" />
-
-  <bean id="mappingCodec" class="org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec"
-         factory-method="newInstance" destroy-method="close">
-    <argument ref="classLoadingStrategy"/>
-    <argument ref="schemaService"/>
-  </bean>
-
-  <!-- Adapter factory based on the codec -->
-  <bean id="adapterFactory" class="org.opendaylight.mdsal.binding.dom.adapter.BindingAdapterFactory">
-    <argument ref="mappingCodec"/>
-  </bean>
-
-  <!-- Automatic DOM/Binding adapter instantiation -->
-  <bean id="dynamicAdapter" class="org.opendaylight.mdsal.binding.dom.adapter.osgi.DynamicBindingAdapter"
-      destroy-method="close">
-    <argument ref="adapterFactory"/>
-    <argument ref="blueprintBundleContext"/>
-  </bean>
-
-  <service ref="adapterFactory" interface="org.opendaylight.mdsal.binding.dom.adapter.spi.AdapterFactory"/>
-</blueprint>
index 34f8062855262e4d69bfe01c66c00ab1d9d1daf9..95053a9342b04195c075230536afc4bf3606dea2 100644 (file)
@@ -13,7 +13,7 @@ import org.opendaylight.mdsal.binding.dom.adapter.test.util.BindingBrokerTestFac
 import org.opendaylight.mdsal.binding.dom.adapter.test.util.BindingTestContext;
 
 public abstract class AbstractAdapterTest {
-    protected BindingToNormalizedNodeCodec codec;
+    protected AdapterContext codec;
 
     @Before
     public void before() {
index 3e5a2a83d0c84f61c1d6cd0433f60d3c150493c2..04c0f6aa999b118321292e491e0051d585c15092 100644 (file)
@@ -9,10 +9,9 @@ package org.opendaylight.mdsal.binding.dom.adapter;
 
 import static org.junit.Assert.assertEquals;
 
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
+import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
 import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Cont;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Grpcont;
@@ -22,24 +21,14 @@ import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.grpcont.Bar;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class ActionLookupTest {
-    private static BindingToNormalizedNodeCodec CODEC;
-
-    @BeforeClass
-    public static void beforeClass() {
-        CODEC = new BindingToNormalizedNodeCodec(
-            BindingRuntimeHelpers.createRuntimeContext(new DefaultBindingRuntimeGenerator()));
-    }
-
-    @AfterClass
-    public static void afterClass() {
-        CODEC = null;
-    }
-
     @Test
     public void testActionSchemaPath() {
-        assertEquals(SchemaPath.create(true, Cont.QNAME, Foo.QNAME), CODEC.getActionPath(Foo.class));
-        assertEquals(SchemaPath.create(true, Grpcont.QNAME, Bar.QNAME), CODEC.getActionPath(Bar.class));
+        CurrentAdapterSerializer codec = new CurrentAdapterSerializer(new BindingCodecContext(
+            BindingRuntimeHelpers.createRuntimeContext(new DefaultBindingRuntimeGenerator())));
+
+        assertEquals(SchemaPath.create(true, Cont.QNAME, Foo.QNAME), codec.getActionPath(Foo.class));
+        assertEquals(SchemaPath.create(true, Grpcont.QNAME, Bar.QNAME), codec.getActionPath(Bar.class));
         assertEquals(SchemaPath.create(true, Othercont.QNAME, Bar.QNAME),
-            CODEC.getActionPath(org.opendaylight.yang.gen.v1.urn.odl.actions.norev.othercont.Bar.class));
+            codec.getActionPath(org.opendaylight.yang.gen.v1.urn.odl.actions.norev.othercont.Bar.class));
     }
 }
index 1da337dda4f02b6c155794b8a15c1cc206797216..49b7c807b87a46efd5dda9d3619549127213fb54 100644 (file)
@@ -19,11 +19,8 @@ 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.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMService;
 
@@ -32,9 +29,8 @@ public class BindingDOMAdapterLoaderTest {
 
     @Mock
     private DOMDataBroker domService;
-
     @Mock
-    private BindingNormalizedNodeCodecRegistry mockCodecRegistry;
+    private AdapterContext mockContext;
 
     private BindingDOMAdapterLoader bindingDOMAdapterLoader;
     private BindingDOMDataBrokerAdapter bindingDOMDataBrokerAdapter;
@@ -42,9 +38,7 @@ public class BindingDOMAdapterLoaderTest {
     @Before
     public void setUp() {
         doReturn(ImmutableClassToInstanceMap.of()).when(domService).getExtensions();
-        bindingDOMAdapterLoader = new BindingDOMAdapterLoader(new BindingToNormalizedNodeCodec(
-                new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
-                mockCodecRegistry)) {
+        bindingDOMAdapterLoader = new BindingDOMAdapterLoader(mockContext) {
             @Override
             protected DOMService getDelegate(final Class<? extends DOMService> reqDeleg) {
                 return domService;
index 43d6033dc651b32392538b4c0be2404f174bf4ad..c04e6ffe79bb85f4c28bd1be4a99662b1d7ada2b 100644 (file)
@@ -15,10 +15,8 @@ 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.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeCursorAwareTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteCursor;
@@ -30,16 +28,14 @@ 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(
-            new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
-                registry);
+        final BindingDOMCodecServices registry = mock(BindingDOMCodecServices.class);
+        final AdapterContext codec = new ConstantAdapterContext(registry);
         final YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.empty();
         doReturn(yangInstanceIdentifier).when(registry).toYangInstanceIdentifier(any());
         doReturn(mock(DOMDataTreeWriteCursor.class)).when(delegate).createCursor(any());
 
-        final BindingDOMCursorAwareWriteTransactionAdapter adapter =
-                new BindingDOMCursorAwareWriteTransactionAdapter<>(delegate, codec);
+        final BindingDOMCursorAwareWriteTransactionAdapter<?> adapter =
+                new BindingDOMCursorAwareWriteTransactionAdapter<>(codec, delegate);
 
         assertNotNull(adapter.createCursor(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
                 InstanceIdentifier.create(DataObject.class))));
index 7dba2f3888d7bf60d0074ba05cdc2ccbc359a2d1..df979cc3c22dd369d522079c92817d9e9236caff 100644 (file)
@@ -18,16 +18,16 @@ import static org.mockito.Mockito.verify;
 import java.util.Collection;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnitRunner;
 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;
 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.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.ClusteredDOMDataTreeChangeListener;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeListener;
@@ -43,6 +43,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
  *
  * @author Thomas Pantelis
  */
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class BindingDOMDataTreeChangeServiceAdapterTest {
     private static final InstanceIdentifier<Top> TOP_PATH = InstanceIdentifier.create(Top.class);
 
@@ -53,7 +54,7 @@ public class BindingDOMDataTreeChangeServiceAdapterTest {
     private GeneratedClassLoadingStrategy classLoadingStrategy;
 
     @Mock
-    private BindingNormalizedNodeCodecRegistry codecRegistry;
+    private BindingDOMCodecServices services;
 
     @Mock
     private YangInstanceIdentifier mockYangID;
@@ -64,30 +65,28 @@ public class BindingDOMDataTreeChangeServiceAdapterTest {
 
     @Before
     public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        doReturn(this.mockYangID).when(this.codecRegistry).toYangInstanceIdentifier(TOP_PATH);
+        doReturn(mockYangID).when(services).toYangInstanceIdentifier(TOP_PATH);
     }
 
     @Test
     public void testRegisterDataTreeChangeListener() {
-        final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec(
-            new DefaultBindingRuntimeGenerator(), classLoadingStrategy, codecRegistry);
+        final AdapterContext codec = new ConstantAdapterContext(services);
 
-        final DataTreeChangeService service = BindingDOMDataTreeChangeServiceAdapter.create(codec, this.mockDOMService);
+        final DataTreeChangeService service = new BindingDOMDataTreeChangeServiceAdapter(codec, mockDOMService);
 
-        doReturn(this.mockDOMReg).when(this.mockDOMService).registerDataTreeChangeListener(
-                domDataTreeIdentifier(this.mockYangID),
+        doReturn(mockDOMReg).when(mockDOMService).registerDataTreeChangeListener(
+                domDataTreeIdentifier(mockYangID),
                 any(DOMDataTreeChangeListener.class));
         final DataTreeIdentifier<Top> treeId = DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, TOP_PATH);
         final TestClusteredDataTreeChangeListener mockClusteredListener = new TestClusteredDataTreeChangeListener();
         service.registerDataTreeChangeListener(treeId , mockClusteredListener);
 
-        verify(this.mockDOMService).registerDataTreeChangeListener(domDataTreeIdentifier(this.mockYangID),
+        verify(mockDOMService).registerDataTreeChangeListener(domDataTreeIdentifier(this.mockYangID),
                 isA(ClusteredDOMDataTreeChangeListener.class));
 
-        reset(this.mockDOMService);
-        doReturn(this.mockDOMReg).when(this.mockDOMService).registerDataTreeChangeListener(
-                domDataTreeIdentifier(this.mockYangID), any(DOMDataTreeChangeListener.class));
+        reset(mockDOMService);
+        doReturn(mockDOMReg).when(mockDOMService).registerDataTreeChangeListener(
+                domDataTreeIdentifier(mockYangID), any(DOMDataTreeChangeListener.class));
         final TestDataTreeChangeListener mockNonClusteredListener = new TestDataTreeChangeListener();
         service.registerDataTreeChangeListener(treeId , mockNonClusteredListener);
 
index b31e9c95ec751c382befc6eb11b4031ed27463cf..4ec75095ec31cdd346cc2b3c8ede0af561217a72 100644 (file)
@@ -18,13 +18,12 @@ import static org.mockito.Mockito.verify;
 import java.util.Arrays;
 import java.util.Collection;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
-import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
+import org.mockito.junit.MockitoJUnitRunner;
 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.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.common.api.PostCanCommitStep;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeCandidate;
@@ -34,15 +33,14 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode;
 
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class BindingDOMDataTreeCommitCohortAdapterTest {
 
     @Test
-    public void canCommitTest() throws Exception {
+    public void canCommitTest() {
         final DataTreeCommitCohort<?> cohort = mock(DataTreeCommitCohort.class);
-        final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class);
-        final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec(
-            new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
-            registry);
+        final BindingDOMCodecServices registry = mock(BindingDOMCodecServices.class);
+        final AdapterContext codec = new ConstantAdapterContext(registry);
 
         final BindingDOMDataTreeCommitCohortAdapter<?> adapter =
                 new BindingDOMDataTreeCommitCohortAdapter<>(codec, cohort);
@@ -52,13 +50,11 @@ public class BindingDOMDataTreeCommitCohortAdapterTest {
         final DOMDataTreeIdentifier domDataTreeIdentifier =
                 new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.empty());
         doReturn(InstanceIdentifier.create(DataObject.class)).when(registry).fromYangInstanceIdentifier(any());
-        final BindingCodecTree bindingCodecTree = mock(BindingCodecTree.class);
         final BindingDataObjectCodecTreeNode<?> bindingCodecTreeNode = mock(BindingDataObjectCodecTreeNode.class);
-        doReturn(bindingCodecTreeNode).when(bindingCodecTree).getSubtreeCodec(any(InstanceIdentifier.class));
-        doReturn(bindingCodecTree).when(registry).getCodecContext();
+        doReturn(bindingCodecTreeNode).when(registry).getSubtreeCodec(any(InstanceIdentifier.class));
         doReturn(domDataTreeIdentifier).when(domDataTreeCandidate).getRootPath();
         doReturn(mock(DataTreeCandidateNode.class)).when(domDataTreeCandidate).getRootNode();
-        assertNotNull(LazyDataTreeModification.create(codec, domDataTreeCandidate));
+        assertNotNull(LazyDataTreeModification.create(codec.currentSerializer(), domDataTreeCandidate));
 
         final Object txId = new Object();
 
index 9620758ee640daafc4530b173d70a149558e0ea6..b1b907bcfd8070729a22684801827b0a37a018aa 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.mdsal.binding.dom.adapter;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -46,9 +45,6 @@ public class BindingDOMDataTreeCommitCohortRegistryAdapterTest {
         final BindingDOMDataTreeCommitCohortRegistryAdapter registryAdapter =
                 new BindingDOMDataTreeCommitCohortRegistryAdapter(bindingTestContext.getCodec(), cohortRegistry);
 
-        assertNotNull(BindingDOMDataTreeCommitCohortRegistryAdapter.from(bindingTestContext.getCodec(),
-            cohortRegistry));
-
         final DataTreeIdentifier<Top> dataTreeIdentifier = DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
                 InstanceIdentifier.create(Top.class));
         final DataTreeCommitCohort<Top> dataTreeCommitCohort = mock(DataTreeCommitCohort.class);
index c5dc8ded71e94ced29b9836596b9bc0d57811787..33cf71c4a4e51d888cc0c42447ffd60ee1ea3977 100644 (file)
@@ -14,13 +14,14 @@ import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
-import static org.mockito.MockitoAnnotations.initMocks;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.MoreExecutors;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.mdsal.binding.api.DataTreeProducerException;
 import org.opendaylight.mdsal.binding.dom.adapter.test.util.BindingBrokerTestFactory;
 import org.opendaylight.mdsal.binding.dom.adapter.test.util.BindingTestContext;
@@ -29,17 +30,16 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerBusyException;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeProducerException;
 
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class BindingDOMDataTreeProducerAdapterTest {
-
     private BindingDOMDataTreeProducerAdapter bindingDOMDataTreeProducerAdapter;
-    private BindingToNormalizedNodeCodec codec;
+    private AdapterContext codec;
 
     @Mock
     private DOMDataTreeProducer delegate;
 
     @Before
     public void setUp() {
-        initMocks(this);
         final BindingBrokerTestFactory testFactory = new BindingBrokerTestFactory();
         testFactory.setExecutor(MoreExecutors.newDirectExecutorService());
         final BindingTestContext testContext = testFactory.getTestContext();
@@ -55,11 +55,6 @@ public class BindingDOMDataTreeProducerAdapterTest {
         verify(delegate).createTransaction(true);
     }
 
-    @Test
-    public void createTest() {
-        assertNotNull(BindingDOMDataTreeProducerAdapter.create(delegate, codec));
-    }
-
     @Test
     public void createProducerTest() {
         doReturn(mock(DOMDataTreeProducer.class)).when(delegate).createProducer(any());
index d22404d8d642ba36bff3b3fee3261d9c86a829d4..24f502dc609b4a7d4b8b370dd5946fa959c08346 100644 (file)
@@ -36,7 +36,7 @@ public class BindingDOMDataTreeServiceAdapterTest extends AbstractAdapterTest {
         initMocks(this);
         super.before();
 
-        bindingDOMDataTreeServiceAdapter = BindingDOMDataTreeServiceAdapter.create(delegate, codec);
+        bindingDOMDataTreeServiceAdapter = new BindingDOMDataTreeServiceAdapter(codec, delegate);
     }
 
     @Test
index 2b5e33ee123669306e5bebdf9ebad0f1455e5cc8..c7f701052936a102c8288114e1d931cd06c957e1 100644 (file)
@@ -19,10 +19,8 @@ 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.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteCursor;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -33,19 +31,16 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
 public class BindingDOMDataTreeWriteCursorAdapterTest {
-
     @Test
     public void basicTest() throws Exception {
         final DataTreeIdentifier<?> identifier =
                 DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
                         InstanceIdentifier.create(DataObject.class));
         final DOMDataTreeWriteCursor delegate = mock(DOMDataTreeWriteCursor.class);
-        final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class);
-        final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec(
-            new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
-            registry);
+        final BindingDOMCodecServices registry = mock(BindingDOMCodecServices.class);
+        final AdapterContext codec = new ConstantAdapterContext(registry);
         final BindingDOMDataTreeWriteCursorAdapter<?> adapter =
-                new BindingDOMDataTreeWriteCursorAdapter<>(identifier, delegate, codec);
+                new BindingDOMDataTreeWriteCursorAdapter<>(codec, delegate, identifier);
 
         final PathArgument pathArgument = Item.of(DataObject.class);
         final DataObject data = mock(DataObject.class);
index afc762c31cdc23ef40770104905fcd36b2fa0c40..c22021fd464921586d5f8b74c2d6eb42648d0077 100644 (file)
@@ -29,7 +29,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 public class BindingDOMMountPointListenerAdapterTest {
 
     private BindingDOMMountPointListenerAdapter<?> bindingDOMMountPointListenerAdapter;
-    private BindingToNormalizedNodeCodec codec;
+    private AdapterContext codec;
 
     @Mock private MountPointListener listener;
     @Mock private DOMMountPointService mountPointService;
index 6d6bfcf9b40c675ddd12cd5bc298fd8a54788875..c09f8d67ac9b23bc2279aa487031f32b70e401a7 100644 (file)
@@ -16,10 +16,8 @@ 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.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.dom.api.DOMMountPoint;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -29,15 +27,13 @@ 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(
-            new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
-            registry);
+        final BindingDOMCodecServices registry = mock(BindingDOMCodecServices.class);
+        final AdapterContext codec = new ConstantAdapterContext(registry);
         doReturn(YangInstanceIdentifier.empty()).when(registry).toYangInstanceIdentifier(any());
         final DOMMountPointService mountPointService = mock(DOMMountPointService.class);
 
         final BindingDOMMountPointServiceAdapter adapter =
-                new BindingDOMMountPointServiceAdapter(mountPointService, codec);
+                new BindingDOMMountPointServiceAdapter(codec, mountPointService);
 
         doReturn(Optional.empty()).when(mountPointService).getMountPoint(any());
         assertFalse(adapter.getMountPoint(InstanceIdentifier.create(DataObject.class)).isPresent());
index da65e9c0a3289685740f52897f068d19aefb64b9..581d5969bcfd2e74c915378aa52dde49fb234125 100644 (file)
@@ -14,7 +14,7 @@ import com.google.common.collect.ImmutableMap;
 import java.lang.reflect.Method;
 import java.net.URI;
 import org.junit.Test;
-import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.rpcservice.rev140701.OpendaylightTestRpcServiceService;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
@@ -24,13 +24,13 @@ public class BindingDOMRpcImplementationAdapterTest {
 
     @Test
     public void basicTest() throws Exception {
-        final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class);
+        final BindingDOMCodecServices registry = mock(BindingDOMCodecServices.class);
         final Method testMethod = this.getClass().getDeclaredMethod("testMethod");
         final SchemaPath schemaPath = SchemaPath.create(true,
                 QName.create(QNameModule.create(new URI("tst")), "test"));
-        final BindingDOMRpcImplementationAdapter adapter =
-                new BindingDOMRpcImplementationAdapter(registry, OpendaylightTestRpcServiceService.class,
-                        ImmutableMap.of(schemaPath, testMethod), mock(OpendaylightTestRpcServiceService.class));
+        final BindingDOMRpcImplementationAdapter adapter = new BindingDOMRpcImplementationAdapter(
+            new ConstantAdapterContext(registry), OpendaylightTestRpcServiceService.class,
+            ImmutableMap.of(schemaPath, testMethod), mock(OpendaylightTestRpcServiceService.class));
         assertNotNull(adapter);
     }
 
index ab591ccbbbe4f6b2fbde843f7b0a11d376faa0b8..03a6638264e449f64442df80c6b9f60c65fc9cc5 100644 (file)
@@ -109,8 +109,9 @@ public class BindingDOMRpcIntegrationTest {
 
         biRpcProviderService.registerRpcImplementation((rpc, input) ->
             FluentFutures.immediateFluentFuture(new DefaultDOMRpcResult(testContext.getCodec()
-                    .getCodecRegistry().toNormalizedNodeRpcData(baKnockKnockOutput))),
-            DOMRpcIdentifier.create(KNOCK_KNOCK_PATH, testContext.getCodec().toYangInstanceIdentifier(BA_NODE_ID)));
+                    .currentSerializer().toNormalizedNodeRpcData(baKnockKnockOutput))),
+            DOMRpcIdentifier.create(KNOCK_KNOCK_PATH, testContext.getCodec().currentSerializer()
+                .toYangInstanceIdentifier(BA_NODE_ID)));
 
         final OpendaylightKnockKnockRpcService baKnockService =
                 baRpcConsumerService.getRpcService(OpendaylightKnockKnockRpcService.class);
@@ -153,7 +154,7 @@ public class BindingDOMRpcIntegrationTest {
     }
 
     private ContainerNode toDOMKnockKnockInput(final KnockKnockInput from) {
-        return testContext.getCodec().getCodecRegistry().toNormalizedNodeRpcData(from);
+        return testContext.getCodec().currentSerializer().toNormalizedNodeRpcData(from);
     }
 
     private static class OpendaylightKnockKnockRpcServiceImpl implements OpendaylightKnockKnockRpcService {
index d3cbffe8fdf4233ae682b9c2b0a47d207e73b31c..5d0b3f3199d8cbd3417a6bb5da830428e3402155 100644 (file)
@@ -20,11 +20,9 @@ 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.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
@@ -44,7 +42,7 @@ public class BindingDOMTransactionChainAdapterTest {
     private TransactionChainListener transactionChainListener;
 
     @Mock
-    private BindingNormalizedNodeCodecRegistry mockCodecRegistry;
+    private BindingDOMCodecServices mockCodecRegistry;
 
     private BindingDOMTransactionChainAdapter bindingDOMTransactionChainAdapter;
 
@@ -53,9 +51,8 @@ public class BindingDOMTransactionChainAdapterTest {
         doReturn(transactionChain).when(domService).createTransactionChain(any());
         doReturn(ImmutableClassToInstanceMap.of()).when(domService).getExtensions();
 
-        BindingDOMAdapterLoader bindingDOMAdapterLoader = new BindingDOMAdapterLoader(new BindingToNormalizedNodeCodec(
-                new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
-                mockCodecRegistry)) {
+        BindingDOMAdapterLoader bindingDOMAdapterLoader = new BindingDOMAdapterLoader(
+                new ConstantAdapterContext(mockCodecRegistry)) {
             @Override
             protected DOMService getDelegate(final Class<? extends DOMService> 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
deleted file mode 100644 (file)
index ecf99d3..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco Systems, Inc. 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.dom.adapter;
-
-import static org.junit.Assert.assertNull;
-import static org.mockito.Mockito.mock;
-import static org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy;
-
-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.dom.api.DOMMountPoint;
-
-public class BindingMountPointAdapterTest {
-    @Test
-    public void basicTest() throws Exception {
-        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());
-    }
-}
index eec5c987ee9837573cbaec9e4eb49134afd516f7..8e223880e2405d3a59badfeef33bb2d20bc36229 100644 (file)
@@ -7,28 +7,21 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
-import com.google.common.collect.ImmutableBiMap;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSetMultimap;
 import com.google.common.collect.SetMultimap;
-import com.google.common.util.concurrent.Uninterruptibles;
 import java.lang.reflect.Method;
 import java.net.URI;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 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.dom.adapter.test.util.MockAdapterContext;
 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;
@@ -43,7 +36,6 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.Augmentat
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.AbstractSchemaContext;
 
@@ -61,107 +53,40 @@ public class BindingNormalizedCodecTest extends AbstractSchemaAwareTest {
     private static final YangInstanceIdentifier BI_TOP_LEVEL_LIST = YangInstanceIdentifier.builder().node(Top.QNAME)
         .node(TopLevelList.QNAME).nodeWithKey(TopLevelList.QNAME, NAME_QNAME, TOP_FOO_KEY.getName()).build();
 
-    private BindingToNormalizedNodeCodec codec;
+    private MockAdapterContext codec;
     private EffectiveModelContext context;
 
     @Override
     protected void setupWithSchema(final EffectiveModelContext schemaContext) {
         this.context = schemaContext;
-        this.codec = new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(),
-            GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), new BindingNormalizedNodeCodecRegistry(),
-            true);
+        this.codec = new MockAdapterContext();
     }
 
     @Test
     public void testComplexAugmentationSerialization() {
-        this.codec.onModelContextUpdated(this.context);
-        final PathArgument lastArg = this.codec.toYangInstanceIdentifier(BA_TREE_COMPLEX_USES).getLastPathArgument();
+        codec.onModelContextUpdated(context);
+        final PathArgument lastArg = codec.currentSerializer().toYangInstanceIdentifier(BA_TREE_COMPLEX_USES)
+                .getLastPathArgument();
         assertTrue(lastArg instanceof AugmentationIdentifier);
     }
 
-
     @Test
     public void testLeafOnlyAugmentationSerialization() {
-        this.codec.onModelContextUpdated(this.context);
-        final PathArgument leafOnlyLastArg = this.codec.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY)
+        codec.onModelContextUpdated(context);
+        final PathArgument leafOnlyLastArg = codec.currentSerializer().toYangInstanceIdentifier(BA_TREE_LEAF_ONLY)
             .getLastPathArgument();
         assertTrue(leafOnlyLastArg instanceof AugmentationIdentifier);
         assertTrue(((AugmentationIdentifier) leafOnlyLastArg).getPossibleChildNames().contains(SIMPLE_VALUE_QNAME));
     }
 
     @Test
-    @SuppressWarnings("checkstyle:illegalCatch")
-    public void testToYangInstanceIdentifierBlocking() {
-        this.codec.onModelContextUpdated(new EmptyEffectiveModelContext());
-
-        final CountDownLatch done = new CountDownLatch(1);
-        final AtomicReference<YangInstanceIdentifier> yangId = new AtomicReference<>();
-        final AtomicReference<RuntimeException> error = new AtomicReference<>();
-        new Thread(() -> {
-            try {
-                yangId.set(BindingNormalizedCodecTest.this.codec.toYangInstanceIdentifierBlocking(BA_TOP_LEVEL_LIST));
-            } catch (final RuntimeException e) {
-                error.set(e);
-            } finally {
-                done.countDown();
-            }
-        }).start();
-
-        Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
-        this.codec.onModelContextUpdated(this.context);
-
-        assertTrue("toYangInstanceIdentifierBlocking completed",
-                Uninterruptibles.awaitUninterruptibly(done, 3, TimeUnit.SECONDS));
-        if (error.get() != null) {
-            throw error.get();
-        }
-
-        assertEquals("toYangInstanceIdentifierBlocking", BI_TOP_LEVEL_LIST, yangId.get());
-    }
-
-    @Test
-    public void testGetRpcMethodToSchemaPathWithNoInitialSchemaContext() {
-        testGetRpcMethodToSchemaPath();
-    }
-
-    @Test
-    public void testGetRpcMethodToSchemaPathBlocking() {
-        this.codec.onModelContextUpdated(new EmptyEffectiveModelContext());
-        testGetRpcMethodToSchemaPath();
-    }
-
-    @SuppressWarnings("checkstyle:illegalCatch")
-    private void testGetRpcMethodToSchemaPath() {
-        final CountDownLatch done = new CountDownLatch(1);
-        final AtomicReference<ImmutableBiMap<Method, SchemaPath>> retMap = new AtomicReference<>();
-        final AtomicReference<RuntimeException> error = new AtomicReference<>();
-        new Thread(() -> {
-            try {
-                retMap.set(BindingNormalizedCodecTest.this.codec.getRpcMethodToSchemaPath(
-                            OpendaylightTestRpcServiceService.class));
-            } catch (final RuntimeException e) {
-                error.set(e);
-            } finally {
-                done.countDown();
-            }
-        }).start();
-
-        Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
-        this.codec.onModelContextUpdated(this.context);
-
-        assertTrue("getRpcMethodToSchemaPath completed",
-                Uninterruptibles.awaitUninterruptibly(done, 3, TimeUnit.SECONDS));
-        if (error.get() != null) {
-            throw error.get();
-        }
-
-        for (final Method method : retMap.get().keySet()) {
-            if (method.getName().equals("rockTheHouse")) {
-                return;
-            }
-        }
-
-        fail("rockTheHouse RPC method not found");
+    public void testGetRpcMethodToSchemaPath() {
+        codec.onModelContextUpdated(context);
+        final List<String> retMap = codec.currentSerializer()
+                .getRpcMethodToSchemaPath(OpendaylightTestRpcServiceService.class).keySet().stream()
+                .map(Method::getName)
+                .collect(Collectors.toList());
+        assertTrue(retMap.contains("rockTheHouse"));
     }
 
     static class EmptyEffectiveModelContext extends AbstractSchemaContext implements EffectiveModelContext {
@@ -7,21 +7,20 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.assertThrows;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
+import java.lang.reflect.Method;
 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.api.DefaultBindingRuntimeContext;
 import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
-import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
 import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -29,7 +28,6 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
@@ -39,7 +37,7 @@ import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
 
-public class BindingToNormalizedNodeCodecTest {
+public class CurrentAdapterSerializerTest {
     /**
      * Positive test.
      *
@@ -91,15 +89,11 @@ public class BindingToNormalizedNodeCodecTest {
         assertNotNull(value);
         final Class<? extends DataObject> iface = value.implementedInterface();
         assertEquals("Cont", iface.getSimpleName());
-        final Object[] objs = {};
-        try {
-            iface.getDeclaredMethod("getVlanId").invoke(value, objs);
-            fail();
-        } catch (final InvocationTargetException e) {
-            final Throwable cause = e.getCause();
-            assertNotNull(cause);
-            assertEquals(cause.getClass(), IllegalArgumentException.class);
-        }
+
+        final Method getVlanId = iface.getDeclaredMethod("getVlanId");
+        final InvocationTargetException ex = assertThrows(InvocationTargetException.class,
+            () -> getVlanId.invoke(value));
+        assertThat(ex.getCause(), instanceOf(IllegalArgumentException.class));
     }
 
     private static NormalizedNode<?, ?> prepareData(final SchemaContext schemaCtx, final Object value) {
@@ -116,20 +110,12 @@ public class BindingToNormalizedNodeCodecTest {
 
     private static Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode(final NormalizedNode<?, ?> data,
             final SchemaContext schemaCtx) {
-        final GeneratedClassLoadingStrategy classLoadingStrategy =
-                GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
-        final BindingRuntimeGenerator generator = new DefaultBindingRuntimeGenerator();
-        final BindingRuntimeContext ctx = DefaultBindingRuntimeContext.create(
-            generator.generateTypeMapping(schemaCtx), classLoadingStrategy);
-        final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(ctx);
-        final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec(
-            generator, classLoadingStrategy, codecRegistry);
-        final List<PathArgument> pathArgs = new ArrayList<>();
-        pathArgs.add(NodeIdentifier.create(QName.create("urn:test", "2017-01-01", "cont")));
+        final CurrentAdapterSerializer codec = new CurrentAdapterSerializer(new BindingCodecContext(
+            DefaultBindingRuntimeContext.create(new DefaultBindingRuntimeGenerator().generateTypeMapping(schemaCtx),
+                GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy())));
 
-        final YangInstanceIdentifier path = YangInstanceIdentifier.create(pathArgs);
-        final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode = codec.fromNormalizedNode(path, data);
-        codec.close();
-        return fromNormalizedNode;
+        final YangInstanceIdentifier path = YangInstanceIdentifier.create(NodeIdentifier.create(QName.create(
+            "urn:test", "2017-01-01", "cont")));
+        return codec.fromNormalizedNode(path, data);
     }
 }
index 90fc6df64ee2f46d4425a86b107c8d842f61b61c..ec047ff54d88c8c5bea34a3993e8ff2896c32103 100644 (file)
@@ -25,14 +25,14 @@ import java.lang.reflect.Field;
 import java.util.concurrent.TimeUnit;
 import org.junit.Before;
 import org.junit.Test;
-import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
 public class LazyDOMRpcResultFutureTest {
 
     private LazyDOMRpcResultFuture lazyDOMRpcResultFuture;
-    private final BindingNormalizedNodeCodecRegistry codec = mock(BindingNormalizedNodeCodecRegistry.class);
+    private final BindingNormalizedNodeSerializer codec = mock(BindingNormalizedNodeSerializer.class);
     private final ListenableFuture<RpcResult<?>> future = mock(ListenableFuture.class);
     private final RpcResult<?> domRpcResult = mock(RpcResult.class);
 
index 90e4fd3a5400cc58e75d34c41a49cfc1cda56c3c..3b62fb8629960064462077da7f81a3d3234b0900 100644 (file)
@@ -13,11 +13,8 @@ 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.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeCandidate;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
@@ -29,21 +26,17 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNod
 public class LazyDataTreeModificationTest {
     @Test
     public void basicTest() throws Exception {
-        final BindingNormalizedNodeCodecRegistry registry = mock(BindingNormalizedNodeCodecRegistry.class);
-        final BindingToNormalizedNodeCodec codec = new BindingToNormalizedNodeCodec(
-            new DefaultBindingRuntimeGenerator(), GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
-            registry);
+        final BindingDOMCodecServices registry = mock(BindingDOMCodecServices.class);
+        final AdapterContext codec = new ConstantAdapterContext(registry);
         final DOMDataTreeCandidate domDataTreeCandidate = mock(DOMDataTreeCandidate.class);
         final DOMDataTreeIdentifier domDataTreeIdentifier =
                 new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.empty());
         doReturn(InstanceIdentifier.create(DataObject.class)).when(registry).fromYangInstanceIdentifier(any());
-        final BindingCodecTree bindingCodecTree = mock(BindingCodecTree.class);
         final BindingDataObjectCodecTreeNode<?> bindingCodecTreeNode = mock(BindingDataObjectCodecTreeNode.class);
-        doReturn(bindingCodecTreeNode).when(bindingCodecTree).getSubtreeCodec(any(InstanceIdentifier.class));
-        doReturn(bindingCodecTree).when(registry).getCodecContext();
+        doReturn(bindingCodecTreeNode).when(registry).getSubtreeCodec(any(InstanceIdentifier.class));
         doReturn(domDataTreeIdentifier).when(domDataTreeCandidate).getRootPath();
         doReturn(mock(DataTreeCandidateNode.class)).when(domDataTreeCandidate).getRootNode();
 
-        assertNotNull(LazyDataTreeModification.create(codec, domDataTreeCandidate));
+        assertNotNull(LazyDataTreeModification.create(codec.currentSerializer(), domDataTreeCandidate));
     }
 }
\ No newline at end of file
index 4bdb889158ccbba43721ed1950ca62937cfd1e4d..f9b8e2dd0ddcefac5f00df3c2e3646816a75cf1d 100644 (file)
@@ -21,7 +21,7 @@ import java.util.Optional;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.dom.adapter.test.util.BindingBrokerTestFactory;
 import org.opendaylight.mdsal.binding.dom.adapter.test.util.BindingTestContext;
-import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.rpcservice.rev140701.OpendaylightTestRpcServiceService;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -34,12 +34,11 @@ import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class LazySerializedContainerNodeTest {
-
     @Test
     public void basicTest() throws Exception {
         final SchemaPath rpcName;
         final DataObject dataObject = mock(DataObject.class);
-        final BindingNormalizedNodeCodecRegistry codec = mock(BindingNormalizedNodeCodecRegistry.class);
+        final BindingNormalizedNodeSerializer codec = mock(BindingNormalizedNodeSerializer.class);
         final ContainerNode containerNode = mock(ContainerNode.class);
         doReturn(containerNode).when(codec).toNormalizedNodeRpcData(any());
         doReturn(Optional.empty()).when(containerNode).getChild(any());
@@ -49,8 +48,8 @@ public class LazySerializedContainerNodeTest {
         final BindingTestContext bindingTestContext = bindingBrokerTestFactory.getTestContext();
         bindingTestContext.start();
 
-        final ImmutableBiMap<?, ?> biMap =
-                bindingTestContext.getCodec().getRpcMethodToSchema(OpendaylightTestRpcServiceService.class);
+        final ImmutableBiMap<?, ?> biMap = bindingTestContext.getCodec().currentSerializer()
+                .getRpcMethodToSchema(OpendaylightTestRpcServiceService.class);
         rpcName = ((RpcDefinition) biMap.values().iterator().next()).getPath();
         final LeafNode<?> leafNode = ImmutableLeafNodeBuilder.create().withNodeIdentifier(NodeIdentifier
                 .create(QName.create("", "test"))).withValue("").build();
index 120bbfc39867f44563ee5f48d5ec7d5c5163df79..af5611921d37bd7a1c28d348536e72a17fb1145d 100644 (file)
@@ -10,17 +10,15 @@ 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;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationPublishServiceAdapter;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceAdapter;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
+import org.opendaylight.mdsal.binding.dom.adapter.test.util.MockAdapterContext;
 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.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
@@ -36,7 +34,7 @@ public abstract class AbstractDataBrokerTestCustomizer {
     private final DOMNotificationRouter domNotificationRouter;
     private final MockSchemaService schemaService;
     private ImmutableMap<LogicalDatastoreType, DOMStore> datastores;
-    private final BindingToNormalizedNodeCodec bindingToNormalized;
+    private final MockAdapterContext adapterContext;
 
     public ImmutableMap<LogicalDatastoreType, DOMStore> createDatastores() {
         return ImmutableMap.<LogicalDatastoreType, DOMStore>builder()
@@ -46,22 +44,21 @@ public abstract class AbstractDataBrokerTestCustomizer {
     }
 
     public AbstractDataBrokerTestCustomizer() {
-        this.schemaService = new MockSchemaService();
-        this.bindingToNormalized = new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(),
-            GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), new BindingNormalizedNodeCodecRegistry());
-        this.schemaService.registerSchemaContextListener(this.bindingToNormalized);
-        this.domNotificationRouter = DOMNotificationRouter.create(16);
+        schemaService = new MockSchemaService();
+        adapterContext = new MockAdapterContext();
+        schemaService.registerSchemaContextListener(adapterContext);
+        domNotificationRouter = DOMNotificationRouter.create(16);
     }
 
     public DOMStore createConfigurationDatastore() {
         final InMemoryDOMDataStore store = new InMemoryDOMDataStore("CFG", getDataTreeChangeListenerExecutor());
-        this.schemaService.registerSchemaContextListener(store);
+        schemaService.registerSchemaContextListener(store);
         return store;
     }
 
     public DOMStore createOperationalDatastore() {
         final InMemoryDOMDataStore store = new InMemoryDOMDataStore("OPER", getDataTreeChangeListenerExecutor());
-        this.schemaService.registerSchemaContextListener(store);
+        schemaService.registerSchemaContextListener(store);
         return store;
     }
 
@@ -70,12 +67,11 @@ public abstract class AbstractDataBrokerTestCustomizer {
     }
 
     public NotificationService createNotificationService() {
-        return new BindingDOMNotificationServiceAdapter(this.domNotificationRouter,
-                this.bindingToNormalized.getCodecRegistry());
+        return new BindingDOMNotificationServiceAdapter(adapterContext, domNotificationRouter);
     }
 
     public NotificationPublishService createNotificationPublishService() {
-        return new BindingDOMNotificationPublishServiceAdapter(this.domNotificationRouter, this.bindingToNormalized);
+        return new BindingDOMNotificationPublishServiceAdapter(adapterContext, domNotificationRouter);
     }
 
     public abstract ListeningExecutorService getCommitCoordinatorExecutor();
@@ -85,36 +81,36 @@ public abstract class AbstractDataBrokerTestCustomizer {
     }
 
     public DataBroker createDataBroker() {
-        return new BindingDOMDataBrokerAdapter(getDOMDataBroker(), this.bindingToNormalized);
+        return new BindingDOMDataBrokerAdapter(adapterContext, getDOMDataBroker());
     }
 
-    public BindingToNormalizedNodeCodec getBindingToNormalized() {
-        return this.bindingToNormalized;
+    public AdapterContext getAdapterContext() {
+        return adapterContext;
     }
 
     public DOMSchemaService getSchemaService() {
-        return this.schemaService;
+        return schemaService;
     }
 
     public DOMDataBroker getDOMDataBroker() {
-        if (this.domDataBroker == null) {
-            this.domDataBroker = createDOMDataBroker();
+        if (domDataBroker == null) {
+            domDataBroker = createDOMDataBroker();
         }
-        return this.domDataBroker;
+        return domDataBroker;
     }
 
     private synchronized ImmutableMap<LogicalDatastoreType, DOMStore> getDatastores() {
-        if (this.datastores == null) {
-            this.datastores = createDatastores();
+        if (datastores == null) {
+            datastores = createDatastores();
         }
-        return this.datastores;
+        return datastores;
     }
 
     public void updateSchema(final EffectiveModelContext ctx) {
-        this.schemaService.changeSchema(ctx);
+        schemaService.changeSchema(ctx);
     }
 
     public DOMNotificationRouter getDomNotificationRouter() {
-        return this.domNotificationRouter;
+        return domNotificationRouter;
     }
 }
index abcc6e74c367cc2357506e7b9dc2f208d9a8cde2..8500a87212a84d879355afbe2711f19024bb7538 100644 (file)
@@ -9,12 +9,12 @@ package org.opendaylight.mdsal.binding.dom.adapter.test;
 
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.mdsal.binding.api.NotificationService;
-import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
 import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 
 public class AbstractNotificationBrokerTest extends AbstractSchemaAwareTest {
-    private BindingToNormalizedNodeCodec bindingToNormalizedNodeCodec;
+    private AdapterContext bindingToNormalizedNodeCodec;
     private DOMNotificationRouter domNotificationRouter;
     private NotificationService notificationService;
     private NotificationPublishService notificationPublishService;
@@ -26,7 +26,7 @@ public class AbstractNotificationBrokerTest extends AbstractSchemaAwareTest {
         domNotificationRouter = testCustomizer.getDomNotificationRouter();
         notificationService = testCustomizer.createNotificationService();
         notificationPublishService = testCustomizer.createNotificationPublishService();
-        bindingToNormalizedNodeCodec = testCustomizer.getBindingToNormalized();
+        bindingToNormalizedNodeCodec = testCustomizer.getAdapterContext();
         testCustomizer.updateSchema(context);
     }
 
@@ -46,7 +46,7 @@ public class AbstractNotificationBrokerTest extends AbstractSchemaAwareTest {
         return domNotificationRouter;
     }
 
-    public BindingToNormalizedNodeCodec getBindingToNormalizedNodeCodec() {
+    public AdapterContext getBindingToNormalizedNodeCodec() {
         return bindingToNormalizedNodeCodec;
     }
 }
index db292aa4806c7c49abfe4a4fae737d321738ea91..653ab8e03a31d653adace1303e2bcd0cb18000cc 100644 (file)
@@ -100,8 +100,8 @@ public class Mdsal500Test {
         SwitchOutput baSwitchOutput = new SwitchOutputBuilder().build();
 
         biRpcProviderService.registerRpcImplementation((rpc, input) ->
-            FluentFutures.immediateFluentFuture(new DefaultDOMRpcResult(testContext.getCodec()
-                    .getCodecRegistry().toNormalizedNodeRpcData(baSwitchOutput))),
+            FluentFutures.immediateFluentFuture(new DefaultDOMRpcResult(testContext.getCodec().currentSerializer()
+                    .toNormalizedNodeRpcData(baSwitchOutput))),
             DOMRpcIdentifier.create(SWITCH_PATH));
 
         final Mdsal500Service baSwitchService =
@@ -130,20 +130,17 @@ public class Mdsal500Test {
     }
 
     private static ListenableFuture<RpcResult<SwitchOutput>> switchResult(final boolean success) {
-        SwitchOutput output = new SwitchOutputBuilder().build();
-        RpcResult<SwitchOutput> result = RpcResultBuilder.<SwitchOutput>status(success).withResult(output)
-                .build();
-        return Futures.immediateFuture(result);
+        return Futures.immediateFuture(RpcResultBuilder.<SwitchOutput>status(success)
+            .withResult(new SwitchOutputBuilder().build())
+            .build());
     }
 
     private static SwitchInputBuilder switchBuilder(final String foo) {
-        SwitchInputBuilder builder = new SwitchInputBuilder();
-        builder.setFoo(foo);
-        return builder;
+        return new SwitchInputBuilder().setFoo(foo);
     }
 
     private ContainerNode toDOMSwitchInput(final SwitchInput from) {
-        return testContext.getCodec().getCodecRegistry().toNormalizedNodeRpcData(from);
+        return testContext.getCodec().currentSerializer().toNormalizedNodeRpcData(from);
     }
 
     private static class Mdsal500ServiceImpl implements Mdsal500Service {
@@ -167,7 +164,7 @@ public class Mdsal500Test {
         }
 
         @Override
-        public ListenableFuture<RpcResult<SwitchOutput>> switch$(SwitchInput switchInput) {
+        public ListenableFuture<RpcResult<SwitchOutput>> switch$(final SwitchInput switchInput) {
             receivedSwitch.put(switchInput.getFoo(), switchInput);
             return switchResult;
         }
index fff796002e5c6d9eadc5a1409371ce5de49ad191..4b44b6ba7debef7e78da1ac34e24a281c1d9f3cf 100644 (file)
@@ -16,22 +16,19 @@ 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;
 import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMDataBrokerAdapter;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMMountPointServiceAdapter;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationPublishServiceAdapter;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMNotificationServiceAdapter;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMRpcProviderServiceAdapter;
 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.spec.reflect.BindingReflections;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
@@ -51,7 +48,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 @Beta
 public class BindingTestContext implements AutoCloseable {
-    private BindingToNormalizedNodeCodec codec;
+    private MockAdapterContext codec;
 
     private final ListeningExecutorService executor;
 
@@ -86,7 +83,7 @@ public class BindingTestContext implements AutoCloseable {
         return newDOMDataBroker;
     }
 
-    public BindingToNormalizedNodeCodec getCodec() {
+    public AdapterContext getCodec() {
         return codec;
     }
 
@@ -101,7 +98,7 @@ public class BindingTestContext implements AutoCloseable {
     public void startNewDataBroker() {
         checkState(executor != null, "Executor needs to be set");
         checkState(newDOMDataBroker != null, "DOM Data Broker must be set");
-        dataBroker = new BindingDOMDataBrokerAdapter(newDOMDataBroker, codec);
+        dataBroker = new BindingDOMDataBrokerAdapter(codec, newDOMDataBroker);
     }
 
     public void startNewDomDataBroker() {
@@ -128,9 +125,9 @@ public class BindingTestContext implements AutoCloseable {
     public void startBindingBroker() {
         checkState(executor != null, "Executor needs to be set");
 
-        baConsumerRpc = new BindingDOMRpcServiceAdapter(getDomRpcInvoker(), codec);
-        baProviderRpc = new BindingDOMRpcProviderServiceAdapter(getDomRpcRegistry(), codec);
-        final MountPointService mountService = new BindingDOMMountPointServiceAdapter(biMountImpl, codec);
+        baConsumerRpc = new BindingDOMRpcServiceAdapter(codec, getDomRpcInvoker());
+        baProviderRpc = new BindingDOMRpcProviderServiceAdapter(codec, getDomRpcRegistry());
+        final MountPointService mountService = new BindingDOMMountPointServiceAdapter(codec, biMountImpl);
     }
 
     public void startForwarding() {
@@ -138,9 +135,7 @@ public class BindingTestContext implements AutoCloseable {
     }
 
     public void startBindingToDomMappingService() {
-        final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry();
-        final GeneratedClassLoadingStrategy loading = GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy();
-        codec = new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(), loading,  codecRegistry);
+        codec = new MockAdapterContext();
         mockSchemaService.registerSchemaContextListener(codec);
     }
 
@@ -166,7 +161,7 @@ public class BindingTestContext implements AutoCloseable {
 
         if (schemaModuleInfos != null) {
             updateYangSchema(schemaModuleInfos);
-        } else if (this.startWithSchema) {
+        } else if (startWithSchema) {
             loadYangSchemaFromClasspath();
         }
     }
@@ -226,6 +221,6 @@ public class BindingTestContext implements AutoCloseable {
     }
 
     public void setSchemaModuleInfos(final Set<YangModuleInfo> moduleInfos) {
-        this.schemaModuleInfos = moduleInfos;
+        schemaModuleInfos = moduleInfos;
     }
 }
diff --git a/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/MockAdapterContext.java b/binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/util/MockAdapterContext.java
new file mode 100644 (file)
index 0000000..64aa6ef
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * 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.dom.adapter.test.util;
+
+import static com.google.common.base.Verify.verifyNotNull;
+
+import org.opendaylight.binding.runtime.api.DefaultBindingRuntimeContext;
+import org.opendaylight.binding.runtime.spi.GeneratedClassLoadingStrategy;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
+import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer;
+import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
+import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
+
+public final class MockAdapterContext implements AdapterContext, EffectiveModelContextListener {
+    private volatile CurrentAdapterSerializer serializer = null;
+
+    @Override
+    public CurrentAdapterSerializer currentSerializer() {
+        return verifyNotNull(serializer);
+    }
+
+    @Override
+    public void onModelContextUpdated(final EffectiveModelContext newModelContext) {
+        serializer = new CurrentAdapterSerializer(new BindingCodecContext(DefaultBindingRuntimeContext.create(
+            new DefaultBindingRuntimeGenerator().generateTypeMapping(newModelContext),
+            GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy())));
+    }
+}
index 928d93339e8be5abab712fa2124b035f58f895be..dee21027178c9fb2b3cf2db0a87bc34d546ac737 100644 (file)
@@ -12,10 +12,6 @@ import static com.google.common.base.Verify.verifyNotNull;
 import com.google.common.annotations.Beta;
 import com.google.common.primitives.UnsignedLong;
 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;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingIdentityCodec;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingInstanceIdentifierCodec;
 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.BindingNormalizedNodeWriterFactory;
@@ -25,13 +21,9 @@ import org.opendaylight.mdsal.binding.dom.codec.spi.ForwardingBindingDOMCodecSer
 import org.opendaylight.mdsal.binding.dom.codec.spi.LazyActionInputContainerNode;
 import org.opendaylight.mdsal.binding.dom.codec.spi.LazyActionOutputContainerNode;
 import org.opendaylight.yangtools.yang.binding.Action;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.RpcInput;
 import org.opendaylight.yangtools.yang.binding.RpcOutput;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -71,31 +63,6 @@ public final class GlobalBindingDOMCodecServices extends ForwardingBindingDOMCod
         return new LazyActionOutputContainerNode(identifier, output, this, action);
     }
 
-    @Override
-    public <T extends DataObject> BindingDataObjectCodecTreeNode<T> getSubtreeCodec(final InstanceIdentifier<T> path) {
-        return delegate.getSubtreeCodec(path);
-    }
-
-    @Override
-    public BindingCodecTreeNode getSubtreeCodec(final YangInstanceIdentifier path) {
-        return delegate.getSubtreeCodec(path);
-    }
-
-    @Override
-    public BindingCodecTreeNode getSubtreeCodec(final Absolute path) {
-        return delegate.getSubtreeCodec(path);
-    }
-
-    @Override
-    public BindingIdentityCodec getIdentityCodec() {
-        return delegate.getIdentityCodec();
-    }
-
-    @Override
-    public BindingInstanceIdentifierCodec getInstanceIdentifierCodec() {
-        return delegate.getInstanceIdentifierCodec();
-    }
-
     @Override
     protected BindingDOMCodecServices delegate() {
         return verifyNotNull(delegate);
index 7bda6df5e89ec6dd799cd1585c96534d0de1d396..fdf3cfb09c8cc201dda087ab6d12bb2d9713e442 100644 (file)
@@ -8,6 +8,8 @@
 package org.opendaylight.mdsal.binding.dom.codec.spi;
 
 import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeWriterFactory;
@@ -20,4 +22,5 @@ import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeWriterF
 public interface BindingDOMCodecServices extends BindingNormalizedNodeWriterFactory, BindingNormalizedNodeSerializer,
     BindingCodecTree {
 
+    @NonNull BindingRuntimeContext getRuntimeContext();
 }
index 1fe1ccd414e159361a94bb7e4947c72413166e67..8b471c1133bbf1fff4b9c03bbb98b1d2902846f7 100644 (file)
@@ -11,6 +11,12 @@ import com.google.common.annotations.Beta;
 import com.google.common.collect.ForwardingObject;
 import java.time.Instant;
 import java.util.Map.Entry;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
+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.api.BindingInstanceIdentifierCodec;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingStreamEventWriter;
 import org.opendaylight.yangtools.yang.binding.Action;
@@ -26,11 +32,12 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 @Beta
 public abstract class ForwardingBindingDOMCodecServices extends ForwardingObject implements BindingDOMCodecServices {
     @Override
-    protected abstract BindingDOMCodecServices delegate();
+    protected abstract @NonNull BindingDOMCodecServices delegate();
 
     @Override
     public BindingLazyContainerNode<RpcInput> toLazyNormalizedNodeActionInput(
@@ -51,7 +58,7 @@ public abstract class ForwardingBindingDOMCodecServices extends ForwardingObject
 
     @Override
     public <T extends DataObject> InstanceIdentifier<T> fromYangInstanceIdentifier(final YangInstanceIdentifier dom) {
-        return delegate().getInstanceIdentifierCodec().toBinding(dom);
+        return delegate().fromYangInstanceIdentifier(dom);
     }
 
     @Override
@@ -151,4 +158,34 @@ public abstract class ForwardingBindingDOMCodecServices extends ForwardingObject
             final NormalizedNodeStreamWriter streamWriter) {
         return delegate().newRpcWriter(rpcInputOrOutput,streamWriter);
     }
+
+    @Override
+    public <T extends DataObject> BindingDataObjectCodecTreeNode<T> getSubtreeCodec(final InstanceIdentifier<T> path) {
+        return delegate().getSubtreeCodec(path);
+    }
+
+    @Override
+    public BindingCodecTreeNode getSubtreeCodec(final YangInstanceIdentifier path) {
+        return delegate().getSubtreeCodec(path);
+    }
+
+    @Override
+    public BindingCodecTreeNode getSubtreeCodec(final Absolute path) {
+        return delegate().getSubtreeCodec(path);
+    }
+
+    @Override
+    public BindingIdentityCodec getIdentityCodec() {
+        return delegate().getIdentityCodec();
+    }
+
+    @Override
+    public BindingInstanceIdentifierCodec getInstanceIdentifierCodec() {
+        return delegate().getInstanceIdentifierCodec();
+    }
+
+    @Override
+    public BindingRuntimeContext getRuntimeContext() {
+        return delegate().getRuntimeContext();
+    }
 }
index 79eeda0a421c58a8a557034da89e2d034fec71a6..ebed85746ec8bfc86cc8f3c9237c0f01905fcd97 100644 (file)
                 <configuration>
                     <instructions>
                         <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
-                        <Export-Package>
-                            org.opendaylight.mdsal.binding.dom.codec.impl,
-                            ;-split-package:=error
-                        </Export-Package>
                         <Private-Package>
+                            org.opendaylight.mdsal.binding.dom.codec.impl,
                             org.opendaylight.mdsal.binding.dom.codec.loader,
                         </Private-Package>
                         <Import-Package>
index 42cae1edb56a8cd6a4e9143a5db5a6f11ea8ce29..e410d9549a467a9597e9bda2b20a564d81c77eac 100644 (file)
@@ -12,6 +12,7 @@ import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.base.Verify.verify;
 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,10 +33,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
+import java.util.ServiceLoader;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.kohsuke.MetaInfServices;
 import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
@@ -95,8 +100,11 @@ import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-final class BindingCodecContext extends AbstractBindingNormalizedNodeSerializer implements BindingDOMCodecServices,
-        Immutable, CodecContextFactory, DataObjectSerializerRegistry {
+@Beta
+@MetaInfServices(value = BindingDOMCodecServices.class)
+@Singleton
+public final class BindingCodecContext extends AbstractBindingNormalizedNodeSerializer
+        implements BindingDOMCodecServices, Immutable, CodecContextFactory, DataObjectSerializerRegistry {
     private final class DataObjectSerializerProxy implements DataObjectSerializer, Delegator<DataObjectStreamer<?>> {
         private final @NonNull DataObjectStreamer<?> delegate;
 
@@ -138,10 +146,16 @@ final class BindingCodecContext extends AbstractBindingNormalizedNodeSerializer
     private final @NonNull CodecClassLoader loader = CodecClassLoader.create();
     private final @NonNull InstanceIdentifierCodec instanceIdentifierCodec;
     private final @NonNull IdentityCodec identityCodec;
-    private final BindingRuntimeContext context;
+    private final @NonNull BindingRuntimeContext context;
     private final SchemaRootCodecContext<?> root;
 
-    BindingCodecContext(final BindingRuntimeContext context) {
+    public BindingCodecContext() {
+        this(ServiceLoader.load(BindingRuntimeContext.class).findFirst()
+            .orElseThrow(() -> new IllegalStateException("Failed to load BindingRuntimeContext")));
+    }
+
+    @Inject
+    public BindingCodecContext(final BindingRuntimeContext context) {
         this.context = requireNonNull(context, "Binding Runtime Context is required.");
         this.root = SchemaRootCodecContext.create(this);
         this.identityCodec = new IdentityCodec(context);
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
deleted file mode 100644 (file)
index 26c905c..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Copyright (c) 2014 Cisco Systems, Inc. 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.dom.codec.impl;
-
-import static com.google.common.base.Preconditions.checkState;
-
-import java.time.Instant;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
-import java.util.function.Function;
-import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
-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.AbstractBindingNormalizedNodeSerializer;
-import org.opendaylight.yangtools.yang.binding.Action;
-import org.opendaylight.yangtools.yang.binding.DataContainer;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.Notification;
-import org.opendaylight.yangtools.yang.binding.RpcInput;
-import org.opendaylight.yangtools.yang.binding.RpcOutput;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class BindingNormalizedNodeCodecRegistry extends AbstractBindingNormalizedNodeSerializer
-        implements BindingNormalizedNodeWriterFactory {
-    private static final Logger LOG = LoggerFactory.getLogger(BindingNormalizedNodeCodecRegistry.class);
-
-    private static final AtomicReferenceFieldUpdater<BindingNormalizedNodeCodecRegistry, BindingCodecContext> UPDATER =
-            AtomicReferenceFieldUpdater.newUpdater(BindingNormalizedNodeCodecRegistry.class, BindingCodecContext.class,
-                "codecContext");
-    private volatile BindingCodecContext codecContext;
-
-    public BindingNormalizedNodeCodecRegistry() {
-
-    }
-
-    public BindingNormalizedNodeCodecRegistry(final BindingRuntimeContext codecContext) {
-        this();
-        onBindingRuntimeContextUpdated(codecContext);
-    }
-
-    public BindingCodecTree getCodecContext() {
-        return codecContext;
-    }
-
-    public void onBindingRuntimeContextUpdated(final BindingRuntimeContext context) {
-        // BindingCodecContext is a costly resource. Let us not ditch it unless we have to
-        final BindingCodecContext current = codecContext;
-        if (current != null && context.equals(current.getRuntimeContext())) {
-            LOG.debug("Skipping update of runtime context {}", context);
-            return;
-        }
-
-        final BindingCodecContext updated = new BindingCodecContext(context);
-        if (!UPDATER.compareAndSet(this, current, updated)) {
-            LOG.warn("Concurrent update of runtime context (expected={} current={}) detected at ", current,
-                codecContext, new Throwable());
-        }
-    }
-
-    final @NonNull BindingCodecContext codecContext() {
-        final BindingCodecContext local = codecContext;
-        checkState(local != null, "No context available yet");
-        return local;
-    }
-
-    @Override
-    public YangInstanceIdentifier toYangInstanceIdentifier(final InstanceIdentifier<?> binding) {
-        return codecContext().toYangInstanceIdentifier(binding);
-    }
-
-    @Override
-    public <T extends DataObject> InstanceIdentifier<T> fromYangInstanceIdentifier(final YangInstanceIdentifier dom) {
-        return codecContext().getInstanceIdentifierCodec().toBinding(dom);
-    }
-
-    @Override
-    public <T extends DataObject> Entry<YangInstanceIdentifier, NormalizedNode<?,?>> toNormalizedNode(
-            final InstanceIdentifier<T> path, final T data) {
-        return codecContext().toNormalizedNode(path, data);
-    }
-
-    @Override
-    public ContainerNode toNormalizedNodeNotification(final Notification data) {
-        return codecContext().toNormalizedNodeNotification(data);
-    }
-
-    @Override
-    public ContainerNode toNormalizedNodeRpcData(final DataContainer data) {
-        return codecContext().toNormalizedNodeRpcData(data);
-    }
-
-    @Override
-    public ContainerNode toNormalizedNodeActionInput(final Class<? extends Action<?, ?, ?>> action,
-            final RpcInput input) {
-        return codecContext().toNormalizedNodeActionInput(action, input);
-    }
-
-    @Override
-    public ContainerNode toNormalizedNodeActionOutput(final Class<? extends Action<?, ?, ?>> action,
-            final RpcOutput output) {
-        return codecContext().toNormalizedNodeActionOutput(action, output);
-    }
-
-    @Override
-    public Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode(final YangInstanceIdentifier path,
-            final NormalizedNode<?, ?> data) {
-        return codecContext().fromNormalizedNode(path, data);
-    }
-
-    @Override
-    public Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data) {
-        return codecContext().fromNormalizedNodeNotification(path, data);
-    }
-
-    @Override
-    public Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data,
-            final Instant eventInstant) {
-        return codecContext().fromNormalizedNodeNotification(path, data, eventInstant);
-    }
-
-    @Override
-    public DataObject fromNormalizedNodeRpcData(final SchemaPath path, final ContainerNode data) {
-        return codecContext().fromNormalizedNodeRpcData(path, data);
-    }
-
-    @Override
-    public <T extends RpcInput> T fromNormalizedNodeActionInput(final Class<? extends Action<?, ?, ?>> action,
-            final ContainerNode input) {
-        return codecContext().fromNormalizedNodeActionInput(action, input);
-    }
-
-    @Override
-    public <T extends RpcOutput> T fromNormalizedNodeActionOutput(final Class<? extends Action<?, ?, ?>> action,
-            final ContainerNode output) {
-        return codecContext().fromNormalizedNodeActionOutput(action, output);
-    }
-
-    @Override
-    public Entry<YangInstanceIdentifier, BindingStreamEventWriter> newWriterAndIdentifier(
-            final InstanceIdentifier<?> path, final NormalizedNodeStreamWriter domWriter) {
-        return codecContext().newWriterAndIdentifier(path, domWriter);
-    }
-
-    @Override
-    public BindingStreamEventWriter newWriter(final InstanceIdentifier<?> path,
-            final NormalizedNodeStreamWriter domWriter) {
-        return codecContext().newWriter(path, domWriter);
-    }
-
-    @Override
-    public BindingStreamEventWriter newNotificationWriter(final Class<? extends Notification> notification,
-            final NormalizedNodeStreamWriter streamWriter) {
-        return codecContext().newNotificationWriter(notification, streamWriter);
-    }
-
-    @Override
-    public BindingStreamEventWriter newActionInputWriter(final Class<? extends Action<?, ?, ?>> action,
-            final NormalizedNodeStreamWriter domWriter) {
-        return codecContext().newActionInputWriter(action, domWriter);
-    }
-
-    @Override
-    public BindingStreamEventWriter newActionOutputWriter(final Class<? extends Action<?, ?, ?>> action,
-            final NormalizedNodeStreamWriter domWriter) {
-        return codecContext().newActionOutputWriter(action, domWriter);
-    }
-
-    @Override
-    public BindingStreamEventWriter newRpcWriter(final Class<? extends DataContainer> rpcInputOrOutput,
-            final NormalizedNodeStreamWriter streamWriter) {
-        return codecContext().newRpcWriter(rpcInputOrOutput,streamWriter);
-    }
-
-    public <T extends DataObject> Function<Optional<NormalizedNode<?, ?>>, Optional<T>>  deserializeFunction(
-            final InstanceIdentifier<T> path) {
-        final DataObjectCodecContext<?,?> ctx = (DataObjectCodecContext<?,?>) codecContext().getCodecContextNode(path,
-            null);
-        return new DeserializeFunction<>(ctx);
-    }
-
-    private static final class DeserializeFunction<T> implements Function<Optional<NormalizedNode<?, ?>>, Optional<T>> {
-        private final DataObjectCodecContext<?,?> ctx;
-
-        DeserializeFunction(final DataObjectCodecContext<?,?> ctx) {
-            this.ctx = ctx;
-        }
-
-        @SuppressWarnings("unchecked")
-        @Override
-        public Optional<T> apply(final Optional<NormalizedNode<?, ?>> input) {
-            return input.map(data -> (T) ctx.deserialize(data));
-        }
-    }
-}
index 288de7ded011fe49dd1cefcd6567228d48aaf6b6..c1ddcfdea60b1e35ea8fdee68ccf85e46449d7ad 100644 (file)
@@ -8,12 +8,13 @@
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCodec;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 
 /**
  * Marker interface for codecs dealing with RPC input being potentially unmapped. We use this interface to mark both
  * {@link UnmappedRpcInputCodec} and {@link ContainerNodeCodecContext}, which results in bimorphic invocation in
- * {@link BindingNormalizedNodeCodecRegistry#fromNormalizedNodeRpcData()}.
+ * {@link BindingNormalizedNodeSerializer#fromNormalizedNodeRpcData()}.
  *
  * <p>
  * Without this interface we could end up with megamorphic invocation, as the two implementations cannot share class
index 8b8b46b1ba41f4b3c15e069ef9dd862716222317..425b440c1d07dbf071dbc3ea9017c0bd3c07042e 100644 (file)
@@ -12,7 +12,7 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 
 public abstract class AbstractBindingCodecTest extends AbstractBindingRuntimeTest {
-    protected BindingNormalizedNodeCodecRegistry registry;
+    protected BindingCodecContext codecContext;
 
     @BeforeClass
     public static void beforeClass() {
@@ -26,6 +26,6 @@ public abstract class AbstractBindingCodecTest extends AbstractBindingRuntimeTes
 
     @Before
     public void before() {
-        this.registry = new BindingNormalizedNodeCodecRegistry(getRuntimeContext());
+        this.codecContext = new BindingCodecContext(getRuntimeContext());
     }
 }
index 08d48324150c16a5dc4c17b0d91badc41458491a..8d9ff89bb9e9a7db7cf42504c4a0fa1193486d14 100644 (file)
@@ -65,35 +65,35 @@ public class ActionSerializeDeserializeTest extends AbstractBindingCodecTest {
 
     @Test
     public void testSerialization() {
-        assertEquals(DOM_FOO_INPUT, registry.toLazyNormalizedNodeActionInput(Foo.class, BINDING_FOO_INPUT)
+        assertEquals(DOM_FOO_INPUT, codecContext.toLazyNormalizedNodeActionInput(Foo.class, BINDING_FOO_INPUT)
                 .getDelegate());
-        assertEquals(DOM_BAR_INPUT, registry.toLazyNormalizedNodeActionInput(Bar.class, BINDING_BAR_INPUT)
+        assertEquals(DOM_BAR_INPUT, codecContext.toLazyNormalizedNodeActionInput(Bar.class, BINDING_BAR_INPUT)
                 .getDelegate());
-        assertEquals(DOM_FOO_OUTPUT, registry.toLazyNormalizedNodeActionOutput(Foo.class, BINDING_FOO_OUTPUT)
+        assertEquals(DOM_FOO_OUTPUT, codecContext.toLazyNormalizedNodeActionOutput(Foo.class, BINDING_FOO_OUTPUT)
                 .getDelegate());
-        assertEquals(DOM_BAR_OUTPUT, registry.toLazyNormalizedNodeActionOutput(Bar.class, BINDING_BAR_OUTPUT)
+        assertEquals(DOM_BAR_OUTPUT, codecContext.toLazyNormalizedNodeActionOutput(Bar.class, BINDING_BAR_OUTPUT)
                 .getDelegate());
     }
 
     @Test
     public void testKeyedListActionSerialization() {
-        assertEquals(DOM_FOOIO_INPUT, registry.toLazyNormalizedNodeActionInput(Fooio.class, BINDING_FOOIO_INPUT)
+        assertEquals(DOM_FOOIO_INPUT, codecContext.toLazyNormalizedNodeActionInput(Fooio.class, BINDING_FOOIO_INPUT)
                 .getDelegate());
-        assertEquals(DOM_FOOIO_OUTPUT, registry.toLazyNormalizedNodeActionOutput(Fooio.class, BINDING_FOOIO_OUTPUT)
+        assertEquals(DOM_FOOIO_OUTPUT, codecContext.toLazyNormalizedNodeActionOutput(Fooio.class, BINDING_FOOIO_OUTPUT)
                 .getDelegate());
     }
 
     @Test
     public void testDeserialization() {
-        assertEquals(BINDING_FOO_INPUT, registry.fromNormalizedNodeActionInput(Foo.class, DOM_FOO_INPUT));
-        assertEquals(BINDING_BAR_INPUT, registry.fromNormalizedNodeActionInput(Bar.class, DOM_FOO_INPUT));
-        assertEquals(BINDING_FOO_OUTPUT, registry.fromNormalizedNodeActionOutput(Foo.class, DOM_FOO_OUTPUT));
-        assertEquals(BINDING_BAR_OUTPUT, registry.fromNormalizedNodeActionOutput(Bar.class, DOM_FOO_INPUT));
+        assertEquals(BINDING_FOO_INPUT, codecContext.fromNormalizedNodeActionInput(Foo.class, DOM_FOO_INPUT));
+        assertEquals(BINDING_BAR_INPUT, codecContext.fromNormalizedNodeActionInput(Bar.class, DOM_FOO_INPUT));
+        assertEquals(BINDING_FOO_OUTPUT, codecContext.fromNormalizedNodeActionOutput(Foo.class, DOM_FOO_OUTPUT));
+        assertEquals(BINDING_BAR_OUTPUT, codecContext.fromNormalizedNodeActionOutput(Bar.class, DOM_FOO_INPUT));
     }
 
     @Test
     public void testKeyedListActionDeserialization() {
-        assertEquals(BINDING_FOOIO_INPUT, registry.fromNormalizedNodeActionInput(Fooio.class, DOM_FOOIO_INPUT));
-        assertEquals(BINDING_FOOIO_OUTPUT, registry.fromNormalizedNodeActionOutput(Fooio.class, DOM_FOOIO_OUTPUT));
+        assertEquals(BINDING_FOOIO_INPUT, codecContext.fromNormalizedNodeActionInput(Fooio.class, DOM_FOOIO_INPUT));
+        assertEquals(BINDING_FOOIO_OUTPUT, codecContext.fromNormalizedNodeActionOutput(Fooio.class, DOM_FOOIO_OUTPUT));
     }
 }
index 60eecaf8c91ce73ef36ffae518268202afb5fbae..9224659221359a23b262088249e6650cbe407279 100644 (file)
@@ -60,7 +60,7 @@ public class AnydataLeafTest extends AbstractBindingCodecTest {
 
     @Test
     public void testAnydataToBinding() {
-        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(
+        final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(
             YangInstanceIdentifier.create(CONT_NODE_ID), cont);
         assertEquals(InstanceIdentifier.create(Cont.class), entry.getKey());
         final DataObject ldo = entry.getValue();
@@ -96,7 +96,7 @@ public class AnydataLeafTest extends AbstractBindingCodecTest {
 
     @Test
     public void testAnydataFromBinding() {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
             InstanceIdentifier.create(Cont.class), new ContBuilder().setContAny(new FakeCont()).build());
         assertEquals(YangInstanceIdentifier.create(CONT_NODE_ID), entry.getKey());
         assertEquals(cont, entry.getValue());
index ce7cb0bb2e22d0e469e0de097145e213401ec878..fa7c517539efe3aa87f659ab57c5ca785ac3bd69 100644 (file)
@@ -60,7 +60,7 @@ public class AnyxmlLeafTest extends AbstractBindingCodecTest {
 
     @Test
     public void testAnyxmlToBinding() {
-        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(
+        final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(
             YangInstanceIdentifier.create(CONT_NODE_ID), cont);
         assertEquals(InstanceIdentifier.create(Cont.class), entry.getKey());
         final DataObject ldo = entry.getValue();
@@ -96,7 +96,7 @@ public class AnyxmlLeafTest extends AbstractBindingCodecTest {
 
     @Test
     public void testAnyxmlFromBinding() {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
             InstanceIdentifier.create(Cont.class), new ContBuilder().setContAny(new FakeCont()).build());
         assertEquals(YangInstanceIdentifier.create(CONT_NODE_ID), entry.getKey());
         assertEquals(cont, entry.getValue());
index 090b9c179e11a33f1fb7e3d8fce54442e971a3df..b3586c124f837c591389e56d09b7a8734bf4c1b1 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.binding.runtime.api.ClassLoadingStrategy;
 import org.opendaylight.binding.runtime.api.DefaultBindingRuntimeContext;
 import org.opendaylight.binding.runtime.spi.BindingRuntimeHelpers;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.binding.dom.codec.api.MissingClassInLoadingStrategyException;
 import org.opendaylight.mdsal.binding.generator.impl.DefaultBindingRuntimeGenerator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.TreeComplexUsesAugment;
@@ -40,7 +41,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
  * The idea of this suite is to test that codecs will work even if situation like this happens.
  */
 public class AugmentationClassDiscoveredAfterCodecTest {
-    private BindingNormalizedNodeCodecRegistry registry;
+    private BindingNormalizedNodeSerializer serializer;
     private FilteringClassLoadingStrategy filter;
 
     @Before
@@ -51,8 +52,7 @@ public class AugmentationClassDiscoveredAfterCodecTest {
 
         // Class loading filter, manipulated by tests
         filter = new FilteringClassLoadingStrategy(delegate.getStrategy());
-        registry = new BindingNormalizedNodeCodecRegistry(DefaultBindingRuntimeContext.create(delegate.getTypes(),
-            filter));
+        serializer = new BindingCodecContext(DefaultBindingRuntimeContext.create(delegate.getTypes(), filter));
     }
 
     private static final TopLevelListKey TOP_FOO_KEY = new TopLevelListKey("foo");
@@ -64,14 +64,14 @@ public class AugmentationClassDiscoveredAfterCodecTest {
     @Test(expected = MissingClassInLoadingStrategyException.class)
     public void testCorrectExceptionThrown() {
         materializeWithExclusions(TreeLeafOnlyAugment.class, TreeComplexUsesAugment.class);
-        registry.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY);
+        serializer.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY);
     }
 
     @Test
     public void testUsingBindingInstanceIdentifier() {
         materializeWithExclusions(TreeLeafOnlyAugment.class, TreeComplexUsesAugment.class);
         filter.includeClass(TreeLeafOnlyAugment.class);
-        final YangInstanceIdentifier domYY = registry.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY);
+        final YangInstanceIdentifier domYY = serializer.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY);
         assertNotNull(domYY);
     }
 
@@ -85,7 +85,7 @@ public class AugmentationClassDiscoveredAfterCodecTest {
                         .addAugmentation(TreeLeafOnlyAugment.class,
                                 new TreeLeafOnlyAugmentBuilder().setSimpleValue("foo").build()).build();
         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> domData =
-                registry.toNormalizedNode(BA_TOP_LEVEL_LIST, data);
+                serializer.toNormalizedNode(BA_TOP_LEVEL_LIST, data);
         assertNotNull(domData);
     }
 
@@ -93,7 +93,7 @@ public class AugmentationClassDiscoveredAfterCodecTest {
         for (final Class<?> clz : clzToExclude) {
             filter.excludeClass(clz);
         }
-        registry.toYangInstanceIdentifier(BA_TOP_LEVEL_LIST);
+        serializer.toYangInstanceIdentifier(BA_TOP_LEVEL_LIST);
     }
 
     private static final class FilteringClassLoadingStrategy implements ClassLoadingStrategy {
index 3472a5ce75d75c5ea4749d9db3e69cc29569b28a..77d99731be8798eef3ab79130e442ac6b865d4a1 100644 (file)
@@ -9,32 +9,25 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import static org.junit.Assert.assertEquals;
 
-import java.util.Optional;
+import java.util.Map.Entry;
 import org.junit.Test;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.RpcComplexUsesAugment;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.augment.rev140709.RpcComplexUsesAugmentBuilder;
 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.TreeComplexUsesAugmentBuilder;
-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.complex.from.grouping.ContainerWithUsesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelListKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
 public class AugmentationSubstitutionTest extends AbstractBindingCodecTest {
-
     private static final TopLevelListKey TOP_FOO_KEY = new TopLevelListKey("foo");
     private static final InstanceIdentifier<TopLevelList> BA_TOP_LEVEL_LIST = InstanceIdentifier.builder(Top.class)
             .child(TopLevelList.class, TOP_FOO_KEY).build();
-    private static final InstanceIdentifier<TreeLeafOnlyAugment> BA_TREE_LEAF_ONLY = BA_TOP_LEVEL_LIST
-            .augmentation(TreeLeafOnlyAugment.class);
-    private static final InstanceIdentifier<TreeComplexUsesAugment> BA_TREE_COMPLEX_USES = BA_TOP_LEVEL_LIST
-            .augmentation(TreeComplexUsesAugment.class);
-    private static final QName SIMPLE_VALUE_QNAME = QName.create(TreeComplexUsesAugment.QNAME, "simple-value");
 
     @Test
     public void augmentationInGroupingSubstituted() {
@@ -47,8 +40,8 @@ public class AugmentationSubstitutionTest extends AbstractBindingCodecTest {
             .addAugmentation(TreeComplexUsesAugment.class, new TreeComplexUsesAugmentBuilder(createComplexData())
                 .build())
             .build();
-        final NormalizedNode<?, ?> domTreeEntry = registry.toNormalizedNode(BA_TOP_LEVEL_LIST, baTree).getValue();
-        final NormalizedNode<?, ?> domRpcEntry = registry.toNormalizedNode(BA_TOP_LEVEL_LIST, baRpc).getValue();
+        final NormalizedNode<?, ?> domTreeEntry = codecContext.toNormalizedNode(BA_TOP_LEVEL_LIST, baTree).getValue();
+        final NormalizedNode<?, ?> domRpcEntry = codecContext.toNormalizedNode(BA_TOP_LEVEL_LIST, baRpc).getValue();
         assertEquals(domTreeEntry, domRpcEntry);
     }
 
@@ -59,10 +52,11 @@ public class AugmentationSubstitutionTest extends AbstractBindingCodecTest {
             .addAugmentation(TreeComplexUsesAugment.class, new TreeComplexUsesAugmentBuilder(createComplexData())
                 .build())
             .build();
-        final NormalizedNode<?, ?> domTreeEntry = registry.toNormalizedNode(BA_TOP_LEVEL_LIST, manuallyConstructed)
-                .getValue();
-        final TopLevelList deserialized = registry.deserializeFunction(BA_TOP_LEVEL_LIST)
-                .apply(Optional.of(domTreeEntry)).get();
+
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
+            BA_TOP_LEVEL_LIST, manuallyConstructed);
+        final TopLevelList deserialized = (TopLevelList) codecContext.fromNormalizedNode(entry.getKey(),
+            entry.getValue()).getValue();
         assertEquals(manuallyConstructed, deserialized);
         final TopLevelList copiedFromDeserialized = new TopLevelListBuilder(deserialized).build();
         assertEquals(manuallyConstructed, copiedFromDeserialized);
index 85c73e36dd7863fa78b58e73195d07c1eaf21868..d944804690a2b2ccee2dd257df6d81670651baf7 100644 (file)
@@ -10,11 +10,12 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 
-import java.util.Optional;
+import java.util.Map.Entry;
 import org.junit.Test;
 import org.opendaylight.yang.gen.v1.odl.test.binary.key.rev160101.BinaryList;
 import org.opendaylight.yang.gen.v1.odl.test.binary.key.rev160101.BinaryListBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
 public class BinaryKeyTest extends AbstractBindingCodecTest {
@@ -45,7 +46,8 @@ public class BinaryKeyTest extends AbstractBindingCodecTest {
     }
 
     private BinaryList process(final BinaryList binaryList) {
-        final NormalizedNode<?, ?> domTreeEntry = registry.toNormalizedNode(instanceIdentifier, binaryList).getValue();
-        return registry.deserializeFunction(instanceIdentifier).apply(Optional.of(domTreeEntry)).get();
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
+            instanceIdentifier, binaryList);
+        return (BinaryList) codecContext.fromNormalizedNode(entry.getKey(), entry.getValue()).getValue();
     }
 }
index 03cd241b19496bf68697a1bb3f4c7e0f8cc50259..d38dd0e36f0980fdf7afcb0d1b15a7bbad7c45bd 100644 (file)
@@ -11,7 +11,6 @@ import static org.junit.Assert.assertNotNull;
 
 import java.util.Collections;
 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.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.ListModule11Builder;
 import org.opendaylight.yang.gen.v1.urn.test.opendaylight.bug._5524.module1.rev160101.grouping.module1.list.module1._1.ListModule12Builder;
@@ -61,7 +60,6 @@ public class Bug5524augmentUses extends AbstractBindingCodecTest {
                                                 new ContainerManualContainerModule2Builder().build()).build())
                                         .build())).build())).build()).build();
 
-        final BindingCodecTree codecContext = registry.getCodecContext();
         final BindingDataObjectCodecTreeNode<Module4Main> subtreeCodec = codecContext.getSubtreeCodec(
                 InstanceIdentifier.create(Module4Main.class));
         final NormalizedNode<?, ?> serialized = subtreeCodec.serialize(module4Main);
index 461c81df67ff5bf08020bc68206d7f36111723da..7d8d3d861b0a395a53146a28be4e07503a678547 100644 (file)
@@ -11,7 +11,6 @@ import static org.junit.Assert.assertNotNull;
 
 import java.util.Collections;
 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.yang.gen.v1.urn.yang.foo.rev160101.BooleanContainer;
 import org.opendaylight.yang.gen.v1.urn.yang.foo.rev160101.BooleanContainerBuilder;
@@ -42,7 +41,6 @@ public class Bug5845booleanKeyTest extends AbstractBindingCodecTest {
                         .build()))
                 .build();
 
-        final BindingCodecTree codecContext = registry.getCodecContext();
         final BindingDataObjectCodecTreeNode<BooleanContainer> subtreeCodec = codecContext.getSubtreeCodec(
                 InstanceIdentifier.create(BooleanContainer.class));
         final NormalizedNode<?, ?> serializedInt = subtreeCodec.serialize(booleanContainerInt);
index a6368cd18928d508d217a403273d7c9c6bfa1a67..b2657e90d378bae3e61847f30a6327607a13d4f6 100644 (file)
@@ -73,8 +73,8 @@ public class CachingCodecTest extends AbstractBindingCodecTest {
     @Before
     public void before() {
         super.before();
-        topNode = registry.getCodecContext().getSubtreeCodec(TOP_PATH);
-        contNode = registry.getCodecContext().getSubtreeCodec(CONT_PATH);
+        topNode = codecContext.getSubtreeCodec(TOP_PATH);
+        contNode = codecContext.getSubtreeCodec(CONT_PATH);
     }
 
     private static Map<TopLevelListKey, TopLevelList> createList(final int num) {
index daf941672ae6b0ed0db3942592941128ab1520cc..7b5060ab280c84ffd1f98db369b125d893499c09 100644 (file)
@@ -53,8 +53,8 @@ public class CaseSubstitutionTest extends AbstractBindingCodecTest {
             .withKey(CHOICE_FOO_KEY)
             .setChoiceInChoiceList(new ComplexViaUsesBuilder(createComplexData()).build())
             .build();
-        final NormalizedNode<?, ?> domTreeEntry = registry.toNormalizedNode(BA_CHOICE_LIST, baTree).getValue();
-        final NormalizedNode<?, ?> domRpcEntry = registry.toNormalizedNode(BA_CHOICE_LIST, baRpc).getValue();
+        final NormalizedNode<?, ?> domTreeEntry = codecContext.toNormalizedNode(BA_CHOICE_LIST, baTree).getValue();
+        final NormalizedNode<?, ?> domRpcEntry = codecContext.toNormalizedNode(BA_CHOICE_LIST, baRpc).getValue();
         assertEquals(domTreeEntry, domRpcEntry);
     }
 
index e16a93db073e809f931de85d635c3e7125fe313f..4e3b5fcbf6c23ad95a06373f05a1d97f70c2d719 100644 (file)
@@ -49,9 +49,9 @@ public class EmptyLeafTest extends AbstractBindingCodecTest {
             .withKey(TOP_FOO_KEY)
             .setChoiceInList(new EmptyLeafBuilder().setEmptyType(Empty.getInstance()).build())
             .build();
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom = registry.toNormalizedNode(BA_TOP_LEVEL_LIST,
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom = codecContext.toNormalizedNode(BA_TOP_LEVEL_LIST,
             withEmptyCase);
-        final Entry<InstanceIdentifier<?>, DataObject> readed = registry.fromNormalizedNode(dom.getKey(),
+        final Entry<InstanceIdentifier<?>, DataObject> readed = codecContext.fromNormalizedNode(dom.getKey(),
             dom.getValue());
         final ChoiceInList list = ((TopLevelList) readed.getValue()).getChoiceInList();
         assertTrue(list instanceof EmptyLeaf);
index 86183a8e610b539541370000a75c67480f026b8c..831eccb20e4db58989ac4423bf807373e609fc37 100644 (file)
@@ -9,6 +9,7 @@ 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.BindingNormalizedNodeSerializer;
 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;
@@ -24,9 +25,9 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 
 public class ExceptionReportingTest {
-    private static final BindingNormalizedNodeCodecRegistry CODEC_WITHOUT_TOP = codec(LowestLevel1.class);
-    private static final BindingNormalizedNodeCodecRegistry ONLY_TOP_CODEC = codec(Top.class);
-    private static final BindingNormalizedNodeCodecRegistry FULL_CODEC = codec(TreeComplexUsesAugment.class);
+    private static final BindingNormalizedNodeSerializer CODEC_WITHOUT_TOP = codec(LowestLevel1.class);
+    private static final BindingNormalizedNodeSerializer ONLY_TOP_CODEC = codec(Top.class);
+    private static final BindingNormalizedNodeSerializer FULL_CODEC = codec(TreeComplexUsesAugment.class);
 
     private static final TopLevelListKey TOP_FOO_KEY = new TopLevelListKey("foo");
     private static final InstanceIdentifier<TopLevelList> BA_TOP_LEVEL_LIST = InstanceIdentifier
@@ -71,9 +72,8 @@ public class ExceptionReportingTest {
             (Class) TreeComplexUsesAugment.class));
     }
 
-    @SuppressWarnings("checkstyle:illegalCatch")
-    private static BindingNormalizedNodeCodecRegistry codec(final Class<?>... classes) {
-        return new BindingNormalizedNodeCodecRegistry(BindingRuntimeHelpers.createRuntimeContext(
+    private static BindingNormalizedNodeSerializer codec(final Class<?>... classes) {
+        return new BindingCodecContext(BindingRuntimeHelpers.createRuntimeContext(
             new DefaultBindingRuntimeGenerator(), classes));
     }
 }
index bbcb8937730cea8a157a5f705d173f5108ed49e4..20fc24d5a886eaea09dd661a0bb62f7ab9a86b4f 100644 (file)
@@ -60,19 +60,21 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testYangIIToBindingAwareII() {
-        final InstanceIdentifier<?> instanceIdentifier = registry.fromYangInstanceIdentifier(BI_TOP_PATH);
+        final InstanceIdentifier<?> instanceIdentifier = codecContext.fromYangInstanceIdentifier(BI_TOP_PATH);
         assertEquals(Top.class, instanceIdentifier.getTargetType());
     }
 
     @Test
     public void testYangIIToBindingAwareIIListWildcarded() {
-        final InstanceIdentifier<?> instanceIdentifier = registry.fromYangInstanceIdentifier(BI_TOP_LEVEL_LIST_PATH);
+        final InstanceIdentifier<?> instanceIdentifier = codecContext.fromYangInstanceIdentifier(
+            BI_TOP_LEVEL_LIST_PATH);
         assertNull(instanceIdentifier);
     }
 
     @Test
     public void testYangIIToBindingAwareIIListWithKey() {
-        final InstanceIdentifier<?> instanceIdentifier = registry.fromYangInstanceIdentifier(BI_TOP_LEVEL_LIST_1_PATH);
+        final InstanceIdentifier<?> instanceIdentifier = codecContext.fromYangInstanceIdentifier(
+            BI_TOP_LEVEL_LIST_1_PATH);
         final InstanceIdentifier.PathArgument last = Iterables.getLast(instanceIdentifier.getPathArguments());
         assertEquals(TopLevelList.class, instanceIdentifier.getTargetType());
         assertFalse(instanceIdentifier.isWildcarded());
@@ -84,7 +86,7 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testBindingAwareIIToYangIContainer() {
-        final YangInstanceIdentifier yangInstanceIdentifier = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier yangInstanceIdentifier = codecContext.toYangInstanceIdentifier(
                 InstanceIdentifier.create(Top.class).child(TopLevelList.class));
         final PathArgument lastPathArgument = yangInstanceIdentifier.getLastPathArgument();
         assertTrue(lastPathArgument instanceof NodeIdentifier);
@@ -93,7 +95,7 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testBindingAwareIIToYangIIWildcard() {
-        final YangInstanceIdentifier yangInstanceIdentifier = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier yangInstanceIdentifier = codecContext.toYangInstanceIdentifier(
                 InstanceIdentifier.create(Top.class).child(TopLevelList.class));
         final PathArgument lastPathArgument = yangInstanceIdentifier.getLastPathArgument();
         assertTrue(lastPathArgument instanceof NodeIdentifier);
@@ -102,7 +104,7 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testBindingAwareIIToYangIIListWithKey() {
-        final YangInstanceIdentifier yangInstanceIdentifier = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier yangInstanceIdentifier = codecContext.toYangInstanceIdentifier(
                 InstanceIdentifier.create(Top.class).child(TopLevelList.class, TOP_FOO_KEY));
         final PathArgument lastPathArgument = yangInstanceIdentifier.getLastPathArgument();
         assertTrue(lastPathArgument instanceof NodeIdentifierWithPredicates);
@@ -112,25 +114,26 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testBindingAwareIIToYangIIAugmentation() {
-        final PathArgument lastArg = registry.toYangInstanceIdentifier(BA_TREE_COMPLEX_USES).getLastPathArgument();
+        final PathArgument lastArg = codecContext.toYangInstanceIdentifier(BA_TREE_COMPLEX_USES).getLastPathArgument();
         assertTrue(lastArg instanceof AugmentationIdentifier);
     }
 
     @Test
     public void testBindingAwareIIToYangIILeafOnlyAugmentation() {
-        final PathArgument leafOnlyLastArg = registry.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY).getLastPathArgument();
+        final PathArgument leafOnlyLastArg = codecContext.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY)
+                .getLastPathArgument();
         assertTrue(leafOnlyLastArg instanceof AugmentationIdentifier);
         assertTrue(((AugmentationIdentifier) leafOnlyLastArg).getPossibleChildNames().contains(SIMPLE_VALUE_QNAME));
     }
 
     @Test
     public void testChoiceCaseGroupingFromBinding() {
-        final YangInstanceIdentifier contBase = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier contBase = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(Cont.class).child(ContBase.class, GrpCont.class).build());
         assertEquals(YangInstanceIdentifier.create(NodeIdentifier.create(Cont.QNAME),
             NodeIdentifier.create(ContChoice.QNAME), NodeIdentifier.create(GrpCont.QNAME)), contBase);
 
-        final YangInstanceIdentifier contAug = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier contAug = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(Cont.class).child(ContAug.class, GrpCont.class).build());
         assertEquals(YangInstanceIdentifier.create(NodeIdentifier.create(Cont.QNAME),
             NodeIdentifier.create(ContChoice.QNAME),
@@ -139,16 +142,16 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
         // Legacy: downcast the child to Class, losing type safety but still working. Faced with ambiguity, it will
         //         select the lexically-lower class
         assertEquals(1, ContBase.class.getCanonicalName().compareTo(ContAug.class.getCanonicalName()));
-        final YangInstanceIdentifier contAugLegacy = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier contAugLegacy = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(Cont.class).child((Class) GrpCont.class).build());
         assertEquals(contAug, contAugLegacy);
 
-        final YangInstanceIdentifier rootBase = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier rootBase = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(RootBase.class, GrpCont.class).build());
         assertEquals(YangInstanceIdentifier.create(NodeIdentifier.create(Root.QNAME),
             NodeIdentifier.create(GrpCont.QNAME)), rootBase);
 
-        final YangInstanceIdentifier rootAug = registry.toYangInstanceIdentifier(
+        final YangInstanceIdentifier rootAug = codecContext.toYangInstanceIdentifier(
             InstanceIdentifier.builder(RootAug.class, GrpCont.class).build());
         assertEquals(YangInstanceIdentifier.create(NodeIdentifier.create(Root.QNAME),
             NodeIdentifier.create(GrpCont.QNAME.withModule(RootAug.QNAME.getModule()))), rootAug);
@@ -156,21 +159,21 @@ public class InstanceIdentifierSerializeDeserializeTest extends AbstractBindingC
 
     @Test
     public void testChoiceCaseGroupingToBinding() {
-        final InstanceIdentifier<?> contBase = registry.fromYangInstanceIdentifier(
+        final InstanceIdentifier<?> contBase = codecContext.fromYangInstanceIdentifier(
             YangInstanceIdentifier.create(NodeIdentifier.create(Cont.QNAME),
             NodeIdentifier.create(ContChoice.QNAME), NodeIdentifier.create(GrpCont.QNAME)));
         assertEquals(InstanceIdentifier.builder(Cont.class).child(ContBase.class, GrpCont.class).build(), contBase);
 
-        final InstanceIdentifier<?> contAug = registry.fromYangInstanceIdentifier(
+        final InstanceIdentifier<?> contAug = codecContext.fromYangInstanceIdentifier(
             YangInstanceIdentifier.create(NodeIdentifier.create(Cont.QNAME), NodeIdentifier.create(ContChoice.QNAME),
                 NodeIdentifier.create(GrpCont.QNAME.withModule(ContAug.QNAME.getModule()))));
         assertEquals(InstanceIdentifier.builder(Cont.class).child(ContAug.class, GrpCont.class).build(), contAug);
 
-        final InstanceIdentifier<?> rootBase = registry.fromYangInstanceIdentifier(
+        final InstanceIdentifier<?> rootBase = codecContext.fromYangInstanceIdentifier(
             YangInstanceIdentifier.create(NodeIdentifier.create(Root.QNAME), NodeIdentifier.create(GrpCont.QNAME)));
         assertEquals(InstanceIdentifier.builder(RootBase.class, GrpCont.class).build(), rootBase);
 
-        final InstanceIdentifier<?> rootAug = registry.fromYangInstanceIdentifier(
+        final InstanceIdentifier<?> rootAug = codecContext.fromYangInstanceIdentifier(
             YangInstanceIdentifier.create(NodeIdentifier.create(Root.QNAME),
                 NodeIdentifier.create(GrpCont.QNAME.withModule(RootAug.QNAME.getModule()))));
         assertEquals(InstanceIdentifier.builder(RootAug.class, GrpCont.class).build(), rootAug);
index 7d6e5c1029f2add8d1660adf23a1bcb4005ed3f3..b7ebc32d7396f7b0b2129d8b3553fe959be1683f 100644 (file)
@@ -31,7 +31,6 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 
 public class InstanceIdentifierTest extends AbstractBindingCodecTest {
-
     private static final TopLevelListKey TOP_FOO_KEY = new TopLevelListKey("foo");
     private static final InstanceIdentifier<TopLevelList> BA_TOP_LEVEL_LIST = InstanceIdentifier.builder(Top.class)
             .child(TopLevelList.class, TOP_FOO_KEY).build();
@@ -43,23 +42,24 @@ public class InstanceIdentifierTest extends AbstractBindingCodecTest {
 
     @Test
     public void testComplexAugmentationSerialization() {
-        final YangInstanceIdentifier yangII = registry.toYangInstanceIdentifier(BA_TREE_COMPLEX_USES);
+        final YangInstanceIdentifier yangII = codecContext.toYangInstanceIdentifier(BA_TREE_COMPLEX_USES);
         final PathArgument lastArg = yangII.getLastPathArgument();
         assertTrue("Last argument should be AugmentationIdentifier", lastArg instanceof AugmentationIdentifier);
-        final InstanceIdentifier<?> bindingII = registry.fromYangInstanceIdentifier(yangII);
+        final InstanceIdentifier<?> bindingII = codecContext.fromYangInstanceIdentifier(yangII);
         assertEquals(BA_TREE_COMPLEX_USES, bindingII);
     }
 
     @Test
     public void testLeafOnlyAugmentationSerialization() {
-        final PathArgument leafOnlyLastArg = registry.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY).getLastPathArgument();
+        final PathArgument leafOnlyLastArg = codecContext.toYangInstanceIdentifier(BA_TREE_LEAF_ONLY)
+                .getLastPathArgument();
         assertTrue("Last argument should be AugmentationIdentifier", leafOnlyLastArg instanceof AugmentationIdentifier);
         assertTrue(((AugmentationIdentifier) leafOnlyLastArg).getPossibleChildNames().contains(SIMPLE_VALUE_QNAME));
     }
 
     @Test
     public void testCamelCaseKeys() {
-        final InstanceIdentifier<?> result = registry.fromYangInstanceIdentifier(YangInstanceIdentifier.create(
+        final InstanceIdentifier<?> result = codecContext.fromYangInstanceIdentifier(YangInstanceIdentifier.create(
             NodeIdentifier.create(OspfStatLsdbBrief.QNAME),
             NodeIdentifierWithPredicates.of(OspfStatLsdbBrief.QNAME, ImmutableMap.of(
                 QName.create(OspfStatLsdbBrief.QNAME, "AreaIndex"), 1,
index 6785ade8da113ea202b11453188b6eb1fdd13694..f2ef45f827425bda3bdc5fa32fa6f581c87ce58a 100644 (file)
@@ -37,25 +37,25 @@ public class KeyInheritenceTest extends AbstractBindingCodecTest {
 
     @Test
     public void testFromBinding() {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> domDef = registry.toNormalizedNode(DEF_IID, DEF);
-        Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(domDef.getKey(),
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> domDef = codecContext.toNormalizedNode(DEF_IID, DEF);
+        Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(domDef.getKey(),
             domDef.getValue());
         assertEquals(DEF_IID, entry.getKey());
         final Def codecDef = (Def) entry.getValue();
 
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> domUse = registry.toNormalizedNode(USE_IID, USE);
-        entry = registry.fromNormalizedNode(domUse.getKey(), domUse.getValue());
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> domUse = codecContext.toNormalizedNode(USE_IID, USE);
+        entry = codecContext.fromNormalizedNode(domUse.getKey(), domUse.getValue());
         assertEquals(USE_IID, entry.getKey());
         final Use codecUse = (Use) entry.getValue();
 
         Use copiedUse = new UseBuilder(DEF).build();
         assertEquals(USE, copiedUse);
-        assertEquals(domUse.getValue(), registry.toNormalizedNode(USE_IID, copiedUse).getValue());
+        assertEquals(domUse.getValue(), codecContext.toNormalizedNode(USE_IID, copiedUse).getValue());
         copiedUse = new UseBuilder(codecDef).build();
         assertEquals(USE, copiedUse);
-        assertEquals(domUse.getValue(), registry.toNormalizedNode(USE_IID, copiedUse).getValue());
+        assertEquals(domUse.getValue(), codecContext.toNormalizedNode(USE_IID, copiedUse).getValue());
         copiedUse = new UseBuilder(codecUse).build();
         assertEquals(USE, copiedUse);
-        assertEquals(domUse.getValue(), registry.toNormalizedNode(USE_IID, copiedUse).getValue());
+        assertEquals(domUse.getValue(), codecContext.toNormalizedNode(USE_IID, copiedUse).getValue());
     }
 }
index 910966ae098a9002c60ca2a14c7b5e5cf4d52fa2..3a00569892a68713ae2ed4f8dddadffbd03cf456 100644 (file)
@@ -39,9 +39,9 @@ public class LeafReferenceTest extends AbstractBindingCodecTest {
             .setSchemaUnawareUnion(new Int32StringUnion("foo"))
             .setSchemaUnawareUnionRef(new Int32StringUnion(10))
             .build();
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom = registry.toNormalizedNode(BA_TOP_LEVEL_LIST,
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom = codecContext.toNormalizedNode(BA_TOP_LEVEL_LIST,
             binding);
-        final Entry<InstanceIdentifier<?>, DataObject> readed = registry.fromNormalizedNode(dom.getKey(),
+        final Entry<InstanceIdentifier<?>, DataObject> readed = codecContext.fromNormalizedNode(dom.getKey(),
             dom.getValue());
         final TreeComplexLeaves readedAugment = (TreeComplexLeaves) readed.getValue();
 
index 07e74cb0e490ea65e55e5a0eb83e7a8bd749a9a4..b20283a9f97217d6cf3932f63e3d69eca7eca362 100644 (file)
@@ -29,18 +29,18 @@ public class LeafrefSerializeDeserializeTest extends AbstractBindingCodecTest {
     @Test
     public void listReferenceTest() {
         final YangInstanceIdentifier contYII = YangInstanceIdentifier.builder().node(Cont.QNAME).build();
-        final InstanceIdentifier<?> fromYangInstanceIdentifier = this.registry.fromYangInstanceIdentifier(contYII);
+        final InstanceIdentifier<?> fromYangInstanceIdentifier = this.codecContext.fromYangInstanceIdentifier(contYII);
         assertNotNull(fromYangInstanceIdentifier);
 
         final InstanceIdentifier<Cont> BA_II_CONT = InstanceIdentifier.builder(Cont.class).build();
         final Ref refVal = new Ref("myvalue");
         final Cont data = new ContBuilder().setRef(refVal).build();
         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedNode =
-                this.registry.toNormalizedNode(BA_II_CONT, data);
+                this.codecContext.toNormalizedNode(BA_II_CONT, data);
         assertNotNull(normalizedNode);
 
         final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode =
-                this.registry.fromNormalizedNode(contYII, normalizedNode.getValue());
+                this.codecContext.fromNormalizedNode(contYII, normalizedNode.getValue());
         assertNotNull(fromNormalizedNode);
         final Cont value = (Cont) fromNormalizedNode.getValue();
         assertEquals(refVal, value.getRef());
@@ -49,18 +49,18 @@ public class LeafrefSerializeDeserializeTest extends AbstractBindingCodecTest {
     @Test
     public void uint32LeafrefTest() {
         final YangInstanceIdentifier contYII = YangInstanceIdentifier.builder().node(ContInt32.QNAME).build();
-        final InstanceIdentifier<?> fromYangInstanceIdentifier = this.registry.fromYangInstanceIdentifier(contYII);
+        final InstanceIdentifier<?> fromYangInstanceIdentifier = this.codecContext.fromYangInstanceIdentifier(contYII);
         assertNotNull(fromYangInstanceIdentifier);
 
         final InstanceIdentifier<ContInt32> BA_II_CONT = InstanceIdentifier.builder(ContInt32.class).build();
         final RefUnionInt32 refVal = new RefUnionInt32(Uint32.valueOf(5));
         final ContInt32 data = new ContInt32Builder().setRefUnionInt32(refVal).build();
         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> normalizedNode =
-                this.registry.toNormalizedNode(BA_II_CONT, data);
+                this.codecContext.toNormalizedNode(BA_II_CONT, data);
         assertNotNull(normalizedNode);
 
         final Entry<InstanceIdentifier<?>, DataObject> fromNormalizedNode =
-                this.registry.fromNormalizedNode(contYII, normalizedNode.getValue());
+                this.codecContext.fromNormalizedNode(contYII, normalizedNode.getValue());
         assertNotNull(fromNormalizedNode);
         final ContInt32 value = (ContInt32) fromNormalizedNode.getValue();
         assertEquals(refVal, value.getRefUnionInt32());
index 629cc230523e454d3ff7f2ffb6741990c72ab99b..fee017b0366cae4017b7dbadcbf71ecb42d46e72 100644 (file)
@@ -121,7 +121,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
 
     @Test
     public void containerToNormalized() {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
             InstanceIdentifier.create(Top.class), top());
         final ContainerNode topNormalized = getEmptyTop();
         assertEquals(topNormalized, entry.getValue());
@@ -130,7 +130,8 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
     @Test
     public void containerFromNormalized() {
         final ContainerNode topNormalized = getEmptyTop();
-        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(BI_TOP_PATH, topNormalized);
+        final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(BI_TOP_PATH,
+            topNormalized);
         assertEquals(top(), entry.getValue());
     }
 
@@ -154,8 +155,9 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                 .build());
         final ContainerNode topNormalized = getEmptyTop();
 
-        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(BI_TOP_PATH, topNormalized);
-        final Entry<InstanceIdentifier<?>, DataObject> entryWithAugments = registry.fromNormalizedNode(BI_TOP_PATH,
+        final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(BI_TOP_PATH,
+            topNormalized);
+        final Entry<InstanceIdentifier<?>, DataObject> entryWithAugments = codecContext.fromNormalizedNode(BI_TOP_PATH,
             topNormalizedWithAugments);
 
         // Equals on other with no augmentation should be false
@@ -195,7 +197,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                 .withChild(ImmutableNodes.leafNode(AUGMENT_INT_Q, AUGMENT_INT_VALUE))
                 .build());
 
-        final Entry<InstanceIdentifier<?>, DataObject> entryWithAugments = registry.fromNormalizedNode(BI_TOP_PATH,
+        final Entry<InstanceIdentifier<?>, DataObject> entryWithAugments = codecContext.fromNormalizedNode(BI_TOP_PATH,
             topNormalizedWithAugments);
         Map<Class<? extends Augmentation<Top>>, Augmentation<Top>> augments = new HashMap<>();
         augments.put(Top1.class, new Top1Builder().setAugmentedString(AUGMENT_STRING_VALUE).build());
@@ -235,8 +237,8 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
 
     @Test
     public void listWithKeysToNormalized() {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(BA_TOP_LEVEL_LIST,
-            topLevelList(TOP_LEVEL_LIST_FOO_KEY));
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
+            BA_TOP_LEVEL_LIST, topLevelList(TOP_LEVEL_LIST_FOO_KEY));
         final MapEntryNode topLevelListNormalized = ImmutableMapEntryNodeBuilder.create()
                 .withNodeIdentifier(NodeIdentifierWithPredicates.of(TOP_LEVEL_LIST_QNAME, TOP_LEVEL_LIST_KEY_QNAME,
                     TOP_LEVEL_LIST_FOO_KEY_VALUE))
@@ -252,15 +254,15 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                     TOP_LEVEL_LIST_FOO_KEY_VALUE))
                 .withChild(leafNode(TOP_LEVEL_LIST_KEY_QNAME, TOP_LEVEL_LIST_FOO_KEY_VALUE))
                 .build();
-        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(BI_TOP_LEVEL_LIST_FOO_PATH,
-            topLevelListNormalized);
+        final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(
+            BI_TOP_LEVEL_LIST_FOO_PATH, topLevelListNormalized);
         assertEquals(topLevelList(TOP_LEVEL_LIST_FOO_KEY), entry.getValue());
     }
 
     @Test
     public void leafOnlyAugmentationToNormalized() {
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(BA_TREE_LEAF_ONLY,
-            new TreeLeafOnlyAugmentBuilder().setSimpleValue("simpleValue").build());
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
+            BA_TREE_LEAF_ONLY, new TreeLeafOnlyAugmentBuilder().setSimpleValue("simpleValue").build());
         final Set<QName> augmentationChildren = new HashSet<>();
         augmentationChildren.add(SIMPLE_VALUE_QNAME);
         final AugmentationNode augmentationNode = ImmutableAugmentationNodeBuilder.create()
@@ -278,7 +280,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                 .withNodeIdentifier(new AugmentationIdentifier(augmentationChildren))
                 .withChild(leafNode(SIMPLE_VALUE_QNAME, "simpleValue"))
                 .build();
-        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(
+        final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(
             BI_TOP_LEVEL_LIST_FOO_PATH.node(new AugmentationIdentifier(augmentationChildren)),
             augmentationNode);
         assertEquals(new TreeLeafOnlyAugmentBuilder().setSimpleValue("simpleValue").build(), entry.getValue());
@@ -290,7 +292,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
         topLevelLeafList.add("foo");
         Top top = new TopBuilder().setTopLevelOrderedLeafList(topLevelLeafList).build();
 
-        Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(
+        Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
             InstanceIdentifier.create(Top.class), top);
         ContainerNode containerNode = ImmutableContainerNodeBuilder.create()
                 .withNodeIdentifier(new NodeIdentifier(TOP_QNAME))
@@ -313,7 +315,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
         topLevelLeafList.add("foo");
         final Top top = new TopBuilder().setTopLevelLeafList(topLevelLeafList).build();
 
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
             InstanceIdentifier.create(Top.class), top);
         final ContainerNode containerNode = ImmutableContainerNodeBuilder.create()
                 .withNodeIdentifier(new NodeIdentifier(TOP_QNAME))
@@ -339,7 +341,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                         .withNodeIdentifier(new NodeWithValue<>(TOP_LEVEL_LEAF_LIST_QNAME, "foo"))
                         .withValue("foo").build()).build())
                 .build();
-        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(BI_TOP_PATH,
+        final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(BI_TOP_PATH,
             topWithLeafList);
         final List<String> topLevelLeafList = new ArrayList<>();
         topLevelLeafList.add("foo");
@@ -357,7 +359,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                         new NodeWithValue<>(TOP_LEVEL_ORDERED_LEAF_LIST_QNAME, "foo")).withValue("foo").build())
                     .build())
                 .build();
-        Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(BI_TOP_PATH, topWithLeafList);
+        Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(BI_TOP_PATH, topWithLeafList);
         List<String> topLevelLeafList = new ArrayList<>();
         topLevelLeafList.add("foo");
         Top top = new TopBuilder().setTopLevelOrderedLeafList(topLevelLeafList).build();
@@ -368,7 +370,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
     public void choiceToNormalized() {
         final ChoiceContainer choiceContainerBA = new ChoiceContainerBuilder().setIdentifier(new ExtendedBuilder()
             .setExtendedId(new ExtendedIdBuilder().setId("identifier_value").build()).build()).build();
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(
             InstanceIdentifier.create(ChoiceContainer.class), choiceContainerBA);
         final ContainerNode choiceContainer = ImmutableContainerNodeBuilder.create()
                 .withNodeIdentifier(new NodeIdentifier(CHOICE_CONTAINER_QNAME))
@@ -401,7 +403,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                         .withChild(leafNode(nestedContainerLeafOuterQname, "bar"))
                         .build())
                 .build();
-        final Entry<InstanceIdentifier<?>, DataObject> entryContainer = registry.fromNormalizedNode(
+        final Entry<InstanceIdentifier<?>, DataObject> entryContainer = codecContext.fromNormalizedNode(
             yangInstanceIdentifierOuter, containerNodeOuter);
         assertNotNull(entryContainer.getValue());
         assertNotNull(entryContainer.getKey());
@@ -435,7 +437,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                         .build())
                 .build();
         try {
-            registry.fromNormalizedNode(yangInstanceIdentifierValid, containerNodeValid);
+            codecContext.fromNormalizedNode(yangInstanceIdentifierValid, containerNodeValid);
             fail("Incorect YangInstanceIdentifier should fail");
         } catch (IllegalStateException e) {
             // Expected
@@ -453,7 +455,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                         .build())
                 .build();
         try {
-            registry.fromNormalizedNode(yangInstanceIdentifier4798, containerNode4798);
+            codecContext.fromNormalizedNode(yangInstanceIdentifier4798, containerNode4798);
             fail("Incorect YangInstanceIdentifier should fail");
         } catch (IllegalStateException e) {
             // Expected
@@ -470,7 +472,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                         .withNodeIdentifier(new NodeIdentifier(EXTENDED_ID_QNAME))
                         .withChild(leafNode(CHOICE_IDENTIFIER_ID_QNAME, "identifier_value")).build()).build())
                 .build();
-        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(BI_CHOICE_CONTAINER_PATH,
+        final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(BI_CHOICE_CONTAINER_PATH,
             choiceContainerBI);
         final ChoiceContainer choiceContainerBA = new ChoiceContainerBuilder().setIdentifier(new ExtendedBuilder()
             .setExtendedId(new ExtendedIdBuilder().setId("identifier_value").build()).build()).build();
@@ -485,7 +487,8 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
         nestedLists.add(new NestedListBuilder().withKey(new NestedListKey("bar")).build());
         final TopLevelList topLevelList = new TopLevelListBuilder().withKey(TOP_LEVEL_LIST_FOO_KEY).setNestedList(
             nestedLists).build();
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = registry.toNormalizedNode(ii, topLevelList);
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> entry = codecContext.toNormalizedNode(ii,
+            topLevelList);
         final MapEntryNode foo = mapEntryBuilder().withNodeIdentifier(NodeIdentifierWithPredicates.of(
                 TOP_LEVEL_LIST_QNAME, TOP_LEVEL_LIST_KEY_QNAME, TOP_LEVEL_LIST_FOO_KEY_VALUE))
                 .withChild(leafNode(TOP_LEVEL_LIST_KEY_QNAME, TOP_LEVEL_LIST_FOO_KEY_VALUE))
@@ -505,8 +508,8 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
                     .withNodeIdentifier(new NodeIdentifier(NESTED_LIST_QNAME))
                     .withChild(mapEntry(NESTED_LIST_QNAME, NESTED_LIST_KEY_QNAME, "foo"))
                     .withChild(mapEntry(NESTED_LIST_QNAME, NESTED_LIST_KEY_QNAME, "bar")).build()).build();
-        final Entry<InstanceIdentifier<?>, DataObject> entry = registry.fromNormalizedNode(BI_TOP_LEVEL_LIST_FOO_PATH,
-            foo);
+        final Entry<InstanceIdentifier<?>, DataObject> entry = codecContext.fromNormalizedNode(
+            BI_TOP_LEVEL_LIST_FOO_PATH, foo);
         final List<NestedList> nestedLists = new ArrayList<>();
         nestedLists.add(new NestedListBuilder().withKey(new NestedListKey("foo")).build());
         nestedLists.add(new NestedListBuilder().withKey(new NestedListKey("bar")).build());
@@ -542,7 +545,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
         tBuilder.addAugmentation(TopChoiceAugment1.class, tca1Builder.build());
         final Top top = tBuilder.build();
 
-        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> biResult = registry.toNormalizedNode(
+        final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> biResult = codecContext.toNormalizedNode(
             InstanceIdentifier.create(Top.class), top);
 
         final NormalizedNode<?, ?> topNormalized =
@@ -562,7 +565,7 @@ public class NormalizedNodeSerializeDeserializeTest extends AbstractBindingCodec
         assertEquals(BI_TOP_PATH, biResult.getKey());
         assertEquals(topNormalized, biResult.getValue());
 
-        final Entry<InstanceIdentifier<?>, DataObject> baResult = registry.fromNormalizedNode(BI_TOP_PATH,
+        final Entry<InstanceIdentifier<?>, DataObject> baResult = codecContext.fromNormalizedNode(BI_TOP_PATH,
             topNormalized);
 
         assertEquals(InstanceIdentifier.create(Top.class), baResult.getKey());
index 3f4a6f15c21916b4032a0d1488ed9819e000d320..d71e48266c52da8c727c2104ae83de57c4ed486f 100644 (file)
@@ -52,13 +52,13 @@ public class NotificationProcessingTest extends AbstractBindingCodecTest {
 
     @Test
     public void testNotificationToNormalized() {
-        final ContainerNode dom = registry.toNormalizedNodeNotification(createTestBindingData());
+        final ContainerNode dom = codecContext.toNormalizedNodeNotification(createTestBindingData());
         assertEquals(createTestDomData(), dom);
     }
 
     @Test
     public void testNormalizedToNotification() {
-        final Notification bindingDeserialized = registry.fromNormalizedNodeNotification(SchemaPath.ROOT.createChild(
+        final Notification bindingDeserialized = codecContext.fromNormalizedNodeNotification(SchemaPath.create(true,
             TwoLevelListChanged.QNAME), createTestDomData());
         assertTrue(bindingDeserialized instanceof TwoLevelListChanged);
         assertEquals(createTestBindingData(), bindingDeserialized);
@@ -67,7 +67,7 @@ public class NotificationProcessingTest extends AbstractBindingCodecTest {
     @Test
     public void testNormalizedToNotificationWithInstant() {
         final Instant instant = Instant.now();
-        final Notification bindingDeserialized = registry.fromNormalizedNodeNotification(SchemaPath.ROOT.createChild(
+        final Notification bindingDeserialized = codecContext.fromNormalizedNodeNotification(SchemaPath.create(true,
             TwoLevelListChanged.QNAME), createTestDomData(), instant);
         assertTrue(bindingDeserialized instanceof TwoLevelListChanged);
         assertEquals(createTestBindingData(), bindingDeserialized);
@@ -77,7 +77,7 @@ public class NotificationProcessingTest extends AbstractBindingCodecTest {
 
     @Test
     public void testNormalizedToNotificationWithNull() {
-        final Notification bindingDeserialized = registry.fromNormalizedNodeNotification(SchemaPath.ROOT.createChild(
+        final Notification bindingDeserialized = codecContext.fromNormalizedNodeNotification(SchemaPath.create(true,
             TwoLevelListChanged.QNAME), createTestDomData(), null);
         assertTrue(bindingDeserialized instanceof TwoLevelListChanged);
         assertEquals(createTestBindingData(), bindingDeserialized);
index a2113dcd676639ab75dcffc8befc477358af253a..05660598d33669a9f3d59a90d635eaf60d8b8dd2 100644 (file)
@@ -38,11 +38,11 @@ public class RpcDataSerializationTest extends AbstractBindingCodecTest {
         final PutTopInput bindingOriginal = new PutTopInputBuilder()
                 .setTopLevelList(ImmutableMap.of(LIST_KEY, new TopLevelListBuilder().withKey(LIST_KEY).build()))
                 .build();
-        final ContainerNode dom = registry.toNormalizedNodeRpcData(bindingOriginal);
+        final ContainerNode dom = codecContext.toNormalizedNodeRpcData(bindingOriginal);
         assertNotNull(dom);
         assertEquals(PutTopInput.QNAME, dom.getIdentifier().getNodeType());
 
-        final DataObject bindingDeserialized = registry.fromNormalizedNodeRpcData(PUT_TOP_INPUT, dom);
+        final DataObject bindingDeserialized = codecContext.fromNormalizedNodeRpcData(PUT_TOP_INPUT, dom);
         assertEquals(bindingOriginal, bindingDeserialized);
     }
 
@@ -51,11 +51,11 @@ public class RpcDataSerializationTest extends AbstractBindingCodecTest {
         final GetTopOutput bindingOriginal = new GetTopOutputBuilder()
                 .setTopLevelList(ImmutableMap.of(LIST_KEY, new TopLevelListBuilder().withKey(LIST_KEY).build()))
                 .build();
-        final ContainerNode dom = registry.toNormalizedNodeRpcData(bindingOriginal);
+        final ContainerNode dom = codecContext.toNormalizedNodeRpcData(bindingOriginal);
         assertNotNull(dom);
         assertEquals(GetTopOutput.QNAME, dom.getIdentifier().getNodeType());
 
-        final DataObject bindingDeserialized = registry.fromNormalizedNodeRpcData(GET_TOP_OUTPUT, dom);
+        final DataObject bindingDeserialized = codecContext.fromNormalizedNodeRpcData(GET_TOP_OUTPUT, dom);
         assertEquals(bindingOriginal, bindingDeserialized);
     }
 }
index 72419db462ee098ff439e7e54ffee98d68c9e8c4..65d64527108b98963fc30b80426a90abd7fc3114 100644 (file)
@@ -22,7 +22,7 @@ public class TopLevelContainerViaUsesTest extends AbstractBindingCodecTest {
 
     @Test
     public void testBindingToDomFirst() {
-        final YangInstanceIdentifier yangII = registry.toYangInstanceIdentifier(TOP_LEVEL_CONTAINER_FROM_USES);
+        final YangInstanceIdentifier yangII = codecContext.toYangInstanceIdentifier(TOP_LEVEL_CONTAINER_FROM_USES);
         final PathArgument lastArg = yangII.getLastPathArgument();
         assertEquals(ContainerTop.QNAME, lastArg.getNodeType());
     }
@@ -31,7 +31,7 @@ public class TopLevelContainerViaUsesTest extends AbstractBindingCodecTest {
     @Test
     public void testDomToBindingFirst() {
         final YangInstanceIdentifier yangII = YangInstanceIdentifier.of(ContainerTop.QNAME);
-        InstanceIdentifier<?> bindingII = registry.fromYangInstanceIdentifier(yangII);
+        InstanceIdentifier<?> bindingII = codecContext.fromYangInstanceIdentifier(yangII);
         assertEquals(TOP_LEVEL_CONTAINER_FROM_USES, bindingII);
     }
 
index 9b80692ad0b4d4b020cc81c2c1c464da69e999be..fb4946a24dcabbd99d0edf6c5b0930d378d2649c 100644 (file)
@@ -39,9 +39,9 @@ public class TypedefTest extends AbstractBindingCodecTest {
                 .setAction3(true)
                 .build();
         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom =
-                registry.toNormalizedNode(BA_DEFAULT_POLICY, binding);
+                codecContext.toNormalizedNode(BA_DEFAULT_POLICY, binding);
         final Entry<InstanceIdentifier<?>, DataObject> readed =
-                registry.fromNormalizedNode(dom.getKey(),dom.getValue());
+                codecContext.fromNormalizedNode(dom.getKey(),dom.getValue());
 
         assertEquals(binding,readed.getValue());
 
@@ -55,9 +55,9 @@ public class TypedefTest extends AbstractBindingCodecTest {
                 .setEmptyLeaf3(Empty.getInstance())
                 .build();
         final Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> dom =
-                registry.toNormalizedNode(BA_TEST_CONT, binding);
+                codecContext.toNormalizedNode(BA_TEST_CONT, binding);
         final Entry<InstanceIdentifier<?>, DataObject> readed =
-                registry.fromNormalizedNode(dom.getKey(),dom.getValue());
+                codecContext.fromNormalizedNode(dom.getKey(),dom.getValue());
 
         assertEquals(binding,readed.getValue());
 
index 5682517aa54da2705edee50179a4d159ca73e75d..cbb7a42d1820aed047c9d12148a031932283bf50 100644 (file)
@@ -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.codec.impl;
 
 import static org.junit.Assert.assertEquals;
@@ -26,28 +25,27 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
 
 public class UnionTypeTest extends AbstractBindingCodecTest {
-
     private static final String TEST_STRING = "testtesttest";
-
-    public static final QName WRAPPER_QNAME = QName.create("urn:opendaylight:params:xml:ns:yang:yangtools:test:union",
+    private static final QName WRAPPER_QNAME = QName.create("urn:opendaylight:params:xml:ns:yang:yangtools:test:union",
         "2015-01-21", "wrapper");
-    public static final QName WRAP_LEAF_QNAME = QName.create(WRAPPER_QNAME, "wrap");
+    private static final QName WRAP_LEAF_QNAME = QName.create(WRAPPER_QNAME, "wrap");
 
     @Test
     public void unionTest() {
         TopLevel topLevel = TopLevelBuilder.getDefaultInstance(TEST_STRING);
         Wrapper wrapper = new WrapperBuilder().setWrap(topLevel).build();
-        NormalizedNode<?, ?> topLevelEntry = registry.toNormalizedNode(InstanceIdentifier.create(Wrapper.class),
+        NormalizedNode<?, ?> topLevelEntry = codecContext.toNormalizedNode(InstanceIdentifier.create(Wrapper.class),
             wrapper).getValue();
 
         ContainerNode containerNode = ImmutableContainerNodeBuilder.create()
-                .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(WRAPPER_QNAME))
+                .withNodeIdentifier(new NodeIdentifier(WRAPPER_QNAME))
                 .withChild(ImmutableNodes.leafNode(WRAP_LEAF_QNAME, TEST_STRING))
                 .build();
         Assert.assertEquals(topLevelEntry, containerNode);
@@ -57,10 +55,10 @@ public class UnionTypeTest extends AbstractBindingCodecTest {
     public void bug5446Test() {
         IpAddressBinary ipAddress = IpAddressBinaryBuilder.getDefaultInstance("fwAAAQ==");
         Root root = new RootBuilder().setIpAddress(ipAddress).build();
-        NormalizedNode<?, ?> rootNode = registry.toNormalizedNode(InstanceIdentifier.builder(Root.class).build(), root)
+        NormalizedNode<?, ?> rootNode = codecContext.toNormalizedNode(InstanceIdentifier.create(Root.class), root)
                 .getValue();
 
-        Entry<InstanceIdentifier<?>, DataObject> rootEntry = registry.fromNormalizedNode(
+        Entry<InstanceIdentifier<?>, DataObject> rootEntry = codecContext.fromNormalizedNode(
                 YangInstanceIdentifier.of(rootNode.getNodeType()), rootNode);
 
         DataObject rootObj = rootEntry.getValue();
index 85afc722f05775cb81b624d97dfe71af59f9119f..44c5bb78111cf0bfd2a9bb3440f9112060962352 100644 (file)
@@ -34,11 +34,11 @@ public class UnionTypeWithIdentityrefTest extends AbstractBindingCodecTest {
     private DataObject createValueNode(final String valueString) {
         UnionType unionType = UnionTypeBuilder.getDefaultInstance(valueString);
         UnionNode unionNode = new UnionNodeBuilder().setValue(unionType).build();
-        NormalizedNode<?, ?> normalizedUnionNode = registry
+        NormalizedNode<?, ?> normalizedUnionNode = codecContext
             .toNormalizedNode(InstanceIdentifier.builder(UnionNode.class).build(), unionNode)
             .getValue();
 
-        Entry<InstanceIdentifier<?>, DataObject> unionNodeEntry = registry.fromNormalizedNode(
+        Entry<InstanceIdentifier<?>, DataObject> unionNodeEntry = codecContext.fromNormalizedNode(
                 YangInstanceIdentifier.of(normalizedUnionNode.getNodeType()), normalizedUnionNode);
         DataObject unionNodeObj = unionNodeEntry.getValue();
         assertTrue(unionNodeObj instanceof UnionNode);
index b2c80284261bc30769438b58ff8bff3b99dda813..3c696b122f0e6abab4aa9b6283883b37ea262ffe 100644 (file)
@@ -11,7 +11,7 @@ import static java.util.Objects.requireNonNull;
 
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
 import org.opendaylight.mdsal.eos.binding.api.Entity;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListener;
@@ -29,12 +29,12 @@ import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService;
  */
 public class BindingDOMEntityOwnershipServiceAdapter implements EntityOwnershipService, AutoCloseable {
     private final @NonNull DOMEntityOwnershipService domService;
-    private final @NonNull BindingNormalizedNodeSerializer conversionCodec;
+    private final @NonNull AdapterContext adapterContext;
 
     public BindingDOMEntityOwnershipServiceAdapter(final @NonNull DOMEntityOwnershipService domService,
-            @NonNull final BindingNormalizedNodeSerializer conversionCodec) {
+            final @NonNull AdapterContext adapterContext) {
         this.domService = requireNonNull(domService);
-        this.conversionCodec = requireNonNull(conversionCodec);
+        this.adapterContext = requireNonNull(adapterContext);
     }
 
     @Override
@@ -48,7 +48,7 @@ public class BindingDOMEntityOwnershipServiceAdapter implements EntityOwnershipS
     public EntityOwnershipListenerRegistration registerListener(final String entityType,
             final EntityOwnershipListener listener) {
         return new BindingEntityOwnershipListenerRegistration(entityType, listener,
-            domService.registerListener(entityType, new DOMEntityOwnershipListenerAdapter(listener, conversionCodec)));
+            domService.registerListener(entityType, new DOMEntityOwnershipListenerAdapter(listener, adapterContext)));
     }
 
     @Override
@@ -62,7 +62,8 @@ public class BindingDOMEntityOwnershipServiceAdapter implements EntityOwnershipS
     }
 
     private @NonNull DOMEntity toDOMEntity(final Entity entity) {
-        return new DOMEntity(entity.getType(), conversionCodec.toYangInstanceIdentifier(entity.getIdentifier()));
+        return new DOMEntity(entity.getType(),
+            adapterContext.currentSerializer().toYangInstanceIdentifier(entity.getIdentifier()));
     }
 
     @Override
index f04365ddbfa8d012d756b69edb93eb7552d44a6e..f07df4ce71a5cd5b07c435829eb4a30467c1bfe0 100644 (file)
@@ -11,7 +11,7 @@ import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
+import org.opendaylight.mdsal.binding.dom.adapter.AdapterContext;
 import org.opendaylight.mdsal.eos.binding.api.Entity;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipChange;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListener;
@@ -28,16 +28,16 @@ import org.slf4j.LoggerFactory;
  *
  * @author Thomas Pantelis
  */
-class DOMEntityOwnershipListenerAdapter implements DOMEntityOwnershipListener {
+final class DOMEntityOwnershipListenerAdapter implements DOMEntityOwnershipListener {
     private static final Logger LOG = LoggerFactory.getLogger(DOMEntityOwnershipListenerAdapter.class);
 
-    private final BindingNormalizedNodeSerializer conversionCodec;
     private final EntityOwnershipListener bindingListener;
+    private final AdapterContext adapterContext;
 
     DOMEntityOwnershipListenerAdapter(final EntityOwnershipListener bindingListener,
-            final BindingNormalizedNodeSerializer conversionCodec) {
+            final AdapterContext adapterContext) {
         this.bindingListener = requireNonNull(bindingListener);
-        this.conversionCodec = requireNonNull(conversionCodec);
+        this.adapterContext = requireNonNull(adapterContext);
     }
 
     @Override
@@ -48,7 +48,7 @@ class DOMEntityOwnershipListenerAdapter implements DOMEntityOwnershipListener {
         final YangInstanceIdentifier domId = domEntity.getIdentifier();
         final InstanceIdentifier<?> bindingId;
         try {
-            bindingId = verifyNotNull(conversionCodec.fromYangInstanceIdentifier(domId));
+            bindingId = verifyNotNull(adapterContext.currentSerializer().fromYangInstanceIdentifier(domId));
         } catch (RuntimeException e) {
             LOG.error("Error converting DOM entity ID {} to binding InstanceIdentifier", domId, e);
             return;
index 0973a4124475d0d781add48a02f2d9ee011abd4e..bb1937be00f671b63f392c9e9f9ff917e672e197 100644 (file)
@@ -6,7 +6,7 @@
 
   <reference id="domEntityOwnershipService" interface="org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService"/>
 
-  <reference id="conversionCodec" interface="org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer"/>
+  <reference id="conversionCodec" interface="org.opendaylight.mdsal.binding.dom.adapter.AdapterContext"/>
 
   <bean id="bindingEntityOwnershipService" class="org.opendaylight.mdsal.eos.binding.dom.adapter.BindingDOMEntityOwnershipServiceAdapter"
           destroy-method="close">
index a01a53e12411b0500d40180f9172cc85a808b876..26379e6213e9730f663a08f4f9680bdad8c97301 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.mdsal.eos.binding.dom.adapter;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -20,13 +21,12 @@ import static org.mockito.Mockito.verify;
 import java.util.Optional;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 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.mockito.junit.MockitoJUnitRunner;
+import org.opendaylight.mdsal.binding.dom.adapter.ConstantAdapterContext;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.eos.binding.api.Entity;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipCandidateRegistration;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipChange;
@@ -47,12 +47,13 @@ import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService;
  *
  * @author Thomas Pantelis
  */
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class BindingDOMEntityOwnershipServiceAdapterTest {
     static Entity BINDING_ENTITY = new Entity("foo", "bar");
     static DOMEntity DOM_ENTITY = new DOMEntity("foo", "bar");
 
     @Mock
-    private BindingNormalizedNodeCodecRegistry mockCodecRegistry;
+    private BindingDOMCodecServices mockCodecRegistry;
 
     @Mock
     private DOMEntityOwnershipService mockDOMService;
@@ -61,16 +62,13 @@ public class BindingDOMEntityOwnershipServiceAdapterTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
-
-        doReturn(DOM_ENTITY.getIdentifier()).when(this.mockCodecRegistry).toYangInstanceIdentifier(
+        doReturn(DOM_ENTITY.getIdentifier()).when(mockCodecRegistry).toYangInstanceIdentifier(
                 BINDING_ENTITY.getIdentifier());
-        doReturn(BINDING_ENTITY.getIdentifier()).when(this.mockCodecRegistry).fromYangInstanceIdentifier(
+        doReturn(BINDING_ENTITY.getIdentifier()).when(mockCodecRegistry).fromYangInstanceIdentifier(
                 DOM_ENTITY.getIdentifier());
 
-        this.adapter = new BindingDOMEntityOwnershipServiceAdapter(this.mockDOMService,
-                new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(),
-                    GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), mockCodecRegistry));
+        this.adapter = new BindingDOMEntityOwnershipServiceAdapter(mockDOMService,
+            new ConstantAdapterContext(mockCodecRegistry));
     }
 
     @Test
@@ -137,14 +135,13 @@ public class BindingDOMEntityOwnershipServiceAdapterTest {
         assertEquals("isCandidateRegistered", true, this.adapter.isCandidateRegistered(BINDING_ENTITY));
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void testOwnershipChangeWithException() throws Exception {
+    public void testOwnershipChangeWithException() {
         final DOMEntityOwnershipListenerAdapter domEntityOwnershipListenerAdapter =
                 new DOMEntityOwnershipListenerAdapter(mock(EntityOwnershipListener.class),
-                        new BindingToNormalizedNodeCodec(new DefaultBindingRuntimeGenerator(),
-                            GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), mockCodecRegistry));
+                    new ConstantAdapterContext(mockCodecRegistry));
         final DOMEntityOwnershipChange domOwnershipChange = mock(DOMEntityOwnershipChange.class);
         doThrow(IllegalStateException.class).when(domOwnershipChange).getEntity();
-        domEntityOwnershipListenerAdapter.ownershipChanged(domOwnershipChange);
+        assertThrows(IllegalStateException.class,
+            () -> domEntityOwnershipListenerAdapter.ownershipChanged(domOwnershipChange));
     }
 }