--- /dev/null
+package org.opendaylight.yangtools.yang.data.composite.node.schema.parser;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode;
+import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
+import org.opendaylight.yangtools.yang.data.composite.node.schema.TestUtils;
+import org.opendaylight.yangtools.yang.data.composite.node.schema.cnsn.parser.CnSnToNormalizedNodeParserFactory;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.Module;
+
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Set;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class Bug2180Test {
+ private Module simpleContainerModule;
+ private Module bug2111TestModule;
+
+ @Before
+ public void init() throws URISyntaxException {
+ Set<Module> modules = TestUtils.loadModulesFrom("/cnsn-to-normalized-node/yang");
+ simpleContainerModule = TestUtils.resolveModule("simple-container-yang", modules);
+ bug2111TestModule = TestUtils.resolveModule("bug2180-test-module", modules);
+ }
+
+ @Test
+ public void orderedListParseTest() throws DataValidationFailedException, URISyntaxException {
+ ContainerSchemaNode topContainerSchemaNode = (ContainerSchemaNode) TestUtils.resolveDataSchemaNode("top", bug2111TestModule);
+ ListSchemaNode aceListSchemaNode = (ListSchemaNode) topContainerSchemaNode.getDataChildByName("ordered-list");
+ ToNormalizedNodeParser<Node<?>, MapNode, ListSchemaNode> mapNodeParser =
+ CnSnToNormalizedNodeParserFactory.getInstance().getMapNodeParser();
+ MapNode mapNode = mapNodeParser.parse(new ArrayList<Node<?>>(), aceListSchemaNode);
+ assertTrue(mapNode instanceof OrderedMapNode);
+ }
+
+ @Test
+ public void unorderedListParseTest() throws DataValidationFailedException, URISyntaxException {
+ ContainerSchemaNode topContainerSchemaNode = (ContainerSchemaNode) TestUtils.resolveDataSchemaNode("cont", simpleContainerModule);
+ ListSchemaNode aceListSchemaNode = (ListSchemaNode) topContainerSchemaNode.getDataChildByName("lst2");
+ ToNormalizedNodeParser<Node<?>, MapNode, ListSchemaNode> mapNodeParser =
+ CnSnToNormalizedNodeParserFactory.getInstance().getMapNodeParser();
+ MapNode mapNode = mapNodeParser.parse(new ArrayList<Node<?>>(), aceListSchemaNode);
+ assertFalse(mapNode instanceof OrderedMapNode);
+ }
+
+ @Test
+ public void orderedLeafListParseTest() throws DataValidationFailedException, URISyntaxException {
+ ContainerSchemaNode topContainerSchemaNode = (ContainerSchemaNode) TestUtils.resolveDataSchemaNode("top", bug2111TestModule);
+ LeafListSchemaNode aceListSchemaNode = (LeafListSchemaNode) topContainerSchemaNode.getDataChildByName("ordered-leaf-list");
+ ToNormalizedNodeParser<Node<?>, LeafSetNode<?>, LeafListSchemaNode> leafSetNodeParser =
+ CnSnToNormalizedNodeParserFactory.getInstance().getLeafSetNodeParser();
+ LeafSetNode<?> leafSetNode = leafSetNodeParser.parse(new ArrayList<Node<?>>(), aceListSchemaNode);
+ assertTrue(leafSetNode instanceof OrderedLeafSetNode);
+ }
+
+ @Test
+ public void unorderedLeafListParseTest() throws DataValidationFailedException, URISyntaxException {
+ ContainerSchemaNode topContainerSchemaNode = (ContainerSchemaNode) TestUtils.resolveDataSchemaNode("cont", simpleContainerModule);
+ LeafListSchemaNode aceListSchemaNode = (LeafListSchemaNode) topContainerSchemaNode.getDataChildByName("lflst1");
+ ToNormalizedNodeParser<Node<?>, LeafSetNode<?>, LeafListSchemaNode> leafSetNodeParser =
+ CnSnToNormalizedNodeParserFactory.getInstance().getLeafSetNodeParser();
+ LeafSetNode<?> leafSetNode = leafSetNodeParser.parse(new ArrayList<Node<?>>(), aceListSchemaNode);
+ assertFalse(leafSetNode instanceof OrderedLeafSetNode);
+ }
+
+}
--- /dev/null
+module bug2180-test-module {
+ yang-version 1;
+
+ namespace "urn:opendaylight:params:xml:ns:yang:controller:md:sal:bug2180:test";
+
+ prefix bug2180-test-module;
+
+ revision 2014-10-22 {
+ description "creating base model for netmod";
+ }
+
+ container top {
+ list ordered-list {
+ key id;
+ ordered-by user;
+ leaf id{
+ type string;
+ }
+ }
+
+ leaf-list ordered-leaf-list {
+ type string;
+ ordered-by user;
+ }
+ }
+}
\ No newline at end of file
*/
package org.opendaylight.yangtools.yang.data.impl.schema;
+import org.opendaylight.yangtools.yang.data.api.Node;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.Node;
import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeSchemaAwareBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedLeafSetNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedLeafSetNodeSchemaAwareBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeSchemaAwareBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
return ImmutableOrderedLeafSetNodeBuilder.create();
}
+ public static <T> ListNodeBuilder<T,LeafSetEntryNode<T>> orderedLeafSetBuilder(final LeafListSchemaNode schema) {
+ return ImmutableOrderedLeafSetNodeSchemaAwareBuilder.<T>create(schema);
+ }
+
public static <T> ListNodeBuilder<T,LeafSetEntryNode<T>> leafSetBuilder(final LeafSetNode<T> node) {
return ImmutableLeafSetNodeBuilder.create(node);
}
return ImmutableOrderedMapNodeBuilder.create();
}
+ public static CollectionNodeBuilder<MapEntryNode, OrderedMapNode> orderedMapBuilder(final ListSchemaNode schema) {
+ return ImmutableOrderedMapNodeSchemaAwareBuilder.create(schema);
+ }
+
public static CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> unkeyedListBuilder() {
return ImmutableUnkeyedListNodeBuilder.create();
}
--- /dev/null
+/*
+ * 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 com.google.common.collect.Sets;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+
+import com.google.common.base.Preconditions;
+
+public final class ImmutableOrderedLeafSetNodeSchemaAwareBuilder<T> extends ImmutableOrderedLeafSetNodeBuilder<T> {
+
+ private final LeafListSchemaNode schema;
+
+ private ImmutableOrderedLeafSetNodeSchemaAwareBuilder(final LeafListSchemaNode schema) {
+ this.schema = Preconditions.checkNotNull(schema);
+ super.withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(schema.getQName()));
+ }
+
+ public ImmutableOrderedLeafSetNodeSchemaAwareBuilder(final LeafListSchemaNode schema, final ImmutableOrderedLeafSetNode<T> node) {
+ super(node);
+ this.schema = Preconditions.checkNotNull(schema);
+ // FIXME: Preconditions.checkArgument(schema.getQName().equals(node.getIdentifier()));
+ super.withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(schema.getQName()));
+ }
+
+ public static <T> ListNodeBuilder<T, LeafSetEntryNode<T>> create(final LeafListSchemaNode schema) {
+ return new ImmutableOrderedLeafSetNodeSchemaAwareBuilder<>(schema);
+ }
+
+ public static <T> ListNodeBuilder<T, LeafSetEntryNode<T>> create(final LeafListSchemaNode schema, final LeafSetNode<T> node) {
+ if (!(node instanceof ImmutableOrderedLeafSetNode<?>)) {
+ throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass()));
+ }
+
+ return new ImmutableOrderedLeafSetNodeSchemaAwareBuilder<T>(schema, (ImmutableOrderedLeafSetNode<T>) node);
+ }
+
+ @Override
+ public ListNodeBuilder<T, LeafSetEntryNode<T>> withChildValue(final T value) {
+ // TODO check value type
+ return super.withChildValue(value);
+ }
+
+ @Override
+ public ListNodeBuilder<T, LeafSetEntryNode<T>> withChild(final LeafSetEntryNode<T> child) {
+ Preconditions.checkArgument(schema.getQName().equals(child.getNodeType()),
+ "Incompatible node type, should be: %s, is: %s", schema.getQName(), child.getNodeType());
+ // TODO check value type using TypeProvider ?
+ DataValidationException.checkLegalChild(schema.getQName().equals(child.getNodeType()), child.getIdentifier(), schema, Sets.newHashSet(schema.getQName()));
+ return super.withChild(child);
+ }
+
+ @Override
+ public ListNodeBuilder<T, LeafSetEntryNode<T>> withNodeIdentifier(final YangInstanceIdentifier.NodeIdentifier nodeIdentifier) {
+ throw new UnsupportedOperationException("Node identifier created from schema");
+ }
+}
*/
package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
+import com.google.common.base.Optional;
+import com.google.common.collect.Iterables;
import org.opendaylight.yangtools.concepts.Immutable;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedNode;
-import com.google.common.base.Optional;
-import com.google.common.collect.Iterables;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
public class ImmutableOrderedMapNodeBuilder
implements CollectionNodeBuilder<MapEntryNode, OrderedMapNode> {
return new ImmutableOrderedMapNodeBuilder();
}
- public static CollectionNodeBuilder<MapEntryNode, OrderedMapNode> create(final OrderedMapNode node) {
+ public static CollectionNodeBuilder<MapEntryNode, OrderedMapNode> create(final MapNode node) {
if (!(node instanceof ImmutableOrderedMapNode)) {
throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass()));
}
--- /dev/null
+/*
+ * 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 com.google.common.base.Preconditions;
+import com.google.common.collect.Sets;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+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.OrderedMapNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataValidationException;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+import com.google.common.base.Preconditions;
+
+public class ImmutableOrderedMapNodeSchemaAwareBuilder extends ImmutableOrderedMapNodeBuilder {
+
+ private final ListSchemaNode schema;
+
+ protected ImmutableOrderedMapNodeSchemaAwareBuilder(final ListSchemaNode schema) {
+ this.schema = Preconditions.checkNotNull(schema);
+ super.withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(schema.getQName()));
+ }
+
+ protected ImmutableOrderedMapNodeSchemaAwareBuilder(final ListSchemaNode schema, final ImmutableOrderedMapNode node) {
+ super(node);
+ this.schema = Preconditions.checkNotNull(schema);
+ super.withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(schema.getQName()));
+ }
+
+ public static CollectionNodeBuilder<MapEntryNode, OrderedMapNode> create(final ListSchemaNode schema) {
+ return new ImmutableOrderedMapNodeSchemaAwareBuilder(schema);
+ }
+
+ public static CollectionNodeBuilder<MapEntryNode, OrderedMapNode> create(final ListSchemaNode schema,
+ final MapNode node) {
+ if (!(node instanceof ImmutableOrderedMapNode)) {
+ throw new UnsupportedOperationException(String.format("Cannot initialize from class %s", node.getClass()));
+ }
+
+ return new ImmutableOrderedMapNodeSchemaAwareBuilder(schema, (ImmutableOrderedMapNode) node);
+ }
+
+ @Override
+ public CollectionNodeBuilder<MapEntryNode, OrderedMapNode> withChild(final MapEntryNode child) {
+ DataValidationException.checkLegalChild(schema.getQName().equals(child.getNodeType()), child.getIdentifier(), schema, Sets.newHashSet(schema.getQName()));
+ return super.withChild(child);
+ }
+
+ @Override
+ public CollectionNodeBuilder<MapEntryNode, OrderedMapNode> withNodeIdentifier(final YangInstanceIdentifier.NodeIdentifier nodeIdentifier) {
+ throw new UnsupportedOperationException("Node identifier created from schema");
+ }
+}
@Override
public final LeafSetNode<?> parse(Iterable<E> childNodes, LeafListSchemaNode schema) {
- ListNodeBuilder<Object, LeafSetEntryNode<Object>> leafListBuilder = Builders.leafSetBuilder(schema);
+ ListNodeBuilder<Object, LeafSetEntryNode<Object>> leafListBuilder =
+ (schema.isUserOrdered() ? Builders.orderedLeafSetBuilder(schema) : Builders.leafSetBuilder(schema));
for (E childNode : childNodes) {
LeafSetEntryNode<?> builtChild = getLeafSetEntryNodeParser().parse(
Collections.singletonList(childNode), schema);
*/
package org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser;
-import java.util.Collections;
-
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.OrderedMapNode;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import java.util.Collections;
+
/**
* Abstract(base) parser for MapNodes, parses elements of type E.
*
@Override
public final MapNode parse(Iterable<E> childNodes, ListSchemaNode schema) {
- CollectionNodeBuilder<MapEntryNode, MapNode> listBuilder = Builders.mapBuilder(schema);
+ if (schema.isUserOrdered()) {
+ CollectionNodeBuilder<MapEntryNode, OrderedMapNode> listBuilder = Builders.orderedMapBuilder(schema);
- for (E childNode : childNodes) {
- MapEntryNode listChild = getMapEntryNodeParser().parse(Collections.singletonList(childNode), schema);
- listBuilder.withChild(listChild);
- }
+ for (E childNode : childNodes) {
+ MapEntryNode listChild = getMapEntryNodeParser().parse(Collections.singletonList(childNode), schema);
+ listBuilder.withChild(listChild);
+ }
+
+ return listBuilder.build();
+ } else {
+ CollectionNodeBuilder<MapEntryNode, MapNode> listBuilder = Builders.mapBuilder(schema);
- return listBuilder.build();
+ for (E childNode : childNodes) {
+ MapEntryNode listChild = getMapEntryNodeParser().parse(Collections.singletonList(childNode), schema);
+ listBuilder.withChild(listChild);
+ }
+
+ return listBuilder.build();
+ }
}
/**