Bug 1014 - Non-configuration items in the model appear in the config 01/20501/11
authorJan Hajnar <jhajnar@cisco.com>
Thu, 14 May 2015 12:30:49 +0000 (14:30 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 15 Jun 2015 12:37:51 +0000 (12:37 +0000)
namespace

* added TreeType enum for tree type identification
* modified factory methods and constructor for InMemoryDataTree
* Modified factory of SchemaApplyOperation to filter subtree by tree type
* reworked verifyStructure() to recursivelly walk data tree
* added tests for config statement check

Change-Id: I3f4ebe84e4387965ff43714a1f45f75c738d4475
Signed-off-by: Jan Hajnar <jhajnar@cisco.com>
32 files changed:
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/DataTreeFactory.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/TreeType.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/AbstractDataNodeContainerModificationStrategy.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/AugmentationModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ChoiceModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ContainerModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeFactory.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/LeafModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ListEntryModificationStrategy.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/OperationWithModification.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/OrderedLeafSetModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/OrderedMapModificationStrategy.java
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/UnkeyedListItemModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UnkeyedListModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UnorderedLeafSetModificationStrategy.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UnorderedMapModificationStrategy.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/Bug2690FixTest.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ConcurrentTreeModificationTest.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ConfigStatementValidationTest.java [new file with mode: 0644]
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ListConstraintsValidationTest.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ModificationMetadataTreeTest.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperationRoot.java [deleted file]
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StoreTreeNodesTest.java
yang/yang-data-impl/src/test/resources/odl-datastore-test.yang

index 84f50179c7f0ad5b0df7653bb42d7ea2a39a9c0e..2e4c4927981ff3d8652718edc2a8c435e712bc17 100644 (file)
@@ -17,4 +17,11 @@ public interface DataTreeFactory {
      * @return A data tree instance.
      */
     DataTree create();
+
+    /**
+     * Create a new data tree.
+     *
+     * @return A data tree instance.
+     */
+    DataTree create(TreeType type);
 }
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/TreeType.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/TreeType.java
new file mode 100644 (file)
index 0000000..3a80aac
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.api.schema.tree;
+
+
+public enum TreeType {
+
+    CONFIGURATION,
+
+    OPERATIONAL
+}
index 03eb2d4a5ed2009ccfce114edb40f1ceca829ed9..0260b3feb63224b691096a7fd326cd9ad5531294 100644 (file)
@@ -17,6 +17,7 @@ import java.util.concurrent.ExecutionException;
 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.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
@@ -37,19 +38,21 @@ abstract class AbstractDataNodeContainerModificationStrategy<T extends DataNodeC
                 @Override
                 public ModificationApplyOperation load(final PathArgument key) {
                     if (key instanceof AugmentationIdentifier && schema instanceof AugmentationTarget) {
-                        return SchemaAwareApplyOperation.from(schema, (AugmentationTarget) schema, (AugmentationIdentifier) key);
+                        return SchemaAwareApplyOperation.from(schema, (AugmentationTarget) schema, (AugmentationIdentifier) key, treeType);
                     }
 
                     final DataSchemaNode child = schema.getDataChildByName(key.getNodeType());
                     Preconditions.checkArgument(child != null, "Schema %s does not have a node for child %s", schema, key.getNodeType());
-                    return SchemaAwareApplyOperation.from(child);
+                    return SchemaAwareApplyOperation.from(child, treeType);
                 }
             });
     private final T schema;
+    private final TreeType treeType;
 
