Adopt odlparent-10.0.0/yangtools-8.0.0-SNAPSHOT
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / main / java / org / opendaylight / mdsal / binding / dom / adapter / LazyDataObjectModification.java
index 66f7548d924b90c028b8bdc3abfad705b2afcdd8..29cb1cdf2c1c1fcff76568ca639c36c8fd63091a 100644 (file)
@@ -7,8 +7,9 @@
  */
 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 org.opendaylight.yangtools.yang.data.tree.api.ModificationType.UNMODIFIED;
 
 import com.google.common.base.MoreObjects;
 import java.util.ArrayList;
@@ -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 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;
@@ -31,7 +33,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.Item;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode;
+import org.opendaylight.yangtools.yang.data.tree.api.DataTreeCandidateNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,33 +51,36 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
 
     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 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());
     }
 
-    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);
     }
 
-    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 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);
@@ -86,9 +91,11 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
                      *  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);
@@ -102,7 +109,7 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
     }
 
     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:
@@ -121,7 +128,7 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
     }
 
     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));
@@ -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<>();
-        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) {
@@ -289,7 +296,7 @@ final class LazyDataObjectModification<T extends DataObject> implements DataObje
         return MoreObjects.toStringHelper(this).add("identifier", identifier).add("domData", domData).toString();
     }
 
-    private T deserialize(final Optional<NormalizedNode<?, ?>> dataAfter) {
+    private T deserialize(final Optional<NormalizedNode> dataAfter) {
         return dataAfter.map(codec::deserialize).orElse(null);
     }
 }