From ed354e4ac28c35091d7bce0bd74919118916d999 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 27 May 2021 11:40:23 +0200 Subject: [PATCH] Add schema-aware builders 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 --- .../data/impl/schema/SchemaAwareBuilders.java | 114 ++++++++++++++++++ .../impl/ImmutableAnyXmlNodeBuilder.java | 7 ++ .../ImmutableAugmentationNodeBuilder.java | 9 +- .../impl/ImmutableChoiceNodeBuilder.java | 7 +- .../impl/ImmutableContainerNodeBuilder.java | 15 +++ .../impl/ImmutableLeafNodeBuilder.java | 7 ++ .../ImmutableLeafSetEntryNodeBuilder.java | 12 +- .../impl/ImmutableLeafSetNodeBuilder.java | 21 +++- .../impl/ImmutableMapEntryNodeBuilder.java | 9 +- .../builder/impl/ImmutableMapNodeBuilder.java | 16 +++ .../impl/ImmutableUserLeafSetNodeBuilder.java | 22 +++- .../impl/ImmutableUserMapNodeBuilder.java | 22 +++- ...SchemaAwareImmutableAnyXmlNodeBuilder.java | 31 +++++ ...AwareImmutableAugmentationNodeBuilder.java | 37 ++++++ ...SchemaAwareImmutableChoiceNodeBuilder.java | 54 +++++++++ ...emaAwareImmutableContainerNodeBuilder.java | 48 ++++++++ .../SchemaAwareImmutableLeafNodeBuilder.java | 31 +++++ ...AwareImmutableLeafSetEntryNodeBuilder.java | 36 ++++++ ...chemaAwareImmutableLeafSetNodeBuilder.java | 58 +++++++++ ...hemaAwareImmutableMapEntryNodeBuilder.java | 95 +++++++++++++++ .../SchemaAwareImmutableMapNodeBuilder.java | 47 ++++++++ ...areImmutableOrderedLeafSetNodeBuilder.java | 59 +++++++++ ...maAwareImmutableOrderedMapNodeBuilder.java | 50 ++++++++ 23 files changed, 793 insertions(+), 14 deletions(-) create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaAwareBuilders.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAnyXmlNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAugmentationNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableChoiceNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableContainerNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetEntryNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapEntryNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedLeafSetNodeBuilder.java create mode 100644 data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedMapNodeBuilder.java 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 index 0000000000..262d276b28 --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/SchemaAwareBuilders.java @@ -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 anyXmlBuilder( + final AnyxmlSchemaNode schema) { + return ImmutableAnyXmlNodeBuilder.create(schema); + } + + public static NormalizedNodeBuilder> leafBuilder( + final LeafSchemaNode schema) { + return ImmutableLeafNodeBuilder.create(schema); + } + + public static NormalizedNodeBuilder> leafSetEntryBuilder( + final LeafListSchemaNode schema) { + return ImmutableLeafSetEntryNodeBuilder.create(schema); + } + + public static ListNodeBuilder> orderedLeafSetBuilder(final LeafListSchemaNode schema) { + return ImmutableUserLeafSetNodeBuilder.create(schema); + } + + public static ListNodeBuilder> leafSetBuilder(final LeafListSchemaNode schema) { + return ImmutableLeafSetNodeBuilder.create(schema); + } + + public static ListNodeBuilder> leafSetBuilder(final LeafListSchemaNode schema, + final LeafSetNode node) { + return ImmutableLeafSetNodeBuilder.create(schema, node); + } + + public static DataContainerNodeBuilder containerBuilder(final ContainerLike schema) { + return ImmutableContainerNodeBuilder.create(schema); + } + + public static DataContainerNodeBuilder containerBuilder(final ContainerLike schema, + final ContainerNode node) { + return ImmutableContainerNodeBuilder.create(schema, node); + } + + public static DataContainerNodeBuilder mapEntryBuilder( + final ListSchemaNode schema) { + return ImmutableMapEntryNodeBuilder.create(schema); + } + + public static CollectionNodeBuilder mapBuilder(final ListSchemaNode schema) { + return ImmutableMapNodeBuilder.create(schema); + } + + public static CollectionNodeBuilder mapBuilder(final ListSchemaNode schema, + final MapNode node) { + return ImmutableMapNodeBuilder.create(schema, node); + } + + public static DataContainerNodeBuilder augmentationBuilder( + final AugmentationSchemaNode schema) { + return ImmutableAugmentationNodeBuilder.create(schema); + } + + public static DataContainerNodeBuilder choiceBuilder(final ChoiceSchemaNode schema) { + return ImmutableChoiceNodeBuilder.create(schema); + } +} diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAnyXmlNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAnyXmlNodeBuilder.java index 6c27e99c20..c41053f7b1 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAnyXmlNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAnyXmlNodeBuilder.java @@ -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 { @@ -21,6 +22,12 @@ public class ImmutableAnyXmlNodeBuilder return new ImmutableAnyXmlNodeBuilder(); } + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull NormalizedNodeBuilder create( + final AnyxmlSchemaNode schema) { + return new SchemaAwareImmutableAnyXmlNodeBuilder(schema); + } + @Override public ImmutableAnyXmlNodeBuilder withValue(final DOMSource withValue) { super.withValue(withValue); diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAugmentationNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAugmentationNodeBuilder.java index e445f42fb6..7d5975a3ea 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAugmentationNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableAugmentationNodeBuilder.java @@ -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 { @@ -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 create( + final AugmentationSchemaNode schema) { + return new SchemaAwareImmutableAugmentationNodeBuilder(schema); + } + @Override public DataContainerNodeBuilder withChild( final DataContainerChild child) { diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java index 333eec5a87..e645964953 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java @@ -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 { - 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 create(final ChoiceSchemaNode schema) { + return new SchemaAwareImmutableChoiceNodeBuilder(schema); + } + @Override public ChoiceNode build() { return new ImmutableChoiceNode(getNodeIdentifier(), buildValue()); diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java index 35abfd734f..41b30f5546 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java @@ -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 { @@ -44,6 +45,20 @@ public class ImmutableContainerNodeBuilder return new ImmutableContainerNodeBuilder((ImmutableContainerNode) node); } + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull DataContainerNodeBuilder create(final ContainerLike schema) { + return new SchemaAwareImmutableContainerNodeBuilder(schema); + } + + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull DataContainerNodeBuilder 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()); diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java index 35450a275a..43eb82f2ff 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafNodeBuilder.java @@ -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 extends AbstractImmutableNormalizedNodeBuilder> { @@ -21,6 +22,12 @@ public class ImmutableLeafNodeBuilder return new ImmutableLeafNodeBuilder<>(); } + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull NormalizedNodeBuilder> create( + final LeafSchemaNode schema) { + return new SchemaAwareImmutableLeafNodeBuilder<>(schema); + } + @Beta @SuppressWarnings("unchecked") public static @NonNull LeafNode createNode(final NodeIdentifier identifier, final T value) { diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java index 8cf0f76cf9..18106f16f1 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetEntryNodeBuilder.java @@ -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 extends AbstractImmutableNormalizedNodeBuilder> { @@ -22,16 +24,22 @@ public class ImmutableLeafSetEntryNodeBuilder return new ImmutableLeafSetEntryNodeBuilder<>(); } + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull NormalizedNodeBuilder> create( + final LeafListSchemaNode schema) { + return new SchemaAwareImmutableLeafSetEntryNodeBuilder<>(schema); + } + @Override public LeafSetEntryNode build() { return new ImmutableLeafSetEntryNode<>(getNodeIdentifier(), getValue()); } private static final class ImmutableLeafSetEntryNode - extends AbstractImmutableNormalizedSimpleValueNode, T> + extends AbstractImmutableNormalizedSimpleValueNode, LeafSetEntryNode, T> implements LeafSetEntryNode { - ImmutableLeafSetEntryNode(final NodeWithValue nodeIdentifier, final T value) { + ImmutableLeafSetEntryNode(final NodeWithValue 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); diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java index 0a0dd41567..d034b7f942 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableLeafSetNodeBuilder.java @@ -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 implements ListNodeBuilder> { private static final int DEFAULT_CAPACITY = 4; @@ -55,11 +57,24 @@ public class ImmutableLeafSetNodeBuilder implements ListNodeBuilder @NonNull ListNodeBuilder> create(final SystemLeafSetNode 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) node); } + throw new UnsupportedOperationException("Cannot initialize from class " + node.getClass()); + } + + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull ListNodeBuilder> create(final LeafListSchemaNode schema) { + return new SchemaAwareImmutableLeafSetNodeBuilder<>(schema); + } - return new ImmutableLeafSetNodeBuilder<>((ImmutableLeafSetNode) node); + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull ListNodeBuilder> create(final LeafListSchemaNode schema, + final LeafSetNode node) { + if (node instanceof ImmutableLeafSetNode) { + return new SchemaAwareImmutableLeafSetNodeBuilder<>(schema, (ImmutableLeafSetNode) node); + } + throw new UnsupportedOperationException("Cannot initialize from class " + node.getClass()); } @Override diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java index 44d6930e2c..55d6efd579 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java @@ -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 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 create( + final ListSchemaNode schema) { + return new SchemaAwareImmutableMapEntryNodeBuilder(schema); + } + private static void fillQNames(final Iterable iterable, final Map out) { for (final DataContainerChild child : iterable) { putQName(out, child); diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java index 728e977e1d..c574e44001 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapNodeBuilder.java @@ -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 { private static final int DEFAULT_CAPACITY = 4; @@ -62,6 +64,20 @@ public class ImmutableMapNodeBuilder implements CollectionNodeBuilder create(final ListSchemaNode schema) { + return new SchemaAwareImmutableMapNodeBuilder(schema); + } + + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull CollectionNodeBuilder 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); diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUserLeafSetNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUserLeafSetNodeBuilder.java index dbed22fc10..7c593ecfa5 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUserLeafSetNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUserLeafSetNodeBuilder.java @@ -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 implements ListNodeBuilder> { +public class ImmutableUserLeafSetNodeBuilder implements ListNodeBuilder> { private Map> value; private NodeIdentifier nodeIdentifier; private boolean dirty; - private ImmutableUserLeafSetNodeBuilder() { + ImmutableUserLeafSetNodeBuilder() { value = new LinkedHashMap<>(); dirty = false; } - private ImmutableUserLeafSetNodeBuilder(final ImmutableUserLeafSetNode node) { + ImmutableUserLeafSetNodeBuilder(final ImmutableUserLeafSetNode node) { nodeIdentifier = node.getIdentifier(); value = node.getChildren(); dirty = true; @@ -52,6 +54,20 @@ public final class ImmutableUserLeafSetNodeBuilder implements ListNodeBuilder return new ImmutableUserLeafSetNodeBuilder<>((ImmutableUserLeafSetNode) node); } + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull ListNodeBuilder> create(final LeafListSchemaNode schema) { + return new SchemaAwareImmutableOrderedLeafSetNodeBuilder<>(schema); + } + + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull ListNodeBuilder> create(final LeafListSchemaNode schema, + final LeafSetNode node) { + if (node instanceof ImmutableUserLeafSetNode) { + return new SchemaAwareImmutableOrderedLeafSetNodeBuilder<>(schema, (ImmutableUserLeafSetNode) 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/ImmutableUserMapNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUserMapNodeBuilder.java index 5a6f577fb4..e51e3546ac 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUserMapNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUserMapNodeBuilder.java @@ -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 { +public class ImmutableUserMapNodeBuilder implements CollectionNodeBuilder { private static final int DEFAULT_CAPACITY = 4; private Map 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 create(final ListSchemaNode schema) { + return new SchemaAwareImmutableOrderedMapNodeBuilder(schema); + } + + @Deprecated(since = "6.0.7", forRemoval = true) + public static @NonNull CollectionNodeBuilder 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 index 0000000000..16e3df09ee --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAnyXmlNodeBuilder.java @@ -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 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 index 0000000000..18ad0bd9ac --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableAugmentationNodeBuilder.java @@ -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 withNodeIdentifier( + final AugmentationIdentifier withNodeIdentifier) { + throw new UnsupportedOperationException("Node identifier created from schema"); + } + + @Override + public DataContainerNodeBuilder 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 index 0000000000..eb26a99672 --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableChoiceNodeBuilder.java @@ -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 withNodeIdentifier( + final NodeIdentifier withNodeIdentifier) { + throw new UnsupportedOperationException("Node identifier created from schema"); + } + + @Override + public DataContainerNodeBuilder withChild(final DataContainerChild child) { + if (validator == null) { + Optional 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 index 0000000000..f697fbb531 --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableContainerNodeBuilder.java @@ -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 withNodeIdentifier( + final NodeIdentifier withNodeIdentifier) { + throw new UnsupportedOperationException("Node identifier created from schema"); + } + + @Override + public DataContainerNodeBuilder 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 index 0000000000..8732d13d9b --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafNodeBuilder.java @@ -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 extends ImmutableLeafNodeBuilder { + SchemaAwareImmutableLeafNodeBuilder(final LeafSchemaNode schema) { + super.withNodeIdentifier(NodeIdentifier.create(schema.getQName())); + } + + @Override + public NormalizedNodeBuilder> withValue(final T withValue) { + // TODO: check value type + return super.withValue(withValue); + } + + @Override + public NormalizedNodeBuilder> 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 index 0000000000..44a7f5facb --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetEntryNodeBuilder.java @@ -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 extends ImmutableLeafSetEntryNodeBuilder { + private final LeafListSchemaNode schema; + + SchemaAwareImmutableLeafSetEntryNodeBuilder(final LeafListSchemaNode schema) { + this.schema = requireNonNull(schema); + } + + @Override + public NormalizedNodeBuilder> withValue(final T withValue) { + super.withNodeIdentifier(new NodeWithValue<>(schema.getQName(), withValue)); + // TODO check value type using TypeProvider ? + return super.withValue(withValue); + } + + @Override + public NormalizedNodeBuilder> 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 index 0000000000..aa803b62b6 --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableLeafSetNodeBuilder.java @@ -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 extends ImmutableLeafSetNodeBuilder { + private final LeafListSchemaNode schema; + + SchemaAwareImmutableLeafSetNodeBuilder(final LeafListSchemaNode schema) { + this.schema = requireNonNull(schema); + super.withNodeIdentifier(new NodeIdentifier(schema.getQName())); + } + + SchemaAwareImmutableLeafSetNodeBuilder(final LeafListSchemaNode schema, final ImmutableLeafSetNode node) { + super(node); + this.schema = requireNonNull(schema); + // FIXME: Preconditions.checkArgument(schema.getQName().equals(node.getIdentifier())); + super.withNodeIdentifier(new NodeIdentifier(schema.getQName())); + } + + @Override + public ImmutableLeafSetNodeBuilder withChildValue(final T childValue) { + // TODO check value type + return super.withChildValue(childValue); + } + + @Override + public ImmutableLeafSetNodeBuilder withChild(final LeafSetEntryNode child) { + final NodeWithValue 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 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 index 0000000000..b671778fd7 --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapEntryNodeBuilder.java @@ -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 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 predicates; + final Collection 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 childrenToPredicates() { + final Object[] values = new Object[childrenQNamesToPaths.size()]; + int offset = 0; + for (Entry entry : childrenQNamesToPaths.entrySet()) { + values[offset++] = nonnullKeyValue(entry.getKey(), getChild(entry.getValue())).body(); + } + return ImmutableMapTemplate.ordered(childrenQNamesToPaths.keySet()).instantiateWithValues(values); + } + + private Map keyDefToPredicates(final Collection 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 index 0000000000..174fc626d5 --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableMapNodeBuilder.java @@ -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 index 0000000000..6c987315e6 --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedLeafSetNodeBuilder.java @@ -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 extends ImmutableUserLeafSetNodeBuilder { + private final LeafListSchemaNode schema; + + SchemaAwareImmutableOrderedLeafSetNodeBuilder(final LeafListSchemaNode schema) { + this.schema = requireNonNull(schema); + super.withNodeIdentifier(new NodeIdentifier(schema.getQName())); + } + + SchemaAwareImmutableOrderedLeafSetNodeBuilder(final LeafListSchemaNode schema, + final ImmutableUserLeafSetNode node) { + super(node); + this.schema = requireNonNull(schema); + // FIXME: Preconditions.checkArgument(schema.getQName().equals(node.getIdentifier())); + super.withNodeIdentifier(new NodeIdentifier(schema.getQName())); + } + + @Override + public ImmutableUserLeafSetNodeBuilder withChildValue(final T childValue) { + // TODO check value type + return super.withChildValue(childValue); + } + + @Override + public ImmutableUserLeafSetNodeBuilder withChild(final LeafSetEntryNode child) { + final NodeWithValue 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 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 index 0000000000..3c8a8b9bec --- /dev/null +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/SchemaAwareImmutableOrderedMapNodeBuilder.java @@ -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 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 withNodeIdentifier( + final NodeIdentifier withNodeIdentifier) { + throw new UnsupportedOperationException("Node identifier created from schema"); + } +} -- 2.36.6