BUG 1975 - yang unkeyed list is transformed to map node 89/11489/13
authorJozef Gloncak <jgloncak@cisco.com>
Tue, 23 Sep 2014 13:21:21 +0000 (15:21 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Thu, 26 Feb 2015 14:09:44 +0000 (15:09 +0100)
Parsers and serializer for base, for concrete DOM type and
for composite node structure to normalized node conversion
were added/modified to make it possible parse|serialize
unkeyed list to|from UnkeyedListNode and parse
OrderedListNode.

yang-data-operations artifact - was added UnkeyedListNodeModification
class to handle cases when unkeyed list is loaded
from input stream

Change-Id: Ia3a9554dea00bb9d424495a2b6ed1f96765be738
Signed-off-by: Jozef Gloncak <jgloncak@cisco.com>
(cherry picked from commit 13b0a924410d92a6d49182161d54cf2cdc50ad56)

42 files changed:
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/CnSnToNormalizedNodeParserFactory.java
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/ListEntryNodeCnSnParser.java [new file with mode: 0644]
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapEntryNodeCnSnParser.java
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapNodeCnSnParser.java
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/OrderedListNodeCnSnParser.java [new file with mode: 0644]
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListEntryNodeCnSnParser.java [new file with mode: 0644]
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListNodeCnSnParser.java [new file with mode: 0644]
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/CnSnFromNormalizedNodeSerializerFactory.java
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/ListEntryNodeCnSnSerializer.java [new file with mode: 0644]
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapEntryNodeCnSnSerializer.java
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapNodeCnSnSerializer.java
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListEntryNodeCnSnSerializer.java [new file with mode: 0644]
yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListNodeCnSnSerializer.java [new file with mode: 0644]
yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/TestUtils.java
yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/parser/Bug2180Test.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/FromNormalizedNodeSerializerFactory.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/ToNormalizedNodeParserFactory.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListEntryNodeBaseParser.java [moved from yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/MapEntryNodeBaseParser.java with 69% similarity]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListNodeBaseParser.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/MapNodeBaseParser.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/NodeParserDispatcher.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/OrderedListNodeBaseParser.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/UnkeyedListNodeBaseParser.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/ListEntryNodeBaseSerializer.java [moved from yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/MapEntryNodeBaseSerializer.java with 73% similarity]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/ListNodeBaseSerializer.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/MapNodeBaseSerializer.java [deleted file]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/NodeSerializerDispatcher.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/DomToNormalizedNodeParserFactory.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/ListEntryNodeDomParser.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapEntryNodeDomParser.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapNodeDomParser.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/OrderedListNodeDomParser.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListEntryNodeDomParser.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListNodeDomParser.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/DomFromNormalizedNodeSerializerFactory.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/ListEntryNodeDomSerializer.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapEntryNodeDomSerializer.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapNodeDomSerializer.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListEntryNodeDomSerializer.java [new file with mode: 0644]
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListNodeDomSerializer.java [new file with mode: 0644]
yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/AbstractContainerNodeModification.java
yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/UnkeyedListNodeModification.java [new file with mode: 0644]

index ce0e20ac580c0a415e3d898e0aa6058c72aa2356..039aa33a7144e53f9574ad02f764c5d9670b438a 100644 (file)
@@ -16,6 +16,9 @@ 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.OrderedMapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParserFactory;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher;
@@ -35,9 +38,12 @@ public class CnSnToNormalizedNodeParserFactory implements ToNormalizedNodeParser
     private final LeafSetNodeCnSnParser leafSetNodeCnSnParser;
     private final MapNodeCnSnParser mapNodeCnSnParser;
     private final MapEntryNodeCnSnParser mapEntryNodeCnSnParser;
+    private final UnkeyedListNodeCnSnParser unkeyedListNodeCnSnParser;
+    private final UnkeyedListEntryNodeCnSnParser unkeyedListEntryNodeCnSnParser;
     private final ChoiceNodeCnSnParser choiceNodeCnSnParser;
     private final AugmentationNodeCnSnParser augmentationNodeCnSnParser;
     private final AnyXmlNodeCnSnParser anyXmlNodeCnSnParser;
+    private final OrderedListNodeCnSnParser orderedListNodeCnSnParser;
 
     private CnSnToNormalizedNodeParserFactory() {
         leafNodeCnSnParser = new LeafNodeCnSnParser();
@@ -53,6 +59,9 @@ public class CnSnToNormalizedNodeParserFactory implements ToNormalizedNodeParser
         containerNodeCnSnParser = new ContainerNodeCnSnParser(dispatcher);
         mapEntryNodeCnSnParser = new MapEntryNodeCnSnParser(dispatcher);
         mapNodeCnSnParser = new MapNodeCnSnParser(mapEntryNodeCnSnParser);
+        orderedListNodeCnSnParser = new OrderedListNodeCnSnParser(mapEntryNodeCnSnParser);
+        unkeyedListEntryNodeCnSnParser = new UnkeyedListEntryNodeCnSnParser(dispatcher);
+        unkeyedListNodeCnSnParser = new UnkeyedListNodeCnSnParser(unkeyedListEntryNodeCnSnParser);
         choiceNodeCnSnParser = new ChoiceNodeCnSnParser(dispatcher);
         augmentationNodeCnSnParser = new AugmentationNodeCnSnParser(dispatcher);
 
@@ -106,4 +115,20 @@ public class CnSnToNormalizedNodeParserFactory implements ToNormalizedNodeParser
     public ToNormalizedNodeParser<Node<?>, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeParser() {
         return anyXmlNodeCnSnParser;
     }
+
+    @Override
+    public ToNormalizedNodeParser<Node<?>, UnkeyedListNode, ListSchemaNode> getUnkeyedListNodeParser() {
+        return unkeyedListNodeCnSnParser;
+    }
+
+    @Override
+    public ToNormalizedNodeParser<Node<?>, UnkeyedListEntryNode, ListSchemaNode> getUnkeyedListEntryNodeParser() {
+        return unkeyedListEntryNodeCnSnParser;
+    }
+
+    @Override
+    public ToNormalizedNodeParser<Node<?>, OrderedMapNode, ListSchemaNode> getOrderedListNodeParser() {
+        return orderedListNodeCnSnParser;
+    }
+
 }
diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/ListEntryNodeCnSnParser.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/ListEntryNodeCnSnParser.java
new file mode 100644 (file)
index 0000000..025b7c9
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * 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.composite.node.schema.cnsn.parser;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.LinkedListMultimap;
+import java.util.Collections;
+import java.util.Map;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
+import org.opendaylight.yangtools.yang.data.composite.node.schema.json.CnSnToNormalizedNodesUtils;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.ListEntryNodeBaseParser;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher;
+
+abstract class ListEntryNodeCnSnParser<N extends DataContainerNode<?>> extends ListEntryNodeBaseParser<Node<?>, N> {
+
+    private final NodeParserDispatcher<Node<?>> dispatcher;
+
+    ListEntryNodeCnSnParser(final NodeParserDispatcher<Node<?>> dispatcher) {
+        this.dispatcher = Preconditions.checkNotNull(dispatcher);
+    }
+
+    @Override
+    protected LinkedListMultimap<QName, Node<?>> mapChildElements(Iterable<Node<?>> elements) {
+        return CnSnToNormalizedNodesUtils.mapChildElementsForSingletonNode(elements.iterator().next());
+    }
+
+    @Override
+    protected NodeParserDispatcher<Node<?>> getDispatcher() {
+        return dispatcher;
+    }
+
+    @Override
+    protected Map<QName, String> getAttributes(Node<?> e) {
+        return Collections.emptyMap();
+    }
+
+}
index ad0b846d64e3d115e25af3d74508054f74396a0f..af2cfefa98501fcc3b4c6f5c1e17181fb487da62 100644 (file)
@@ -7,40 +7,24 @@
  */
 package org.opendaylight.yangtools.yang.data.composite.node.schema.cnsn.parser;
 
-import org.opendaylight.yangtools.yang.data.composite.node.schema.json.CnSnToNormalizedNodesUtils;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.Node;
-import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.MapEntryNodeBaseParser;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.LinkedListMultimap;
-
-public final class MapEntryNodeCnSnParser extends MapEntryNodeBaseParser<Node<?>> {
-
-    private final NodeParserDispatcher<Node<?>> dispatcher;
+public final class MapEntryNodeCnSnParser extends ListEntryNodeCnSnParser<MapEntryNode> {
 
     public MapEntryNodeCnSnParser(final NodeParserDispatcher<Node<?>> dispatcher) {
-        this.dispatcher = Preconditions.checkNotNull(dispatcher);
-    }
-
-
-    @Override
-    protected LinkedListMultimap<QName, Node<?>> mapChildElements(Iterable<Node<?>> elements) {
-        return CnSnToNormalizedNodesUtils.mapChildElementsForSingletonNode(elements.iterator().next());
+        super(dispatcher);
     }
 
     @Override
-    protected NodeParserDispatcher<Node<?>> getDispatcher() {
-        return dispatcher;
+    protected final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> getBuilder(
+            ListSchemaNode schema) {
+        return Builders.mapEntryBuilder(schema);
     }
 
-    @Override
-    protected Map<QName, String> getAttributes(Node<?> e) {
-        return Collections.emptyMap();
-    }
 }
index 5fae7715b3dbc312a540f58962a5818c28f3f837..66c47bbc20f5629377732abe3b93a84844197a6d 100644 (file)
@@ -22,7 +22,7 @@ public final class MapNodeCnSnParser extends MapNodeBaseParser<Node<?>> {
     }
 
     @Override
-    protected ToNormalizedNodeParser<Node<?>, MapEntryNode, ListSchemaNode> getMapEntryNodeParser() {
+    protected ToNormalizedNodeParser<Node<?>, MapEntryNode, ListSchemaNode> getListEntryNodeParser() {
         return mapEntryNodeCnSnParser;
     }
 
diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/OrderedListNodeCnSnParser.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/OrderedListNodeCnSnParser.java
new file mode 100644 (file)
index 0000000..c809c35
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * 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.composite.node.schema.cnsn.parser;
+
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.OrderedListNodeBaseParser;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+public final class OrderedListNodeCnSnParser extends OrderedListNodeBaseParser<Node<?>> {
+
+    private final MapEntryNodeCnSnParser mapEntryNodeCnSnParser;
+
+    public OrderedListNodeCnSnParser(MapEntryNodeCnSnParser mapEntryNodeCnSnParser) {
+        this.mapEntryNodeCnSnParser = mapEntryNodeCnSnParser;
+    }
+
+    @Override
+    protected ToNormalizedNodeParser<Node<?>, MapEntryNode, ListSchemaNode> getListEntryNodeParser() {
+        return mapEntryNodeCnSnParser;
+    }
+
+}
diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListEntryNodeCnSnParser.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListEntryNodeCnSnParser.java
new file mode 100644 (file)
index 0000000..272e834
--- /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.composite.node.schema.cnsn.parser;
+
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+final class UnkeyedListEntryNodeCnSnParser extends ListEntryNodeCnSnParser<UnkeyedListEntryNode> {
+
+    UnkeyedListEntryNodeCnSnParser(final NodeParserDispatcher<Node<?>> dispatcher) {
+        super(dispatcher);
+    }
+
+    @Override
+    protected final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifier, UnkeyedListEntryNode> getBuilder(
+            ListSchemaNode schema) {
+        return Builders.unkeyedListEntryBuilder().withNodeIdentifier(new NodeIdentifier(schema.getQName()));
+    }
+
+}
diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListNodeCnSnParser.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListNodeCnSnParser.java
new file mode 100644 (file)
index 0000000..d5194d6
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * 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.composite.node.schema.cnsn.parser;
+
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.UnkeyedListNodeBaseParser;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+final class UnkeyedListNodeCnSnParser extends UnkeyedListNodeBaseParser<Node<?>> {
+
+    private final UnkeyedListEntryNodeCnSnParser unkeyedListEntryNodeParser;
+
+    UnkeyedListNodeCnSnParser(UnkeyedListEntryNodeCnSnParser unkeyedListEntryNodeParser) {
+        this.unkeyedListEntryNodeParser = unkeyedListEntryNodeParser;
+    }
+
+    @Override
+    protected ToNormalizedNodeParser<Node<?>, UnkeyedListEntryNode, ListSchemaNode> getListEntryNodeParser() {
+        return unkeyedListEntryNodeParser;
+    }
+}
index 681c624903608c7efd179ebd38ec25e1b973583a..87c841182dd8472baa643678510883b16ba1d4f4 100644 (file)
@@ -17,6 +17,7 @@ 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.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializer;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializerFactory;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.NodeSerializerDispatcher;
@@ -37,6 +38,8 @@ public final class CnSnFromNormalizedNodeSerializerFactory implements FromNormal
     private final LeafSetEntryNodeCnSnSerializer leafSetEntryNodeSerializer;
     private final MapEntryNodeCnSnSerializer mapEntryNodeSerializer;
     private final AnyXmlNodeCnSnSerializer anyXmlNodeSerializer;
+    private final UnkeyedListNodeCnSnSerializer unkeyedListNodeSerializer;
+    private final UnkeyedListEntryNodeCnSnSerializer unkeyedListEntryNodeSerializer;
 
     private CnSnFromNormalizedNodeSerializerFactory() {
         final NodeSerializerDispatcher.BaseNodeSerializerDispatcher<Node<?>> dispatcher = new NodeSerializerDispatcher.BaseNodeSerializerDispatcher<Node<?>>(
@@ -55,6 +58,9 @@ public final class CnSnFromNormalizedNodeSerializerFactory implements FromNormal
 
         mapEntryNodeSerializer = new MapEntryNodeCnSnSerializer(dispatcher);
         mapNodeSerializer = new MapNodeCnSnSerializer(mapEntryNodeSerializer);
+
+        unkeyedListEntryNodeSerializer = new UnkeyedListEntryNodeCnSnSerializer(dispatcher);
+        unkeyedListNodeSerializer = new UnkeyedListNodeCnSnSerializer(unkeyedListEntryNodeSerializer);
     }
 
 
@@ -108,4 +114,9 @@ public final class CnSnFromNormalizedNodeSerializerFactory implements FromNormal
     public FromNormalizedNodeSerializer<Node<?>, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeSerializer() {
         return anyXmlNodeSerializer;
     }
+
+    @Override
+    public FromNormalizedNodeSerializer<Node<?>, UnkeyedListNode, ListSchemaNode> getUnkeyedListNodeSerializer() {
+        return unkeyedListNodeSerializer;
+    }
 }
diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/ListEntryNodeCnSnSerializer.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/ListEntryNodeCnSnSerializer.java
new file mode 100644 (file)
index 0000000..fd29a09
--- /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.composite.node.schema.cnsn.serializer;
+
+import com.google.common.base.Preconditions;
+import java.util.Collections;
+import java.util.List;
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
+import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.ListEntryNodeBaseSerializer;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.NodeSerializerDispatcher;
+import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+/**
+ *
+ * Common class for list entry node serialization (MapEntry, UnkeyedListEntry nodes)
+ *
+ * @param <N>
+ *            concrete entry node type
+ */
+abstract class ListEntryNodeCnSnSerializer<N extends DataContainerNode<?>> extends
+        ListEntryNodeBaseSerializer<Node<?>, N> {
+    private final NodeSerializerDispatcher<Node<?>> dispatcher;
+
+    ListEntryNodeCnSnSerializer(final NodeSerializerDispatcher<Node<?>> dispatcher) {
+        this.dispatcher = Preconditions.checkNotNull(dispatcher);
+    }
+
+    @Override
+    public List<Node<?>> serialize(ListSchemaNode schema, N node) {
+        CompositeNodeBuilder<ImmutableCompositeNode> compNodeBuilder = ImmutableCompositeNode.builder();
+        compNodeBuilder.setQName(node.getNodeType());
+        compNodeBuilder.addAll(super.serialize(schema, node));
+        return Collections.<Node<?>> singletonList(compNodeBuilder.toInstance());
+    }
+
+    @Override
+    protected NodeSerializerDispatcher<Node<?>> getNodeDispatcher() {
+        return dispatcher;
+    }
+}
index 1cadd4c6f36056d45bb727c001140e3585b8cc1d..be39870e2a2e34461b6835d74626e9424d9d5173 100644 (file)
@@ -7,35 +7,13 @@
  */
 package org.opendaylight.yangtools.yang.data.composite.node.schema.cnsn.serializer;
 
-import com.google.common.base.Preconditions;
-import java.util.Collections;
-import java.util.List;
 import org.opendaylight.yangtools.yang.data.api.Node;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.MapEntryNodeBaseSerializer;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.NodeSerializerDispatcher;
-import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder;
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
-public class MapEntryNodeCnSnSerializer extends MapEntryNodeBaseSerializer<Node<?>> {
-
-    private final NodeSerializerDispatcher<Node<?>> dispatcher;
+public class MapEntryNodeCnSnSerializer extends ListEntryNodeCnSnSerializer<MapEntryNode> {
 
     MapEntryNodeCnSnSerializer(final NodeSerializerDispatcher<Node<?>> dispatcher) {
-        this.dispatcher = Preconditions.checkNotNull(dispatcher);
-    }
-
-    @Override
-    public List<Node<?>> serialize(ListSchemaNode schema, MapEntryNode node) {
-        CompositeNodeBuilder<ImmutableCompositeNode> compNodeBuilder = ImmutableCompositeNode.builder();
-        compNodeBuilder.setQName(node.getNodeType());
-        compNodeBuilder.addAll(super.serialize(schema, node));
-        return Collections.<Node<?>> singletonList(compNodeBuilder.build());
-    }
-
-    @Override
-    protected NodeSerializerDispatcher<Node<?>> getNodeDispatcher() {
-        return dispatcher;
+        super(dispatcher);
     }
 }
index f6107217c19550feb1801d5603102285abcd1ad2..06767084868919a4403cc2b3bfe23f6c5b24fd10 100644 (file)
@@ -9,11 +9,12 @@ package org.opendaylight.yangtools.yang.data.composite.node.schema.cnsn.serializ
 
 import org.opendaylight.yangtools.yang.data.api.Node;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializer;
-import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.MapNodeBaseSerializer;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.ListNodeBaseSerializer;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
-public class MapNodeCnSnSerializer extends MapNodeBaseSerializer<Node<?>> {
+public class MapNodeCnSnSerializer extends ListNodeBaseSerializer<Node<?>, MapNode, MapEntryNode> {
 
     private final FromNormalizedNodeSerializer<Node<?>, MapEntryNode, ListSchemaNode> mapEntrySerializer;
 
@@ -22,7 +23,7 @@ public class MapNodeCnSnSerializer extends MapNodeBaseSerializer<Node<?>> {
     }
 
     @Override
-    protected FromNormalizedNodeSerializer<Node<?>, MapEntryNode, ListSchemaNode> getMapEntryNodeDomSerializer() {
+    protected FromNormalizedNodeSerializer<Node<?>, MapEntryNode, ListSchemaNode> getListEntryNodeSerializer() {
         return mapEntrySerializer;
     }
 }
diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListEntryNodeCnSnSerializer.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListEntryNodeCnSnSerializer.java
new file mode 100644 (file)
index 0000000..4f877a3
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * 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.composite.node.schema.cnsn.serializer;
+
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.NodeSerializerDispatcher;
+
+final class UnkeyedListEntryNodeCnSnSerializer extends ListEntryNodeCnSnSerializer<UnkeyedListEntryNode> {
+
+    UnkeyedListEntryNodeCnSnSerializer(final NodeSerializerDispatcher<Node<?>> dispatcher) {
+        super(dispatcher);
+    }
+
+}
diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListNodeCnSnSerializer.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListNodeCnSnSerializer.java
new file mode 100644 (file)
index 0000000..289c0a0
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * 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.composite.node.schema.cnsn.serializer;
+
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializer;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.ListNodeBaseSerializer;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+final class UnkeyedListNodeCnSnSerializer extends
+        ListNodeBaseSerializer<Node<?>, UnkeyedListNode, UnkeyedListEntryNode> {
+
+    private final FromNormalizedNodeSerializer<Node<?>, UnkeyedListEntryNode, ListSchemaNode> unkeyedListEntrySerializer;
+
+    UnkeyedListNodeCnSnSerializer(UnkeyedListEntryNodeCnSnSerializer unkeyedListEntrySerializer) {
+        this.unkeyedListEntrySerializer = unkeyedListEntrySerializer;
+    }
+
+    @Override
+    protected FromNormalizedNodeSerializer<Node<?>, UnkeyedListEntryNode, ListSchemaNode> getListEntryNodeSerializer() {
+        return unkeyedListEntrySerializer;
+    }
+}
\ No newline at end of file
index 58c28a8c38adf69fa9195b76615afd3681db17fd..3ad62aea21bc47a531f0c7995af2014c9020b8c4 100644 (file)
@@ -33,8 +33,8 @@ 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.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
-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.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode;
 import org.opendaylight.yangtools.yang.data.impl.NodeFactory;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
@@ -196,14 +196,14 @@ public class TestUtils {
                         Builders.leafBuilder().withNodeIdentifier(getNodeIdentifier("lf21"))
                                 .withValue("value in cont2/lf21").build()).build());
 
-        CollectionNodeBuilder<MapEntryNode, MapNode> lst1 = Builders.mapBuilder().withNodeIdentifier(
+        CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> lst1 = Builders.unkeyedListBuilder().withNodeIdentifier(
                 getNodeIdentifier("lst1"));
-        lst1.withChild(Builders.mapEntryBuilder()
-                .withNodeIdentifier(getNodeIdentifierPredicate("lst1", new HashMap<String, Object>()))
+        lst1.withChild(Builders.unkeyedListEntryBuilder()
+                .withNodeIdentifier(getNodeIdentifier("lst1"))
                 .withValue(Collections.<DataContainerChild<? extends PathArgument, ?>> emptyList()).build());
         containerBuilder.withChild(lst1.build());
 
-        CollectionNodeBuilder<MapEntryNode, MapNode> lst2 = Builders.mapBuilder().withNodeIdentifier(
+        CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> lst2 = Builders.unkeyedListBuilder().withNodeIdentifier(
                 getNodeIdentifier("lst2"));
 
         Map<String, Object> lst2_1 = new HashMap<>();
@@ -212,7 +212,7 @@ public class TestUtils {
         List<DataContainerChild<? extends PathArgument, ?>> lst2_1_values = new ArrayList<>();
         lst2_1_values.add(Builders.leafBuilder().withNodeIdentifier(getNodeIdentifier("lf21"))
                 .withValue("some value21").build());
-        lst2.withChild(Builders.mapEntryBuilder().withNodeIdentifier(getNodeIdentifierPredicate("lst2", lst2_1))
+        lst2.withChild(Builders.unkeyedListEntryBuilder().withNodeIdentifier(getNodeIdentifier("lst2"))
                 .withValue(lst2_1_values).build());
 
         Map<String, Object> lst2_2 = new HashMap<>();
@@ -220,7 +220,7 @@ public class TestUtils {
         List<DataContainerChild<? extends PathArgument, ?>> lst2_2_values = new ArrayList<>();
         lst2_2_values.add(Builders.leafBuilder().withNodeIdentifier(getNodeIdentifier("lf22"))
                 .withValue("some value22").build());
-        lst2.withChild(Builders.mapEntryBuilder().withNodeIdentifier(getNodeIdentifierPredicate("lst2", lst2_2))
+        lst2.withChild(Builders.unkeyedListEntryBuilder().withNodeIdentifier(getNodeIdentifier("lst2"))
                 .withValue(lst2_2_values).build());
         containerBuilder.withChild(lst2.build());
 
index c3f48bd36e3596675b04ca2de3fdda5e2107320e..dbe1c7a8ea7fe040e133c272302d045b865ef37e 100644 (file)
@@ -38,9 +38,9 @@ public class Bug2180Test {
     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);
+        ToNormalizedNodeParser<Node<?>, OrderedMapNode, ListSchemaNode> orderedListNodeParser =
+                CnSnToNormalizedNodeParserFactory.getInstance().getOrderedListNodeParser();
+        MapNode mapNode = orderedListNodeParser.parse(new ArrayList<Node<?>>(), aceListSchemaNode);
         assertTrue(mapNode instanceof OrderedMapNode);
     }
 
index 319752d282bf61a3b8ae43ef6e42eb8701b7d37e..932560c32d4e413da5535954efb42adb39bd4214 100644 (file)
@@ -16,6 +16,7 @@ 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.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
@@ -30,13 +31,14 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
  *            type of resulting/serialized element from NormalizedNode
  */
 public interface FromNormalizedNodeSerializerFactory<E> {
-       FromNormalizedNodeSerializer<E, AugmentationNode, AugmentationSchema> getAugmentationNodeSerializer();
-       FromNormalizedNodeSerializer<E, ChoiceNode, org.opendaylight.yangtools.yang.model.api.ChoiceNode> getChoiceNodeSerializer();
-       FromNormalizedNodeSerializer<E, ContainerNode, ContainerSchemaNode> getContainerNodeSerializer();
-       FromNormalizedNodeSerializer<E, LeafNode<?>, LeafSchemaNode> getLeafNodeSerializer();
-       FromNormalizedNodeSerializer<E, LeafSetEntryNode<?>, LeafListSchemaNode> getLeafSetEntryNodeSerializer();
-       FromNormalizedNodeSerializer<E, LeafSetNode<?>, LeafListSchemaNode> getLeafSetNodeSerializer();
-       FromNormalizedNodeSerializer<E, MapEntryNode, ListSchemaNode> getMapEntryNodeSerializer();
-       FromNormalizedNodeSerializer<E, MapNode, ListSchemaNode> getMapNodeSerializer();
-       FromNormalizedNodeSerializer<E, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeSerializer();
+    FromNormalizedNodeSerializer<E, AugmentationNode, AugmentationSchema> getAugmentationNodeSerializer();
+    FromNormalizedNodeSerializer<E, ChoiceNode, org.opendaylight.yangtools.yang.model.api.ChoiceNode> getChoiceNodeSerializer();
+    FromNormalizedNodeSerializer<E, ContainerNode, ContainerSchemaNode> getContainerNodeSerializer();
+    FromNormalizedNodeSerializer<E, LeafNode<?>, LeafSchemaNode> getLeafNodeSerializer();
+    FromNormalizedNodeSerializer<E, LeafSetEntryNode<?>, LeafListSchemaNode> getLeafSetEntryNodeSerializer();
+    FromNormalizedNodeSerializer<E, LeafSetNode<?>, LeafListSchemaNode> getLeafSetNodeSerializer();
+    FromNormalizedNodeSerializer<E, MapEntryNode, ListSchemaNode> getMapEntryNodeSerializer();
+    FromNormalizedNodeSerializer<E, MapNode, ListSchemaNode> getMapNodeSerializer();
+    FromNormalizedNodeSerializer<E, UnkeyedListNode, ListSchemaNode> getUnkeyedListNodeSerializer();
+    FromNormalizedNodeSerializer<E, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeSerializer();
 }
index 7c2700f7c4139f83208845e570c194b1d445a5aa..c887d3ff7f5164fd104e26b9a004926684dc106b 100644 (file)
@@ -16,6 +16,9 @@ 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.OrderedMapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
@@ -30,13 +33,16 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
  *            type of element to be parsed into NormalizedNode
  */
 public interface ToNormalizedNodeParserFactory<E> {
-       ToNormalizedNodeParser<E, AugmentationNode, AugmentationSchema> getAugmentationNodeParser();
-       ToNormalizedNodeParser<E, ChoiceNode, org.opendaylight.yangtools.yang.model.api.ChoiceNode> getChoiceNodeParser();
-       ToNormalizedNodeParser<E, ContainerNode, ContainerSchemaNode> getContainerNodeParser();
-       ToNormalizedNodeParser<E, LeafNode<?>, LeafSchemaNode> getLeafNodeParser();
-       ToNormalizedNodeParser<E, LeafSetEntryNode<?>, LeafListSchemaNode> getLeafSetEntryNodeParser();
-       ToNormalizedNodeParser<E, LeafSetNode<?>, LeafListSchemaNode> getLeafSetNodeParser();
-       ToNormalizedNodeParser<E, MapEntryNode, ListSchemaNode> getMapEntryNodeParser();
-       ToNormalizedNodeParser<E, MapNode, ListSchemaNode> getMapNodeParser();
-        ToNormalizedNodeParser<E, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeParser();
+    ToNormalizedNodeParser<E, AugmentationNode, AugmentationSchema> getAugmentationNodeParser();
+    ToNormalizedNodeParser<E, ChoiceNode, org.opendaylight.yangtools.yang.model.api.ChoiceNode> getChoiceNodeParser();
+    ToNormalizedNodeParser<E, ContainerNode, ContainerSchemaNode> getContainerNodeParser();
+    ToNormalizedNodeParser<E, LeafNode<?>, LeafSchemaNode> getLeafNodeParser();
+    ToNormalizedNodeParser<E, LeafSetEntryNode<?>, LeafListSchemaNode> getLeafSetEntryNodeParser();
+    ToNormalizedNodeParser<E, LeafSetNode<?>, LeafListSchemaNode> getLeafSetNodeParser();
+    ToNormalizedNodeParser<E, MapEntryNode, ListSchemaNode> getMapEntryNodeParser();
+    ToNormalizedNodeParser<E, MapNode, ListSchemaNode> getMapNodeParser();
+    ToNormalizedNodeParser<E, UnkeyedListNode, ListSchemaNode> getUnkeyedListNodeParser();
+    ToNormalizedNodeParser<E, UnkeyedListEntryNode, ListSchemaNode> getUnkeyedListEntryNodeParser();
+    ToNormalizedNodeParser<E, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeParser();
+    ToNormalizedNodeParser<E, OrderedMapNode, ListSchemaNode> getOrderedListNodeParser();
 }
@@ -9,12 +9,8 @@ package org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser;
 
 import java.util.Map;
 import java.util.Set;
-
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
@@ -23,23 +19,13 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
 /**
- * Abstract(base) parser for MapEntryNodes, parses elements of type E.
+ * Abstract(base) parser for ListNodes (MapNode, UnkeyedListNode), parses elements of type E.
  *
- * @param <E> type of elements to be parsed
+ * @param <E>
+ *            type of elements to be parsed
  */
-public abstract class MapEntryNodeBaseParser<E> extends BaseDispatcherParser<E, MapEntryNode, ListSchemaNode> {
-
-    @Override
-    protected final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> getBuilder(
-            ListSchemaNode schema) {
-        return Builders.mapEntryBuilder(schema);
-    }
-
-    @Override
-    public final MapEntryNode parse(Iterable<E> elements, ListSchemaNode schema) {
-        checkOnlyOneNode(schema, elements);
-        return super.parse(elements, schema);
-    }
+public abstract class ListEntryNodeBaseParser<E, N extends DataContainerNode<?>> extends
+        BaseDispatcherParser<E, N, ListSchemaNode> {
 
     @Override
     protected final Set<DataSchemaNode> getRealSchemasForAugment(ListSchemaNode schema, AugmentationSchema augmentSchema) {
@@ -61,6 +47,12 @@ public abstract class MapEntryNodeBaseParser<E> extends BaseDispatcherParser<E,
         return SchemaUtils.mapChildElementsFromAugments(schema);
     }
 
+    @Override
+    public final N parse(Iterable<E> elements, ListSchemaNode schema) {
+        checkOnlyOneNode(schema, elements);
+        return super.parse(elements, schema);
+    }
+
     @Override
     protected abstract Map<QName, String> getAttributes(E e);
-}
+}
\ No newline at end of file
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListNodeBaseParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListNodeBaseParser.java
new file mode 100644 (file)
index 0000000..67c97a7
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * 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.transform.base.parser;
+
+import java.util.Collections;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+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;
+
+/**
+ * Abstract(base) parser for ListNodes (MapNode, UnkeyedListNode), parses elements of type E.
+ *
+ * @param <E>
+ *            type of elements to be parsed
+ */
+public abstract class ListNodeBaseParser<E, N extends NormalizedNode<?, ?>, O extends NormalizedNode<YangInstanceIdentifier.NodeIdentifier, ?>, S extends ListSchemaNode>
+        implements ToNormalizedNodeParser<E, O, S> {
+
+    @Override
+    public final O parse(Iterable<E> childNodes, S schema) {
+        CollectionNodeBuilder<N, O> listBuilder = provideBuilder(schema);
+        for (E childNode : childNodes) {
+            N listChild = getListEntryNodeParser().parse(Collections.singletonList(childNode), schema);
+            listBuilder.withChild(listChild);
+        }
+
+        return listBuilder.build();
+    }
+
+    /**
+     *
+     * @return parser for inner ListEntryNodes used to parse every entry of ListNode, might be the same instance in case
+     *         its immutable
+     */
+    protected abstract ToNormalizedNodeParser<E, N, S> getListEntryNodeParser();
+
+    /**
+     *
+     * @return prepares builder which will contain entries of list according to concrete list type
+     */
+    protected abstract CollectionNodeBuilder<N, O> provideBuilder(S schema);
+}
index 581d5f4b781633d4f0da8509d25a38781fbcc6cb..a57a694e126668684bf9310804aa0f50aea7f062 100644 (file)
@@ -9,48 +9,20 @@ package org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser;
 
 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.
  *
- * @param <E> type of elements to be parsed
+ * @param <E>
+ *            type of elements to be parsed
  */
-public abstract class MapNodeBaseParser<E> implements ToNormalizedNodeParser<E, MapNode, ListSchemaNode> {
-
-    @Override
-    public final MapNode parse(Iterable<E> childNodes, ListSchemaNode 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);
-            }
+public abstract class MapNodeBaseParser<E> extends ListNodeBaseParser<E, MapEntryNode, MapNode, ListSchemaNode> {
 
-            return listBuilder.build();
-        } else {
-            CollectionNodeBuilder<MapEntryNode, MapNode> listBuilder = Builders.mapBuilder(schema);
-
-            for (E childNode : childNodes) {
-                MapEntryNode listChild = getMapEntryNodeParser().parse(Collections.singletonList(childNode), schema);
-                listBuilder.withChild(listChild);
-            }
-
-            return listBuilder.build();
-        }
+    protected CollectionNodeBuilder<MapEntryNode, MapNode> provideBuilder(ListSchemaNode schema) {
+        return Builders.mapBuilder(schema);
     }
 
-    /**
-     *
-     * @return parser for inner MapEntryNodes used to parse every entry of MapNode, might be the same instance in case its immutable
-     */
-    protected abstract ToNormalizedNodeParser<E, MapEntryNode, ListSchemaNode> getMapEntryNodeParser();
-
-}
+}
\ No newline at end of file
index 220b2cb04d4058e081bee585bc516bc0e9608319..69cc49a712985affbb01dba8c119b5e3f6c0ae6a 100644 (file)
@@ -51,7 +51,14 @@ public interface NodeParserDispatcher<E> {
             } else if (schema instanceof LeafListSchemaNode) {
                 return factory.getLeafSetNodeParser().parse(childNodes, (LeafListSchemaNode) schema);
             } else if (schema instanceof ListSchemaNode) {
-                return factory.getMapNodeParser().parse(childNodes, (ListSchemaNode) schema);
+                final ListSchemaNode listSchemaNode = (ListSchemaNode)schema;
+                if (listSchemaNode.isUserOrdered()) {
+                    return factory.getOrderedListNodeParser().parse(childNodes, listSchemaNode);
+                } else if (listSchemaNode.getKeyDefinition().isEmpty()) {
+                    return factory.getUnkeyedListNodeParser().parse(childNodes, listSchemaNode);
+                } else {
+                    return factory.getMapNodeParser().parse(childNodes, listSchemaNode);
+                }
             } else if (schema instanceof ChoiceNode) {
                 return factory.getChoiceNodeParser().parse(childNodes, (ChoiceNode) schema);
             } else if (schema instanceof AugmentationSchema) {
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/OrderedListNodeBaseParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/OrderedListNodeBaseParser.java
new file mode 100644 (file)
index 0000000..6278acc
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * 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.transform.base.parser;
+
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+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.model.api.ListSchemaNode;
+
+/**
+ * Abstract(base) parser for OrderedListNodes, parses elements of type E.
+ *
+ * @param <E>
+ *            type of elements to be parsed
+ */
+public abstract class OrderedListNodeBaseParser<E> extends
+        ListNodeBaseParser<E, MapEntryNode, OrderedMapNode, ListSchemaNode> {
+    @Override
+    protected CollectionNodeBuilder<MapEntryNode, OrderedMapNode> provideBuilder(ListSchemaNode schema) {
+        return Builders.orderedMapBuilder(schema);
+    }
+}
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/UnkeyedListNodeBaseParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/UnkeyedListNodeBaseParser.java
new file mode 100644 (file)
index 0000000..14d4789
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * 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.transform.base.parser;
+
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+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.model.api.ListSchemaNode;
+
+/**
+ * Abstract(base) parser for UnkeyedListNodes, parses elements of type E.
+ *
+ * @param <E>
+ *            type of elements to be parsed
+ */
+public abstract class UnkeyedListNodeBaseParser<E> extends
+        ListNodeBaseParser<E, UnkeyedListEntryNode, UnkeyedListNode, ListSchemaNode> {
+    @Override
+    protected CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> provideBuilder(ListSchemaNode schema) {
+        CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> listBuilder = Builders.unkeyedListBuilder();
+        return listBuilder.withNodeIdentifier(new NodeIdentifier(schema.getQName()));
+    }
+}
@@ -8,11 +8,10 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer;
 
 import java.util.Set;
-
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 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.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
@@ -20,16 +19,17 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 
 /**
- * Abstract(base) serializer for MapEntryNodes, serializes elements of type E.
+ * Abstract(base) serializer for ListEntryNodes (MapEntryNode, UnkeyedListEntryNode), serializes elements of type E.
  *
- * @param <E> type of serialized elements
+ * @param <E>
+ *            type of serialized elements
  */
-public abstract class MapEntryNodeBaseSerializer<E> extends
-        BaseDispatcherSerializer<E, MapEntryNode, ListSchemaNode> {
+public abstract class ListEntryNodeBaseSerializer<E, N extends DataContainerNode<?>> extends
+        BaseDispatcherSerializer<E, N, ListSchemaNode> {
 
     @Override
     protected final DataSchemaNode getSchemaForChild(ListSchemaNode schema,
-                                               DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> childNode) {
+            DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> childNode) {
         return SchemaUtils.findSchemaForChild(schema, childNode.getNodeType());
     }
 
@@ -39,7 +39,8 @@ public abstract class MapEntryNodeBaseSerializer<E> extends
     }
 
     @Override
-    protected final Set<DataSchemaNode> getRealSchemasForAugment(ListSchemaNode schema, AugmentationSchema augmentationSchema) {
+    protected final Set<DataSchemaNode> getRealSchemasForAugment(ListSchemaNode schema,
+            AugmentationSchema augmentationSchema) {
         return SchemaUtils.getRealSchemasForAugment((AugmentationTarget) schema, augmentationSchema);
     }
 
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/ListNodeBaseSerializer.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/ListNodeBaseSerializer.java
new file mode 100644 (file)
index 0000000..c90df44
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * 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.transform.base.serializer;
+
+import com.google.common.base.Function;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializer;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+/**
+ * Abstract(base) serializer for ListNodes (MapNode, UnkeyedListNode), serializes elements of type E.
+ *
+ * @param <E>
+ *            type of serialized elements
+ * @param <N>
+ *            containing node type
+ * @param <O>
+ *            entry node type which is inside containing (N) type
+ */
+public abstract class ListNodeBaseSerializer<E, N extends DataContainerChild<NodeIdentifier, Iterable<O>>, O extends DataContainerNode<?>>
+        implements FromNormalizedNodeSerializer<E, N, ListSchemaNode> {
+
+    @Override
+    public final Iterable<E> serialize(final ListSchemaNode schema, final N node) {
+        return Iterables.concat(Iterables.transform(node.getValue(), new Function<O, Iterable<E>>() {
+            @Override
+            public Iterable<E> apply(O input) {
+                final Iterable<E> serializedChild = getListEntryNodeSerializer().serialize(schema, input);
+                final int size = Iterables.size(serializedChild);
+
+                Preconditions.checkState(size == 1,
+                        "Unexpected count of entries  for list serialized from: %s, should be 1, was: %s", input, size);
+                return serializedChild;
+            }
+        }));
+    }
+
+    /**
+     *
+     * @return serializer for inner ListEntryNodes (MapEntryNode, UnkeyedListEntryNode) used to serialize every entry of
+     *         ListNode, might be the same instance in case its immutable
+     */
+    protected abstract FromNormalizedNodeSerializer<E, O, ListSchemaNode> getListEntryNodeSerializer();
+}
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/MapNodeBaseSerializer.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/MapNodeBaseSerializer.java
deleted file mode 100644 (file)
index dba2c5d..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.transform.base.serializer;
-
-import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializer;
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-
-import com.google.common.base.Function;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Iterables;
-
-/**
- * Abstract(base) serializer for MapNodes, serializes elements of type E.
- *
- * @param <E> type of serialized elements
- */
-public abstract class MapNodeBaseSerializer<E> implements FromNormalizedNodeSerializer<E, MapNode, ListSchemaNode> {
-
-    @Override
-    public final Iterable<E> serialize(final ListSchemaNode schema, final MapNode node) {
-        return Iterables.concat(Iterables.transform(node.getValue(), new Function<MapEntryNode, Iterable<E>>() {
-            @Override
-            public Iterable<E> apply(MapEntryNode input) {
-                final Iterable<E> serializedChild = getMapEntryNodeDomSerializer().serialize(schema, input);
-                final int size = Iterables.size(serializedChild);
-
-                Preconditions.checkState(size == 1,
-                        "Unexpected count of entries  for list serialized from: %s, should be 1, was: %s",
-                        input, size);
-                return serializedChild;
-            }
-        }));
-    }
-
-    /**
-     *
-     * @return serializer for inner MapEntryNodes used to serialize every entry of MapNode, might be the same instance in case its immutable
-     */
-    protected abstract FromNormalizedNodeSerializer<E, MapEntryNode, ListSchemaNode> getMapEntryNodeDomSerializer();
-}
index c686c31cba4871577c415937262c62b00c5046fd..e1ac42e5ec1e1d0fc3289841d535b24cb3921b6a 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 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.MixinNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializerFactory;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -65,7 +66,9 @@ public interface NodeSerializerDispatcher<E> {
                 if (dataContainerChild instanceof LeafSetNode<?>) {
                     return onLeafListNode(childSchema, dataContainerChild);
                 } else if (dataContainerChild instanceof MapNode) {
-                    return onListNode(childSchema, dataContainerChild);
+                    return onMapNode(childSchema, dataContainerChild);
+                } else if (dataContainerChild instanceof  UnkeyedListNode) {
+                    return onUnkeyedListNode(childSchema, dataContainerChild);
                 } else if (dataContainerChild instanceof ChoiceNode) {
                     return onChoiceNode(childSchema, dataContainerChild);
                 } else if (dataContainerChild instanceof AugmentationNode) {
@@ -91,12 +94,18 @@ public interface NodeSerializerDispatcher<E> {
                             (ChoiceNode) dataContainerChild);
         }
 
-        private Iterable<E> onListNode(Object childSchema,
+        private Iterable<E> onMapNode(Object childSchema,
                 DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> dataContainerChild) {
             checkSchemaCompatibility(childSchema, ListSchemaNode.class, dataContainerChild);
             return factory.getMapNodeSerializer().serialize((ListSchemaNode) childSchema, (MapNode) dataContainerChild);
         }
 
+        private Iterable<E> onUnkeyedListNode(Object childSchema,
+                DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> dataContainerChild) {
+            checkSchemaCompatibility(childSchema, ListSchemaNode.class, dataContainerChild);
+            return factory.getUnkeyedListNodeSerializer().serialize((ListSchemaNode) childSchema, (UnkeyedListNode) dataContainerChild);
+        }
+
         private Iterable<E> onLeafListNode(Object childSchema,
                 DataContainerChild<? extends YangInstanceIdentifier.PathArgument, ?> dataContainerChild) {
             checkSchemaCompatibility(childSchema, LeafListSchemaNode.class, dataContainerChild);
index a02b60b2fd24b6443596e3dd4fe4e508433b0518..772f425d171cfa16074865856ec195aa91b4353f 100644 (file)
@@ -16,6 +16,9 @@ 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.OrderedMapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParserFactory;
@@ -37,6 +40,9 @@ public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeP
     private final LeafSetNodeDomParser leafSetNodeParser;
     private final MapNodeDomParser mapNodeParser;
     private final MapEntryNodeDomParser mapEntryNodeParser;
+    private final UnkeyedListEntryNodeDomParser unkeyedListEntryNodeParser;
+    private final UnkeyedListNodeDomParser unkeyedListNodeParser;
+    private final OrderedListNodeDomParser orderedListNodeParser;
 
     private DomToNormalizedNodeParserFactory(final XmlCodecProvider codecProvider) {
         leafNodeParser = new LeafNodeDomParser(codecProvider);
@@ -50,6 +56,9 @@ public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeP
         containerNodeParser = new ContainerNodeDomParser(dispatcher);
         mapEntryNodeParser = new MapEntryNodeDomParser(dispatcher);
         mapNodeParser = new MapNodeDomParser(mapEntryNodeParser);
+        orderedListNodeParser = new OrderedListNodeDomParser(mapEntryNodeParser);
+        unkeyedListEntryNodeParser = new UnkeyedListEntryNodeDomParser(dispatcher);
+        unkeyedListNodeParser = new UnkeyedListNodeDomParser(unkeyedListEntryNodeParser);
         choiceNodeParser = new ChoiceNodeDomParser(dispatcher);
         augmentationNodeParser = new AugmentationNodeDomParser(dispatcher);
     }
@@ -98,6 +107,21 @@ public final class DomToNormalizedNodeParserFactory implements ToNormalizedNodeP
         return mapNodeParser;
     }
 
+    @Override
+    public ToNormalizedNodeParser<Element, UnkeyedListNode, ListSchemaNode> getUnkeyedListNodeParser() {
+        return unkeyedListNodeParser;
+    }
+
+    @Override
+    public ToNormalizedNodeParser<Element, UnkeyedListEntryNode, ListSchemaNode> getUnkeyedListEntryNodeParser() {
+        return unkeyedListEntryNodeParser;
+    }
+
+    @Override
+    public ToNormalizedNodeParser<Element, OrderedMapNode, ListSchemaNode> getOrderedListNodeParser() {
+        return orderedListNodeParser;
+    }
+
     @Override
     public ToNormalizedNodeParser<Element, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeParser() {
         throw new UnsupportedOperationException();
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/ListEntryNodeDomParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/ListEntryNodeDomParser.java
new file mode 100644 (file)
index 0000000..92496d7
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * 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.transform.dom.parser;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.LinkedListMultimap;
+import java.util.Map;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.ListEntryNodeBaseParser;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.DomUtils;
+import org.w3c.dom.Element;
+
+abstract class ListEntryNodeDomParser<N extends DataContainerNode<?>> extends ListEntryNodeBaseParser<Element, N> {
+
+    private final NodeParserDispatcher<Element> dispatcher;
+
+    ListEntryNodeDomParser(final NodeParserDispatcher<Element> dispatcher) {
+        this.dispatcher = Preconditions.checkNotNull(dispatcher);
+    }
+
+    @Override
+    protected LinkedListMultimap<QName, Element> mapChildElements(Iterable<Element> elements) {
+        return DomUtils.mapChildElementsForSingletonNode(elements.iterator().next());
+    }
+
+    @Override
+    protected NodeParserDispatcher<Element> getDispatcher() {
+        return dispatcher;
+    }
+
+    @Override
+    protected Map<QName, String> getAttributes(Element element) {
+        return DomUtils.toAttributes(element.getAttributes());
+    }
+}
index 65dde5cf5ba1a3a6801f04aacf82ae8f1de07a62..4d4d35aa7debb12ab7dc1fac204ba9c39a45238c 100644 (file)
@@ -7,37 +7,23 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.parser;
 
-import java.util.Map;
-
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.MapEntryNodeBaseParser;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher;
-import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.DomUtils;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.w3c.dom.Element;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.LinkedListMultimap;
-
-final class MapEntryNodeDomParser extends MapEntryNodeBaseParser<Element> {
-
-    private final NodeParserDispatcher<Element> dispatcher;
+final class MapEntryNodeDomParser extends ListEntryNodeDomParser<MapEntryNode> {
 
     MapEntryNodeDomParser(final NodeParserDispatcher<Element> dispatcher) {
-        this.dispatcher = Preconditions.checkNotNull(dispatcher);
-    }
-
-    @Override
-    protected LinkedListMultimap<QName, Element> mapChildElements(Iterable<Element> elements) {
-        return DomUtils.mapChildElementsForSingletonNode(elements.iterator().next());
-    }
-
-    @Override
-    protected NodeParserDispatcher<Element> getDispatcher() {
-        return dispatcher;
+        super(dispatcher);
     }
 
     @Override
-    protected Map<QName, String> getAttributes(Element element) {
-        return DomUtils.toAttributes(element.getAttributes());
+    protected final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> getBuilder(
+            ListSchemaNode schema) {
+        return Builders.mapEntryBuilder(schema);
     }
 }
index 0dd00aabb9b8ec267a4519324feedbddac071863..748564fdd1c6a3493112b3390259622caf6b3390 100644 (file)
@@ -22,7 +22,7 @@ final class MapNodeDomParser extends MapNodeBaseParser<Element> {
     }
 
     @Override
-    protected ToNormalizedNodeParser<Element, MapEntryNode, ListSchemaNode> getMapEntryNodeParser() {
+    protected ToNormalizedNodeParser<Element, MapEntryNode, ListSchemaNode> getListEntryNodeParser() {
         return mapEntryParser;
     }
 }
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/OrderedListNodeDomParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/OrderedListNodeDomParser.java
new file mode 100644 (file)
index 0000000..787bff8
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * 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.transform.dom.parser;
+
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.OrderedListNodeBaseParser;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.w3c.dom.Element;
+
+final class OrderedListNodeDomParser extends OrderedListNodeBaseParser<Element> {
+
+    private final MapEntryNodeDomParser mapEntryNodeParser;
+
+    OrderedListNodeDomParser(MapEntryNodeDomParser mapEntryNodeParser) {
+        this.mapEntryNodeParser = mapEntryNodeParser;
+    }
+
+    @Override
+    protected ToNormalizedNodeParser<Element, MapEntryNode, ListSchemaNode> getListEntryNodeParser() {
+        return mapEntryNodeParser;
+    }
+}
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListEntryNodeDomParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListEntryNodeDomParser.java
new file mode 100644 (file)
index 0000000..781f06c
--- /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.transform.dom.parser;
+
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.NodeParserDispatcher;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.w3c.dom.Element;
+
+final class UnkeyedListEntryNodeDomParser extends ListEntryNodeDomParser<UnkeyedListEntryNode> {
+
+    UnkeyedListEntryNodeDomParser(final NodeParserDispatcher<Element> dispatcher) {
+        super(dispatcher);
+    }
+
+    @Override
+    protected final DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifier, UnkeyedListEntryNode> getBuilder(
+            ListSchemaNode schema) {
+        return Builders.unkeyedListEntryBuilder().withNodeIdentifier(new NodeIdentifier(schema.getQName()));
+    }
+
+}
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListNodeDomParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListNodeDomParser.java
new file mode 100644 (file)
index 0000000..15eed32
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * 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.transform.dom.parser;
+
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.ToNormalizedNodeParser;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.parser.UnkeyedListNodeBaseParser;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.w3c.dom.Element;
+
+final class UnkeyedListNodeDomParser extends UnkeyedListNodeBaseParser<Element> {
+
+    private final UnkeyedListEntryNodeDomParser unkeyedListEntryNodeParser;
+
+    UnkeyedListNodeDomParser(UnkeyedListEntryNodeDomParser unkeyedListEntryNodeParser) {
+        this.unkeyedListEntryNodeParser = unkeyedListEntryNodeParser;
+    }
+
+    @Override
+    protected ToNormalizedNodeParser<Element, UnkeyedListEntryNode, ListSchemaNode> getListEntryNodeParser() {
+        return unkeyedListEntryNodeParser;
+    }
+}
index b9d8ef2a757a3dec9cd0f3faf00d2194fe02a24a..a964914579a7c2c774a72f032bd64f03d2546c90 100644 (file)
@@ -16,6 +16,7 @@ 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.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializer;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializerFactory;
@@ -36,8 +37,10 @@ public final class DomFromNormalizedNodeSerializerFactory implements FromNormali
     private final LeafNodeDomSerializer leafNodeSerializer;
     private final LeafSetNodeDomSerializer leafSetSerializer;
     private final MapNodeDomSerializer mapNodeSerializer;
+    private final UnkeyedListNodeDomSerializer unkeyedListNodeSerializer;
     private final LeafSetEntryNodeDomSerializer leafSetEntryNodeSerializer;
-       private final MapEntryNodeDomSerializer mapEntryNodeSerializer;
+    private final MapEntryNodeDomSerializer mapEntryNodeSerializer;
+    private final UnkeyedListEntryNodeDomSerializer unkeyedListEntryNodeSerializer;
 
        private DomFromNormalizedNodeSerializerFactory(final Document doc, final XmlCodecProvider codecProvider) {
                final NodeSerializerDispatcher.BaseNodeSerializerDispatcher<Element> dispatcher = new NodeSerializerDispatcher.BaseNodeSerializerDispatcher<Element>(this) {
@@ -54,6 +57,9 @@ public final class DomFromNormalizedNodeSerializerFactory implements FromNormali
 
         mapEntryNodeSerializer = new MapEntryNodeDomSerializer(doc, dispatcher);
         mapNodeSerializer = new MapNodeDomSerializer(mapEntryNodeSerializer);
+
+        unkeyedListEntryNodeSerializer = new UnkeyedListEntryNodeDomSerializer(doc, dispatcher);
+        unkeyedListNodeSerializer = new UnkeyedListNodeDomSerializer(unkeyedListEntryNodeSerializer);
        }
 
        public static DomFromNormalizedNodeSerializerFactory getInstance(final Document doc, final XmlCodecProvider codecProvider) {
@@ -100,6 +106,11 @@ public final class DomFromNormalizedNodeSerializerFactory implements FromNormali
                return mapNodeSerializer;
        }
 
+       @Override
+       public FromNormalizedNodeSerializer<Element, UnkeyedListNode, ListSchemaNode> getUnkeyedListNodeSerializer() {
+           return unkeyedListNodeSerializer;
+       }
+
         @Override
         public FromNormalizedNodeSerializer<Element, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeSerializer() {
             throw new UnsupportedOperationException();
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/ListEntryNodeDomSerializer.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/ListEntryNodeDomSerializer.java
new file mode 100644 (file)
index 0000000..f045f72
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * 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.transform.dom.serializer;
+
+import com.google.common.base.Preconditions;
+import java.util.Collections;
+import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
+import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.ListEntryNodeBaseSerializer;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.NodeSerializerDispatcher;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ *
+ * Common class for list entry node serialization (MapEntry, UnkeyedListEntry nodes)
+ *
+ * @param <N>
+ *            concrete entry node type
+ */
+abstract class ListEntryNodeDomSerializer<N extends DataContainerNode<?>> extends
+        ListEntryNodeBaseSerializer<Element, N> {
+    private final NodeSerializerDispatcher<Element> dispatcher;
+    private final Document doc;
+
+    ListEntryNodeDomSerializer(final Document doc, final NodeSerializerDispatcher<Element> dispatcher) {
+        this.doc = Preconditions.checkNotNull(doc);
+        this.dispatcher = Preconditions.checkNotNull(dispatcher);
+    }
+
+    @Override
+    public Iterable<Element> serialize(ListSchemaNode schema, N node) {
+        Element itemEl = XmlDocumentUtils.createElementFor(doc, node);
+
+        for (Element element : super.serialize(schema, node)) {
+            itemEl.appendChild(element);
+        }
+
+        return Collections.singletonList(itemEl);
+    }
+
+    @Override
+    protected NodeSerializerDispatcher<Element> getNodeDispatcher() {
+        return dispatcher;
+    }
+}
index dbe8a90fc67f3b0caffa782160a57d950e68b5ba..6178bbab6043586066d39ab4490fc7a382be1ec5 100644 (file)
@@ -7,40 +7,13 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.serializer;
 
-import java.util.Collections;
-
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils;
-import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.MapEntryNodeBaseSerializer;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.NodeSerializerDispatcher;
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import com.google.common.base.Preconditions;
-
-final class MapEntryNodeDomSerializer extends MapEntryNodeBaseSerializer<Element> {
-    private final NodeSerializerDispatcher<Element> dispatcher;
-    private final Document doc;
-
+final class MapEntryNodeDomSerializer extends ListEntryNodeDomSerializer<MapEntryNode> {
     MapEntryNodeDomSerializer(final Document doc, final NodeSerializerDispatcher<Element> dispatcher) {
-        this.doc = Preconditions.checkNotNull(doc);
-        this.dispatcher = Preconditions.checkNotNull(dispatcher);
-    }
-
-    @Override
-    public Iterable<Element> serialize(ListSchemaNode schema, MapEntryNode node) {
-        Element itemEl = XmlDocumentUtils.createElementFor(doc, node);
-
-        for (Element element : super.serialize(schema, node)) {
-            itemEl.appendChild(element);
-        }
-
-        return Collections.singletonList(itemEl);
-    }
-
-    @Override
-    protected NodeSerializerDispatcher<Element> getNodeDispatcher() {
-        return dispatcher;
+        super(doc, dispatcher);
     }
 }
index 5404f193bfb69f0ec2283dbda2fee0dfe1cc5fa3..4dccd49305402750bae64a163e5697805abdd1bf 100644 (file)
@@ -8,12 +8,13 @@
 package org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.serializer;
 
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializer;
-import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.MapNodeBaseSerializer;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.ListNodeBaseSerializer;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.w3c.dom.Element;
 
-final class MapNodeDomSerializer extends MapNodeBaseSerializer<Element> {
+final class MapNodeDomSerializer extends ListNodeBaseSerializer<Element, MapNode, MapEntryNode> {
 
     private final FromNormalizedNodeSerializer<Element, MapEntryNode, ListSchemaNode> mapEntrySerializer;
 
@@ -22,7 +23,7 @@ final class MapNodeDomSerializer extends MapNodeBaseSerializer<Element> {
     }
 
     @Override
-    protected FromNormalizedNodeSerializer<Element, MapEntryNode, ListSchemaNode> getMapEntryNodeDomSerializer() {
+    protected FromNormalizedNodeSerializer<Element, MapEntryNode, ListSchemaNode> getListEntryNodeSerializer() {
         return mapEntrySerializer;
     }
 }
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListEntryNodeDomSerializer.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListEntryNodeDomSerializer.java
new file mode 100644 (file)
index 0000000..1cef516
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * 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.transform.dom.serializer;
+
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.NodeSerializerDispatcher;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+final class UnkeyedListEntryNodeDomSerializer extends ListEntryNodeDomSerializer<UnkeyedListEntryNode> {
+
+    UnkeyedListEntryNodeDomSerializer(final Document doc, final NodeSerializerDispatcher<Element> dispatcher) {
+        super(doc, dispatcher);
+    }
+
+}
diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListNodeDomSerializer.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListNodeDomSerializer.java
new file mode 100644 (file)
index 0000000..7e64d21
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * 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.transform.dom.serializer;
+
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.FromNormalizedNodeSerializer;
+import org.opendaylight.yangtools.yang.data.impl.schema.transform.base.serializer.ListNodeBaseSerializer;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.w3c.dom.Element;
+
+final class UnkeyedListNodeDomSerializer extends ListNodeBaseSerializer<Element, UnkeyedListNode, UnkeyedListEntryNode> {
+
+    private final FromNormalizedNodeSerializer<Element, UnkeyedListEntryNode, ListSchemaNode> unkeyedListEntrySerializer;
+
+    UnkeyedListNodeDomSerializer(UnkeyedListEntryNodeDomSerializer unkeyedListEntrySerializer) {
+        this.unkeyedListEntrySerializer = unkeyedListEntrySerializer;
+    }
+
+    @Override
+    protected FromNormalizedNodeSerializer<Element, UnkeyedListEntryNode, ListSchemaNode> getListEntryNodeSerializer() {
+        return unkeyedListEntrySerializer;
+    }
+}
index fd6b9c6ab183bc1f13ddc5f5715b331fdde67c1f..3534a563fa46c4e121cac9087a20d2b8454c8e53 100644 (file)
@@ -23,6 +23,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 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.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
@@ -174,6 +175,7 @@ abstract class AbstractContainerNodeModification<S, N extends DataContainerNode<
         private static final LeafSetNodeModification LEAF_SET_NODE_MODIFICATION = new LeafSetNodeModification();
         private static final AugmentationNodeModification AUGMENTATION_NODE_MODIFICATION = new AugmentationNodeModification();
         private static final MapNodeModification MAP_NODE_MODIFICATION = new MapNodeModification();
+        private static final UnkeyedListNodeModification UNKEYED_LIST_NODE_MODIFICATION = new UnkeyedListNodeModification();
         private static final ContainerNodeModification CONTAINER_NODE_MODIFICATION = new ContainerNodeModification();
         private static final ChoiceNodeModification CHOICE_NODE_MODIFICATION = new ChoiceNodeModification();
 
@@ -190,7 +192,11 @@ abstract class AbstractContainerNodeModification<S, N extends DataContainerNode<
             } else if (schemaChild instanceof AugmentationSchema) {
                 return onAugmentationNode((AugmentationSchema) schemaChild, actual, modification, operations);
             } else if (schemaChild instanceof ListSchemaNode) {
-                return onMapNode((ListSchemaNode) schemaChild, actual, modification, operations);
+                if (((ListSchemaNode)schemaChild).getKeyDefinition().isEmpty()) {
+                    return onUnkeyedNode((ListSchemaNode) schemaChild, actual, modification, operations);
+                } else {
+                    return onMapNode((ListSchemaNode) schemaChild, actual, modification, operations);
+                }
             } else if (schemaChild instanceof org.opendaylight.yangtools.yang.model.api.ChoiceNode) {
                 return onChoiceNode((org.opendaylight.yangtools.yang.model.api.ChoiceNode) schemaChild, actual,
                         modification, operations);
@@ -220,6 +226,16 @@ abstract class AbstractContainerNodeModification<S, N extends DataContainerNode<
                     (Optional<MapNode>) modification, operations);
         }
 
+        private static Optional<? extends DataContainerChild<?, ?>> onUnkeyedNode(ListSchemaNode schemaChild,
+                Optional<? extends DataContainerChild<?, ?>> actual,
+                        Optional<? extends DataContainerChild<?, ?>> modification, OperationStack operations)
+                                throws DataModificationException {
+            checkType(actual, UnkeyedListNode.class);
+            checkType(modification, UnkeyedListNode.class);
+            return UNKEYED_LIST_NODE_MODIFICATION.modify(schemaChild, (Optional<UnkeyedListNode>) actual,
+                    (Optional<UnkeyedListNode>) modification, operations);
+        }
+
         private static Optional<? extends DataContainerChild<?, ?>> onAugmentationNode(AugmentationSchema schemaChild,
                 Optional<? extends DataContainerChild<?, ?>> actual,
                 Optional<? extends DataContainerChild<?, ?>> modification, OperationStack operations)
diff --git a/yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/UnkeyedListNodeModification.java b/yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/UnkeyedListNodeModification.java
new file mode 100644 (file)
index 0000000..a6c2d61
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * 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.operations;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
+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.model.api.ListSchemaNode;
+
+public class UnkeyedListNodeModification implements Modification<ListSchemaNode, UnkeyedListNode> {
+
+    public static final MapEntryNodeModification MAP_ENTRY_NODE_MODIFICATION = new MapEntryNodeModification();
+
+    @Override
+    public Optional<UnkeyedListNode> modify(ListSchemaNode schema, Optional<UnkeyedListNode> actual,
+            Optional<UnkeyedListNode> modification, OperationStack operationStack) throws DataModificationException {
+
+        // Merge or None operation on parent, leaving actual if modification not present
+        if (modification.isPresent() == false)
+            return actual;
+
+        List<UnkeyedListEntryNode> resultNodes = Lists.newArrayList();
+        if (actual.isPresent())
+            resultNodes = unkeyedListEntries(actual.get());
+
+        // TODO implement ordering for modification nodes
+
+        for (UnkeyedListEntryNode unkeyedListEntryModification : modification.get().getValue()) {
+
+            operationStack.enteringNode(unkeyedListEntryModification);
+
+            YangInstanceIdentifier.NodeIdentifier entryKey = unkeyedListEntryModification.getIdentifier();
+
+            switch (operationStack.getCurrentOperation()) {
+            case NONE:
+                break;
+            // DataModificationException.DataMissingException.check(schema.getQName(), actual, mapEntryModification);
+            case MERGE:
+            case CREATE: {
+                DataModificationException.DataExistsException.check(schema.getQName(), actual,
+                        unkeyedListEntryModification);
+                resultNodes.add(unkeyedListEntryModification);
+            }
+            case REPLACE: {
+                break;
+            }
+            case DELETE: {
+                // DataModificationException.DataMissingException.check(schema.getQName(), actual,
+                // unkeyedListEntryModification);
+                break;
+            }
+            case REMOVE: {
+                break;
+            }
+            default:
+                throw new UnsupportedOperationException(
+                        String.format("Unable to perform operation: %s on: %s, unknown",
+                                operationStack.getCurrentOperation(), schema));
+            }
+
+            operationStack.exitingNode(unkeyedListEntryModification);
+        }
+        return build(schema, resultNodes);
+    }
+
+    private Optional<UnkeyedListNode> build(ListSchemaNode schema, List<UnkeyedListEntryNode> resultNodes) {
+        if (resultNodes.isEmpty())
+            return Optional.absent();
+
+        CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode> b = Builders.unkeyedListBuilder();
+        b.withNodeIdentifier(new NodeIdentifier(schema.getQName()));
+
+        for (UnkeyedListEntryNode child : resultNodes) {
+            b.withChild(child);
+        }
+
+        return Optional.of(b.build());
+    }
+
+    private List<UnkeyedListEntryNode> unkeyedListEntries(UnkeyedListNode unkeyedListNode) {
+        List<UnkeyedListEntryNode> unkeyedListEntries = Lists.newArrayList();
+
+        for (UnkeyedListEntryNode unkeyedListEntryNode : unkeyedListNode.getValue()) {
+            unkeyedListEntries.add(unkeyedListEntryNode);
+        }
+
+        return unkeyedListEntries;
+    }
+
+}