Track current path in a stack 34/72134/10
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 21 May 2018 21:02:12 +0000 (23:02 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 22 May 2018 14:31:54 +0000 (16:31 +0200)
Rather than creating temporary InstanceIdentifiers, which eagerly
calculate hashCode and cost 32-64 bytes each, use a dedicated stack,
which costs 72-112 bytes without the need for hash code computations.

Since a DataTree may not start at YangInstanceIdentifier.EMPTY, we
need to have a dedicated subclass to properly report the full path.

The contents of the stack are converted to a YangInstanceIdentifier
when needed -- which is only in error paths.

Change-Id: Ifd77a79e6d7481a4355ecb052c9fc2d2c3c1f463
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
12 files changed:
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractDataTreeCandidate.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractDataTreeTip.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractNodeContainerModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractValueNodeModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AlwaysFailOperation.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/MinMaxElementsValidation.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModificationApplyOperation.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModificationPath.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/RootModificationApplyOperation.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StructuralContainerModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UnkeyedListModificationStrategy.java

index 3b9bc1f8f5427c267092e35a495e3749f5fcfed5..6b5f0ec4bb020799fa6d6b9f6bb1e65cc18d833c 100644 (file)
@@ -8,9 +8,11 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import com.google.common.base.Preconditions;
+import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
 
+@NonNullByDefault
 abstract class AbstractDataTreeCandidate extends AbstractDataTreeTip implements DataTreeCandidateTip {
     private final YangInstanceIdentifier rootPath;
 
index 3c3ab25edc0e6f6ceab5cb0367f30b1c4bf9279a..298715e999c69b5ce59523f296d092aaa78bfa2e 100644 (file)
@@ -12,6 +12,7 @@ import static com.google.common.base.Preconditions.checkState;
 
 import java.util.Optional;
 import javax.annotation.Nonnull;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
@@ -27,12 +28,14 @@ abstract class AbstractDataTreeTip implements DataTreeTip {
      */
     @Nonnull protected abstract TreeNode getTipRoot();
 
+    @NonNull abstract YangInstanceIdentifier getRootPath();
+
     @Override
     public final void validate(final DataTreeModification modification) throws DataValidationFailedException {
         final InMemoryDataTreeModification m = checkedCast(modification);
         checkArgument(m.isSealed(), "Attempted to verify unsealed modification %s", m);
 
-        m.getStrategy().checkApplicable(YangInstanceIdentifier.EMPTY, m.getRootModification(),
+        m.getStrategy().checkApplicable(new ModificationPath(getRootPath()), m.getRootModification(),
             Optional.of(getTipRoot()), m.getVersion());
     }
 
index 21ff600553879459805966ac9a8fa4fe36aa0fc4..5fc273e2a9ed5a8b573d580267899eeb8a2801c8 100644 (file)
@@ -13,11 +13,9 @@ import com.google.common.base.Preconditions;
 import com.google.common.base.Verify;
 import java.util.Collection;
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType;
@@ -132,7 +130,7 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl
             final Version nodeVersion, final Iterable<ModifiedNode> modifications) {
 
         for (final ModifiedNode mod : modifications) {
-            final YangInstanceIdentifier.PathArgument id = mod.getIdentifier();
+            final PathArgument id = mod.getIdentifier();
             final Optional<TreeNode> cm = meta.getChild(id);
 
             final Optional<TreeNode> result = resolveChildOperation(id).apply(mod, cm, nodeVersion);
@@ -275,17 +273,14 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl
     }
 
     @Override
-    protected void checkTouchApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    protected void checkTouchApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         if (!modification.getOriginal().isPresent() && !current.isPresent()) {
-            throw new ModifiedNodeDoesNotExistException(path,
+            throw new ModifiedNodeDoesNotExistException(path.toInstanceIdentifier(),
                 String.format("Node %s does not exist. Cannot apply modification to its children.", path));
         }
 
-        if (!current.isPresent()) {
-            throw new ConflictingModificationAppliedException(path, "Node was deleted by other transaction.");
-        }
-
+        checkConflicting(path, current.isPresent(), "Node was deleted by other transaction.");
         checkChildPreconditions(path, modification, current.get(), version);
     }
 
@@ -296,19 +291,23 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl
      * @param modification current modification
      * @param current Current data tree node.
      */
-    private void checkChildPreconditions(final YangInstanceIdentifier path, final NodeModification modification,
+    private void checkChildPreconditions(final ModificationPath path, final NodeModification modification,
             final TreeNode current, final Version version) throws DataValidationFailedException {
         for (final NodeModification childMod : modification.getChildren()) {
-            final YangInstanceIdentifier.PathArgument childId = childMod.getIdentifier();
+            final PathArgument childId = childMod.getIdentifier();
             final Optional<TreeNode> childMeta = current.getChild(childId);
 
-            final YangInstanceIdentifier childPath = path.node(childId);
-            resolveChildOperation(childId).checkApplicable(childPath, childMod, childMeta, version);
+            path.push(childId);
+            try {
+                resolveChildOperation(childId).checkApplicable(path, childMod, childMeta, version);
+            } finally {
+                path.pop();
+            }
         }
     }
 
     @Override
-    protected void checkMergeApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    protected void checkMergeApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         if (current.isPresent()) {
             checkChildPreconditions(path, modification, current.get(), version);
index daa18d1fb3b5757a4250afb2602cf63b2743c5af..2cd8bbdac39db50086c1122f55f164576196c25d 100644 (file)
@@ -11,7 +11,6 @@ import static com.google.common.base.Preconditions.checkArgument;
 
 import com.google.common.base.Preconditions;
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.IncorrectDataStructureException;
@@ -70,9 +69,9 @@ abstract class AbstractValueNodeModificationStrategy<T extends DataSchemaNode> e
     }
 
     @Override
-    protected final void checkTouchApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    protected final void checkTouchApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws IncorrectDataStructureException {
-        throw new IncorrectDataStructureException(path, "Subtree modification is not allowed.");
+        throw new IncorrectDataStructureException(path.toInstanceIdentifier(), "Subtree modification is not allowed.");
     }
 
     @Override
index 9c662e5779a082518ba6c3ea04e89261e4bb3f16..3258dcaf87484c678dcbcc983c431dc88d786c65 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
@@ -34,7 +33,7 @@ final class AlwaysFailOperation extends ModificationApplyOperation {
     }
 
     @Override
-    void checkApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    void checkApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> storeMetadata, final Version version) {
         throw ise();
     }
index 53fbfb90dd2aac17b18c5e5873342ef95169e20f..92f96c9e76d92ae5d3169b52d471720b4a201c0d 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Verify;
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
@@ -53,20 +52,20 @@ final class MinMaxElementsValidation extends SchemaAwareApplyOperation {
         return new MinMaxElementsValidation(delegate, constraint.getMinElements(), constraint.getMaxElements());
     }
 
-    private void validateMinMaxElements(final YangInstanceIdentifier path, final PathArgument id,
+    private void validateMinMaxElements(final ModificationPath path, final PathArgument id,
             final NormalizedNode<?, ?> data) throws DataValidationFailedException {
         final int children = numOfChildrenFromValue(data);
         if (minElements > children) {
-            throw new RequiredElementCountException(path, minElements, maxElements,
+            throw new RequiredElementCountException(path.toInstanceIdentifier(), minElements, maxElements,
                 children, "%s does not have enough elements (%s), needs at least %s", id, children, minElements);
         }
         if (maxElements < children) {
-            throw new RequiredElementCountException(path, minElements, maxElements,
+            throw new RequiredElementCountException(path.toInstanceIdentifier(), minElements, maxElements,
                 children, "%s has too many elements (%s), can have at most %s", id, children, maxElements);
         }
     }
 
-    private void checkMinMaxElements(final YangInstanceIdentifier path, final NodeModification nodeMod,
+    private void checkMinMaxElements(final ModificationPath path, final NodeModification nodeMod,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         if (!(nodeMod instanceof ModifiedNode)) {
             LOG.debug("Could not validate {}, does not implement expected class {}", nodeMod, ModifiedNode.class);
@@ -105,21 +104,21 @@ final class MinMaxElementsValidation extends SchemaAwareApplyOperation {
     }
 
     @Override
-    protected void checkTouchApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    protected void checkTouchApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         delegate.checkTouchApplicable(path, modification, current, version);
         checkMinMaxElements(path, modification, current, version);
     }
 
     @Override
-    protected void checkMergeApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    protected void checkMergeApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         delegate.checkMergeApplicable(path, modification, current, version);
         checkMinMaxElements(path, modification, current, version);
     }
 
     @Override
-    protected void checkWriteApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    protected void checkWriteApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         delegate.checkWriteApplicable(path, modification, current, version);
         checkMinMaxElements(path, modification, current, version);
index 2c6104cc89292b337800ede2ee750274df40575d..92fda9d19bd402a31270d421b87a9c8132aa821e 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
@@ -60,12 +59,13 @@ abstract class ModificationApplyOperation implements StoreTreeNode<ModificationA
     /**
      * Checks if provided node modification could be applied to current metadata node.
      *
+     * @param path Path to modification
      * @param modification Modification
      * @param current Metadata Node to which modification should be applied
      * @param version Metadata version
      * @throws DataValidationFailedException if the modification is not applicable
      */
-    abstract void checkApplicable(YangInstanceIdentifier path, NodeModification modification,
+    abstract void checkApplicable(ModificationPath path, NodeModification modification,
             Optional<TreeNode> current, Version version) throws DataValidationFailedException;
 
     /**
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModificationPath.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModificationPath.java
new file mode 100644 (file)
index 0000000..c5e533b
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2018 Pantheon Technologies, 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.yangtools.yang.data.impl.schema.tree;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import java.util.Arrays;
+import javax.annotation.concurrent.NotThreadSafe;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.concepts.Mutable;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+
+@NonNullByDefault
+@NotThreadSafe
+final class ModificationPath implements Mutable {
+    private static final int DEFAULT_ALLOC_SIZE = 8;
+    private static final int ALLOC_SIZE = Integer.getInteger(
+        "org.opendaylight.yangtools.yang.data.impl.schema.tree.ModificationPath.ALLOC_SIZE", DEFAULT_ALLOC_SIZE);
+
+    private final YangInstanceIdentifier root;
+
+    private PathArgument[] entries = new PathArgument[ALLOC_SIZE];
+    private int used;
+
+    ModificationPath(final YangInstanceIdentifier root) {
+        this.root = requireNonNull(root);
+    }
+
+    void push(final PathArgument arg) {
+        if (entries.length == used) {
+            final int grow = used <= 32 ? used : used / 2;
+            entries = Arrays.copyOf(entries, used + grow);
+        }
+        entries[used++] = requireNonNull(arg);
+    }
+
+    void pop() {
+        checkState(used > 0, "No elements left");
+        used--;
+    }
+
+    YangInstanceIdentifier toInstanceIdentifier() {
+        return YangInstanceIdentifier.builder(root).append(Arrays.asList(entries).subList(0, used)).build();
+    }
+}
index 541ee6c0989997359956c6244cb04e5c0dd113a7..0c1d969b60dcb303798d6e7431a6e4111ff023dd 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
@@ -67,7 +66,7 @@ abstract class RootModificationApplyOperation extends ModificationApplyOperation
     }
 
     @Override
-    final void checkApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    final void checkApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         getDelegate().checkApplicable(path, modification, current, version);
     }
index 1e136af4987c0278f5f1cd83cd35e8137b5ac021..03654a619750a5ff60a4f6289e95103663cbf1a0 100644 (file)
@@ -11,7 +11,6 @@ import com.google.common.base.Preconditions;
 import java.util.List;
 import java.util.Optional;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException;
@@ -75,10 +74,10 @@ abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
         return null;
     }
 
-    public static void checkConflicting(final YangInstanceIdentifier path, final boolean condition,
-                                        final String message) throws ConflictingModificationAppliedException {
+    static void checkConflicting(final ModificationPath path, final boolean condition, final String message)
+            throws ConflictingModificationAppliedException {
         if (!condition) {
-            throw new ConflictingModificationAppliedException(path, message);
+            throw new ConflictingModificationAppliedException(path.toInstanceIdentifier(), message);
         }
     }
 
@@ -107,7 +106,7 @@ abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
         return MinMaxElementsValidation.from(op, schemaNode);
     }
 
-    protected static void checkNotConflicting(final YangInstanceIdentifier path, final TreeNode original,
+    protected static void checkNotConflicting(final ModificationPath path, final TreeNode original,
             final TreeNode current) throws ConflictingModificationAppliedException {
         checkConflicting(path, original.getVersion().equals(current.getVersion()),
                 "Node was replaced by other transaction.");
@@ -122,7 +121,7 @@ abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
     }
 
     @Override
-    final void checkApplicable(final YangInstanceIdentifier path,final NodeModification modification,
+    final void checkApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         switch (modification.getOperation()) {
             case DELETE:
@@ -145,7 +144,7 @@ abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
         }
     }
 
-    protected void checkMergeApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    protected void checkMergeApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         final Optional<TreeNode> original = modification.getOriginal();
         if (original.isPresent() && current.isPresent()) {
@@ -173,15 +172,14 @@ abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
      * @param current current node in TreeNode for modification to apply
      * @throws DataValidationFailedException when a data dependency conflict is detected
      */
-    protected void checkWriteApplicable(final YangInstanceIdentifier path, final NodeModification modification,
-        final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
+    protected void checkWriteApplicable(final ModificationPath path, final NodeModification modification,
+            final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         final Optional<TreeNode> original = modification.getOriginal();
         if (original.isPresent() && current.isPresent()) {
             checkNotConflicting(path, original.get(), current.get());
-        } else if (original.isPresent()) {
-            throw new ConflictingModificationAppliedException(path, "Node was deleted by other transaction.");
-        } else if (current.isPresent()) {
-            throw new ConflictingModificationAppliedException(path, "Node was created by other transaction.");
+        } else {
+            checkConflicting(path, !original.isPresent(), "Node was deleted by other transaction.");
+            checkConflicting(path, !current.isPresent(), "Node was created by other transaction.");
         }
     }
 
@@ -273,7 +271,7 @@ abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
      * @throws org.opendaylight.yangtools.yang.data.api.schema.tree.IncorrectDataStructureException If subtree
      *         modification is not applicable (e.g. leaf node).
      */
-    protected abstract void checkTouchApplicable(YangInstanceIdentifier path, NodeModification modification,
+    protected abstract void checkTouchApplicable(ModificationPath path, NodeModification modification,
             Optional<TreeNode> current, Version version) throws DataValidationFailedException;
 
     /**
index 7bb23b8d1c6f4d5a73cebd6e60d827b17daf1b23..6216339d0ae75f0cd2bee2490782938449ff0947 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -33,7 +32,7 @@ import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 final class StructuralContainerModificationStrategy extends ModificationApplyOperation {
     /**
      * Fake TreeNode version used in
-     * {@link #checkApplicable(YangInstanceIdentifier, NodeModification, Optional, Version)}.
+     * {@link #checkApplicable(ModificationPath, NodeModification, Optional, Version)}.
      * It is okay to use a global constant, as the delegate will ignore it anyway. For
      * {@link #apply(ModifiedNode, Optional, Version)} we will use the appropriate version as provided to us.
      */
@@ -92,7 +91,7 @@ final class StructuralContainerModificationStrategy extends ModificationApplyOpe
     }
 
     @Override
-    void checkApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    void checkApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws DataValidationFailedException {
         if (modification.getOperation() == LogicalOperation.TOUCH && !current.isPresent()) {
             // Structural containers are created as needed, so we pretend this container is here
index cf236aa121257e77796b098c059d673f5c343a53..076f9df776db52048740cbdb4585e926c004ae6e 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import java.util.Optional;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -91,7 +90,7 @@ final class UnkeyedListModificationStrategy extends SchemaAwareApplyOperation {
      */
     @SuppressWarnings({ "rawtypes", "unchecked" })
     private TreeNode mutateChildren(final MutableTreeNode meta, final NormalizedNodeContainerBuilder data,
-        final Version nodeVersion, final Iterable<ModifiedNode> modifications) {
+            final Version nodeVersion, final Iterable<ModifiedNode> modifications) {
 
         for (final ModifiedNode mod : modifications) {
             final PathArgument id = mod.getIdentifier();
@@ -128,9 +127,9 @@ final class UnkeyedListModificationStrategy extends SchemaAwareApplyOperation {
     }
 
     @Override
-    protected void checkTouchApplicable(final YangInstanceIdentifier path, final NodeModification modification,
+    protected void checkTouchApplicable(final ModificationPath path, final NodeModification modification,
             final Optional<TreeNode> current, final Version version) throws IncorrectDataStructureException {
-        throw new IncorrectDataStructureException(path, "Subtree modification is not allowed.");
+        throw new IncorrectDataStructureException(path.toInstanceIdentifier(), "Subtree modification is not allowed.");
     }
 
     @Override