Rework BindingCodecTreeNode 38/81538/8
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 10 Apr 2019 15:44:43 +0000 (17:44 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 11 Apr 2019 00:04:37 +0000 (02:04 +0200)
There is a strong tie-in between NodeCodecContext and
BindingCodecTreeNode, where the latter has massive oversubscription
of context.

This patch separates the semantics out, so that we end up with
cleaner interfaces and proper decomposition of concerns, so that
further binding concepts can be handled by the codec infrastructure.

This is a preparatory patch for both TypedObject caching and
Annotation/OpaqueObject translation.

JIRA: MDSAL-10
JIRA: MDSAL-285
JIRA: MDSAL-407
Change-Id: Ibc8d155b8a91b6081cd0eecd5d25fae56cb4699a
Signed-off-by: Jie Han <han.jie@zte.com.cn>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
25 files changed:
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataObjectModification.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazyDataTreeModification.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/LazyDataTreeModificationTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5524augmentUses.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/test/Bug5845booleanKeyTest.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTree.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingCodecTreeNode.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingDataObjectCodecTreeNode.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingNormalizedNodeCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingObjectCodecTreeNode.java [new file with mode: 0644]
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingNormalizedNodeCodecRegistry.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingToNormalizedStreamWriter.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecPrototype.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/InstanceIdentifierCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LeafNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeContextSupplier.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueContext.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/CachingCodecTest.java

index e99ce6094501ab97843e03e7434ee7977c3e3b81..cfda3a31d73c6f73899ad9c1af55d0e9c97e9faa 100644 (file)
@@ -33,6 +33,7 @@ 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.BindingCodecTreeNode;
 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.BindingCodecTreeNode;
+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.gen.impl.StreamWriterGenerator;
 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.gen.impl.StreamWriterGenerator;
@@ -400,7 +401,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory,
         return codecRegistry.create(context, bindingClasses);
     }
 
         return codecRegistry.create(context, bindingClasses);
     }
 
-    protected @NonNull Entry<InstanceIdentifier<?>, BindingCodecTreeNode<?>> getSubtreeCodec(
+    protected @NonNull Entry<InstanceIdentifier<?>, BindingDataObjectCodecTreeNode<?>> getSubtreeCodec(
             final YangInstanceIdentifier domIdentifier) {
 
         final BindingCodecTree currentCodecTree = codecRegistry.getCodecContext();
             final YangInstanceIdentifier domIdentifier) {
 
         final BindingCodecTree currentCodecTree = codecRegistry.getCodecContext();
@@ -410,7 +411,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory,
          * If we are able to deserialize YANG instance identifier, getSubtreeCodec must
          * return non-null value.
          */
          * If we are able to deserialize YANG instance identifier, getSubtreeCodec must
          * return non-null value.
          */
-        final BindingCodecTreeNode<?> codecContext = currentCodecTree.getSubtreeCodec(bindingPath);
+        final BindingDataObjectCodecTreeNode<?> codecContext = currentCodecTree.getSubtreeCodec(bindingPath);
         return new SimpleEntry<>(bindingPath, codecContext);
     }
 
         return new SimpleEntry<>(bindingPath, codecContext);
     }
 
