Add schema-aware builders 78/96378/3
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 27 May 2021 09:40:23 +0000 (11:40 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 27 May 2021 11:45:53 +0000 (13:45 +0200)
The removal of schema-aware builders was a bit premature, as RESTCONF
uses them quite extensively and is not ready to migrate. Resurrect them
and make sure we have them better organized.

JIRA: YANGTOOLS-1249
Change-Id: I900e7905c9451b71fcce2a495aa771a96f760c40
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
23 files changed:
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaAwareBuilders.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAnyXmlNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAugmentationNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUserLeafSetNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUserMapNodeBuilder.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAnyXmlNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAugmentationNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableChoiceNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableContainerNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetEntryNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapEntryNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedLeafSetNodeBuilder.java [new file with mode: 0644]
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedMapNodeBuilder.java [new file with mode: 0644]

diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaAwareBuilders.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaAwareBuilders.java
new file mode 100644 (file)
index 0000000..262d276
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.impl.schema;
+
+import javax.xml.transform.dom.DOMSource;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
+import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
+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.DOMSourceAnyxmlNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.SystemLeafSetNode;
+import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UserLeafSetNode;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.ListNodeBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAnyXmlNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUserLeafSetNodeBuilder;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+@Deprecated(forRemoval = true)
+public final class SchemaAwareBuilders {
+    private SchemaAwareBuilders() {
+        // Hidden on purpose
+    }
+
+    public static NormalizedNodeBuilder<NodeIdentifier, DOMSource, DOMSourceAnyxmlNode> anyXmlBuilder(
+            final AnyxmlSchemaNode schema) {
+        return ImmutableAnyXmlNodeBuilder.create(schema);
+    }
+
+    public static <T> NormalizedNodeBuilder<NodeIdentifier, T, LeafNode<T>> leafBuilder(
+            final LeafSchemaNode schema) {
+        return ImmutableLeafNodeBuilder.create(schema);
+    }
+
+    public static <T> NormalizedNodeBuilder<NodeWithValue, T, LeafSetEntryNode<T>> leafSetEntryBuilder(
+            final LeafListSchemaNode schema) {
+        return ImmutableLeafSetEntryNodeBuilder.create(schema);
+    }
+
+    public static <T> ListNodeBuilder<T, UserLeafSetNode<T>> orderedLeafSetBuilder(final LeafListSchemaNode schema) {
+        return ImmutableUserLeafSetNodeBuilder.create(schema);
+    }
+
+    public static <T> ListNodeBuilder<T, SystemLeafSetNode<T>> leafSetBuilder(final LeafListSchemaNode schema) {
+        return ImmutableLeafSetNodeBuilder.create(schema);
+    }
+
+    public static <T> ListNodeBuilder<T, SystemLeafSetNode<T>> leafSetBuilder(final LeafListSchemaNode schema,
+            final LeafSetNode<T> node) {
+        return ImmutableLeafSetNodeBuilder.create(schema, node);
+    }
+
+    public static DataContainerNodeBuilder<NodeIdentifier, ContainerNode> containerBuilder(final ContainerLike schema) {
+        return ImmutableContainerNodeBuilder.create(schema);
+    }
+
+    public static DataContainerNodeBuilder<NodeIdentifier, ContainerNode> containerBuilder(final ContainerLike schema,
+            final ContainerNode node) {
+        return ImmutableContainerNodeBuilder.create(schema, node);
+    }
+
+    public static DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> mapEntryBuilder(
+            final ListSchemaNode schema) {
+        return ImmutableMapEntryNodeBuilder.create(schema);
+    }
+
+    public static CollectionNodeBuilder<MapEntryNode, SystemMapNode> mapBuilder(final ListSchemaNode schema) {
+        return ImmutableMapNodeBuilder.create(schema);
+    }
+
+    public static CollectionNodeBuilder<MapEntryNode, SystemMapNode> mapBuilder(final ListSchemaNode schema,
+            final MapNode node) {
+        return ImmutableMapNodeBuilder.create(schema, node);
+    }
+
+    public static DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> augmentationBuilder(
+            final AugmentationSchemaNode schema) {
+        return ImmutableAugmentationNodeBuilder.create(schema);
+    }
+
+    public static DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> choiceBuilder(final ChoiceSchemaNode schema) {
+        return ImmutableChoiceNodeBuilder.create(schema);
+    }
+}
index 6c27e99c2088b5a3bf01d1dd51067808a74d0a19..c41053f7b1243781e3221877280a7386b84535d9 100644 (file)
@@ -13,6 +13,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedSimpleValueNode;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
 
 public class ImmutableAnyXmlNodeBuilder
         extends AbstractImmutableNormalizedNodeBuilder<NodeIdentifier, DOMSource, DOMSourceAnyxmlNode> {
@@ -21,6 +22,12 @@ public class ImmutableAnyXmlNodeBuilder
         return new ImmutableAnyXmlNodeBuilder();
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull NormalizedNodeBuilder<NodeIdentifier, DOMSource, DOMSourceAnyxmlNode> create(
+            final AnyxmlSchemaNode schema) {
+        return new SchemaAwareImmutableAnyXmlNodeBuilder(schema);
+    }
+
     @Override
     public ImmutableAnyXmlNodeBuilder withValue(final DOMSource withValue) {
         super.withValue(withValue);
index e445f42fb630f23e68a66ba5ed5d44c4678c2acc..7d5975a3eabd4480d7b1693424f4833c38dd6c7c 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 
 public class ImmutableAugmentationNodeBuilder
         extends AbstractImmutableDataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> {
@@ -27,7 +28,7 @@ public class ImmutableAugmentationNodeBuilder
         super(sizeHint);
     }
 
-    public ImmutableAugmentationNodeBuilder(final ImmutableAugmentationNode node) {
+    ImmutableAugmentationNodeBuilder(final ImmutableAugmentationNode node) {
         super(node);
     }
 
@@ -49,6 +50,12 @@ public class ImmutableAugmentationNodeBuilder
         return new ImmutableAugmentationNodeBuilder((ImmutableAugmentationNode)node);
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> create(
+            final AugmentationSchemaNode schema) {
+        return new SchemaAwareImmutableAugmentationNodeBuilder(schema);
+    }
+
     @Override
     public DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> withChild(
             final DataContainerChild child) {
index 333eec5a87f9a62763c3d82a31942c6846d87abb..e64596495359213a85bb123dc175f53f9020d50c 100644 (file)
@@ -14,9 +14,9 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgum
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode;
+import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 
 public class ImmutableChoiceNodeBuilder extends AbstractImmutableDataContainerNodeBuilder<NodeIdentifier, ChoiceNode> {
-
     protected ImmutableChoiceNodeBuilder() {
 
     }
@@ -45,6 +45,11 @@ public class ImmutableChoiceNodeBuilder extends AbstractImmutableDataContainerNo
         return new ImmutableChoiceNodeBuilder((ImmutableChoiceNode)node);
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> create(final ChoiceSchemaNode schema) {
+        return new SchemaAwareImmutableChoiceNodeBuilder(schema);
+    }
+
     @Override
     public ChoiceNode build() {
         return new ImmutableChoiceNode(getNodeIdentifier(), buildValue());
index 35abfd734fbbd23653cf8df9092b18afe2df4b01..41b30f55466f668eff45671bb7a01ad37ccb510e 100644 (file)
@@ -14,6 +14,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgum
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
 
 public class ImmutableContainerNodeBuilder
         extends AbstractImmutableDataContainerNodeBuilder<NodeIdentifier, ContainerNode> {
@@ -44,6 +45,20 @@ public class ImmutableContainerNodeBuilder
         return new ImmutableContainerNodeBuilder((ImmutableContainerNode) node);
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull DataContainerNodeBuilder<NodeIdentifier, ContainerNode> create(final ContainerLike schema) {
+        return new SchemaAwareImmutableContainerNodeBuilder(schema);
+    }
+
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull DataContainerNodeBuilder<NodeIdentifier, ContainerNode> create(final ContainerLike schema,
+            final ContainerNode node) {
+        if (!(node instanceof ImmutableContainerNode)) {
+            throw new UnsupportedOperationException("Cannot initialize from class " + node.getClass());
+        }
+        return new SchemaAwareImmutableContainerNodeBuilder(schema, (ImmutableContainerNode)node);
+    }
+
     @Override
     public ContainerNode build() {
         return new ImmutableContainerNode(getNodeIdentifier(), buildValue());
index 35450a275a24526e8221d39da171e2d2807de0e3..43eb82f2ff8b252a869248032bfeee073a2c9152 100644 (file)
@@ -13,6 +13,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedSimpleValueNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 
 public class ImmutableLeafNodeBuilder<T>
         extends AbstractImmutableNormalizedNodeBuilder<NodeIdentifier, T, LeafNode<T>> {
@@ -21,6 +22,12 @@ public class ImmutableLeafNodeBuilder<T>
         return new ImmutableLeafNodeBuilder<>();
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static <T> @NonNull NormalizedNodeBuilder<NodeIdentifier, T, LeafNode<T>> create(
+            final LeafSchemaNode schema) {
+        return new SchemaAwareImmutableLeafNodeBuilder<>(schema);
+    }
+
     @Beta
     @SuppressWarnings("unchecked")
     public static <T> @NonNull LeafNode<T> createNode(final NodeIdentifier identifier, final T value) {
index 8cf0f76cf93536d1f611d29ab37c8ba58e8f29a4..18106f16f1651f00a6723607c03ae563c69601e5 100644 (file)
@@ -13,7 +13,9 @@ import java.util.Objects;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedSimpleValueNode;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 
 public class ImmutableLeafSetEntryNodeBuilder<T>
         extends AbstractImmutableNormalizedNodeBuilder<NodeWithValue, T, LeafSetEntryNode<T>> {
@@ -22,16 +24,22 @@ public class ImmutableLeafSetEntryNodeBuilder<T>
         return new ImmutableLeafSetEntryNodeBuilder<>();
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static <T> @NonNull NormalizedNodeBuilder<NodeWithValue, T, LeafSetEntryNode<T>> create(
+            final LeafListSchemaNode schema) {
+        return new SchemaAwareImmutableLeafSetEntryNodeBuilder<>(schema);
+    }
+
     @Override
     public LeafSetEntryNode<T> build() {
         return new ImmutableLeafSetEntryNode<>(getNodeIdentifier(), getValue());
     }
 
     private static final class ImmutableLeafSetEntryNode<T>
-            extends AbstractImmutableNormalizedSimpleValueNode<NodeWithValue, LeafSetEntryNode<?>, T>
+            extends AbstractImmutableNormalizedSimpleValueNode<NodeWithValue<T>, LeafSetEntryNode<?>, T>
             implements LeafSetEntryNode<T> {
 
-        ImmutableLeafSetEntryNode(final NodeWithValue nodeIdentifier, final T value) {
+        ImmutableLeafSetEntryNode(final NodeWithValue<T> nodeIdentifier, final T value) {
             super(nodeIdentifier, value);
             checkArgument(Objects.deepEquals(nodeIdentifier.getValue(), value),
                     "Node identifier contains different value: %s than value itself: %s", nodeIdentifier, value);
index 0a0dd41567bc05dbf310e302310e016cc1e5e237..d034b7f942659476d60aeeb64e7e7221b7740911 100644 (file)
@@ -18,9 +18,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
 import org.opendaylight.yangtools.yang.data.api.schema.SystemLeafSetNode;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.ListNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedValueNode;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 
 public class ImmutableLeafSetNodeBuilder<T> implements ListNodeBuilder<T, SystemLeafSetNode<T>> {
     private static final int DEFAULT_CAPACITY = 4;
@@ -55,11 +57,24 @@ public class ImmutableLeafSetNodeBuilder<T> implements ListNodeBuilder<T, System
     }
 
     public static <T> @NonNull ListNodeBuilder<T, SystemLeafSetNode<T>> create(final SystemLeafSetNode<T> node) {
-        if (!(node instanceof ImmutableLeafSetNode<?>)) {
-            throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass()));
+        if (node instanceof ImmutableLeafSetNode) {
+            return new ImmutableLeafSetNodeBuilder<>((ImmutableLeafSetNode<T>) node);
         }
+        throw new UnsupportedOperationException("Cannot initialize from class " + node.getClass());
+    }
+
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static <T> @NonNull ListNodeBuilder<T, SystemLeafSetNode<T>> create(final LeafListSchemaNode schema) {
+        return new SchemaAwareImmutableLeafSetNodeBuilder<>(schema);
+    }
 
-        return new ImmutableLeafSetNodeBuilder<>((ImmutableLeafSetNode<T>) node);
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static <T> @NonNull ListNodeBuilder<T, SystemLeafSetNode<T>> create(final LeafListSchemaNode schema,
+            final LeafSetNode<T> node) {
+        if (node instanceof ImmutableLeafSetNode) {
+            return new SchemaAwareImmutableLeafSetNodeBuilder<>(schema, (ImmutableLeafSetNode<T>) node);
+        }
+        throw new UnsupportedOperationException("Cannot initialize from class " + node.getClass());
     }
 
     @Override
index 44d6930e2cfdda30088fdf820d9cada6b9f08096..55d6efd5793b444a91a272b86a0027d86c63bd4e 100644 (file)
@@ -23,6 +23,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNode
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException;
 import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -58,12 +59,18 @@ public class ImmutableMapEntryNodeBuilder
     public static @NonNull DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> create(
             final MapEntryNode node) {
         if (!(node instanceof ImmutableMapEntryNode)) {
-            throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass()));
+            throw new UnsupportedOperationException("Cannot initialize from class " + node.getClass());
         }
 
         return new ImmutableMapEntryNodeBuilder((ImmutableMapEntryNode)node);
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> create(
+            final ListSchemaNode schema) {
+        return new SchemaAwareImmutableMapEntryNodeBuilder(schema);
+    }
+
     private static void fillQNames(final Iterable<DataContainerChild> iterable, final Map<QName, PathArgument> out) {
         for (final DataContainerChild child : iterable) {
             putQName(out, child);
index 728e977e1db192401d833ee37b928e6d8cd36bd9..c574e4400105584038cdf8802f2481e6b71ddf84 100644 (file)
@@ -21,9 +21,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBuilder;
 import org.opendaylight.yangtools.yang.data.spi.node.AbstractNormalizedNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
 public class ImmutableMapNodeBuilder implements CollectionNodeBuilder<MapEntryNode, SystemMapNode> {
     private static final int DEFAULT_CAPACITY = 4;
@@ -62,6 +64,20 @@ public class ImmutableMapNodeBuilder implements CollectionNodeBuilder<MapEntryNo
         return new ImmutableMapNodeBuilder(node);
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull CollectionNodeBuilder<MapEntryNode, SystemMapNode> create(final ListSchemaNode schema) {
+        return new SchemaAwareImmutableMapNodeBuilder(schema);
+    }
+
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull CollectionNodeBuilder<MapEntryNode, SystemMapNode> create(final ListSchemaNode schema,
+            final MapNode node) {
+        if (node instanceof ImmutableMapNode) {
+            return new SchemaAwareImmutableMapNodeBuilder(schema, (ImmutableMapNode) node);
+        }
+        throw new UnsupportedOperationException("Cannot initialize from class " + node.getClass());
+    }
+
     @Override
     public ImmutableMapNodeBuilder withChild(final MapEntryNode child) {
         this.value.put(child.getIdentifier(), child);
index dbed22fc10e9917aa8856f7e11fcdc6916221cfa..7c593ecfa50b1302546fe43ed14e49047c7aa872 100644 (file)
@@ -19,21 +19,23 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UserLeafSetNode;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.ListNodeBuilder;
 import org.opendaylight.yangtools.yang.data.spi.node.AbstractNormalizedNode;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 
-public final class ImmutableUserLeafSetNodeBuilder<T> implements ListNodeBuilder<T, UserLeafSetNode<T>> {
+public class ImmutableUserLeafSetNodeBuilder<T> implements ListNodeBuilder<T, UserLeafSetNode<T>> {
     private Map<NodeWithValue, LeafSetEntryNode<T>> value;
     private NodeIdentifier nodeIdentifier;
     private boolean dirty;
 
-    private ImmutableUserLeafSetNodeBuilder() {
+    ImmutableUserLeafSetNodeBuilder() {
         value = new LinkedHashMap<>();
         dirty = false;
     }
 
-    private ImmutableUserLeafSetNodeBuilder(final ImmutableUserLeafSetNode<T> node) {
+    ImmutableUserLeafSetNodeBuilder(final ImmutableUserLeafSetNode<T> node) {
         nodeIdentifier = node.getIdentifier();
         value = node.getChildren();
         dirty = true;
@@ -52,6 +54,20 @@ public final class ImmutableUserLeafSetNodeBuilder<T> implements ListNodeBuilder
         return new ImmutableUserLeafSetNodeBuilder<>((ImmutableUserLeafSetNode<T>) node);
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static <T> @NonNull ListNodeBuilder<T, UserLeafSetNode<T>> create(final LeafListSchemaNode schema) {
+        return new SchemaAwareImmutableOrderedLeafSetNodeBuilder<>(schema);
+    }
+
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static <T> @NonNull ListNodeBuilder<T, UserLeafSetNode<T>> create(final LeafListSchemaNode schema,
+            final LeafSetNode<T> node) {
+        if (node instanceof ImmutableUserLeafSetNode<?>) {
+            return new SchemaAwareImmutableOrderedLeafSetNodeBuilder<>(schema, (ImmutableUserLeafSetNode<T>) node);
+        }
+        throw new UnsupportedOperationException("Cannot initialize from class " + node.getClass());
+    }
+
     private void checkDirty() {
         if (dirty) {
             value = new LinkedHashMap<>(value);
index 5a6f577fb49c35fbc076deb432f86587cdf4c9c4..e51e3546ac2d78d2036ac3dc065883008b16eff6 100644 (file)
@@ -18,19 +18,21 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UserMapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBuilder;
 import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeContainerBuilder;
 import org.opendaylight.yangtools.yang.data.spi.node.AbstractNormalizedNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
-public final class ImmutableUserMapNodeBuilder implements CollectionNodeBuilder<MapEntryNode, UserMapNode> {
+public class ImmutableUserMapNodeBuilder implements CollectionNodeBuilder<MapEntryNode, UserMapNode> {
     private static final int DEFAULT_CAPACITY = 4;
 
     private Map<NodeIdentifierWithPredicates, MapEntryNode> value;
     private NodeIdentifier nodeIdentifier;
     private boolean dirty;
 
-    private ImmutableUserMapNodeBuilder() {
+    ImmutableUserMapNodeBuilder() {
         this.value = new LinkedHashMap<>(DEFAULT_CAPACITY);
         this.dirty = false;
     }
@@ -44,7 +46,7 @@ public final class ImmutableUserMapNodeBuilder implements CollectionNodeBuilder<
         this.dirty = false;
     }
 
-    private ImmutableUserMapNodeBuilder(final ImmutableUserMapNode node) {
+    ImmutableUserMapNodeBuilder(final ImmutableUserMapNode node) {
         this.nodeIdentifier = node.getIdentifier();
         this.value = node.children;
         this.dirty = true;
@@ -66,6 +68,20 @@ public final class ImmutableUserMapNodeBuilder implements CollectionNodeBuilder<
         return new ImmutableUserMapNodeBuilder((ImmutableUserMapNode) node);
     }
 
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull CollectionNodeBuilder<MapEntryNode, UserMapNode> create(final ListSchemaNode schema) {
+        return new SchemaAwareImmutableOrderedMapNodeBuilder(schema);
+    }
+
+    @Deprecated(since = "6.0.7", forRemoval = true)
+    public static @NonNull CollectionNodeBuilder<MapEntryNode, UserMapNode> create(final ListSchemaNode schema,
+            final MapNode node) {
+        if (node instanceof ImmutableUserMapNode) {
+            return new SchemaAwareImmutableOrderedMapNodeBuilder(schema, (ImmutableUserMapNode) node);
+        }
+        throw new UnsupportedOperationException("Cannot initialize from class " + node.getClass());
+    }
+
     private void checkDirty() {
         if (dirty) {
             value = new LinkedHashMap<>(value);
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAnyXmlNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAnyXmlNodeBuilder.java
new file mode 100644 (file)
index 0000000..16e3df0
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import javax.xml.transform.dom.DOMSource;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeBuilder;
+import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
+
+final class SchemaAwareImmutableAnyXmlNodeBuilder extends ImmutableAnyXmlNodeBuilder {
+    SchemaAwareImmutableAnyXmlNodeBuilder(final AnyxmlSchemaNode schema) {
+        super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
+    }
+
+    @Override
+    public ImmutableAnyXmlNodeBuilder withValue(final DOMSource withValue) {
+        return super.withValue(withValue);
+    }
+
+    @Override
+    public NormalizedNodeBuilder<NodeIdentifier, DOMSource, DOMSourceAnyxmlNode> withNodeIdentifier(
+            final NodeIdentifier withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAugmentationNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAugmentationNodeBuilder.java
new file mode 100644 (file)
index 0000000..18ad0bd
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataNodeContainerValidator;
+import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
+
+final class SchemaAwareImmutableAugmentationNodeBuilder extends ImmutableAugmentationNodeBuilder {
+    private final DataNodeContainerValidator validator;
+
+    SchemaAwareImmutableAugmentationNodeBuilder(final AugmentationSchemaNode schema) {
+        this.validator = new DataNodeContainerValidator(schema);
+        super.withNodeIdentifier(DataSchemaContextNode.augmentationIdentifierFrom(schema));
+    }
+
+    @Override
+    public DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> withNodeIdentifier(
+            final AugmentationIdentifier withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+
+    @Override
+    public DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> withChild(
+            final DataContainerChild child) {
+        return super.withChild(validator.validateChild(child));
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableChoiceNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableChoiceNodeBuilder.java
new file mode 100644 (file)
index 0000000..eb26a99
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Optional;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataNodeContainerValidator;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException;
+import org.opendaylight.yangtools.yang.data.util.NormalizedNodeSchemaUtils;
+import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
+
+final class SchemaAwareImmutableChoiceNodeBuilder extends ImmutableChoiceNodeBuilder {
+    private final ChoiceSchemaNode schema;
+    private DataNodeContainerValidator validator;
+
+    SchemaAwareImmutableChoiceNodeBuilder(final ChoiceSchemaNode schema) {
+        this.schema = requireNonNull(schema, "Schema was null");
+        super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
+    }
+
+    @Override
+    public DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> withNodeIdentifier(
+            final NodeIdentifier withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+
+    @Override
+    public DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> withChild(final DataContainerChild child) {
+        if (validator == null) {
+            Optional<CaseSchemaNode> detectedCaseOpt = NormalizedNodeSchemaUtils.detectCase(schema, child);
+            DataValidationException.checkLegalChild(detectedCaseOpt.isPresent(), child.getIdentifier(), schema);
+            validator = new DataNodeContainerValidator(detectedCaseOpt.get());
+        }
+
+        return super.withChild(validator.validateChild(child));
+    }
+
+    @Override
+    public ChoiceNode build() {
+        // TODO validate when statement
+        return super.build();
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableContainerNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableContainerNodeBuilder.java
new file mode 100644 (file)
index 0000000..f697fbb
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataNodeContainerValidator;
+import org.opendaylight.yangtools.yang.model.api.ContainerLike;
+
+public final class SchemaAwareImmutableContainerNodeBuilder extends ImmutableContainerNodeBuilder {
+    private final DataNodeContainerValidator validator;
+
+    SchemaAwareImmutableContainerNodeBuilder(final ContainerLike schema) {
+        this.validator = new DataNodeContainerValidator(schema);
+        super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
+    }
+
+    SchemaAwareImmutableContainerNodeBuilder(final ContainerLike schema, final ImmutableContainerNode node) {
+        super(node);
+        this.validator = new DataNodeContainerValidator(schema);
+        super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
+    }
+
+    @Override
+    public DataContainerNodeBuilder<NodeIdentifier, ContainerNode> withNodeIdentifier(
+            final NodeIdentifier withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+
+    @Override
+    public DataContainerNodeBuilder<NodeIdentifier, ContainerNode> withChild(final DataContainerChild child) {
+        validator.validateChild(child.getIdentifier());
+        return super.withChild(child);
+    }
+
+    @Override
+    public ContainerNode build() {
+        // TODO check when statements... somewhere
+        return super.build();
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafNodeBuilder.java
new file mode 100644 (file)
index 0000000..8732d13
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeBuilder;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+
+final class SchemaAwareImmutableLeafNodeBuilder<T> extends ImmutableLeafNodeBuilder<T> {
+    SchemaAwareImmutableLeafNodeBuilder(final LeafSchemaNode schema) {
+        super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
+    }
+
+    @Override
+    public NormalizedNodeBuilder<NodeIdentifier, T, LeafNode<T>> withValue(final T withValue) {
+        // TODO: check value type
+        return super.withValue(withValue);
+    }
+
+    @Override
+    public NormalizedNodeBuilder<NodeIdentifier, T, LeafNode<T>> withNodeIdentifier(
+            final NodeIdentifier withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetEntryNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetEntryNodeBuilder.java
new file mode 100644 (file)
index 0000000..44a7f5f
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.NormalizedNodeBuilder;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+
+final class SchemaAwareImmutableLeafSetEntryNodeBuilder<T> extends ImmutableLeafSetEntryNodeBuilder<T> {
+    private final LeafListSchemaNode schema;
+
+    SchemaAwareImmutableLeafSetEntryNodeBuilder(final LeafListSchemaNode schema) {
+        this.schema = requireNonNull(schema);
+    }
+
+    @Override
+    public NormalizedNodeBuilder<NodeWithValue, T, LeafSetEntryNode<T>> withValue(final T withValue) {
+        super.withNodeIdentifier(new NodeWithValue<>(schema.getQName(), withValue));
+        // TODO check value type using TypeProvider ?
+        return super.withValue(withValue);
+    }
+
+    @Override
+    public NormalizedNodeBuilder<NodeWithValue, T, LeafSetEntryNode<T>> withNodeIdentifier(
+            final NodeWithValue withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetNodeBuilder.java
new file mode 100644 (file)
index 0000000..aa803b6
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import java.util.Set;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+
+final class SchemaAwareImmutableLeafSetNodeBuilder<T> extends ImmutableLeafSetNodeBuilder<T> {
+    private final LeafListSchemaNode schema;
+
+    SchemaAwareImmutableLeafSetNodeBuilder(final LeafListSchemaNode schema) {
+        this.schema = requireNonNull(schema);
+        super.withNodeIdentifier(new NodeIdentifier(schema.getQName()));
+    }
+
+    SchemaAwareImmutableLeafSetNodeBuilder(final LeafListSchemaNode schema, final ImmutableLeafSetNode<T> node) {
+        super(node);
+        this.schema = requireNonNull(schema);
+        // FIXME: Preconditions.checkArgument(schema.getQName().equals(node.getIdentifier()));
+        super.withNodeIdentifier(new NodeIdentifier(schema.getQName()));
+    }
+
+    @Override
+    public ImmutableLeafSetNodeBuilder<T> withChildValue(final T childValue) {
+        // TODO check value type
+        return super.withChildValue(childValue);
+    }
+
+    @Override
+    public ImmutableLeafSetNodeBuilder<T> withChild(final LeafSetEntryNode<T> child) {
+        final NodeWithValue<T> childId = child.getIdentifier();
+        final QName childName = childId.getNodeType();
+        final QName qname = schema.getQName();
+
+        checkArgument(qname.equals(childName), "Incompatible node type, should be: %s, is: %s", qname, childName);
+        // TODO check value type using TypeProvider ?
+        DataValidationException.checkLegalChild(qname.equals(childName), childId, schema, Set.of(qname));
+        return super.withChild(child);
+    }
+
+    @Override
+    public ImmutableLeafSetNodeBuilder<T> withNodeIdentifier(final NodeIdentifier withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapEntryNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapEntryNodeBuilder.java
new file mode 100644 (file)
index 0000000..b671778
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.opendaylight.yangtools.util.ImmutableMapTemplate;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataNodeContainerValidator;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException.IllegalListKeyException;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+final class SchemaAwareImmutableMapEntryNodeBuilder extends ImmutableMapEntryNodeBuilder {
+    private final ListSchemaNode schema;
+    private final DataNodeContainerValidator validator;
+
+    SchemaAwareImmutableMapEntryNodeBuilder(final ListSchemaNode schema) {
+        this.schema = requireNonNull(schema);
+        this.validator = new DataNodeContainerValidator(schema);
+    }
+
+    @Override
+    public ImmutableMapEntryNodeBuilder withNodeIdentifier(final NodeIdentifierWithPredicates withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+
+    @Override
+    public DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> withChild(
+            final DataContainerChild child) {
+        validator.validateChild(child.getIdentifier());
+        return super.withChild(child);
+    }
+
+    @Override
+    public MapEntryNode build() {
+        super.withNodeIdentifier(constructNodeIdentifier());
+        return super.build();
+    }
+
+    /**
+     * Build map entry node identifier from schema and provided children.
+     */
+    private NodeIdentifierWithPredicates constructNodeIdentifier() {
+        final Map<QName, Object> predicates;
+        final Collection<QName> keys = schema.getKeyDefinition();
+        if (!keys.isEmpty()) {
+            predicates = keyDefToPredicates(keys);
+        } else if (!childrenQNamesToPaths.isEmpty()) {
+            predicates = childrenToPredicates();
+        } else {
+            predicates = ImmutableMap.of();
+        }
+        return NodeIdentifierWithPredicates.of(schema.getQName(), predicates);
+    }
+
+    private Map<QName, Object> childrenToPredicates() {
+        final Object[] values = new Object[childrenQNamesToPaths.size()];
+        int offset = 0;
+        for (Entry<QName, PathArgument> entry : childrenQNamesToPaths.entrySet()) {
+            values[offset++] = nonnullKeyValue(entry.getKey(), getChild(entry.getValue())).body();
+        }
+        return ImmutableMapTemplate.ordered(childrenQNamesToPaths.keySet()).instantiateWithValues(values);
+    }
+
+    private Map<QName, Object> keyDefToPredicates(final Collection<QName> keys) {
+        final Object[] values = new Object[keys.size()];
+        int offset = 0;
+        for (QName key : keys) {
+            values[offset++] = nonnullKeyValue(key, getChild(childrenQNamesToPaths.get(key))).body();
+        }
+        return ImmutableMapTemplate.ordered(keys).instantiateWithValues(values);
+    }
+
+    private DataContainerChild nonnullKeyValue(final QName key, final DataContainerChild value) {
+        if (value != null) {
+            return value;
+        }
+        throw new IllegalListKeyException("Key value not present for key: %s, in: %s values %s", key, schema.getQName(),
+            buildValue());
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapNodeBuilder.java
new file mode 100644 (file)
index 0000000..174fc62
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Set;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+final class SchemaAwareImmutableMapNodeBuilder extends ImmutableMapNodeBuilder {
+    private final ListSchemaNode schema;
+
+    SchemaAwareImmutableMapNodeBuilder(final ListSchemaNode schema) {
+        this.schema = requireNonNull(schema);
+        super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
+    }
+
+    SchemaAwareImmutableMapNodeBuilder(final ListSchemaNode schema, final ImmutableMapNode node) {
+        super(node);
+        this.schema = requireNonNull(schema);
+        super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
+    }
+
+    @Override
+    public ImmutableMapNodeBuilder withChild(final MapEntryNode child) {
+        final NodeIdentifierWithPredicates childId = child.getIdentifier();
+        final QName qname = schema.getQName();
+
+        DataValidationException.checkLegalChild(qname.equals(childId.getNodeType()), childId, schema, Set.of(qname));
+        return super.withChild(child);
+    }
+
+    @Override
+    public ImmutableMapNodeBuilder withNodeIdentifier(final NodeIdentifier withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedLeafSetNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedLeafSetNodeBuilder.java
new file mode 100644 (file)
index 0000000..6c98731
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+import java.util.Set;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+
+final class SchemaAwareImmutableOrderedLeafSetNodeBuilder<T> extends ImmutableUserLeafSetNodeBuilder<T> {
+    private final LeafListSchemaNode schema;
+
+    SchemaAwareImmutableOrderedLeafSetNodeBuilder(final LeafListSchemaNode schema) {
+        this.schema = requireNonNull(schema);
+        super.withNodeIdentifier(new NodeIdentifier(schema.getQName()));
+    }
+
+    SchemaAwareImmutableOrderedLeafSetNodeBuilder(final LeafListSchemaNode schema,
+            final ImmutableUserLeafSetNode<T> node) {
+        super(node);
+        this.schema = requireNonNull(schema);
+        // FIXME: Preconditions.checkArgument(schema.getQName().equals(node.getIdentifier()));
+        super.withNodeIdentifier(new NodeIdentifier(schema.getQName()));
+    }
+
+    @Override
+    public ImmutableUserLeafSetNodeBuilder<T> withChildValue(final T childValue) {
+        // TODO check value type
+        return super.withChildValue(childValue);
+    }
+
+    @Override
+    public ImmutableUserLeafSetNodeBuilder<T> withChild(final LeafSetEntryNode<T> child) {
+        final NodeWithValue<T> childId = child.getIdentifier();
+        final QName childName = childId.getNodeType();
+        final QName qname = schema.getQName();
+
+        checkArgument(qname.equals(childName), "Incompatible node type, should be: %s, is: %s", qname, childName);
+        // TODO check value type using TypeProvider ?
+        DataValidationException.checkLegalChild(qname.equals(childName), childId, schema, Set.of(qname));
+        return super.withChild(child);
+    }
+
+    @Override
+    public ImmutableUserLeafSetNodeBuilder<T> withNodeIdentifier(final NodeIdentifier withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+}
diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedMapNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedMapNodeBuilder.java
new file mode 100644 (file)
index 0000000..3c8a8b9
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2013 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.builder.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import java.util.Set;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UserMapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+final class SchemaAwareImmutableOrderedMapNodeBuilder extends ImmutableUserMapNodeBuilder {
+    private final ListSchemaNode schema;
+
+    SchemaAwareImmutableOrderedMapNodeBuilder(final ListSchemaNode schema) {
+        this.schema = requireNonNull(schema);
+        super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
+    }
+
+    SchemaAwareImmutableOrderedMapNodeBuilder(final ListSchemaNode schema, final ImmutableUserMapNode node) {
+        super(node);
+        this.schema = requireNonNull(schema);
+        super.withNodeIdentifier(NodeIdentifier.create(schema.getQName()));
+    }
+
+    @Override
+    public CollectionNodeBuilder<MapEntryNode, UserMapNode> withChild(final MapEntryNode child) {
+        final NodeIdentifierWithPredicates childId = child.getIdentifier();
+        final QName qname = schema.getQName();
+
+        DataValidationException.checkLegalChild(qname.equals(childId.getNodeType()), childId, schema, Set.of(qname));
+        return super.withChild(child);
+    }
+
+    @Override
+    public CollectionNodeBuilder<MapEntryNode, UserMapNode> withNodeIdentifier(
+            final NodeIdentifier withNodeIdentifier) {
+        throw new UnsupportedOperationException("Node identifier created from schema");
+    }
+}