-    protected AbstractDataNodeContainerModificationStrategy(final T schema, final Class<? extends NormalizedNode<?, ?>> nodeClass) {
+    protected AbstractDataNodeContainerModificationStrategy(final T schema, final Class<? extends NormalizedNode<?, ?>> nodeClass, final TreeType treeType) {
         super(nodeClass);
-        this.schema = Preconditions.checkNotNull(schema);
+        this.schema = Preconditions.checkNotNull(schema,"schema");
+        this.treeType = Preconditions.checkNotNull(treeType,"treeType");
     }
 
     protected final T getSchema() {
index 8a8afb046a859c2787280efdcc9a86b738dab662..3e13dd454910e8f79c27c08c8d4582b2dcfe8d52 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import static com.google.common.base.Preconditions.checkArgument;
+
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import java.util.Collection;
@@ -29,32 +30,26 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl
     private final Class<? extends NormalizedNode<?, ?>> nodeClass;
 
     protected AbstractNodeContainerModificationStrategy(final Class<? extends NormalizedNode<?, ?>> nodeClass) {
-        this.nodeClass = Preconditions.checkNotNull(nodeClass);
-    }
-
-    @Override
-    void verifyStructure(final ModifiedNode modification) throws IllegalArgumentException {
-        for (ModifiedNode childModification : modification.getChildren()) {
-            resolveChildOperation(childModification.getIdentifier()).verifyStructure(childModification);
-        }
+        this.nodeClass = Preconditions.checkNotNull(nodeClass , "nodeClass");
     }
 
     @SuppressWarnings("rawtypes")
     @Override
-    protected void verifyWrittenStructure(final NormalizedNode<?, ?> writtenValue) {
+    void verifyStructure(final NormalizedNode<?, ?> writtenValue) {
         checkArgument(nodeClass.isInstance(writtenValue), "Node %s is not of type %s", writtenValue, nodeClass);
         checkArgument(writtenValue instanceof NormalizedNodeContainer);
 
-        NormalizedNodeContainer container = (NormalizedNodeContainer) writtenValue;
-        for (Object child : container.getValue()) {
+        final NormalizedNodeContainer container = (NormalizedNodeContainer) writtenValue;
+        for (final Object child : container.getValue()) {
             checkArgument(child instanceof NormalizedNode);
-
-            /*
-             * FIXME: fail-fast semantics:
-             *
-             * We can validate the data structure here, aborting the commit
-             * before it ever progresses to being committed.
-             */
+            final NormalizedNode<?, ?> castedChild = (NormalizedNode<?, ?>) child;
+            final Optional<ModificationApplyOperation> childOp = getChild(castedChild.getIdentifier());
+            if(childOp.isPresent()) {
+                childOp.get().verifyStructure(castedChild);
+            } else {
+                throw new SchemaValidationFailedException(String.format("Child %s is not valid child according to schema.",
+                        castedChild.getIdentifier()));
+            }
         }
     }
 
@@ -107,11 +102,11 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl
     private TreeNode mutateChildren(final MutableTreeNode meta, final NormalizedNodeContainerBuilder data,
             final Version nodeVersion, final Iterable<ModifiedNode> modifications) {
 
-        for (ModifiedNode mod : modifications) {
+        for (final ModifiedNode mod : modifications) {
             final YangInstanceIdentifier.PathArgument id = mod.getIdentifier();
             final Optional<TreeNode> cm = meta.getChild(id);
 
-            Optional<TreeNode> result = resolveChildOperation(id).apply(mod, cm, nodeVersion);
+            final Optional<TreeNode> result = resolveChildOperation(id).apply(mod, cm, nodeVersion);
             if (result.isPresent()) {
                 final TreeNode tn = result.get();
                 meta.addChild(tn);
@@ -164,7 +159,7 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl
          * In order to do that, though, we have to check all child operations are UNMODIFIED.
          * Let's do precisely that, stopping as soon we find a different result.
          */
-        for (ModifiedNode child : children) {
+        for (final ModifiedNode child : children) {
             if (child.getModificationType() != ModificationType.UNMODIFIED) {
                 modification.resolveModificationType(ModificationType.SUBTREE_MODIFIED);
                 return ret;
@@ -197,11 +192,11 @@ abstract class AbstractNodeContainerModificationStrategy extends SchemaAwareAppl
      * @param current Current data tree node.
      */
     private void checkChildPreconditions(final YangInstanceIdentifier path, final NodeModification modification, final TreeNode current) throws DataValidationFailedException {
-        for (NodeModification childMod : modification.getChildren()) {
+        for (final NodeModification childMod : modification.getChildren()) {
             final YangInstanceIdentifier.PathArgument childId = childMod.getIdentifier();
             final Optional<TreeNode> childMeta = current.getChild(childId);
 
-            YangInstanceIdentifier childPath = path.node(childId);
+            final YangInstanceIdentifier childPath = path.node(childId);
             resolveChildOperation(childId).checkApplicable(childPath, childMod, childMeta);
         }
     }
index 6f4e8497ac387879dcce3c2b11ad9d4916896a6a..6291de5dbabaa63cd4537837c56417df12c4247d 100644 (file)
@@ -30,7 +30,7 @@ abstract class AbstractValueNodeModificationStrategy<T extends DataSchemaNode> e
     }
 
     @Override
-    protected final void verifyWrittenStructure(final NormalizedNode<?, ?> writtenValue) {
+    protected final void verifyStructure(final NormalizedNode<?, ?> writtenValue) {
         checkArgument(nodeClass.isInstance(writtenValue), "Node should must be of type %s", nodeClass);
     }
 
index 8ff141f16727a87d7a3974befac89d121aa99a18..f7719f2e05856c41f5711c9ae03f38111bff4490 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 import com.google.common.base.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;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
 
@@ -43,7 +44,7 @@ final class AlwaysFailOperation extends ModificationApplyOperation {
     }
 
     @Override
-    void verifyStructure(final ModifiedNode modification) {
+    void verifyStructure(final NormalizedNode<?, ?> modification) {
         throw new IllegalStateException("Schema Context is not available.");
     }
 
index 454254ef12d86ad473259f24d3c0642f835dc18f..83d460c09b635e693d23d50e64b00c66a21de961 100644 (file)
@@ -8,10 +8,12 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import static com.google.common.base.Preconditions.checkArgument;
+
 import java.util.HashSet;
 import java.util.Set;
 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -20,8 +22,8 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.util.EffectiveAugmentationSchema;
 
 final class AugmentationModificationStrategy extends AbstractDataNodeContainerModificationStrategy<AugmentationSchema> {
-    AugmentationModificationStrategy(final AugmentationSchema schema, final DataNodeContainer resolved) {
-        super(createAugmentProxy(schema,resolved), AugmentationNode.class);
+    AugmentationModificationStrategy(final AugmentationSchema schema, final DataNodeContainer resolved, final TreeType treeType) {
+        super(createAugmentProxy(schema,resolved), AugmentationNode.class, treeType);
     }
 
     @Override
@@ -32,8 +34,8 @@ final class AugmentationModificationStrategy extends AbstractDataNodeContainerMo
     }
 
     private static AugmentationSchema createAugmentProxy(final AugmentationSchema schema, final DataNodeContainer resolved) {
-        Set<DataSchemaNode> realChildSchemas = new HashSet<>();
-        for(DataSchemaNode augChild : schema.getChildNodes()) {
+        final Set<DataSchemaNode> realChildSchemas = new HashSet<>();
+        for(final DataSchemaNode augChild : schema.getChildNodes()) {
             realChildSchemas.add(resolved.getDataChildByName(augChild.getQName()));
         }
         return new EffectiveAugmentationSchema(schema, realChildSchemas);
index dbc1fe3536321112e3ac75e3ba9ea87fd38234a7..8158792367be56c3e5231ef80378201ae9ec52bd 100644 (file)
@@ -8,12 +8,14 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import static com.google.common.base.Preconditions.checkArgument;
+
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
@@ -23,14 +25,18 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 final class ChoiceModificationStrategy extends AbstractNodeContainerModificationStrategy {
     private final Map<YangInstanceIdentifier.PathArgument, ModificationApplyOperation> childNodes;
 
-    ChoiceModificationStrategy(final ChoiceSchemaNode schemaNode) {
+    ChoiceModificationStrategy(final ChoiceSchemaNode schemaNode, final TreeType treeType) {
         super(ChoiceNode.class);
-        ImmutableMap.Builder<YangInstanceIdentifier.PathArgument, ModificationApplyOperation> child = ImmutableMap.builder();
+        final ImmutableMap.Builder<YangInstanceIdentifier.PathArgument, ModificationApplyOperation> child = ImmutableMap.builder();
 
-        for (ChoiceCaseNode caze : schemaNode.getCases()) {
-            for (DataSchemaNode cazeChild : caze.getChildNodes()) {
-                SchemaAwareApplyOperation childNode = SchemaAwareApplyOperation.from(cazeChild);
-                child.put(new YangInstanceIdentifier.NodeIdentifier(cazeChild.getQName()), childNode);
+        for (final ChoiceCaseNode caze : schemaNode.getCases()) {
+            if(SchemaAwareApplyOperation.belongsToTree(treeType,caze)) {
+                for (final DataSchemaNode cazeChild : caze.getChildNodes()) {
+                    if(SchemaAwareApplyOperation.belongsToTree(treeType,cazeChild)) {
+                        final SchemaAwareApplyOperation childNode = SchemaAwareApplyOperation.from(cazeChild,treeType);
+                        child.put(new YangInstanceIdentifier.NodeIdentifier(cazeChild.getQName()), childNode);
+                    }
+                }
             }
         }
         childNodes = child.build();
index 4c8156801b9f563382055204eedfd9c46db8c6a6..62301688286cee3a2aaa4e49fd3a7017459ee6aa 100644 (file)
@@ -1,22 +1,24 @@
 /*
- * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
  *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
+ * 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.checkArgument;
+
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 
 final class ContainerModificationStrategy extends AbstractDataNodeContainerModificationStrategy<ContainerSchemaNode> {
-    ContainerModificationStrategy(final ContainerSchemaNode schemaNode) {
-        super(schemaNode, ContainerNode.class);
+    ContainerModificationStrategy(final ContainerSchemaNode schemaNode, final TreeType treeType) {
+        super(schemaNode, ContainerNode.class, treeType);
     }
 
     @Override
@@ -25,4 +27,4 @@ final class ContainerModificationStrategy extends AbstractDataNodeContainerModif
         checkArgument(original instanceof ContainerNode);
         return ImmutableContainerNodeBuilder.create((ContainerNode) original);
     }
-}
\ No newline at end of file
+}
index fc9f744a6fe400ee83de27db5a7fa352341eeb51..7a66d30215a3ce48fbe823f122ac107ae928c396 100644 (file)
@@ -11,8 +11,9 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.slf4j.Logger;
@@ -30,8 +31,10 @@ final class InMemoryDataTree extends AbstractDataTreeTip implements TipProducing
      * Current data store state generation.
      */
     private volatile DataTreeState state;
+    private final TreeType treeType;
 
-    public InMemoryDataTree(final TreeNode rootNode, final SchemaContext schemaContext) {
+    public InMemoryDataTree(final TreeNode rootNode, final TreeType treeType, final SchemaContext schemaContext) {
+        this.treeType = Preconditions.checkNotNull(treeType,treeType);
         state = DataTreeState.createInitial(rootNode);
         if (schemaContext != null) {
             setSchemaContext(schemaContext);
@@ -48,7 +51,7 @@ final class InMemoryDataTree extends AbstractDataTreeTip implements TipProducing
 
         LOG.debug("Following schema contexts will be attempted {}", newSchemaContext);
 
-        final SchemaAwareApplyOperation operation = SchemaAwareApplyOperation.from(newSchemaContext);
+        final SchemaAwareApplyOperation operation = SchemaAwareApplyOperation.from(newSchemaContext,treeType);
 
         DataTreeState currentState, newState;
         do {
@@ -67,7 +70,6 @@ final class InMemoryDataTree extends AbstractDataTreeTip implements TipProducing
         if (candidate instanceof NoopDataTreeCandidate) {
             return;
         }
-
         Preconditions.checkArgument(candidate instanceof InMemoryDataTreeCandidate, "Invalid candidate class %s", candidate.getClass());
         final InMemoryDataTreeCandidate c = (InMemoryDataTreeCandidate)candidate;
 
index 5caf94ec53b3b6f5a21186c9c46e0d09c55cda3d..083da67ea8fb4c33348d2daee585c4652b6fcdab 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeFactory;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNodeFactory;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
@@ -28,7 +29,12 @@ public final class InMemoryDataTreeFactory implements DataTreeFactory {
 
     @Override
     public TipProducingDataTree create() {
-        return new InMemoryDataTree(TreeNodeFactory.createTreeNode(root, Version.initial()), null);
+        return create(TreeType.OPERATIONAL);
+    }
+
+    @Override
+    public TipProducingDataTree create(TreeType treeType) {
+        return new InMemoryDataTree(TreeNodeFactory.createTreeNode(root, Version.initial()), treeType, null);
     }
 
     /**
index e5f07c65b0f29a5c5781e6b2055c4d6e99fe1118..250991154dd22543ea8726b161c3e930cb80dcf0 100644 (file)
@@ -8,11 +8,12 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 
 final class LeafModificationStrategy extends AbstractValueNodeModificationStrategy<LeafSchemaNode> {
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    LeafModificationStrategy(final LeafSchemaNode schema) {
+    LeafModificationStrategy(final LeafSchemaNode schema, final TreeType treeType) {
         super(schema, (Class) LeafNode.class);
     }
 }
\ No newline at end of file
index a0c5a3bdb05e7e7b7fa7b57ab7378589d4bd4b6f..98a14e1dc56d979d66362210f29a02a366521378 100644 (file)
@@ -8,15 +8,17 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import static com.google.common.base.Preconditions.checkArgument;
+
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
 final class ListEntryModificationStrategy extends AbstractDataNodeContainerModificationStrategy<ListSchemaNode> {
-    ListEntryModificationStrategy(final ListSchemaNode schema) {
-        super(schema, MapEntryNode.class);
+    ListEntryModificationStrategy(final ListSchemaNode schema, final TreeType treeType) {
+        super(schema, MapEntryNode.class, treeType);
     }
 
     @Override
index 306d9c8581233362e07ec61f27500a5680548e85..45d6f05740e698f7a829caa9877341e7a4442bf8 100644 (file)
@@ -146,7 +146,7 @@ final class MinMaxElementsValidation extends SchemaAwareApplyOperation {
     }
 
     @Override
-    void verifyStructure(final ModifiedNode modification) throws IllegalArgumentException {
+    protected void verifyStructure(final NormalizedNode<?, ?> modification) {
         delegate.verifyStructure(modification);
     }
 
@@ -166,11 +166,6 @@ final class MinMaxElementsValidation extends SchemaAwareApplyOperation {
         return delegate.applyWrite(modification, currentMeta, version);
     }
 
-    @Override
-    protected void verifyWrittenStructure(final NormalizedNode<?, ?> writtenValue) {
-        delegate.verifyWrittenStructure(writtenValue);
-    }
-
     @Override
     protected ChildTrackingPolicy getChildPolicy() {
         return delegate.getChildPolicy();
index c890a28b09335ce6f520d2f21c2a7f6956f9dbf3..40eac7a1c5ac740dc3f0f4d66dbb74427426d501 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 import com.google.common.base.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;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.StoreTreeNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
@@ -75,7 +76,7 @@ abstract class ModificationApplyOperation implements StoreTreeNode<ModificationA
      * @param modification to be verified.
      * @throws IllegalArgumentException If provided NodeModification does not adhere to the structure.
      */
-    abstract void verifyStructure(ModifiedNode modification) throws IllegalArgumentException;
+    abstract void verifyStructure(NormalizedNode<?, ?> modification) throws IllegalArgumentException;
 
     /**
      * Return the tracking policy for this node's children.
index 9a4c97802a6bd1c11f4cea05b6485e448a9888d7..27511507477d32fe14759f02e7818fcf85473d50 100644 (file)
@@ -28,12 +28,13 @@ final class OperationWithModification {
 
     void write(final NormalizedNode<?, ?> value) {
         modification.write(value);
-        applyOperation.verifyStructure(modification);
+        applyOperation.verifyStructure(value);
     }
 
     private void recursiveMerge(final NormalizedNode<?,?> data) {
         if (data instanceof NormalizedNodeContainer<?,?,?>) {
             @SuppressWarnings({ "rawtypes", "unchecked" })
+            final
             NormalizedNodeContainer<?,?,NormalizedNode<PathArgument, ?>> dataContainer = (NormalizedNodeContainer) data;
 
             /*
@@ -44,15 +45,16 @@ final class OperationWithModification {
              */
             if (modification.getOperation().equals(LogicalOperation.WRITE)) {
                 @SuppressWarnings({ "rawtypes", "unchecked" })
+                final
                 NormalizedNodeContainer<?,?,NormalizedNode<PathArgument, ?>> odlDataContainer =
                         (NormalizedNodeContainer) modification.getWrittenValue();
-                for (NormalizedNode<PathArgument, ?> child : odlDataContainer.getValue()) {
-                    PathArgument childId = child.getIdentifier();
+                for (final NormalizedNode<PathArgument, ?> child : odlDataContainer.getValue()) {
+                    final PathArgument childId = child.getIdentifier();
                     forChild(childId).write(child);
                 }
             }
-            for (NormalizedNode<PathArgument, ?> child : dataContainer.getValue()) {
-                PathArgument childId = child.getIdentifier();
+            for (final NormalizedNode<PathArgument, ?> child : dataContainer.getValue()) {
+                final PathArgument childId = child.getIdentifier();
                 forChild(childId).recursiveMerge(child);
             }
         }
@@ -69,7 +71,7 @@ final class OperationWithModification {
          * assumption that adding the newly-validated data with the previously-validated
          * data will not result in invalid data.
          */
-        applyOperation.verifyStructure(modification.asNewlyWritten(data));
+        applyOperation.verifyStructure(data);
         recursiveMerge(data);
     }
 
@@ -98,8 +100,8 @@ final class OperationWithModification {
         final Optional<ModificationApplyOperation> maybeChildOp = applyOperation.getChild(childId);
         Preconditions.checkArgument(maybeChildOp.isPresent(), "Attempted to apply operation to non-existent child %s", childId);
 
-        ModificationApplyOperation childOp = maybeChildOp.get();
-        ModifiedNode childMod = modification.modifyChild(childId, childOp.getChildPolicy());
+        final ModificationApplyOperation childOp = maybeChildOp.get();
+        final ModifiedNode childMod = modification.modifyChild(childId, childOp.getChildPolicy());
 
         return from(childOp, childMod);
     }
index 4d0b62f997c788b963072c5aa8336aa635de82f0..cb058c08955add886d23df479bddef0e94ca0e3a 100644 (file)
@@ -8,11 +8,13 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import static com.google.common.base.Preconditions.checkArgument;
+
 import com.google.common.base.Optional;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 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.OrderedLeafSetNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedLeafSetNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
@@ -21,7 +23,7 @@ final class OrderedLeafSetModificationStrategy extends AbstractNodeContainerModi
     private final Optional<ModificationApplyOperation> entryStrategy;
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    OrderedLeafSetModificationStrategy(final LeafListSchemaNode schema) {
+    OrderedLeafSetModificationStrategy(final LeafListSchemaNode schema, final TreeType treeType) {
         super((Class) LeafSetNode.class);
         entryStrategy = Optional.<ModificationApplyOperation> of(new LeafSetEntryModificationStrategy(schema));
     }
index 0949be4c557f79b5ec65cb091dcef444bd67388b..6febd4e5cecf64577b2d7c324683f09af4d2b333 100644 (file)
@@ -1,10 +1,12 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import static com.google.common.base.Preconditions.checkArgument;
+
 import com.google.common.base.Optional;
 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.OrderedMapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
@@ -12,9 +14,9 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 final class OrderedMapModificationStrategy extends AbstractNodeContainerModificationStrategy {
     private final Optional<ModificationApplyOperation> entryStrategy;
 
-    OrderedMapModificationStrategy(final ListSchemaNode schema) {
+    OrderedMapModificationStrategy(final ListSchemaNode schema, final TreeType treeType) {
         super(OrderedMapNode.class);
-        entryStrategy = Optional.<ModificationApplyOperation> of(new ListEntryModificationStrategy(schema));
+        entryStrategy = Optional.<ModificationApplyOperation> of(new ListEntryModificationStrategy(schema, treeType));
     }
 
     @Override
index 868dfd1d520a011d59e60bfccd8d951390f3d94a..d262d210c99696f87f5aeb3552c89d13881eb6cc 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 import com.google.common.base.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;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
@@ -93,7 +94,7 @@ abstract class RootModificationApplyOperation extends ModificationApplyOperation
     }
 
     @Override
-    final void verifyStructure(final ModifiedNode modification) throws IllegalArgumentException {
+    final void verifyStructure(final NormalizedNode<?, ?> modification) throws IllegalArgumentException {
         getDelegate().verifyStructure(modification);
     }
 
index 9ab33e3707930068462158d140c13b071a7049a5..10487a5a6b45f704418130289b2a42b20da74fd2 100644 (file)
@@ -14,11 +14,11 @@ 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.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.IncorrectDataStructureException;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -30,33 +30,41 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
     private static final Logger LOG = LoggerFactory.getLogger(SchemaAwareApplyOperation.class);
 
-    public static SchemaAwareApplyOperation from(final DataSchemaNode schemaNode) {
+    static SchemaAwareApplyOperation from(final SchemaContext schemaNode, final TreeType treeType) {
+        return new ContainerModificationStrategy(schemaNode, treeType);
+    }
+
+    public static SchemaAwareApplyOperation from(final DataSchemaNode schemaNode, final TreeType treeType) {
+        if(treeType == TreeType.CONFIGURATION) {
+            Preconditions.checkArgument(schemaNode.isConfiguration(), "Supplied %s does not belongs to configuration tree.", schemaNode.getPath());
+        }
         if (schemaNode instanceof ContainerSchemaNode) {
-            return new ContainerModificationStrategy((ContainerSchemaNode) schemaNode);
+            return new ContainerModificationStrategy((ContainerSchemaNode) schemaNode, treeType);
         } else if (schemaNode instanceof ListSchemaNode) {
-            return fromListSchemaNode((ListSchemaNode) schemaNode);
+            return fromListSchemaNode((ListSchemaNode) schemaNode, treeType);
         } else if (schemaNode instanceof ChoiceSchemaNode) {
-            return new ChoiceModificationStrategy((ChoiceSchemaNode) schemaNode);
+            return new ChoiceModificationStrategy((ChoiceSchemaNode) schemaNode, treeType);
         } else if (schemaNode instanceof LeafListSchemaNode) {
-            return fromLeafListSchemaNode((LeafListSchemaNode) schemaNode);
+            return fromLeafListSchemaNode((LeafListSchemaNode) schemaNode, treeType);
         } else if (schemaNode instanceof LeafSchemaNode) {
-            return new LeafModificationStrategy((LeafSchemaNode) schemaNode);
+            return new LeafModificationStrategy((LeafSchemaNode) schemaNode, treeType);
         }
         throw new IllegalArgumentException("Not supported schema node type for " + schemaNode.getClass());
     }
 
     public static SchemaAwareApplyOperation from(final DataNodeContainer resolvedTree,
-            final AugmentationTarget augSchemas, final AugmentationIdentifier identifier) {
+            final AugmentationTarget augSchemas, final AugmentationIdentifier identifier, final TreeType treeType) {
         for (final AugmentationSchema potential : augSchemas.getAvailableAugmentations()) {
             for (final DataSchemaNode child : potential.getChildNodes()) {
                 if (identifier.getPossibleChildNames().contains(child.getQName())) {
-                    return new AugmentationModificationStrategy(potential, resolvedTree);
+                    return new AugmentationModificationStrategy(potential, resolvedTree, treeType);
                 }
             }
         }
@@ -71,25 +79,25 @@ abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
         return condition;
     }
 
-    private static SchemaAwareApplyOperation fromListSchemaNode(final ListSchemaNode schemaNode) {
+    private static SchemaAwareApplyOperation fromListSchemaNode(final ListSchemaNode schemaNode, final TreeType treeType) {
         final List<QName> keyDefinition = schemaNode.getKeyDefinition();
         final SchemaAwareApplyOperation op;
         if (keyDefinition == null || keyDefinition.isEmpty()) {
-            op = new UnkeyedListModificationStrategy(schemaNode);
+            op = new UnkeyedListModificationStrategy(schemaNode, treeType);
         } else if (schemaNode.isUserOrdered()) {
-            op =  new OrderedMapModificationStrategy(schemaNode);
+            op =  new OrderedMapModificationStrategy(schemaNode, treeType);
         } else {
-            op = new UnorderedMapModificationStrategy(schemaNode);
+            op = new UnorderedMapModificationStrategy(schemaNode, treeType);
         }
         return MinMaxElementsValidation.from(op, schemaNode);
     }
 
-    private static SchemaAwareApplyOperation fromLeafListSchemaNode(final LeafListSchemaNode schemaNode) {
+    private static SchemaAwareApplyOperation fromLeafListSchemaNode(final LeafListSchemaNode schemaNode, final TreeType treeType) {
         final SchemaAwareApplyOperation op;
         if(schemaNode.isUserOrdered()) {
-            op =  new OrderedLeafSetModificationStrategy(schemaNode);
+            op =  new OrderedLeafSetModificationStrategy(schemaNode, treeType);
         } else {
-            op = new UnorderedLeafSetModificationStrategy(schemaNode);
+            op = new UnorderedLeafSetModificationStrategy(schemaNode, treeType);
         }
         return MinMaxElementsValidation.from(op, schemaNode);
     }
@@ -107,13 +115,6 @@ abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
         return potential.get();
     }
 
-    @Override
-    void verifyStructure(final ModifiedNode modification) throws IllegalArgumentException {
-        if (modification.getOperation() == LogicalOperation.WRITE) {
-            verifyWrittenStructure(modification.getWrittenValue());
-        }
-    }
-
     @Override
     final void checkApplicable(final YangInstanceIdentifier path,final NodeModification modification, final Optional<TreeNode> current) throws DataValidationFailedException {
         switch (modification.getOperation()) {
@@ -259,5 +260,17 @@ abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
     protected abstract void checkTouchApplicable(YangInstanceIdentifier path, final NodeModification modification,
             final Optional<TreeNode> current) throws DataValidationFailedException;
 
-    protected abstract void verifyWrittenStructure(NormalizedNode<?, ?> writtenValue);
+    /**
+     * Checks if supplied schema node belong to specified Data Tree type.
+     *
+     * @param treeType Tree Type
+     * @param node Schema node
+     * @return
+     */
+    static boolean belongsToTree(final TreeType treeType, final DataSchemaNode node) {
+        if(treeType == TreeType.CONFIGURATION) {
+            return node.isConfiguration();
+        }
+        return true;
+    }
 }
index 9367b4c5792c404a5f16623c3de0e0df66d5e8f5..6439ed67cb20ab7078e40587523837a1363a1cd5 100644 (file)
@@ -8,15 +8,17 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import static com.google.common.base.Preconditions.checkArgument;
+
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
 final class UnkeyedListItemModificationStrategy extends AbstractDataNodeContainerModificationStrategy<ListSchemaNode> {
-    UnkeyedListItemModificationStrategy(final ListSchemaNode schemaNode) {
-        super(schemaNode, UnkeyedListEntryNode.class);
+    UnkeyedListItemModificationStrategy(final ListSchemaNode schemaNode, final TreeType treeType) {
+        super(schemaNode, UnkeyedListEntryNode.class, treeType);
     }
 
     @Override
index d786cc67b5fe61c21ba19df0e6ecd04c1baaca89..2cb33518996a74ded292c58ff5814052944c055a 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.IncorrectDataStructureException;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.MutableTreeNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNodeFactory;
@@ -27,8 +28,8 @@ final class UnkeyedListModificationStrategy extends SchemaAwareApplyOperation {
 
     private final Optional<ModificationApplyOperation> entryStrategy;
 
-    UnkeyedListModificationStrategy(final ListSchemaNode schema) {
-        entryStrategy = Optional.<ModificationApplyOperation> of(new UnkeyedListItemModificationStrategy(schema));
+    UnkeyedListModificationStrategy(final ListSchemaNode schema, final TreeType treeType) {
+        entryStrategy = Optional.<ModificationApplyOperation> of(new UnkeyedListItemModificationStrategy(schema, treeType));
     }
 
     @Override
@@ -94,11 +95,11 @@ final class UnkeyedListModificationStrategy extends SchemaAwareApplyOperation {
     private TreeNode mutateChildren(final MutableTreeNode meta, final NormalizedNodeContainerBuilder data,
         final Version nodeVersion, final Iterable<ModifiedNode> modifications) {
 
-        for (ModifiedNode mod : modifications) {
+        for (final ModifiedNode mod : modifications) {
             final PathArgument id = mod.getIdentifier();
             final Optional<TreeNode> cm = meta.getChild(id);
 
-            Optional<TreeNode> result = resolveChildOperation(id).apply(mod, cm, nodeVersion);
+            final Optional<TreeNode> result = resolveChildOperation(id).apply(mod, cm, nodeVersion);
             if (result.isPresent()) {
                 final TreeNode tn = result.get();
                 meta.addChild(tn);
@@ -122,7 +123,7 @@ final class UnkeyedListModificationStrategy extends SchemaAwareApplyOperation {
     }
 
     @Override
-    protected void verifyWrittenStructure(final NormalizedNode<?, ?> writtenValue) {
+    protected void verifyStructure(final NormalizedNode<?, ?> writtenValue) {
 
     }
 
index b88b28ba2d148d377bc94627bfb7c700e7123748..8963f3cbce41114075b946ce23f7c3ba5627ca8d 100644 (file)
@@ -8,10 +8,12 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
 import static com.google.common.base.Preconditions.checkArgument;
+
 import com.google.common.base.Optional;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 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.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
@@ -20,7 +22,7 @@ final class UnorderedLeafSetModificationStrategy extends AbstractNodeContainerMo
     private final Optional<ModificationApplyOperation> entryStrategy;
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    UnorderedLeafSetModificationStrategy(final LeafListSchemaNode schema) {
+    UnorderedLeafSetModificationStrategy(final LeafListSchemaNode schema, final TreeType treeType) {
         super((Class) LeafSetNode.class);
         entryStrategy = Optional.<ModificationApplyOperation> of(new LeafSetEntryModificationStrategy(schema));
     }
index 9f13a9fd8d388223f28d443676adf274c4e3751c..a416b0d329e53aef8a22cfd008da278be42a0ca4 100644 (file)
@@ -1,17 +1,19 @@
 /*
- * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
  *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
+ * 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.checkArgument;
+
 import com.google.common.base.Optional;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
@@ -19,9 +21,9 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 final class UnorderedMapModificationStrategy extends AbstractNodeContainerModificationStrategy {
     private final Optional<ModificationApplyOperation> entryStrategy;
 
-    UnorderedMapModificationStrategy(final ListSchemaNode schema) {
+    UnorderedMapModificationStrategy(final ListSchemaNode schema, final TreeType treeType) {
         super(MapNode.class);
-        entryStrategy = Optional.<ModificationApplyOperation> of(new ListEntryModificationStrategy(schema));
+        entryStrategy = Optional.<ModificationApplyOperation>of(new ListEntryModificationStrategy(schema, treeType));
     }
 
     @SuppressWarnings("rawtypes")
@@ -43,4 +45,4 @@ final class UnorderedMapModificationStrategy extends AbstractNodeContainerModifi
     public String toString() {
         return "UnorderedMapModificationStrategy [entry=" + entryStrategy + "]";
     }
-}
\ No newline at end of file
+}
index 50a17c46d2b2bdd52afa5df47b4ded6d3bb705d0..0a3ba3abe258ede1d3c555dfa1a90cee8e273595 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+
 import com.google.common.base.Optional;
 import java.io.InputStream;
 import java.util.Collections;
@@ -24,6 +25,7 @@ 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.DataTreeCandidate;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.Module;
@@ -41,7 +43,7 @@ public class Bug2690FixTest {
     public void prepare() {
         schemaContext = createTestContext();
         assertNotNull("Schema context must not be null.", schemaContext);
-        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext));
+        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext, TreeType.OPERATIONAL));
         inMemoryDataTree =  (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create();
         inMemoryDataTree.setSchemaContext(schemaContext);
     }
index 6812122eb494701ffb446bac29e83eac45778533..aa8bce59a3bf71a2c1ed002158e5584f9365fab4 100644 (file)
@@ -6,6 +6,7 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder;
 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder;
+
 import com.google.common.base.Optional;
 import org.junit.Before;
 import org.junit.Test;
@@ -17,6 +18,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificat
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
@@ -55,7 +57,7 @@ public class ConcurrentTreeModificationTest {
     public void prepare() {
         schemaContext = TestModel.createTestContext();
         assertNotNull("Schema context must not be null.", schemaContext);
-        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext));
+        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext,TreeType.OPERATIONAL));
         inMemoryDataTree = (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create();
         inMemoryDataTree.setSchemaContext(schemaContext);
     }
@@ -87,224 +89,224 @@ public class ConcurrentTreeModificationTest {
 
     @Test
     public void writeWrite1stLevelEmptyTreeTest() throws DataValidationFailedException {
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         modificationTree2.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         try {
             inMemoryDataTree.validate(modificationTree2);
             fail("Exception should have been thrown.");
-        } catch (ConflictingModificationAppliedException ex) {
+        } catch (final ConflictingModificationAppliedException ex) {
             LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
         }
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        Optional<NormalizedNode<?, ?>> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
+        final Optional<NormalizedNode<?, ?>> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
         assertPresentAndType(testNodeAfterCommits, ContainerNode.class);
     }
 
     @Test
     public void writeMerge1stLevelEmptyTreeTest() throws DataValidationFailedException {
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         modificationTree2.merge(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        Optional<NormalizedNode<?, ?>> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
+        final Optional<NormalizedNode<?, ?>> testNodeAfterCommits = modificationTree1.readNode(TestModel.TEST_PATH);
         assertPresentAndType(testNodeAfterCommits, ContainerNode.class);
     }
 
     @Test
     public void writeWriteFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
         modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         try {
             inMemoryDataTree.validate(modificationTree2);
             fail("Exception should have been thrown.");
-            DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+            final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
             inMemoryDataTree.commit(prepare2);
-        } catch (ConflictingModificationAppliedException ex) {
+        } catch (final ConflictingModificationAppliedException ex) {
             LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
         }
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
     }
 
     @Test
     public void writeMergeFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
         modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
     }
 
     @Test
     public void mergeWriteFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
         modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         try {
             inMemoryDataTree.validate(modificationTree2);
             fail("Exception should have been thrown.");
-            DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+            final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
             inMemoryDataTree.commit(prepare2);
-        } catch (ConflictingModificationAppliedException ex) {
+        } catch (final ConflictingModificationAppliedException ex) {
             LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
         }
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
     }
 
     @Test
     public void mergeMergeFooBar1stLevelEmptyTreeTest() throws DataValidationFailedException {
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
         modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
     }
 
     @Test
     public void writeWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
         modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         try {
             inMemoryDataTree.validate(modificationTree2);
             fail("Exception should have been thrown.");
-            DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+            final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
             inMemoryDataTree.commit(prepare2);
-        } catch (ConflictingModificationAppliedException ex) {
+        } catch (final ConflictingModificationAppliedException ex) {
             LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
         }
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
     }
 
     @Test
     public void writeMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.write(TestModel.TEST_PATH, createFooTestContainerNode());
         modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
     }
@@ -312,305 +314,305 @@ public class ConcurrentTreeModificationTest {
 
     @Test
     public void mergeWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
         modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         try {
             inMemoryDataTree.validate(modificationTree2);
             fail("Exception should have been thrown.");
-            DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+            final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
             inMemoryDataTree.commit(prepare2);
-        } catch (ConflictingModificationAppliedException ex) {
+        } catch (final ConflictingModificationAppliedException ex) {
             LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
         }
 
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertFalse(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH).isPresent());
     }
 
     @Test
     public void mergeMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.merge(TestModel.TEST_PATH, createFooTestContainerNode());
         modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
     }
 
     @Test
     public void deleteWriteFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.delete(TestModel.TEST_PATH);
         modificationTree2.write(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         try {
             inMemoryDataTree.validate(modificationTree2);
             fail("Exception should have been thrown.");
-            DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+            final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
             inMemoryDataTree.commit(prepare2);
-        } catch (ConflictingModificationAppliedException ex) {
+        } catch (final ConflictingModificationAppliedException ex) {
             LOG.debug("ConflictingModificationAppliedException - '{}' was thrown as expected.");
         }
 
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());
     }
 
     @Test
     public void deleteMergeFooBar1stLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.delete(TestModel.TEST_PATH);
         modificationTree2.merge(TestModel.TEST_PATH, createBarTestContainerNode());
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
     }
 
     @Test
     public void writeWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.write(OUTER_LIST_1_PATH, FOO_NODE);
         modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
     }
 
     @Test
     public void writeMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.write(OUTER_LIST_1_PATH, FOO_NODE);
         modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
     }
 
     @Test
     public void mergeWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.merge(OUTER_LIST_1_PATH, FOO_NODE);
         modificationTree2.write(OUTER_LIST_2_PATH, BAR_NODE);
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
     }
 
     @Test
     public void mergeMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.merge(OUTER_LIST_1_PATH, FOO_NODE);
         modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         inMemoryDataTree.validate(modificationTree2);
-        DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+        final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
         inMemoryDataTree.commit(prepare2);
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_1_PATH), MapEntryNode.class);
         assertPresentAndType(snapshotAfterCommits.readNode(OUTER_LIST_2_PATH), MapEntryNode.class);
     }
 
     @Test
     public void deleteWriteFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.delete(TestModel.TEST_PATH);
         modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         try {
             inMemoryDataTree.validate(modificationTree2);
-            DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+            final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
             inMemoryDataTree.commit(prepare2);
             fail("Exception should have been thrown");
-        } catch (Exception e) {
+        } catch (final Exception e) {
             LOG.debug("Exception was thrown because path no longer exist in tree");
         }
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());
     }
 
     @Test
     public void deleteMergeFooBar2ndLevelEmptyContainerTest() throws DataValidationFailedException {
-        DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
+        final DataTreeModification initialDataTreeModification = inMemoryDataTree.takeSnapshot().newModification();
         initialDataTreeModification.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
         initialDataTreeModification.write(TestModel.OUTER_LIST_PATH, mapNodeBuilder(TestModel.OUTER_LIST_QNAME).build());
         inMemoryDataTree.commit(inMemoryDataTree.prepare(initialDataTreeModification));
-        InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
 
-        DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree1 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
-        DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
+        final DataTreeModification modificationTree2 = new InMemoryDataTreeModification(initialDataTreeSnapshot,
                 rootOper);
 
         modificationTree1.delete(TestModel.TEST_PATH);
         modificationTree2.merge(OUTER_LIST_2_PATH, BAR_NODE);
 
         inMemoryDataTree.validate(modificationTree1);
-        DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+        final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
         inMemoryDataTree.commit(prepare1);
 
         try {
             inMemoryDataTree.validate(modificationTree2);
-            DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+            final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
             inMemoryDataTree.commit(prepare2);
             fail("Exception should have been thrown");
-        } catch (Exception e) {
+        } catch (final Exception e) {
             LOG.debug("Exception was thrown because path no longer exist in tree");
         }
 
-        InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
+        final InMemoryDataTreeSnapshot snapshotAfterCommits = inMemoryDataTree.takeSnapshot();
         assertFalse(snapshotAfterCommits.readNode(TestModel.TEST_PATH).isPresent());
     }
 }
diff --git a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ConfigStatementValidationTest.java b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/ConfigStatementValidationTest.java
new file mode 100644 (file)
index 0000000..a3c5dc7
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.impl.schema.tree;
+
+import static org.junit.Assert.assertNotNull;
+import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.leafNode;
+import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder;
+import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+// TODO: expand these tests to catch some more obscure cases
+public class ConfigStatementValidationTest {
+    private static final Logger LOG = LoggerFactory.getLogger(ConfigStatementValidationTest.class);
+
+    private static final Short ONE_ID = 1;
+    private static final Short TWO_ID = 2;
+
+    private static final YangInstanceIdentifier OUTER_LIST_1_PATH = YangInstanceIdentifier.builder(TestModel.OUTER_LIST_PATH)
+            .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, ONE_ID) //
+            .build();
+
+    private static final YangInstanceIdentifier OUTER_LIST_2_PATH = YangInstanceIdentifier.builder(TestModel.OUTER_LIST_PATH)
+            .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, TWO_ID) //
+            .build();
+
+    private static final MapEntryNode INNER_FOO_ENTRY_NODE =
+            ImmutableNodes.mapEntry(TestModel.INNER_LIST_QNAME, TestModel.NAME_QNAME, "foo");
+
+    private static final MapEntryNode INNER_BAR_ENTRY_NODE =
+            ImmutableNodes.mapEntryBuilder(QName.create(TestModel.TEST_QNAME, "inner-list2"), TestModel.NAME_QNAME, "foo")
+                    .withChild(ImmutableNodes.leafNode(TestModel.VALUE_QNAME, "value")).build();
+
+    private static final MapEntryNode FOO_NODE = mapEntryBuilder(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, ONE_ID) //
+            .withChild(mapNodeBuilder(TestModel.INNER_LIST_QNAME).withChild(INNER_FOO_ENTRY_NODE) //
+                    .build()) //
+            .build();
+
+    private static final MapEntryNode BAR_NODE = mapEntryBuilder(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, TWO_ID) //
+            .withChild(mapNodeBuilder(TestModel.INNER_LIST_QNAME).withChild(INNER_BAR_ENTRY_NODE) //
+                    .build()) //
+            .build();
+
+    private SchemaContext schemaContext;
+
+    private ContainerNode createFooTestContainerNode() {
+        return ImmutableContainerNodeBuilder
+                .create()
+                .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
+                .withChild(
+                        mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
+                                .withChild(FOO_NODE).build()).build();
+    }
+
+    private ContainerNode createBarTestContainerNode() {
+        return ImmutableContainerNodeBuilder
+                .create()
+                .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME))
+                .withChild(
+                        mapNodeBuilder(TestModel.OUTER_LIST_QNAME)
+                                .withChild(BAR_NODE).build()).build();
+    }
+
+    @Before
+    public void prepare() {
+        schemaContext = TestModel.createTestContext();
+        assertNotNull("Schema context must not be null.", schemaContext);
+    }
+
+    @Test(expected=SchemaValidationFailedException.class)
+    public void testOnPathFail() throws DataValidationFailedException {
+        final InMemoryDataTree inMemoryDataTree =
+                (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create(TreeType.CONFIGURATION);
+        inMemoryDataTree.setSchemaContext(schemaContext);
+        final InMemoryDataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
+        final YangInstanceIdentifier ii = OUTER_LIST_1_PATH.node(new YangInstanceIdentifier.NodeIdentifier(TestModel.INNER_LIST_QNAME))
+                .node(INNER_FOO_ENTRY_NODE.getIdentifier());
+        modificationTree.write(ii, INNER_FOO_ENTRY_NODE);
+
+        inMemoryDataTree.validate(modificationTree);
+        final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
+        inMemoryDataTree.commit(prepare);
+    }
+
+    @Test(expected=SchemaValidationFailedException.class)
+    public void testOnDataFail() throws DataValidationFailedException {
+        final InMemoryDataTree inMemoryDataTree =
+                (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create(TreeType.CONFIGURATION);
+        inMemoryDataTree.setSchemaContext(schemaContext);
+        final InMemoryDataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
+        modificationTree.write(TestModel.TEST_PATH, createFooTestContainerNode());
+
+        inMemoryDataTree.validate(modificationTree);
+        final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
+        inMemoryDataTree.commit(prepare);
+    }
+
+    @Test(expected=SchemaValidationFailedException.class)
+    public void testOnDataLeafFail() throws DataValidationFailedException {
+        final InMemoryDataTree inMemoryDataTree =
+                (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create(TreeType.CONFIGURATION);
+        inMemoryDataTree.setSchemaContext(schemaContext);
+        final InMemoryDataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
+        modificationTree.write(TestModel.TEST_PATH, createBarTestContainerNode());
+
+        inMemoryDataTree.validate(modificationTree);
+        final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
+        inMemoryDataTree.commit(prepare);
+    }
+
+    @Test(expected=SchemaValidationFailedException.class)
+    public void testOnPathCaseLeafFail() throws DataValidationFailedException {
+        final InMemoryDataTree inMemoryDataTree =
+                (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create(TreeType.CONFIGURATION);
+        inMemoryDataTree.setSchemaContext(schemaContext);
+        final YangInstanceIdentifier.NodeIdentifier choice1Id = new YangInstanceIdentifier.NodeIdentifier(
+                QName.create(TestModel.TEST_QNAME, "choice1"));
+        final YangInstanceIdentifier.NodeIdentifier case2ContId = new YangInstanceIdentifier.NodeIdentifier(
+                QName.create(TestModel.TEST_QNAME, "case2-cont"));
+        final YangInstanceIdentifier ii = TestModel.TEST_PATH.node(choice1Id).node(case2ContId);
+        final ContainerNode case2Cont = Builders.containerBuilder().withNodeIdentifier(case2ContId)
+                .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf1"), "leaf-value")).build();
+
+        final InMemoryDataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
+        modificationTree.write(ii, case2Cont);
+
+        inMemoryDataTree.validate(modificationTree);
+        final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
+        inMemoryDataTree.commit(prepare);
+    }
+
+    @Test(expected=SchemaValidationFailedException.class)
+    public void testOnDataCaseLeafFail() throws DataValidationFailedException {
+        final InMemoryDataTree inMemoryDataTree =
+                (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create(TreeType.CONFIGURATION);
+        inMemoryDataTree.setSchemaContext(schemaContext);
+        final YangInstanceIdentifier.NodeIdentifier choice1Id = new YangInstanceIdentifier.NodeIdentifier(
+                QName.create(TestModel.TEST_QNAME, "choice1"));
+        final YangInstanceIdentifier ii = TestModel.TEST_PATH.node(choice1Id);
+        final ChoiceNode choice1 = Builders.choiceBuilder().withNodeIdentifier(choice1Id)
+                .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case1-leaf1"), "leaf-value")).build();
+
+        final InMemoryDataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
+        modificationTree.write(ii, choice1);
+
+        inMemoryDataTree.validate(modificationTree);
+        final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
+        inMemoryDataTree.commit(prepare);
+    }
+}
index 3f6bca552d5e1b4f8e6a507b84c8547edebf0327..6af9a8fd6710aa7673551633cc53d388b8e5b8c5 100644 (file)
@@ -31,6 +31,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder;
@@ -78,7 +79,7 @@ public class ListConstraintsValidationTest {
     public void prepare() {
         schemaContext = createTestContext();
         assertNotNull("Schema context must not be null.", schemaContext);
-        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext));
+        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext, TreeType.OPERATIONAL));
         inMemoryDataTree =  (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create();
         inMemoryDataTree.setSchemaContext(schemaContext);
         final InMemoryDataTreeSnapshot initialDataTreeSnapshot = inMemoryDataTree.takeSnapshot();
index 2896675c156a0ddc5c2be0612d140dad75ed9c26..73e24ab45dc7c440ee7ad0c98f666ccc46c79f42 100644 (file)
@@ -16,6 +16,7 @@ import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.ma
 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder;
 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder;
 
+import com.google.common.base.Optional;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
@@ -26,14 +27,13 @@ import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNodeFactory;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
-import com.google.common.base.Optional;
-
 
 
 
@@ -104,7 +104,7 @@ public class ModificationMetadataTreeTest {
     public void prepare() {
         schemaContext = TestModel.createTestContext();
         assertNotNull("Schema context must not be null.", schemaContext);
-        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext));
+        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext, TreeType.OPERATIONAL));
     }
 
     /**
@@ -145,10 +145,10 @@ public class ModificationMetadataTreeTest {
 
     @Test
     public void basicReadWrites() {
-        DataTreeModification modificationTree = new InMemoryDataTreeModification(new InMemoryDataTreeSnapshot(schemaContext,
+        final DataTreeModification modificationTree = new InMemoryDataTreeModification(new InMemoryDataTreeSnapshot(schemaContext,
                 TreeNodeFactory.createTreeNodeRecursively(createDocumentOne(), Version.initial()), rootOper),
                 rootOper);
-        Optional<NormalizedNode<?, ?>> originalBarNode = modificationTree.readNode(OUTER_LIST_2_PATH);
+        final Optional<NormalizedNode<?, ?>> originalBarNode = modificationTree.readNode(OUTER_LIST_2_PATH);
         assertTrue(originalBarNode.isPresent());
         assertSame(BAR_NODE, originalBarNode.get());
 
@@ -157,13 +157,13 @@ public class ModificationMetadataTreeTest {
 
         // reads node to /outer-list/1/inner_list/two/value
         // and checks if node is already present
-        Optional<NormalizedNode<?, ?>> barTwoCModified = modificationTree.readNode(TWO_TWO_VALUE_PATH);
+        final Optional<NormalizedNode<?, ?>> barTwoCModified = modificationTree.readNode(TWO_TWO_VALUE_PATH);
         assertTrue(barTwoCModified.isPresent());
         assertEquals(ImmutableNodes.leafNode(TestModel.VALUE_QNAME, "test"), barTwoCModified.get());
 
         // delete node to /outer-list/1/inner_list/two/value
         modificationTree.delete(TWO_TWO_VALUE_PATH);
-        Optional<NormalizedNode<?, ?>> barTwoCAfterDelete = modificationTree.readNode(TWO_TWO_VALUE_PATH);
+        final Optional<NormalizedNode<?, ?>> barTwoCAfterDelete = modificationTree.readNode(TWO_TWO_VALUE_PATH);
         assertFalse(barTwoCAfterDelete.isPresent());
     }
 
@@ -172,7 +172,7 @@ public class ModificationMetadataTreeTest {
         /**
          * Creates empty Snapshot with associated schema context.
          */
-        DataTree t = InMemoryDataTreeFactory.getInstance().create();
+        final DataTree t = InMemoryDataTreeFactory.getInstance().create();
         t.setSchemaContext(schemaContext);
 
         /**
@@ -187,7 +187,7 @@ public class ModificationMetadataTreeTest {
     @Test
     public void createFromEmptyState() {
 
-        DataTreeModification modificationTree = createEmptyModificationTree();
+        final DataTreeModification modificationTree = createEmptyModificationTree();
         /**
          * Writes empty container node to /test
          *
@@ -202,15 +202,15 @@ public class ModificationMetadataTreeTest {
         /**
          * Reads list node from /test/outer-list
          */
-        Optional<NormalizedNode<?, ?>> potentialOuterList = modificationTree.readNode(TestModel.OUTER_LIST_PATH);
+        final Optional<NormalizedNode<?, ?>> potentialOuterList = modificationTree.readNode(TestModel.OUTER_LIST_PATH);
         assertTrue(potentialOuterList.isPresent());
 
         /**
          * Reads container node from /test and verifies that it contains test
          * node
          */
-        Optional<NormalizedNode<?, ?>> potentialTest = modificationTree.readNode(TestModel.TEST_PATH);
-        ContainerNode containerTest = assertPresentAndType(potentialTest, ContainerNode.class);
+        final Optional<NormalizedNode<?, ?>> potentialTest = modificationTree.readNode(TestModel.TEST_PATH);
+        final ContainerNode containerTest = assertPresentAndType(potentialTest, ContainerNode.class);
 
         /**
          *
@@ -224,23 +224,23 @@ public class ModificationMetadataTreeTest {
 
     @Test
     public void writeSubtreeReadChildren() {
-        DataTreeModification modificationTree = createEmptyModificationTree();
+        final DataTreeModification modificationTree = createEmptyModificationTree();
         modificationTree.write(TestModel.TEST_PATH, createTestContainer());
-        Optional<NormalizedNode<?, ?>> potential = modificationTree.readNode(TWO_TWO_PATH);
+        final Optional<NormalizedNode<?, ?>> potential = modificationTree.readNode(TWO_TWO_PATH);
         assertPresentAndType(potential, MapEntryNode.class);
     }
 
     @Test
     public void writeSubtreeDeleteChildren() {
-        DataTreeModification modificationTree = createEmptyModificationTree();
+        final DataTreeModification modificationTree = createEmptyModificationTree();
         modificationTree.write(TestModel.TEST_PATH, createTestContainer());
 
         // We verify data are present
-        Optional<NormalizedNode<?, ?>> potentialBeforeDelete = modificationTree.readNode(TWO_TWO_PATH);
+        final Optional<NormalizedNode<?, ?>> potentialBeforeDelete = modificationTree.readNode(TWO_TWO_PATH);
         assertPresentAndType(potentialBeforeDelete, MapEntryNode.class);
 
         modificationTree.delete(TWO_TWO_PATH);
-        Optional<NormalizedNode<?, ?>> potentialAfterDelete = modificationTree.readNode(TWO_TWO_PATH);
+        final Optional<NormalizedNode<?, ?>> potentialAfterDelete = modificationTree.readNode(TWO_TWO_PATH);
         assertFalse(potentialAfterDelete.isPresent());
 
     }
diff --git a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperationRoot.java b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperationRoot.java
deleted file mode 100644 (file)
index f27beec..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yangtools.yang.data.impl.schema.tree;
-
-
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-
-public class SchemaAwareApplyOperationRoot extends AbstractDataNodeContainerModificationStrategy<ContainerSchemaNode> {
-    private final SchemaContext context;
-
-    public SchemaAwareApplyOperationRoot(final SchemaContext context) {
-        super(context,ContainerNode.class);
-        this.context = context;
-    }
-
-    public SchemaContext getContext() {
-        return context;
-    }
-
-    @Override
-    public String toString() {
-        return "SchemaAwareApplyOperationRoot [context=" + context + "]";
-    }
-
-    @Override
-    @SuppressWarnings("rawtypes")
-    protected DataContainerNodeBuilder createBuilder(NormalizedNode<?, ?> original) {
-        return ImmutableContainerNodeBuilder.create((ContainerNode) original);
-    }
-}
index 20b35b34698e0fcdb6b010d21ab20a9338f35cee..2e5057b59af611fac1efe1e1fc1293bc09dd75e0 100644 (file)
@@ -15,6 +15,7 @@ import static org.junit.Assert.fail;
 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntry;
 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder;
 import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder;
+
 import com.google.common.base.Optional;
 import java.util.Map;
 import org.junit.Before;
@@ -24,6 +25,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.StoreTreeNodes;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNodeFactory;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
@@ -67,7 +69,7 @@ public class StoreTreeNodesTest {
     public void prepare() {
         schemaContext = TestModel.createTestContext();
         assertNotNull("Schema context must not be null.", schemaContext);
-        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext));
+        rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext, TreeType.OPERATIONAL));
     }
 
     public NormalizedNode<?, ?> createDocumentOne() {
@@ -97,34 +99,34 @@ public class StoreTreeNodesTest {
 
     @Test
     public void findNodeTestNodeFound() {
-        InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
+        final InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
                 TreeNodeFactory.createTreeNodeRecursively(createDocumentOne(), Version.initial()), rootOper);
-        TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
-        Optional<TreeNode> node = StoreTreeNodes.findNode(rootNode, OUTER_LIST_1_PATH);
+        final TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
+        final Optional<TreeNode> node = StoreTreeNodes.findNode(rootNode, OUTER_LIST_1_PATH);
         assertPresentAndType(node, TreeNode.class);
     }
 
     @Test
     public void findNodeTestNodeNotFound() {
-        InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
+        final InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
                 TreeNodeFactory.createTreeNodeRecursively(createDocumentOne(), Version.initial()), rootOper);
-        TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
+        final TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
         final YangInstanceIdentifier outerList1InvalidPath = YangInstanceIdentifier.builder(TestModel.OUTER_LIST_PATH)
                 .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, 3) //
                 .build();
-        Optional<TreeNode> node = StoreTreeNodes.findNode(rootNode, outerList1InvalidPath);
+        final Optional<TreeNode> node = StoreTreeNodes.findNode(rootNode, outerList1InvalidPath);
         assertFalse(node.isPresent());
     }
 
     @Test
     public void findNodeCheckedTestNodeFound() {
-        InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
+        final InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
                 TreeNodeFactory.createTreeNodeRecursively(createDocumentOne(), Version.initial()), rootOper);
-        TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
+        final TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
         TreeNode foundNode = null;
         try {
             foundNode = StoreTreeNodes.findNodeChecked(rootNode, OUTER_LIST_1_PATH);
-        } catch (IllegalArgumentException e) {
+        } catch (final IllegalArgumentException e) {
             fail("Illegal argument exception was thrown and should not have been" + e.getMessage());
         }
         assertNotNull(foundNode);
@@ -132,36 +134,36 @@ public class StoreTreeNodesTest {
 
     @Test
     public void findNodeCheckedTestNodeNotFound() {
-        InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
+        final InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
                 TreeNodeFactory.createTreeNodeRecursively(createDocumentOne(), Version.initial()), rootOper);
-        TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
+        final TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
         final YangInstanceIdentifier outerList1InvalidPath = YangInstanceIdentifier.builder(TestModel.OUTER_LIST_PATH)
                 .nodeWithKey(TestModel.OUTER_LIST_QNAME, TestModel.ID_QNAME, 3) //
                 .build();
         try {
             StoreTreeNodes.findNodeChecked(rootNode, outerList1InvalidPath);
             fail("Illegal argument exception should have been thrown");
-        } catch (IllegalArgumentException e) {
+        } catch (final IllegalArgumentException e) {
             LOG.debug("Illegal argument exception was thrown as expected: '{}' - '{}'", e.getClass(), e.getMessage());
         }
     }
 
     @Test
     public void findClosestOrFirstMatchTestNodeExists() {
-        InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
+        final InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
                 TreeNodeFactory.createTreeNodeRecursively(createDocumentOne(), Version.initial()), rootOper);
-        TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
-        Optional<TreeNode> expectedNode = StoreTreeNodes.findNode(rootNode, TWO_TWO_PATH);
+        final TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
+        final Optional<TreeNode> expectedNode = StoreTreeNodes.findNode(rootNode, TWO_TWO_PATH);
         assertPresentAndType(expectedNode, TreeNode.class);
-        Map.Entry<YangInstanceIdentifier, TreeNode> actualNode = StoreTreeNodes.findClosest(rootNode, TWO_TWO_PATH);
+        final Map.Entry<YangInstanceIdentifier, TreeNode> actualNode = StoreTreeNodes.findClosest(rootNode, TWO_TWO_PATH);
         assertEquals("Expected node and actual node are not the same", expectedNode.get(), actualNode.getValue());
     }
 
     @Test
     public void findClosestOrFirstMatchTestNodeDoesNotExist() {
-        InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
+        final InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
                 TreeNodeFactory.createTreeNodeRecursively(createDocumentOne(), Version.initial()), rootOper);
-        TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
+        final TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
         final YangInstanceIdentifier outerListInnerListPath = YangInstanceIdentifier.builder(OUTER_LIST_2_PATH)
                 .node(TestModel.INNER_LIST_QNAME)
                 .build();
@@ -169,28 +171,28 @@ public class StoreTreeNodesTest {
                 .node(TestModel.INNER_LIST_QNAME) //
                 .nodeWithKey(TestModel.INNER_LIST_QNAME, TestModel.NAME_QNAME, "three") //
                 .build();
-        Optional<TreeNode> expectedNode = StoreTreeNodes.findNode(rootNode, outerListInnerListPath);
+        final Optional<TreeNode> expectedNode = StoreTreeNodes.findNode(rootNode, outerListInnerListPath);
         assertPresentAndType(expectedNode, TreeNode.class);
-        Map.Entry<YangInstanceIdentifier, TreeNode> actualNode = StoreTreeNodes.findClosest(rootNode, twoTwoInvalidPath);
+        final Map.Entry<YangInstanceIdentifier, TreeNode> actualNode = StoreTreeNodes.findClosest(rootNode, twoTwoInvalidPath);
         assertEquals("Expected node and actual node are not the same", expectedNode.get(), actualNode.getValue());
     }
 
     @Test
     public void getChildTestChildFound() {
-        InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
+        final InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
                 TreeNodeFactory.createTreeNodeRecursively(createDocumentOne(), Version.initial()), rootOper);
-        TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
-        Optional<TreeNode> node = StoreTreeNodes.getChild(Optional.fromNullable(rootNode),
+        final TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
+        final Optional<TreeNode> node = StoreTreeNodes.getChild(Optional.fromNullable(rootNode),
                 TestModel.TEST_PATH.getLastPathArgument());
         assertPresentAndType(node, TreeNode.class);
     }
 
     @Test
     public void getChildTestChildNotFound() {
-        InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
+        final InMemoryDataTreeSnapshot inMemoryDataTreeSnapshot = new InMemoryDataTreeSnapshot(schemaContext,
                 TreeNodeFactory.createTreeNodeRecursively(createDocumentOne(), Version.initial()), rootOper);
-        TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
-        Optional<TreeNode> node = StoreTreeNodes.getChild(Optional.fromNullable(rootNode),
+        final TreeNode rootNode = inMemoryDataTreeSnapshot.getRootNode();
+        final Optional<TreeNode> node = StoreTreeNodes.getChild(Optional.fromNullable(rootNode),
                 TestModel.OUTER_LIST_PATH.getLastPathArgument());
         assertFalse(node.isPresent());
     }
index 17541fecab02c62f35c7a64cd679ad3ca52849e6..45999a662bd23bc09a1270016d69af6da25ae7ec 100644 (file)
@@ -2,13 +2,31 @@ module odl-datastore-test {
     yang-version 1;
     namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test";
     prefix "store-test";
-    
+
     revision "2014-03-13" {
         description "Initial revision.";
     }
 
     container test {
+        choice choice1 {
+            case case1 {
+                leaf case1-leaf1 {
+                    type string;
+                    config false;
+                }
+            }
+            case case2 {
+                container case2-cont {
+                    leaf case2-leaf1 {
+                        type string;
+                        config false;
+                    }
+                }
+            }
+        }
+
         list outer-list {
+
             key id;
             leaf id {
                 type uint16;
@@ -29,6 +47,7 @@ module odl-datastore-test {
                }
            }
            list inner-list {
+               config false;
                 key name;
                 leaf name {
                     type string;
@@ -37,6 +56,18 @@ module odl-datastore-test {
                     type string;
                 }
             }
+
+            list inner-list2 {
+                 key name;
+                 leaf name {
+                     type string;
+                 }
+                 leaf value {
+                     type string;
+                     config false;
+                 }
+             }
+         }
         }
     }
-}
\ No newline at end of file
+}