@@ -458,7 +459,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory,
      */
     @Deprecated
     public NormalizedNode<?, ?> getDefaultNodeFor(final YangInstanceIdentifier parentMapPath) {
      */
     @Deprecated
     public NormalizedNode<?, ?> getDefaultNodeFor(final YangInstanceIdentifier parentMapPath) {
-        final BindingCodecTreeNode<?> mapCodec = requireNonNull(
+        final BindingCodecTreeNode mapCodec = requireNonNull(
                 codecRegistry.getCodecContext().getSubtreeCodec(parentMapPath),
                 "Codec not found for yang instance identifier: " + parentMapPath);
         final WithStatus schema = mapCodec.getSchema();
                 codecRegistry.getCodecContext().getSubtreeCodec(parentMapPath),
                 "Codec not found for yang instance identifier: " + parentMapPath);
         final WithStatus schema = mapCodec.getSchema();
index 66f7548d924b90c028b8bdc3abfad705b2afcdd8..e727e3c52903afdabf3d58e53d6909348790e19b 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
  */
 package org.opendaylight.mdsal.binding.dom.adapter;
 
+import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 import static org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType.UNMODIFIED;
 
 import static java.util.Objects.requireNonNull;
 import static org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType.UNMODIFIED;
 
@@ -20,6 +21,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
 import java.util.stream.Stream;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.ChoiceIn;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.ChoiceIn;
@@ -49,33 +51,36 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
 
     private static final Logger LOG = LoggerFactory.getLogger(LazyDataObjectModification.class);
 
 
     private static final Logger LOG = LoggerFactory.getLogger(LazyDataObjectModification.class);
 
-    private final BindingCodecTreeNode<T> codec;
+    private final BindingDataObjectCodecTreeNode<T> codec;
     private final DataTreeCandidateNode domData;
     private final PathArgument identifier;
 
     private volatile Collection<LazyDataObjectModification<? extends DataObject>> childNodesCache;
     private volatile ModificationType modificationType;
 
     private final DataTreeCandidateNode domData;
     private final PathArgument identifier;
 
     private volatile Collection<LazyDataObjectModification<? extends DataObject>> childNodesCache;
     private volatile ModificationType modificationType;
 
-    private LazyDataObjectModification(final BindingCodecTreeNode<T> codec, final DataTreeCandidateNode domData) {
+    private LazyDataObjectModification(final BindingDataObjectCodecTreeNode<T> codec,
+            final DataTreeCandidateNode domData) {
         this.codec = requireNonNull(codec);
         this.domData = requireNonNull(domData);
         this.identifier = codec.deserializePathArgument(domData.getIdentifier());
     }
 
         this.codec = requireNonNull(codec);
         this.domData = requireNonNull(domData);
         this.identifier = codec.deserializePathArgument(domData.getIdentifier());
     }
 
-    static <T extends DataObject> LazyDataObjectModification<T> create(final BindingCodecTreeNode<T> codec,
+    static <T extends DataObject> LazyDataObjectModification<T> create(final BindingDataObjectCodecTreeNode<T> codec,
             final DataTreeCandidateNode domData) {
         return new LazyDataObjectModification<>(codec, domData);
     }
 
             final DataTreeCandidateNode domData) {
         return new LazyDataObjectModification<>(codec, domData);
     }
 
-    private static Collection<LazyDataObjectModification<? extends DataObject>> from(final BindingCodecTreeNode<?>
-            parentCodec, final Collection<DataTreeCandidateNode> domChildNodes) {
+    private static Collection<LazyDataObjectModification<? extends DataObject>> from(
+            final BindingDataObjectCodecTreeNode<?> parentCodec,
+            final Collection<DataTreeCandidateNode> domChildNodes) {
         final List<LazyDataObjectModification<? extends DataObject>> result = new ArrayList<>(domChildNodes.size());
         populateList(result, parentCodec, domChildNodes);
         return result;
     }
 
     private static void populateList(final List<LazyDataObjectModification<? extends DataObject>> result,
         final List<LazyDataObjectModification<? extends DataObject>> result = new ArrayList<>(domChildNodes.size());
         populateList(result, parentCodec, domChildNodes);
         return result;
     }
 
     private static void populateList(final List<LazyDataObjectModification<? extends DataObject>> result,
-            final BindingCodecTreeNode<?> parentCodec, final Collection<DataTreeCandidateNode> domChildNodes) {
+            final BindingDataObjectCodecTreeNode<?> parentCodec,
+            final Collection<DataTreeCandidateNode> domChildNodes) {
         for (final DataTreeCandidateNode domChildNode : domChildNodes) {
             if (domChildNode.getModificationType() != UNMODIFIED) {
                 final BindingStructuralType type = BindingStructuralType.from(domChildNode);
         for (final DataTreeCandidateNode domChildNode : domChildNodes) {
             if (domChildNode.getModificationType() != UNMODIFIED) {
                 final BindingStructuralType type = BindingStructuralType.from(domChildNode);
@@ -86,9 +91,11 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
                      *  debug log.
                      */
                     try {
                      *  debug log.
                      */
                     try {
-                        final BindingCodecTreeNode<?> childCodec =
-                                parentCodec.yangPathArgumentChild(domChildNode.getIdentifier());
-                        populateList(result, type, childCodec, domChildNode);
+                        final BindingCodecTreeNode childCodec = parentCodec.yangPathArgumentChild(
+                            domChildNode.getIdentifier());
+                        verify(childCodec instanceof BindingDataObjectCodecTreeNode, "Unhandled codec %s for type %s",
+                            childCodec, type);
+                        populateList(result, type, (BindingDataObjectCodecTreeNode<?>) childCodec, domChildNode);
                     } catch (final IllegalArgumentException e) {
                         if (type == BindingStructuralType.UNKNOWN) {
                             LOG.debug("Unable to deserialize unknown DOM node {}", domChildNode, e);
                     } catch (final IllegalArgumentException e) {
                         if (type == BindingStructuralType.UNKNOWN) {
                             LOG.debug("Unable to deserialize unknown DOM node {}", domChildNode, e);
@@ -102,7 +109,7 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
     }
 
     private static void populateList(final List<LazyDataObjectModification<? extends DataObject>> result,
     }
 
     private static void populateList(final List<LazyDataObjectModification<? extends DataObject>> result,
-            final BindingStructuralType type, final BindingCodecTreeNode<?> childCodec,
+            final BindingStructuralType type, final BindingDataObjectCodecTreeNode<?> childCodec,
             final DataTreeCandidateNode domChildNode) {
         switch (type) {
             case INVISIBLE_LIST:
             final DataTreeCandidateNode domChildNode) {
         switch (type) {
             case INVISIBLE_LIST:
@@ -121,7 +128,7 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
     }
 
     private static void populateListWithSingleCodec(final List<LazyDataObjectModification<? extends DataObject>> result,
     }
 
     private static void populateListWithSingleCodec(final List<LazyDataObjectModification<? extends DataObject>> result,
-            final BindingCodecTreeNode<?> codec, final Collection<DataTreeCandidateNode> childNodes) {
+            final BindingDataObjectCodecTreeNode<?> codec, final Collection<DataTreeCandidateNode> childNodes) {
         for (final DataTreeCandidateNode child : childNodes) {
             if (child.getModificationType() != UNMODIFIED) {
                 result.add(create(codec, child));
         for (final DataTreeCandidateNode child : childNodes) {
             if (child.getModificationType() != UNMODIFIED) {
                 result.add(create(codec, child));
@@ -240,7 +247,7 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
     @Override
     public DataObjectModification<? extends DataObject> getModifiedChild(final PathArgument arg) {
         final List<YangInstanceIdentifier.PathArgument> domArgumentList = new ArrayList<>();
     @Override
     public DataObjectModification<? extends DataObject> getModifiedChild(final PathArgument arg) {
         final List<YangInstanceIdentifier.PathArgument> domArgumentList = new ArrayList<>();
-        final BindingCodecTreeNode<?> childCodec = codec.bindingPathArgumentChild(arg, domArgumentList);
+        final BindingDataObjectCodecTreeNode<?> childCodec = codec.bindingPathArgumentChild(arg, domArgumentList);
         final Iterator<YangInstanceIdentifier.PathArgument> toEnter = domArgumentList.iterator();
         DataTreeCandidateNode current = domData;
         while (toEnter.hasNext() && current != null) {
         final Iterator<YangInstanceIdentifier.PathArgument> toEnter = domArgumentList.iterator();
         DataTreeCandidateNode current = domData;
         while (toEnter.hasNext() && current != null) {
index 63644dfc3fbb6fbc924c986bee887ccda248a0b4..82c99140e559a2f41b7a3a2c5b134d2d933e60f0 100644 (file)
@@ -18,7 +18,7 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
+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.yangtools.yang.binding.DataObject;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeCandidate;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -44,7 +44,7 @@ final class LazyDataTreeModification<T extends DataObject> implements DataTreeMo
     @SuppressWarnings({"unchecked", "rawtypes"})
     static <T extends DataObject> DataTreeModification<T> create(final BindingToNormalizedNodeCodec codec,
             final DataTreeCandidate domChange, final LogicalDatastoreType datastoreType) {
     @SuppressWarnings({"unchecked", "rawtypes"})
     static <T extends DataObject> DataTreeModification<T> create(final BindingToNormalizedNodeCodec codec,
             final DataTreeCandidate domChange, final LogicalDatastoreType datastoreType) {
-        final Entry<InstanceIdentifier<?>, BindingCodecTreeNode<?>> codecCtx = codec.getSubtreeCodec(
+        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.getRootPath());
         final DataTreeIdentifier<?> path = DataTreeIdentifier.create(datastoreType, codecCtx.getKey());
         final DataObjectModification<?> modification = LazyDataObjectModification.create(codecCtx.getValue(),
@@ -55,7 +55,7 @@ final class LazyDataTreeModification<T extends DataObject> implements DataTreeMo
     @SuppressWarnings({"unchecked", "rawtypes"})
     static <T extends DataObject> DataTreeModification<T> create(final BindingToNormalizedNodeCodec codec,
             final DOMDataTreeCandidate candidate) {
     @SuppressWarnings({"unchecked", "rawtypes"})
     static <T extends DataObject> DataTreeModification<T> create(final BindingToNormalizedNodeCodec codec,
             final DOMDataTreeCandidate candidate) {
-        final Entry<InstanceIdentifier<?>, BindingCodecTreeNode<?>> codecCtx = codec.getSubtreeCodec(
+        final Entry<InstanceIdentifier<?>, BindingDataObjectCodecTreeNode<?>> codecCtx = codec.getSubtreeCodec(
             candidate.getRootPath().getRootIdentifier());
         final DataTreeIdentifier<?> path = DataTreeIdentifier.create(candidate.getRootPath().getDatastoreType(),
             codecCtx.getKey());
             candidate.getRootPath().getRootIdentifier());
         final DataTreeIdentifier<?> path = DataTreeIdentifier.create(candidate.getRootPath().getDatastoreType(),
             codecCtx.getKey());
index b06b6eaed495ceebefaeae4a54078df0f9cdd24d..8620e2644ce8588c28eec6fb06ffa16564969959 100644 (file)
@@ -21,7 +21,7 @@ import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.opendaylight.mdsal.binding.api.DataTreeCommitCohort;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.mockito.ArgumentCaptor;
 import org.opendaylight.mdsal.binding.api.DataTreeCommitCohort;
 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.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -51,7 +51,7 @@ public class BindingDOMDataTreeCommitCohortAdapterTest {
                 new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.EMPTY);
         doReturn(InstanceIdentifier.create(DataObject.class)).when(registry).fromYangInstanceIdentifier(any());
         final BindingCodecTree bindingCodecTree = mock(BindingCodecTree.class);
                 new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.EMPTY);
         doReturn(InstanceIdentifier.create(DataObject.class)).when(registry).fromYangInstanceIdentifier(any());
         final BindingCodecTree bindingCodecTree = mock(BindingCodecTree.class);
-        final BindingCodecTreeNode<?> bindingCodecTreeNode = mock(BindingCodecTreeNode.class);
+        final BindingDataObjectCodecTreeNode<?> bindingCodecTreeNode = mock(BindingDataObjectCodecTreeNode.class);
         doReturn(bindingCodecTreeNode).when(bindingCodecTree).getSubtreeCodec(any(InstanceIdentifier.class));
         doReturn(bindingCodecTree).when(registry).getCodecContext();
         doReturn(domDataTreeIdentifier).when(domDataTreeCandidate).getRootPath();
         doReturn(bindingCodecTreeNode).when(bindingCodecTree).getSubtreeCodec(any(InstanceIdentifier.class));
         doReturn(bindingCodecTree).when(registry).getCodecContext();
         doReturn(domDataTreeIdentifier).when(domDataTreeCandidate).getRootPath();
index bfd19a9f4ce3ed3f42141aef5e1be24f4f7a3cea..9c229d6db838f8e0468cdae4746f51c7b4a5b142 100644 (file)
@@ -14,7 +14,7 @@ import static org.mockito.Mockito.mock;
 
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 
 import org.junit.Test;
 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.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -37,7 +37,7 @@ public class LazyDataTreeModificationTest {
                 new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.EMPTY);
         doReturn(InstanceIdentifier.create(DataObject.class)).when(registry).fromYangInstanceIdentifier(any());
         final BindingCodecTree bindingCodecTree = mock(BindingCodecTree.class);
                 new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.EMPTY);
         doReturn(InstanceIdentifier.create(DataObject.class)).when(registry).fromYangInstanceIdentifier(any());
         final BindingCodecTree bindingCodecTree = mock(BindingCodecTree.class);
-        final BindingCodecTreeNode bindingCodecTreeNode = mock(BindingCodecTreeNode.class);
+        final BindingDataObjectCodecTreeNode<?> bindingCodecTreeNode = mock(BindingDataObjectCodecTreeNode.class);
         doReturn(bindingCodecTreeNode).when(bindingCodecTree).getSubtreeCodec(any(InstanceIdentifier.class));
         doReturn(bindingCodecTree).when(registry).getCodecContext();
         doReturn(domDataTreeIdentifier).when(domDataTreeCandidate).getRootPath();
         doReturn(bindingCodecTreeNode).when(bindingCodecTree).getSubtreeCodec(any(InstanceIdentifier.class));
         doReturn(bindingCodecTree).when(registry).getCodecContext();
         doReturn(domDataTreeIdentifier).when(domDataTreeCandidate).getRootPath();
index 623bbb4e3bb967035ea02cca482cac92e679d2c5..25e6390ad43d40b5c79335a27535e0c06aef6298 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
  */
  * 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;
 
 import static org.junit.Assert.assertNotNull;
 package org.opendaylight.mdsal.binding.dom.adapter.test;
 
 import static org.junit.Assert.assertNotNull;
@@ -15,7 +14,7 @@ import javassist.ClassPool;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
 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.gen.impl.StreamWriterGenerator;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.dom.codec.gen.impl.StreamWriterGenerator;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
@@ -79,7 +78,7 @@ public class Bug5524augmentUses extends AbstractDataBrokerTest {
                                         .build())).build())).build()).build();
 
         final BindingCodecTree codecContext = mappingService.getCodecFactory().getCodecContext();
                                         .build())).build())).build()).build();
 
         final BindingCodecTree codecContext = mappingService.getCodecFactory().getCodecContext();
-        final BindingCodecTreeNode<Module4Main> subtreeCodec = codecContext.getSubtreeCodec(
+        final BindingDataObjectCodecTreeNode<Module4Main> subtreeCodec = codecContext.getSubtreeCodec(
                 InstanceIdentifier.create(Module4Main.class));
         final NormalizedNode<?, ?> serialized = subtreeCodec.serialize(module4Main);
         final NormalizedNode<?, ?> manualSerialized = subtreeCodec.serialize(manualModule4Main);
                 InstanceIdentifier.create(Module4Main.class));
         final NormalizedNode<?, ?> serialized = subtreeCodec.serialize(module4Main);
         final NormalizedNode<?, ?> manualSerialized = subtreeCodec.serialize(manualModule4Main);
index a2c23f526147ea9fe3d257312a5469ab9be51a4f..62cd86c64e521f414245e82eaedd605b0912c4ff 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
  */
  * 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;
 
 import static org.junit.Assert.assertNotNull;
 package org.opendaylight.mdsal.binding.dom.adapter.test;
 
 import static org.junit.Assert.assertNotNull;
@@ -15,7 +14,7 @@ import javassist.ClassPool;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec;
 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.gen.impl.StreamWriterGenerator;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.dom.codec.gen.impl.StreamWriterGenerator;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
@@ -58,7 +57,7 @@ public class Bug5845booleanKeyTest extends AbstractDataBrokerTest {
                 .build();
 
         final BindingCodecTree codecContext = mappingService.getCodecFactory().getCodecContext();
                 .build();
 
         final BindingCodecTree codecContext = mappingService.getCodecFactory().getCodecContext();
-        final BindingCodecTreeNode<BooleanContainer> subtreeCodec = codecContext.getSubtreeCodec(
+        final BindingDataObjectCodecTreeNode<BooleanContainer> subtreeCodec = codecContext.getSubtreeCodec(
                 InstanceIdentifier.create(BooleanContainer.class));
         final NormalizedNode<?, ?> serializedInt = subtreeCodec.serialize(booleanContainerInt);
         assertNotNull(serializedInt);
                 InstanceIdentifier.create(BooleanContainer.class));
         final NormalizedNode<?, ?> serializedInt = subtreeCodec.serialize(booleanContainerInt);
         assertNotNull(serializedInt);
index 5ac2cbb83618b3d516eda3ca1534864860288210..8a9d7fd075fe64d798dd11aa2448e7490751e787 100644 (file)
@@ -21,9 +21,9 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 // TODO: Add more detailed documentation
 public interface BindingCodecTree {
 
 // TODO: Add more detailed documentation
 public interface BindingCodecTree {
 
-    @Nullable <T extends DataObject> BindingCodecTreeNode<T> getSubtreeCodec(InstanceIdentifier<T> path);
+    @Nullable <T extends DataObject> BindingDataObjectCodecTreeNode<T> getSubtreeCodec(InstanceIdentifier<T> path);
 
 
-    @Nullable BindingCodecTreeNode<?> getSubtreeCodec(YangInstanceIdentifier path);
+    @Nullable BindingCodecTreeNode getSubtreeCodec(YangInstanceIdentifier path);
 
 
-    @Nullable BindingCodecTreeNode<?> getSubtreeCodec(SchemaPath path);
+    @Nullable BindingCodecTreeNode getSubtreeCodec(SchemaPath path);
 }
 }
index ef330dab2981c9e9e0dd5ae15bdeac5ef00378cb..8c4bc32193b41edd294c489d2d386ee7d2149ae1 100644 (file)
 package org.opendaylight.mdsal.binding.dom.codec.api;
 
 import com.google.common.annotations.Beta;
 package org.opendaylight.mdsal.binding.dom.codec.api;
 
 import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableCollection;
-import java.util.List;
-import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 
 /**
  * Subtree codec specific to model subtree between Java Binding and NormalizedNode.
  */
 @Beta
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 
 /**
  * Subtree codec specific to model subtree between Java Binding and NormalizedNode.
  */
 @Beta
-public interface BindingCodecTreeNode<T extends DataObject> extends BindingNormalizedNodeCodec<T> {
-
-    /**
-     * Returns binding class of interface which represents API of current schema node. The result is same as invoking
-     * {@link DataObject#implementedInterface()} on instance of data.
-     *
-     * @return interface which defines API of binding representation of data.
-     */
-    @NonNull Class<T> getBindingClass();
-
-    /**
-     * Returns child context as if it was walked by {@link BindingStreamEventWriter}. This means that to enter case,
-     * one must issue getChild(ChoiceClass).getChild(CaseClass).
-     *
-     * @param childClass Child class by Biding Stream navigation
-     * @return Context of child
-     * @throws IllegalArgumentException
-     *             If supplied child class is not valid in specified context.
-     */
-    <E extends DataObject> @NonNull BindingCodecTreeNode<E> streamChild(@NonNull Class<E> childClass);
-
-    /**
-     * Returns child context as if it was walked by {@link BindingStreamEventWriter}. This means that to enter case,
-     * one must issue getChild(ChoiceClass).getChild(CaseClass).
-     *
-     * <p>
-     * This method differs from {@link #streamChild(Class)}, that is less strict for interfaces representing
-     * augmentation and cases, that may return {@link BindingCodecTreeNode} even if augmentation interface containing
-     * same data was supplied and does not represent augmentation of this node.
-     *
-     * @param childClass
-     * @return Context of child or Optional.empty is supplied class is not
-     *         applicable in context.
-     */
-    <E extends DataObject> Optional<? extends BindingCodecTreeNode<E>> possibleStreamChild(
-            @NonNull Class<E> childClass);
-
-    /**
-     * Returns nested node context using supplied YANG Instance Identifier.
-     *
-     * @param child
-     *            Yang Instance Identifier Argument
-     * @return Context of child
-     * @throws IllegalArgumentException
-     *             If supplied argument does not represent valid child.
-     */
-    @NonNull BindingCodecTreeNode<?> yangPathArgumentChild(YangInstanceIdentifier.@NonNull PathArgument child);
-
-    /**
-     * Returns nested node context using supplied Binding Instance Identifier and adds YANG instance identifiers to
-     * the supplied list.
-     *
-     * @param arg
-     *            Binding Instance Identifier Argument
-     * @param builder
-     *            Mutable instance of list, which is appended by YangInstanceIdentifiers
-     *            as tree is walked. Use null if such side-product is not needed.
-     * @return Context of child
-     * @throws IllegalArgumentException
-     *             If supplied argument does not represent valid child.
-     */
-    @NonNull BindingCodecTreeNode<?> bindingPathArgumentChild(InstanceIdentifier.@NonNull PathArgument arg,
-            @Nullable List<YangInstanceIdentifier.PathArgument> builder);
-
-    /**
-     * Returns codec which uses caches serialization / deserialization results.
-     *
-     * <p>
-     * Caching may introduce performance penalty to serialization / deserialization
-     * but may decrease use of heap for repetitive objects.
-     *
-     * @param cacheSpecifier Set of objects, for which cache may be in place
-     * @return Codec whihc uses cache for serialization / deserialization.
-     */
-    @NonNull BindingNormalizedNodeCachingCodec<T> createCachingCodec(
-            @NonNull ImmutableCollection<Class<? extends DataObject>> cacheSpecifier);
-
-    @Beta
-    void writeAsNormalizedNode(T data, NormalizedNodeStreamWriter writer);
-
-    /**
-     * Serializes path argument for current node.
-     *
-     * @param arg Binding Path Argument, may be null if Binding Instance Identifier does not have
-     *        representation for current node (e.g. choice or case).
-     * @return Yang Path Argument, may be null if Yang Instance Identifier does not have
-     *         representation for current node (e.g. case).
-     * @throws IllegalArgumentException If supplied {@code arg} is not valid.
-     */
-    @Beta
-    YangInstanceIdentifier.@Nullable PathArgument serializePathArgument(InstanceIdentifier.@Nullable PathArgument arg);
-
-    /**
-     * Deserializes path argument for current node.
-     *
-     * @param arg Yang Path Argument, may be null if Yang Instance Identifier does not have
-     *         representation for current node (e.g. case).
-     * @return Binding Path Argument, may be null if Binding Instance Identifier does not have
-     *        representation for current node (e.g. choice or case).
-     * @throws IllegalArgumentException If supplied {@code arg} is not valid.
-     */
-    @Beta
-    InstanceIdentifier.@Nullable PathArgument deserializePathArgument(
-            YangInstanceIdentifier.@Nullable PathArgument arg);
+public interface BindingCodecTreeNode {
 
     /**
      * Return the schema node associated with this node.
 
     /**
      * Return the schema node associated with this node.
@@ -135,33 +23,4 @@ public interface BindingCodecTreeNode<T extends DataObject> extends BindingNorma
      * @return A schema node.
      */
     @NonNull WithStatus getSchema();
      * @return A schema node.
      */
     @NonNull WithStatus getSchema();
-
-    /**
-     * Return a summary of addressability of potential children. Binding specification does not allow all DOM tree
-     * elements to be directly addressed, which means some recursive tree operations, like data tree changes do not
-     * have a one-to-one mapping from DOM to binding in all cases. This method provides an optimization hint to guide
-     * translation of data structures, allowing for fast paths when all children are known to either be addressable
-     * or non-addressable.
-     *
-     * @return Summary children addressability.
-     */
-    @NonNull ChildAddressabilitySummary getChildAddressabilitySummary();
-
-    /**
-     * Enumeration of possible addressability attribute of all children.
-     */
-    enum ChildAddressabilitySummary {
-        /**
-         * All children are addressable.
-         */
-        ADDRESSABLE,
-        /**
-         * All children are non-addressable, including the case when this node does not have any children.
-         */
-        UNADDRESSABLE,
-        /**
-         * Mixed children, some are addressable and some are not.
-         */
-        MIXED
-    }
 }
 }
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingDataObjectCodecTreeNode.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingDataObjectCodecTreeNode.java
new file mode 100644 (file)
index 0000000..870db5e
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2019 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.codec.api;
+
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableCollection;
+import java.util.List;
+import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
+
+@Beta
+public interface BindingDataObjectCodecTreeNode<T extends DataObject> extends BindingObjectCodecTreeNode<T>,
+        BindingNormalizedNodeCodec<T> {
+
+    /**
+     * Returns binding class of interface which represents API of current schema node. The result is same as invoking
+     * {@link DataObject#implementedInterface()} on instance of data.
+     *
+     * @return interface which defines API of binding representation of data.
+     */
+    @Override
+    @NonNull Class<T> getBindingClass();
+
+    /**
+     * Returns child context as if it was walked by {@link BindingStreamEventWriter}. This means that to enter case,
+     * one must issue getChild(ChoiceClass).getChild(CaseClass).
+     *
+     * @param childClass Child class by Biding Stream navigation
+     * @return Context of child
+     * @throws IllegalArgumentException
+     *             If supplied child class is not valid in specified context.
+     */
+    <E extends DataObject> @NonNull BindingDataObjectCodecTreeNode<E> streamChild(@NonNull Class<E> childClass);
+
+    /**
+     * Returns child context as if it was walked by {@link BindingStreamEventWriter}. This means that to enter case,
+     * one must issue getChild(ChoiceClass).getChild(CaseClass).
+     *
+     * <p>
+     * This method differs from {@link #streamChild(Class)}, that is less strict for interfaces representing
+     * augmentation and cases, that may return {@link BindingCodecTreeNode} even if augmentation interface containing
+     * same data was supplied and does not represent augmentation of this node.
+     *
+     * @param childClass
+     * @return Context of child or Optional.empty is supplied class is not
+     *         applicable in context.
+     */
+    <E extends DataObject> Optional<? extends BindingDataObjectCodecTreeNode<E>> possibleStreamChild(
+            @NonNull Class<E> childClass);
+
+    /**
+     * Returns nested node context using supplied YANG Instance Identifier.
+     *
+     * @param child
+     *            Yang Instance Identifier Argument
+     * @return Context of child
+     * @throws IllegalArgumentException
+     *             If supplied argument does not represent valid child.
+     */
+    @NonNull BindingCodecTreeNode yangPathArgumentChild(YangInstanceIdentifier.@NonNull PathArgument child);
+
+    /**
+     * Returns nested node context using supplied Binding Instance Identifier and adds YANG instance identifiers to
+     * the supplied list.
+     *
+     * @param arg
+     *            Binding Instance Identifier Argument
+     * @param builder
+     *            Mutable instance of list, which is appended by YangInstanceIdentifiers
+     *            as tree is walked. Use null if such side-product is not needed.
+     * @return Context of child
+     * @throws IllegalArgumentException
+     *             If supplied argument does not represent valid child.
+     */
+    @NonNull BindingDataObjectCodecTreeNode<?> bindingPathArgumentChild(InstanceIdentifier.@NonNull PathArgument arg,
+            @Nullable List<YangInstanceIdentifier.PathArgument> builder);
+
+    /**
+     * Serializes path argument for current node.
+     *
+     * @param arg Binding Path Argument, may be null if Binding Instance Identifier does not have
+     *        representation for current node (e.g. choice or case).
+     * @return Yang Path Argument, may be null if Yang Instance Identifier does not have
+     *         representation for current node (e.g. case).
+     * @throws IllegalArgumentException If supplied {@code arg} is not valid.
+     */
+    @Beta
+    YangInstanceIdentifier.@Nullable PathArgument serializePathArgument(InstanceIdentifier.@Nullable PathArgument arg);
+
+    /**
+     * Deserializes path argument for current node.
+     *
+     * @param arg Yang Path Argument, may be null if Yang Instance Identifier does not have
+     *         representation for current node (e.g. case).
+     * @return Binding Path Argument, may be null if Binding Instance Identifier does not have
+     *        representation for current node (e.g. choice or case).
+     * @throws IllegalArgumentException If supplied {@code arg} is not valid.
+     */
+    @Beta
+    InstanceIdentifier.@Nullable PathArgument deserializePathArgument(
+            YangInstanceIdentifier.@Nullable PathArgument arg);
+
+
+    /**
+     * Return a summary of addressability of potential children. Binding specification does not allow all DOM tree
+     * elements to be directly addressed, which means some recursive tree operations, like data tree changes do not
+     * have a one-to-one mapping from DOM to binding in all cases. This method provides an optimization hint to guide
+     * translation of data structures, allowing for fast paths when all children are known to either be addressable
+     * or non-addressable.
+     *
+     * @return Summary children addressability.
+     */
+    @NonNull ChildAddressabilitySummary getChildAddressabilitySummary();
+
+    /**
+     * Returns codec which uses caches serialization / deserialization results.
+     *
+     * <p>
+     * Caching may introduce performance penalty to serialization / deserialization
+     * but may decrease use of heap for repetitive objects.
+     *
+     * @param cacheSpecifier Set of objects, for which cache may be in place
+     * @return Codec which uses cache for serialization / deserialization.
+     */
+    @NonNull BindingNormalizedNodeCachingCodec<T> createCachingCodec(
+            @NonNull ImmutableCollection<Class<? extends DataObject>> cacheSpecifier);
+
+    @Beta
+    void writeAsNormalizedNode(T data, NormalizedNodeStreamWriter writer);
+
+    /**
+     * Enumeration of possible addressability attribute of all children.
+     */
+    enum ChildAddressabilitySummary {
+        /**
+         * All children are addressable.
+         */
+        ADDRESSABLE,
+        /**
+         * All children are non-addressable, including the case when this node does not have any children.
+         */
+        UNADDRESSABLE,
+        /**
+         * Mixed children, some are addressable and some are not.
+         */
+        MIXED
+    }
+}
index ffb50d3e0b9fff4d35ca9d6b0156c7e67badc7d9..637893fc291629098ff3356fa6c9d02b7a09e08c 100644 (file)
@@ -13,21 +13,19 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
 /**
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
 /**
- * Codec providing serialization and deserializiation between Binding
- * and NormalizedNode representation of data.
+ * Codec providing serialization and deserializiation between Binding and NormalizedNode representation of data.
  *
  * @param <T> Binding representation of data
  */
 @Beta
 public interface BindingNormalizedNodeCodec<T extends DataObject> {
  *
  * @param <T> Binding representation of data
  */
 @Beta
 public interface BindingNormalizedNodeCodec<T extends DataObject> {
-
     /**
      * Converts from Normalized Node to Binding representation of data.
      *
      * @param data Normalized Node representation of data
      * @return Binding representation of data
      */
     /**
      * Converts from Normalized Node to Binding representation of data.
      *
      * @param data Normalized Node representation of data
      * @return Binding representation of data
      */
-    @NonNull T deserialize(@NonNull NormalizedNode<?,?> data);
+    @NonNull T deserialize(@NonNull NormalizedNode<?, ?> data);
 
     /**
      * Converts from  Binding to Normalized Node representation of data.
 
     /**
      * Converts from  Binding to Normalized Node representation of data.
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingObjectCodecTreeNode.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingObjectCodecTreeNode.java
new file mode 100644 (file)
index 0000000..b19ed11
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2019 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.codec.api;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.binding.BindingObject;
+
+@Beta
+public interface BindingObjectCodecTreeNode<T extends BindingObject> extends BindingCodecTreeNode {
+    /**
+     * Returns binding class which represents API of current schema node.
+     *
+     * @return interface which defines API of binding representation of data.
+     */
+    @NonNull Class<T> getBindingClass();
+}
index 777b0bcdde3c0c86dd5a1ee530d272c31b9991d5..ea35425667392a804097808ab721812a7be7d002 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 
 import static com.google.common.base.Preconditions.checkArgument;
 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.collect.ImmutableMap;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.ImmutableMap;
@@ -28,6 +29,7 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
 import org.eclipse.jdt.annotation.Nullable;
 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.impl.NodeCodecContext.CodecContextFactory;
 import org.opendaylight.mdsal.binding.dom.codec.util.BindingSchemaMapping;
 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory;
 import org.opendaylight.mdsal.binding.dom.codec.util.BindingSchemaMapping;
 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
@@ -144,16 +146,16 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
      *         binding representation (choice, case, leaf).
      *
      */
      *         binding representation (choice, case, leaf).
      *
      */
-    @Nullable NodeCodecContext<?> getCodecContextNode(final @NonNull YangInstanceIdentifier dom,
+    @Nullable BindingDataObjectCodecTreeNode<?> getCodecContextNode(final @NonNull YangInstanceIdentifier dom,
             final @Nullable Collection<InstanceIdentifier.PathArgument> bindingArguments) {
             final @Nullable Collection<InstanceIdentifier.PathArgument> bindingArguments) {
-        NodeCodecContext<?> currentNode = root;
+        NodeCodecContext currentNode = root;
         ListNodeCodecContext<?> currentList = null;
 
         for (final YangInstanceIdentifier.PathArgument domArg : dom.getPathArguments()) {
             checkArgument(currentNode instanceof DataContainerCodecContext,
                 "Unexpected child of non-container node %s", currentNode);
             final DataContainerCodecContext<?,?> previous = (DataContainerCodecContext<?, ?>) currentNode;
         ListNodeCodecContext<?> currentList = null;
 
         for (final YangInstanceIdentifier.PathArgument domArg : dom.getPathArguments()) {
             checkArgument(currentNode instanceof DataContainerCodecContext,
                 "Unexpected child of non-container node %s", currentNode);
             final DataContainerCodecContext<?,?> previous = (DataContainerCodecContext<?, ?>) currentNode;
-            final NodeCodecContext<?> nextNode = previous.yangPathArgumentChild(domArg);
+            final NodeCodecContext nextNode = previous.yangPathArgumentChild(domArg);
 
             /*
              * List representation in YANG Instance Identifier consists of two
 
             /*
              * List representation in YANG Instance Identifier consists of two
@@ -210,7 +212,12 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
             }
             return currentList;
         }
             }
             return currentList;
         }
-        return currentNode;
+        if (currentNode != null) {
+            verify(currentNode instanceof BindingDataObjectCodecTreeNode, "Illegal return node %s for identifier %s",
+                currentNode, dom);
+            return (BindingDataObjectCodecTreeNode<?>) currentNode;
+        }
+        return null;
     }
 
     NotificationCodecContext<?> getNotificationContext(final SchemaPath notification) {
     }
 
     NotificationCodecContext<?> getNotificationContext(final SchemaPath notification) {
@@ -226,7 +233,7 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
     }
 
     @Override
     }
 
     @Override
-    public ImmutableMap<String, LeafNodeCodecContext<?>> getLeafNodes(final Class<?> parentClass,
+    public ImmutableMap<String, LeafNodeCodecContext> getLeafNodes(final Class<?> parentClass,
             final DataNodeContainer childSchema) {
         final Map<String, DataSchemaNode> getterToLeafSchema = new HashMap<>();
         for (final DataSchemaNode leaf : childSchema.getChildNodes()) {
             final DataNodeContainer childSchema) {
         final Map<String, DataSchemaNode> getterToLeafSchema = new HashMap<>();
         for (final DataSchemaNode leaf : childSchema.getChildNodes()) {
@@ -237,12 +244,17 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
         return getLeafNodesUsingReflection(parentClass, getterToLeafSchema);
     }
 
         return getLeafNodesUsingReflection(parentClass, getterToLeafSchema);
     }
 
-    private ImmutableMap<String, LeafNodeCodecContext<?>> getLeafNodesUsingReflection(final Class<?> parentClass,
+    private ImmutableMap<String, LeafNodeCodecContext> getLeafNodesUsingReflection(final Class<?> parentClass,
             final Map<String, DataSchemaNode> getterToLeafSchema) {
             final Map<String, DataSchemaNode> getterToLeafSchema) {
-        final Map<String, LeafNodeCodecContext<?>> leaves = new HashMap<>();
+        final Map<String, LeafNodeCodecContext> leaves = new HashMap<>();
         for (final Method method : parentClass.getMethods()) {
             if (method.getParameterCount() == 0) {
                 final DataSchemaNode schema = getterToLeafSchema.get(method.getName());
         for (final Method method : parentClass.getMethods()) {
             if (method.getParameterCount() == 0) {
                 final DataSchemaNode schema = getterToLeafSchema.get(method.getName());
+                if (!(schema instanceof TypedDataSchemaNode)) {
+                    // We do not have schema for leaf, so we will ignore it (e.g. getClass).
+                    continue;
+                }
+                final TypedDataSchemaNode typedSchema = (TypedDataSchemaNode) schema;
                 final Class<?> valueType;
                 if (schema instanceof LeafSchemaNode) {
                     valueType = method.getReturnType();
                 final Class<?> valueType;
                 if (schema instanceof LeafSchemaNode) {
                     valueType = method.getReturnType();
@@ -260,11 +272,11 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
                         throw new IllegalStateException("Unexpected return type " + genericType);
                     }
                 } else {
                         throw new IllegalStateException("Unexpected return type " + genericType);
                     }
                 } else {
-                    // We do not have schema for leaf, so we will ignore it (e.g. getClass).
-                    continue;
+                    throw new IllegalStateException("Unhandled typed schema " + typedSchema);
                 }
                 }
-                final Codec<Object, Object> codec = getCodec(valueType, schema);
-                final LeafNodeCodecContext<?> leafNode = new LeafNodeCodecContext<>(schema, codec, method,
+
+                final Codec<Object, Object> codec = getCodec(valueType, typedSchema.getType());
+                final LeafNodeCodecContext leafNode = new LeafNodeCodecContext(typedSchema, codec, method,
                         context.getSchemaContext());
                 leaves.put(schema.getQName().getLocalName(), leafNode);
             }
                         context.getSchemaContext());
                 leaves.put(schema.getQName().getLocalName(), leafNode);
             }
@@ -272,11 +284,6 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
         return ImmutableMap.copyOf(leaves);
     }
 
         return ImmutableMap.copyOf(leaves);
     }
 
-    private Codec<Object, Object> getCodec(final Class<?> valueType, final DataSchemaNode schema) {
-        checkArgument(schema instanceof TypedDataSchemaNode, "Unsupported leaf node type %s", schema);
-        return getCodec(valueType, ((TypedDataSchemaNode)schema).getType());
-    }
-
     Codec<Object, Object> getCodec(final Class<?> valueType, final TypeDefinition<?> instantiatedType) {
         if (Class.class.equals(valueType)) {
             @SuppressWarnings({ "unchecked", "rawtypes" })
     Codec<Object, Object> getCodec(final Class<?> valueType, final TypeDefinition<?> instantiatedType) {
         if (Class.class.equals(valueType)) {
             @SuppressWarnings({ "unchecked", "rawtypes" })
@@ -323,7 +330,7 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
 
         final Class<Identifier<?>> identifier = optIdentifier.get();
         final Map<QName, ValueContext> valueCtx = new HashMap<>();
 
         final Class<Identifier<?>> identifier = optIdentifier.get();
         final Map<QName, ValueContext> valueCtx = new HashMap<>();
-        for (final LeafNodeCodecContext<?> leaf : getLeafNodes(identifier, schema).values()) {
+        for (final LeafNodeCodecContext leaf : getLeafNodes(identifier, schema).values()) {
             final QName name = leaf.getDomPathArgument().getNodeType();
             valueCtx.put(name, new ValueContext(identifier, leaf));
         }
             final QName name = leaf.getDomPathArgument().getNodeType();
             valueCtx.put(name, new ValueContext(identifier, leaf));
         }
@@ -332,18 +339,18 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
 
     @SuppressWarnings("unchecked")
     @Override
 
     @SuppressWarnings("unchecked")
     @Override
-    public <T extends DataObject> BindingCodecTreeNode<T> getSubtreeCodec(final InstanceIdentifier<T> path) {
+    public <T extends DataObject> BindingDataObjectCodecTreeNode<T> getSubtreeCodec(final InstanceIdentifier<T> path) {
         // TODO Do we need defensive check here?
         // TODO Do we need defensive check here?
-        return (BindingCodecTreeNode<T>) getCodecContextNode(path, null);
+        return (BindingDataObjectCodecTreeNode<T>) getCodecContextNode(path, null);
     }
 
     @Override
     }
 
     @Override
-    public BindingCodecTreeNode<?> getSubtreeCodec(final YangInstanceIdentifier path) {
+    public BindingCodecTreeNode getSubtreeCodec(final YangInstanceIdentifier path) {
         return getCodecContextNode(path, null);
     }
 
     @Override
         return getCodecContextNode(path, null);
     }
 
     @Override
-    public BindingCodecTreeNode<?> getSubtreeCodec(final SchemaPath path) {
+    public BindingCodecTreeNode getSubtreeCodec(final SchemaPath path) {
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 }
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 }
index 775a7b7045f269870b21d4848869d3279b93756f..c16280679aa9c8cb3a0b93a1c579ad0eaa8bb1ee 100644 (file)
@@ -24,6 +24,7 @@ import java.util.function.Function;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 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.BindingNormalizedNodeWriterFactory;
 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;
@@ -209,7 +210,7 @@ public class BindingNormalizedNodeCodecRegistry implements DataObjectSerializerR
         }
 
         final List<PathArgument> builder = new ArrayList<>();
         }
 
         final List<PathArgument> builder = new ArrayList<>();
-        final NodeCodecContext<?> codec = codecContext.getCodecContextNode(path, builder);
+        final BindingDataObjectCodecTreeNode<?> codec = codecContext.getCodecContextNode(path, builder);
         if (codec == null) {
             if (data != null) {
                 LOG.warn("Path {} does not have a binding equivalent, should have been caught earlier ({})", path,
         if (codec == null) {
             if (data != null) {
                 LOG.warn("Path {} does not have a binding equivalent, should have been caught earlier ({})", path,
index 5c184e67ca50e87de6577bf7e4823d8d3b589ec1..bf8edd9d2a8952d058c92a266287a124fe4c8ac8 100644 (file)
@@ -33,17 +33,16 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStre
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 
 final class BindingToNormalizedStreamWriter implements BindingStreamEventWriter, Delegator<NormalizedNodeStreamWriter> {
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 
 final class BindingToNormalizedStreamWriter implements BindingStreamEventWriter, Delegator<NormalizedNodeStreamWriter> {
-    private final Deque<NodeCodecContext<?>> schema = new ArrayDeque<>();
+    private final Deque<NodeCodecContext> schema = new ArrayDeque<>();
     private final NormalizedNodeStreamWriter delegate;
     private final NormalizedNodeStreamWriter delegate;
-    private final NodeCodecContext<?> rootNodeSchema;
+    private final NodeCodecContext rootNodeSchema;
 
 
-    BindingToNormalizedStreamWriter(final NodeCodecContext<?> rootNodeSchema,
-            final NormalizedNodeStreamWriter delegate) {
+    BindingToNormalizedStreamWriter(final NodeCodecContext rootNodeSchema, final NormalizedNodeStreamWriter delegate) {
         this.rootNodeSchema = requireNonNull(rootNodeSchema);
         this.delegate = requireNonNull(delegate);
     }
 
         this.rootNodeSchema = requireNonNull(rootNodeSchema);
         this.delegate = requireNonNull(delegate);
     }
 
-    static BindingToNormalizedStreamWriter create(final NodeCodecContext<?> schema,
+    static BindingToNormalizedStreamWriter create(final NodeCodecContext schema,
             final NormalizedNodeStreamWriter delegate) {
         return new BindingToNormalizedStreamWriter(schema, delegate);
     }
             final NormalizedNodeStreamWriter delegate) {
         return new BindingToNormalizedStreamWriter(schema, delegate);
     }
@@ -52,12 +51,12 @@ final class BindingToNormalizedStreamWriter implements BindingStreamEventWriter,
         delegate.nextDataSchemaNode((DataSchemaNode) schemaNode);
     }
 
         delegate.nextDataSchemaNode((DataSchemaNode) schemaNode);
     }
 
-    NodeCodecContext<?> current() {
+    NodeCodecContext current() {
         return schema.peek();
     }
 
     private NodeIdentifier duplicateSchemaEnter() {
         return schema.peek();
     }
 
     private NodeIdentifier duplicateSchemaEnter() {
-        final NodeCodecContext<?> next;
+        final NodeCodecContext next;
         if (current() == null) {
             // Entry of first node
             next = rootNodeSchema;
         if (current() == null) {
             // Entry of first node
             next = rootNodeSchema;
@@ -70,7 +69,7 @@ final class BindingToNormalizedStreamWriter implements BindingStreamEventWriter,
 
     @SuppressWarnings({"unchecked", "rawtypes"})
     private <T extends YangInstanceIdentifier.PathArgument> T enter(final Class<?> name, final Class<T> identifier) {
 
     @SuppressWarnings({"unchecked", "rawtypes"})
     private <T extends YangInstanceIdentifier.PathArgument> T enter(final Class<?> name, final Class<T> identifier) {
-        final NodeCodecContext<?> next;
+        final NodeCodecContext next;
         if (current() == null) {
             // Entry of first node
             next = rootNodeSchema;
         if (current() == null) {
             // Entry of first node
             next = rootNodeSchema;
@@ -85,8 +84,8 @@ final class BindingToNormalizedStreamWriter implements BindingStreamEventWriter,
     }
 
     private <T extends YangInstanceIdentifier.PathArgument> T enter(final String localName, final Class<T> identifier) {
     }
 
     private <T extends YangInstanceIdentifier.PathArgument> T enter(final String localName, final Class<T> identifier) {
-        NodeCodecContext<?> current = current();
-        NodeCodecContext<?> next = ((DataObjectCodecContext<?,?>) current).getLeafChild(localName);
+        NodeCodecContext current = current();
+        NodeCodecContext next = ((DataObjectCodecContext<?, ?>) current).getLeafChild(localName);
         this.schema.push(next);
         @SuppressWarnings("unchecked")
         T arg = (T) next.getDomPathArgument();
         this.schema.push(next);
         @SuppressWarnings("unchecked")
         T arg = (T) next.getDomPathArgument();
@@ -100,7 +99,7 @@ final class BindingToNormalizedStreamWriter implements BindingStreamEventWriter,
 
     @Override
     public void endNode() throws IOException {
 
     @Override
     public void endNode() throws IOException {
-        NodeCodecContext<?> left = schema.pop();
+        NodeCodecContext left = schema.pop();
         // NormalizedNode writer does not have entry into case, but into choice
         // so for leaving case, we do not emit endNode.
         if (!(left instanceof CaseNodeCodecContext)) {
         // NormalizedNode writer does not have entry into case, but into choice
         // so for leaving case, we do not emit endNode.
         if (!(left instanceof CaseNodeCodecContext)) {
@@ -112,7 +111,7 @@ final class BindingToNormalizedStreamWriter implements BindingStreamEventWriter,
         Preconditions.checkArgument(current() instanceof DataObjectCodecContext);
 
         DataObjectCodecContext<?,?> currentCasted = (DataObjectCodecContext<?,?>) current();
         Preconditions.checkArgument(current() instanceof DataObjectCodecContext);
 
         DataObjectCodecContext<?,?> currentCasted = (DataObjectCodecContext<?,?>) current();
-        LeafNodeCodecContext<?> leafContext = currentCasted.getLeafChild(localName);
+        LeafNodeCodecContext leafContext = currentCasted.getLeafChild(localName);
 
         NodeIdentifier domArg = (NodeIdentifier) leafContext.getDomPathArgument();
         Object domValue = leafContext.getValueCodec().serialize(value);
 
         NodeIdentifier domArg = (NodeIdentifier) leafContext.getDomPathArgument();
         Object domValue = leafContext.getValueCodec().serialize(value);
@@ -138,7 +137,7 @@ final class BindingToNormalizedStreamWriter implements BindingStreamEventWriter,
 
     @Override
     public void leafSetEntryNode(final Object value) throws IOException {
 
     @Override
     public void leafSetEntryNode(final Object value) throws IOException {
-        final LeafNodeCodecContext<?> ctx = (LeafNodeCodecContext<?>) current();
+        final LeafNodeCodecContext ctx = (LeafNodeCodecContext) current();
         final Object domValue = ctx.getValueCodec().serialize(value);
         delegate.startLeafSetEntryNode(new NodeWithValue<>(ctx.getSchema().getQName(), domValue));
         delegate.scalarValue(domValue);
         final Object domValue = ctx.getValueCodec().serialize(value);
         delegate.startLeafSetEntryNode(new NodeWithValue<>(ctx.getSchema().getQName(), domValue));
         delegate.scalarValue(domValue);
index 8cba2466fa6db59ad54e42dd815a172e3afa9944..5fbd0bdd3960b4be06a469a949a08f32b9fe4355 100644 (file)
@@ -222,7 +222,7 @@ final class ChoiceNodeCodecContext<D extends DataObject> extends DataContainerCo
     }
 
     @Override
     }
 
     @Override
-    public NodeCodecContext<?> yangPathArgumentChild(final YangInstanceIdentifier.PathArgument arg) {
+    public NodeCodecContext yangPathArgumentChild(final YangInstanceIdentifier.PathArgument arg) {
         final DataContainerCodecPrototype<?> cazeProto;
         if (arg instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates) {
             cazeProto = byYangCaseChild.get(new NodeIdentifier(arg.getNodeType()));
         final DataContainerCodecPrototype<?> cazeProto;
         if (arg instanceof YangInstanceIdentifier.NodeIdentifierWithPredicates) {
             cazeProto = byYangCaseChild.get(new NodeIdentifier(arg.getNodeType()));
index 92cc5b51a4631e58d939767372e29dcb4b85ef0c..18d341a518c51344de7080e830347dfd6171aeb4 100644 (file)
@@ -14,6 +14,7 @@ import java.util.List;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCachingCodec;
 import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCachingCodec;
 import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -28,7 +29,8 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeS
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 
 import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 
-abstract class DataContainerCodecContext<D extends DataObject, T extends WithStatus> extends NodeCodecContext<D>  {
+abstract class DataContainerCodecContext<D extends DataObject, T extends WithStatus> extends NodeCodecContext
+        implements BindingDataObjectCodecTreeNode<D>  {
 
     private final DataContainerCodecPrototype<T> prototype;
     private volatile DataObjectSerializer eventStreamSerializer;
 
     private final DataContainerCodecPrototype<T> prototype;
     private volatile DataObjectSerializer eventStreamSerializer;
@@ -68,7 +70,7 @@ abstract class DataContainerCodecContext<D extends DataObject, T extends WithSta
      * @throws IllegalArgumentException If supplied argument does not represent valid child.
      */
     @Override
      * @throws IllegalArgumentException If supplied argument does not represent valid child.
      */
     @Override
-    public abstract NodeCodecContext<?> yangPathArgumentChild(YangInstanceIdentifier.PathArgument arg);
+    public abstract NodeCodecContext yangPathArgumentChild(YangInstanceIdentifier.PathArgument arg);
 
     /**
      * Returns nested node context using supplied Binding Instance Identifier
 
     /**
      * Returns nested node context using supplied Binding Instance Identifier
index d35ed14b38acd6dbf8c1901e718942d0daecbba3..31915601397bc52f187ec4aa12577b352e551e5f 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.mdsal.binding.dom.codec.impl;
 
 import com.google.common.collect.Iterables;
 import org.checkerframework.checker.lock.qual.Holding;
 
 import com.google.common.collect.Iterables;
 import org.checkerframework.checker.lock.qual.Holding;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode.ChildAddressabilitySummary;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode.ChildAddressabilitySummary;
 import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.DataRoot;
 import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.DataRoot;
@@ -202,8 +202,8 @@ final class DataContainerCodecPrototype<T extends WithStatus> implements NodeCon
     }
 
     @Override
     }
 
     @Override
-    public DataContainerCodecContext<?,T> get() {
-        DataContainerCodecContext<?,T> tmp = instance;
+    public DataContainerCodecContext<?, T> get() {
+        DataContainerCodecContext<?, T> tmp = instance;
         if (tmp == null) {
             synchronized (this) {
                 tmp = instance;
         if (tmp == null) {
             synchronized (this) {
                 tmp = instance;
index 3dcc386bd2d48ba5ca5e49369f53274a3e55c2d2..4c105af43319bcf22e84657ad408bc32878dcac5 100644 (file)
@@ -82,7 +82,7 @@ abstract class DataObjectCodecContext<D extends DataObject, T extends DataNodeCo
     private static final Augmentations EMPTY_AUGMENTATIONS = new Augmentations(ImmutableMap.of(), ImmutableMap.of());
     private static final Method[] EMPTY_METHODS = new Method[0];
 
     private static final Augmentations EMPTY_AUGMENTATIONS = new Augmentations(ImmutableMap.of(), ImmutableMap.of());
     private static final Method[] EMPTY_METHODS = new Method[0];
 
-    private final ImmutableMap<String, LeafNodeCodecContext<?>> leafChild;
+    private final ImmutableMap<String, LeafNodeCodecContext> leafChild;
     private final ImmutableMap<YangInstanceIdentifier.PathArgument, NodeContextSupplier> byYang;
     private final ImmutableMap<String, NodeContextSupplier> byMethod;
     private final ImmutableMap<String, String> nonnullToGetter;
     private final ImmutableMap<YangInstanceIdentifier.PathArgument, NodeContextSupplier> byYang;
     private final ImmutableMap<String, NodeContextSupplier> byMethod;
     private final ImmutableMap<String, String> nonnullToGetter;
@@ -114,7 +114,7 @@ abstract class DataObjectCodecContext<D extends DataObject, T extends DataNodeCo
         final Map<Class<?>, DataContainerCodecPrototype<?>> byBindingArgClassBuilder = new HashMap<>();
 
         // Adds leaves to mapping
         final Map<Class<?>, DataContainerCodecPrototype<?>> byBindingArgClassBuilder = new HashMap<>();
 
         // Adds leaves to mapping
-        for (final LeafNodeCodecContext<?> leaf : leafChild.values()) {
+        for (final LeafNodeCodecContext leaf : leafChild.values()) {
             tmpMethodToSupplier.put(leaf.getGetter(), leaf);
             byYangBuilder.put(leaf.getDomPathArgument(), leaf);
         }
             tmpMethodToSupplier.put(leaf.getGetter(), leaf);
             byYangBuilder.put(leaf.getDomPathArgument(), leaf);
         }
@@ -329,9 +329,8 @@ abstract class DataObjectCodecContext<D extends DataObject, T extends DataNodeCo
         return context;
     }
 
         return context;
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     @Override
-    public NodeCodecContext<D> yangPathArgumentChild(final YangInstanceIdentifier.PathArgument arg) {
+    public NodeCodecContext yangPathArgumentChild(final YangInstanceIdentifier.PathArgument arg) {
         final NodeContextSupplier childSupplier;
         if (arg instanceof NodeIdentifierWithPredicates) {
             childSupplier = byYang.get(new NodeIdentifier(arg.getNodeType()));
         final NodeContextSupplier childSupplier;
         if (arg instanceof NodeIdentifierWithPredicates) {
             childSupplier = byYang.get(new NodeIdentifier(arg.getNodeType()));
@@ -341,12 +340,11 @@ abstract class DataObjectCodecContext<D extends DataObject, T extends DataNodeCo
             childSupplier = byYang.get(arg);
         }
 
             childSupplier = byYang.get(arg);
         }
 
-        return (NodeCodecContext<D>) childNonNull(childSupplier, arg,
-            "Argument %s is not valid child of %s", arg, getSchema()).get();
+        return childNonNull(childSupplier, arg, "Argument %s is not valid child of %s", arg, getSchema()).get();
     }
 
     }
 
-    protected final LeafNodeCodecContext<?> getLeafChild(final String name) {
-        final LeafNodeCodecContext<?> value = leafChild.get(name);
+    protected final LeafNodeCodecContext getLeafChild(final String name) {
+        final LeafNodeCodecContext value = leafChild.get(name);
         return IncorrectNestingException.checkNonNull(value, "Leaf %s is not valid for %s", name, getBindingClass());
     }
 
         return IncorrectNestingException.checkNonNull(value, "Leaf %s is not valid for %s", name, getBindingClass());
     }
 
@@ -521,7 +519,7 @@ abstract class DataObjectCodecContext<D extends DataObject, T extends DataNodeCo
 
     @SuppressWarnings("rawtypes")
     @Nullable Object getBindingChildValue(final String method, final NormalizedNodeContainer domData) {
 
     @SuppressWarnings("rawtypes")
     @Nullable Object getBindingChildValue(final String method, final NormalizedNodeContainer domData) {
-        final NodeCodecContext<?> childContext = verifyNotNull(byMethod.get(method),
+        final NodeCodecContext childContext = verifyNotNull(byMethod.get(method),
             "Cannot find data handler for method %s", method).get();
 
         @SuppressWarnings("unchecked")
             "Cannot find data handler for method %s", method).get();
 
         @SuppressWarnings("unchecked")
index becd7c208a73f185a055fdec00f55a4aa64318fc..b2147a124dc3aad9c9158fec7a398a7341486ff2 100644 (file)
@@ -12,6 +12,7 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.collect.Iterables;
 import java.util.ArrayList;
 import java.util.List;
 import com.google.common.collect.Iterables;
 import java.util.ArrayList;
 import java.util.List;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode;
 import org.opendaylight.yangtools.concepts.Codec;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.concepts.Codec;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -34,7 +35,7 @@ final class InstanceIdentifierCodec implements Codec<YangInstanceIdentifier, Ins
     @Override
     public InstanceIdentifier<?> deserialize(final YangInstanceIdentifier input) {
         final List<InstanceIdentifier.PathArgument> builder = new ArrayList<>();
     @Override
     public InstanceIdentifier<?> deserialize(final YangInstanceIdentifier input) {
         final List<InstanceIdentifier.PathArgument> builder = new ArrayList<>();
-        final NodeCodecContext<?> codec = context.getCodecContextNode(input, builder);
+        final BindingDataObjectCodecTreeNode<?> codec = context.getCodecContextNode(input, builder);
         if (codec == null) {
             return null;
         }
         if (codec == null) {
             return null;
         }
index 385c6095f0e1b8e2b40afdd1ebad887909d56af8..0baae812bf8edce53c3e9c316ebc8faa19fe6be0 100644 (file)
@@ -7,29 +7,21 @@
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
  */
 package org.opendaylight.mdsal.binding.dom.codec.impl;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.collect.ImmutableCollection;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCachingCodec;
 import org.opendaylight.yangtools.concepts.Codec;
 import org.opendaylight.yangtools.concepts.Codec;
-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.common.QName;
 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.LeafNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
@@ -37,19 +29,20 @@ import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 
-final class LeafNodeCodecContext<D extends DataObject> extends NodeCodecContext<D> implements NodeContextSupplier {
-
-    private final YangInstanceIdentifier.PathArgument yangIdentifier;
+// FIXME: MDSAL-436: this class should be specialized for Leaf and LeafSet
+final class LeafNodeCodecContext extends NodeCodecContext implements NodeContextSupplier {
+    private final NodeIdentifier yangIdentifier;
     private final Codec<Object, Object> valueCodec;
     private final Method getter;
     private final Codec<Object, Object> valueCodec;
     private final Method getter;
-    private final DataSchemaNode schema;
+    private final TypedDataSchemaNode schema;
     private final Object defaultObject;
 
     private final Object defaultObject;
 
-    LeafNodeCodecContext(final DataSchemaNode schema, final Codec<Object, Object> codec, final Method getter,
+    LeafNodeCodecContext(final TypedDataSchemaNode schema, final Codec<Object, Object> codec, final Method getter,
                 final SchemaContext schemaContext) {
                 final SchemaContext schemaContext) {
-        this.yangIdentifier = new YangInstanceIdentifier.NodeIdentifier(schema.getQName());
+        this.yangIdentifier = NodeIdentifier.create(schema.getQName());
         this.valueCodec = requireNonNull(codec);
         this.getter = getter;
         this.schema = requireNonNull(schema);
         this.valueCodec = requireNonNull(codec);
         this.getter = getter;
         this.schema = requireNonNull(schema);
@@ -120,13 +113,13 @@ final class LeafNodeCodecContext<D extends DataObject> extends NodeCodecContext<
             Object castedDefaultValue = typeDefAwareCodec.deserialize((String) defaultValue);
             return codec.deserialize(castedDefaultValue);
         }
             Object castedDefaultValue = typeDefAwareCodec.deserialize((String) defaultValue);
             return codec.deserialize(castedDefaultValue);
         }
-        // FIXME: BUG-4647 Refactor / redesign this to throw hard error,
-        // once BUG-4638 is fixed and will provide proper getDefaultValue implementation.
+        // FIXME: BUG-4647 Refactor / redesign this to throw hard error, once BUG-4638 is fixed and will provide proper
+        //                 getDefaultValue() implementation.
         return null;
     }
 
     @Override
         return null;
     }
 
     @Override
-    protected YangInstanceIdentifier.PathArgument getDomPathArgument() {
+    protected NodeIdentifier getDomPathArgument() {
         return yangIdentifier;
     }
 
         return yangIdentifier;
     }
 
@@ -135,12 +128,7 @@ final class LeafNodeCodecContext<D extends DataObject> extends NodeCodecContext<
     }
 
     @Override
     }
 
     @Override
-    public D deserialize(final NormalizedNode<?, ?> normalizedNode) {
-        throw new UnsupportedOperationException("Leaf can not be deserialized to DataObject");
-    }
-
-    @Override
-    public NodeCodecContext<?> get() {
+    public NodeCodecContext get() {
         return this;
     }
 
         return this;
     }
 
@@ -148,49 +136,6 @@ final class LeafNodeCodecContext<D extends DataObject> extends NodeCodecContext<
         return getter;
     }
 
         return getter;
     }
 
-    @Override
-    public BindingCodecTreeNode<?> bindingPathArgumentChild(final PathArgument arg,
-            final List<YangInstanceIdentifier.PathArgument> builder) {
-        throw new IllegalArgumentException("Leaf does not have children");
-    }
-
-    @Override
-    public BindingNormalizedNodeCachingCodec<D> createCachingCodec(
-            final ImmutableCollection<Class<? extends DataObject>> cacheSpecifier) {
-        throw new UnsupportedOperationException("Leaves does not support caching codec.");
-    }
-
-    @Override
-    public Class<D> getBindingClass() {
-        throw new UnsupportedOperationException("Leaf does not have DataObject representation");
-    }
-
-    @Override
-    public NormalizedNode<?, ?> serialize(final D data) {
-        throw new UnsupportedOperationException("Separete serialization of leaf node is not supported.");
-    }
-
-    @Override
-    public void writeAsNormalizedNode(final D data, final NormalizedNodeStreamWriter writer) {
-        throw new UnsupportedOperationException("Separete serialization of leaf node is not supported.");
-    }
-
-    @Override
-    public <E extends DataObject> BindingCodecTreeNode<E> streamChild(final Class<E> childClass) {
-        throw new IllegalArgumentException("Leaf does not have children");
-    }
-
-    @Override
-    public <E extends DataObject> Optional<? extends BindingCodecTreeNode<E>> possibleStreamChild(
-            final Class<E> childClass) {
-        throw new IllegalArgumentException("Leaf does not have children");
-    }
-
-    @Override
-    public BindingCodecTreeNode<?> yangPathArgumentChild(final YangInstanceIdentifier.PathArgument child) {
-        throw new IllegalArgumentException("Leaf does not have children");
-    }
-
     @Override
     protected Object deserializeObject(final NormalizedNode<?, ?> normalizedNode) {
         if (normalizedNode instanceof LeafNode<?>) {
     @Override
     protected Object deserializeObject(final NormalizedNode<?, ?> normalizedNode) {
         if (normalizedNode instanceof LeafNode<?>) {
@@ -209,26 +154,10 @@ final class LeafNodeCodecContext<D extends DataObject> extends NodeCodecContext<
     }
 
     @Override
     }
 
     @Override
-    public InstanceIdentifier.PathArgument deserializePathArgument(final YangInstanceIdentifier.PathArgument arg) {
-        checkArgument(getDomPathArgument().equals(arg));
-        return null;
-    }
-
-    @Override
-    public YangInstanceIdentifier.PathArgument serializePathArgument(final InstanceIdentifier.PathArgument arg) {
-        return getDomPathArgument();
-    }
-
-    @Override
-    public DataSchemaNode getSchema() {
+    public TypedDataSchemaNode getSchema() {
         return schema;
     }
 
         return schema;
     }
 
-    @Override
-    public ChildAddressabilitySummary getChildAddressabilitySummary() {
-        return ChildAddressabilitySummary.UNADDRESSABLE;
-    }
-
     @Override
     Object defaultObject() {
         return defaultObject;
     @Override
     Object defaultObject() {
         return defaultObject;
index 1c1c8c66aab48f3c632b4d001bd8ba4a87a82bbe..c89fdf72b5de9bfa4d90190aeaa237d210217984 100644 (file)
@@ -12,7 +12,6 @@ import java.util.List;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.DataObjectSerializer;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.DataObjectSerializer;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -33,7 +32,7 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
  * context nodes contains context for children nodes.</li>
  * </ul>
  */
  * context nodes contains context for children nodes.</li>
  * </ul>
  */
-abstract class NodeCodecContext<D extends DataObject> implements BindingCodecTreeNode<D> {
+abstract class NodeCodecContext implements BindingCodecTreeNode {
 
     /**
      * Returns Yang Instance Identifier Path Argument of current node.
 
     /**
      * Returns Yang Instance Identifier Path Argument of current node.
@@ -64,7 +63,7 @@ abstract class NodeCodecContext<D extends DataObject> implements BindingCodecTre
          * @param schema  Instantiated schema of binding type.
          * @return Map of local name to leaf node context.
          */
          * @param schema  Instantiated schema of binding type.
          * @return Map of local name to leaf node context.
          */
-        ImmutableMap<String, LeafNodeCodecContext<?>> getLeafNodes(Class<?> type, DataNodeContainer schema);
+        ImmutableMap<String, LeafNodeCodecContext> getLeafNodes(Class<?> type, DataNodeContainer schema);
 
         /**
          * Returns Path argument codec for list item.
 
         /**
          * Returns Path argument codec for list item.
index 30e022782ecc2c4bff19e88de3b23d0debb42f1b..76d40c23c8bf9782ad6aa34c05b255ce5d234f5a 100644 (file)
@@ -13,7 +13,7 @@ import org.eclipse.jdt.annotation.NonNull;
 /**
  * Type capture of an entity producing NodeCodecContexts.
  */
 /**
  * Type capture of an entity producing NodeCodecContexts.
  */
-interface NodeContextSupplier extends Supplier<NodeCodecContext<?>> {
+interface NodeContextSupplier extends Supplier<NodeCodecContext> {
     @Override
     @Override
-    @NonNull NodeCodecContext<?> get();
+    @NonNull NodeCodecContext get();
 }
 }
index bc621f1212400cc0285e0a971da5a9f7ddf028cc..b52eab538935a0612cc5c97c960bdf09488e54ee 100644 (file)
@@ -21,7 +21,7 @@ final class ValueContext {
     private final Class<?> identifier;
     private final String getterName;
 
     private final Class<?> identifier;
     private final String getterName;
 
-    ValueContext(final Class<?> identifier, final LeafNodeCodecContext<?> leaf) {
+    ValueContext(final Class<?> identifier, final LeafNodeCodecContext leaf) {
         getterName = leaf.getGetter().getName();
         try {
             getter = MethodHandles.publicLookup().unreflect(identifier.getMethod(getterName)).asType(OBJECT_METHOD);
         getterName = leaf.getGetter().getName();
         try {
             getter = MethodHandles.publicLookup().unreflect(identifier.getMethod(getterName)).asType(OBJECT_METHOD);
index 03d5d7c1964a7c4b4ab0e574d7c1ffdc508b73a8..a5280ccde5ee00c260e34dc8702af33e2aeb2e65 100644 (file)
@@ -19,7 +19,7 @@ import java.util.Collection;
 import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
 import java.util.List;
 import org.junit.Before;
 import org.junit.Test;
-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.BindingNormalizedNodeCachingCodec;
 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.TopBuilder;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeCachingCodec;
 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.TopBuilder;
@@ -44,7 +44,7 @@ public class CachingCodecTest extends AbstractBindingCodecTest {
     private static final Top TOP_TWO_LIST_DATA = new TopBuilder().setTopLevelList(TWO_LIST).build();
     private static final Top TOP_THREE_LIST_DATA = new TopBuilder().setTopLevelList(THREE_LIST).build();
 
     private static final Top TOP_TWO_LIST_DATA = new TopBuilder().setTopLevelList(TWO_LIST).build();
     private static final Top TOP_THREE_LIST_DATA = new TopBuilder().setTopLevelList(THREE_LIST).build();
 
-    private BindingCodecTreeNode<Top> topNode;
+    private BindingDataObjectCodecTreeNode<Top> topNode;
 
     @Override
     @Before
 
     @Override
     @Before