From aa1da45ac29a5e75bd49d7547fd3a42389e300d3 Mon Sep 17 00:00:00 2001 From: Jozef Gloncak Date: Tue, 23 Sep 2014 15:21:21 +0200 Subject: [PATCH] BUG 1975 - yang unkeyed list is transformed to map node 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 (cherry picked from commit 13b0a924410d92a6d49182161d54cf2cdc50ad56) --- .../CnSnToNormalizedNodeParserFactory.java | 25 +++++ .../cnsn/parser/ListEntryNodeCnSnParser.java | 44 ++++++++ .../cnsn/parser/MapEntryNodeCnSnParser.java | 36 ++----- .../schema/cnsn/parser/MapNodeCnSnParser.java | 2 +- .../parser/OrderedListNodeCnSnParser.java | 29 +++++ .../UnkeyedListEntryNodeCnSnParser.java | 31 ++++++ .../parser/UnkeyedListNodeCnSnParser.java | 28 +++++ ...SnFromNormalizedNodeSerializerFactory.java | 11 ++ .../ListEntryNodeCnSnSerializer.java | 48 +++++++++ .../MapEntryNodeCnSnSerializer.java | 26 +---- .../serializer/MapNodeCnSnSerializer.java | 7 +- .../UnkeyedListEntryNodeCnSnSerializer.java | 20 ++++ .../UnkeyedListNodeCnSnSerializer.java | 30 ++++++ .../data/composite/node/schema/TestUtils.java | 16 +-- .../node/schema/parser/Bug2180Test.java | 6 +- .../FromNormalizedNodeSerializerFactory.java | 20 ++-- .../ToNormalizedNodeParserFactory.java | 24 +++-- ...rser.java => ListEntryNodeBaseParser.java} | 34 +++--- .../base/parser/ListNodeBaseParser.java | 49 +++++++++ .../base/parser/MapNodeBaseParser.java | 40 ++----- .../base/parser/NodeParserDispatcher.java | 9 +- .../parser/OrderedListNodeBaseParser.java | 28 +++++ .../parser/UnkeyedListNodeBaseParser.java | 30 ++++++ ....java => ListEntryNodeBaseSerializer.java} | 17 +-- .../serializer/ListNodeBaseSerializer.java | 53 +++++++++ .../serializer/MapNodeBaseSerializer.java | 47 -------- .../serializer/NodeSerializerDispatcher.java | 13 ++- .../DomToNormalizedNodeParserFactory.java | 24 +++++ .../dom/parser/ListEntryNodeDomParser.java | 42 ++++++++ .../dom/parser/MapEntryNodeDomParser.java | 34 ++---- .../dom/parser/MapNodeDomParser.java | 2 +- .../dom/parser/OrderedListNodeDomParser.java | 28 +++++ .../parser/UnkeyedListEntryNodeDomParser.java | 31 ++++++ .../dom/parser/UnkeyedListNodeDomParser.java | 28 +++++ ...omFromNormalizedNodeSerializerFactory.java | 13 ++- .../ListEntryNodeDomSerializer.java | 52 +++++++++ .../serializer/MapEntryNodeDomSerializer.java | 31 +----- .../dom/serializer/MapNodeDomSerializer.java | 7 +- .../UnkeyedListEntryNodeDomSerializer.java | 21 ++++ .../UnkeyedListNodeDomSerializer.java | 29 +++++ .../AbstractContainerNodeModification.java | 18 +++- .../UnkeyedListNodeModification.java | 101 ++++++++++++++++++ 42 files changed, 929 insertions(+), 255 deletions(-) create mode 100644 yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/ListEntryNodeCnSnParser.java create mode 100644 yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/OrderedListNodeCnSnParser.java create mode 100644 yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListEntryNodeCnSnParser.java create mode 100644 yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListNodeCnSnParser.java create mode 100644 yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/ListEntryNodeCnSnSerializer.java create mode 100644 yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListEntryNodeCnSnSerializer.java create mode 100644 yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListNodeCnSnSerializer.java rename yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/{MapEntryNodeBaseParser.java => ListEntryNodeBaseParser.java} (69%) create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListNodeBaseParser.java create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/OrderedListNodeBaseParser.java create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/UnkeyedListNodeBaseParser.java rename yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/{MapEntryNodeBaseSerializer.java => ListEntryNodeBaseSerializer.java} (73%) create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/ListNodeBaseSerializer.java delete mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/MapNodeBaseSerializer.java create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/ListEntryNodeDomParser.java create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/OrderedListNodeDomParser.java create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListEntryNodeDomParser.java create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListNodeDomParser.java create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/ListEntryNodeDomSerializer.java create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListEntryNodeDomSerializer.java create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListNodeDomSerializer.java create mode 100644 yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/UnkeyedListNodeModification.java diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/CnSnToNormalizedNodeParserFactory.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/CnSnToNormalizedNodeParserFactory.java index ce0e20ac58..039aa33a71 100644 --- a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/CnSnToNormalizedNodeParserFactory.java +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/CnSnToNormalizedNodeParserFactory.java @@ -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, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeParser() { return anyXmlNodeCnSnParser; } + + @Override + public ToNormalizedNodeParser, UnkeyedListNode, ListSchemaNode> getUnkeyedListNodeParser() { + return unkeyedListNodeCnSnParser; + } + + @Override + public ToNormalizedNodeParser, UnkeyedListEntryNode, ListSchemaNode> getUnkeyedListEntryNodeParser() { + return unkeyedListEntryNodeCnSnParser; + } + + @Override + public ToNormalizedNodeParser, 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 index 0000000000..025b7c9143 --- /dev/null +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/ListEntryNodeCnSnParser.java @@ -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> extends ListEntryNodeBaseParser, N> { + + private final NodeParserDispatcher> dispatcher; + + ListEntryNodeCnSnParser(final NodeParserDispatcher> dispatcher) { + this.dispatcher = Preconditions.checkNotNull(dispatcher); + } + + @Override + protected LinkedListMultimap> mapChildElements(Iterable> elements) { + return CnSnToNormalizedNodesUtils.mapChildElementsForSingletonNode(elements.iterator().next()); + } + + @Override + protected NodeParserDispatcher> getDispatcher() { + return dispatcher; + } + + @Override + protected Map getAttributes(Node e) { + return Collections.emptyMap(); + } + +} diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapEntryNodeCnSnParser.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapEntryNodeCnSnParser.java index ad0b846d64..af2cfefa98 100644 --- a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapEntryNodeCnSnParser.java +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapEntryNodeCnSnParser.java @@ -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> { - - private final NodeParserDispatcher> dispatcher; +public final class MapEntryNodeCnSnParser extends ListEntryNodeCnSnParser { public MapEntryNodeCnSnParser(final NodeParserDispatcher> dispatcher) { - this.dispatcher = Preconditions.checkNotNull(dispatcher); - } - - - @Override - protected LinkedListMultimap> mapChildElements(Iterable> elements) { - return CnSnToNormalizedNodesUtils.mapChildElementsForSingletonNode(elements.iterator().next()); + super(dispatcher); } @Override - protected NodeParserDispatcher> getDispatcher() { - return dispatcher; + protected final DataContainerNodeBuilder getBuilder( + ListSchemaNode schema) { + return Builders.mapEntryBuilder(schema); } - @Override - protected Map getAttributes(Node e) { - return Collections.emptyMap(); - } } diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapNodeCnSnParser.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapNodeCnSnParser.java index 5fae7715b3..66c47bbc20 100644 --- a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapNodeCnSnParser.java +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/MapNodeCnSnParser.java @@ -22,7 +22,7 @@ public final class MapNodeCnSnParser extends MapNodeBaseParser> { } @Override - protected ToNormalizedNodeParser, MapEntryNode, ListSchemaNode> getMapEntryNodeParser() { + protected ToNormalizedNodeParser, 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 index 0000000000..c809c350ae --- /dev/null +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/OrderedListNodeCnSnParser.java @@ -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> { + + private final MapEntryNodeCnSnParser mapEntryNodeCnSnParser; + + public OrderedListNodeCnSnParser(MapEntryNodeCnSnParser mapEntryNodeCnSnParser) { + this.mapEntryNodeCnSnParser = mapEntryNodeCnSnParser; + } + + @Override + protected ToNormalizedNodeParser, 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 index 0000000000..272e8347dd --- /dev/null +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListEntryNodeCnSnParser.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.data.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 { + + UnkeyedListEntryNodeCnSnParser(final NodeParserDispatcher> dispatcher) { + super(dispatcher); + } + + @Override + protected final DataContainerNodeBuilder 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 index 0000000000..d5194d6108 --- /dev/null +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/parser/UnkeyedListNodeCnSnParser.java @@ -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> { + + private final UnkeyedListEntryNodeCnSnParser unkeyedListEntryNodeParser; + + UnkeyedListNodeCnSnParser(UnkeyedListEntryNodeCnSnParser unkeyedListEntryNodeParser) { + this.unkeyedListEntryNodeParser = unkeyedListEntryNodeParser; + } + + @Override + protected ToNormalizedNodeParser, UnkeyedListEntryNode, ListSchemaNode> getListEntryNodeParser() { + return unkeyedListEntryNodeParser; + } +} diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/CnSnFromNormalizedNodeSerializerFactory.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/CnSnFromNormalizedNodeSerializerFactory.java index 681c624903..87c841182d 100644 --- a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/CnSnFromNormalizedNodeSerializerFactory.java +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/CnSnFromNormalizedNodeSerializerFactory.java @@ -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> dispatcher = new NodeSerializerDispatcher.BaseNodeSerializerDispatcher>( @@ -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, AnyXmlNode, AnyXmlSchemaNode> getAnyXmlNodeSerializer() { return anyXmlNodeSerializer; } + + @Override + public FromNormalizedNodeSerializer, 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 index 0000000000..fd29a092d1 --- /dev/null +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/ListEntryNodeCnSnSerializer.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.data.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 + * concrete entry node type + */ +abstract class ListEntryNodeCnSnSerializer> extends + ListEntryNodeBaseSerializer, N> { + private final NodeSerializerDispatcher> dispatcher; + + ListEntryNodeCnSnSerializer(final NodeSerializerDispatcher> dispatcher) { + this.dispatcher = Preconditions.checkNotNull(dispatcher); + } + + @Override + public List> serialize(ListSchemaNode schema, N node) { + CompositeNodeBuilder compNodeBuilder = ImmutableCompositeNode.builder(); + compNodeBuilder.setQName(node.getNodeType()); + compNodeBuilder.addAll(super.serialize(schema, node)); + return Collections.> singletonList(compNodeBuilder.toInstance()); + } + + @Override + protected NodeSerializerDispatcher> getNodeDispatcher() { + return dispatcher; + } +} diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapEntryNodeCnSnSerializer.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapEntryNodeCnSnSerializer.java index 1cadd4c6f3..be39870e2a 100644 --- a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapEntryNodeCnSnSerializer.java +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapEntryNodeCnSnSerializer.java @@ -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> { - - private final NodeSerializerDispatcher> dispatcher; +public class MapEntryNodeCnSnSerializer extends ListEntryNodeCnSnSerializer { MapEntryNodeCnSnSerializer(final NodeSerializerDispatcher> dispatcher) { - this.dispatcher = Preconditions.checkNotNull(dispatcher); - } - - @Override - public List> serialize(ListSchemaNode schema, MapEntryNode node) { - CompositeNodeBuilder compNodeBuilder = ImmutableCompositeNode.builder(); - compNodeBuilder.setQName(node.getNodeType()); - compNodeBuilder.addAll(super.serialize(schema, node)); - return Collections.> singletonList(compNodeBuilder.build()); - } - - @Override - protected NodeSerializerDispatcher> getNodeDispatcher() { - return dispatcher; + super(dispatcher); } } diff --git a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapNodeCnSnSerializer.java b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapNodeCnSnSerializer.java index f6107217c1..0676708486 100644 --- a/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapNodeCnSnSerializer.java +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/MapNodeCnSnSerializer.java @@ -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> { +public class MapNodeCnSnSerializer extends ListNodeBaseSerializer, MapNode, MapEntryNode> { private final FromNormalizedNodeSerializer, MapEntryNode, ListSchemaNode> mapEntrySerializer; @@ -22,7 +23,7 @@ public class MapNodeCnSnSerializer extends MapNodeBaseSerializer> { } @Override - protected FromNormalizedNodeSerializer, MapEntryNode, ListSchemaNode> getMapEntryNodeDomSerializer() { + protected FromNormalizedNodeSerializer, 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 index 0000000000..4f877a3d56 --- /dev/null +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListEntryNodeCnSnSerializer.java @@ -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 { + + UnkeyedListEntryNodeCnSnSerializer(final NodeSerializerDispatcher> 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 index 0000000000..289c0a03d3 --- /dev/null +++ b/yang/yang-data-composite-node/src/main/java/org/opendaylight/yangtools/yang/data/composite/node/schema/cnsn/serializer/UnkeyedListNodeCnSnSerializer.java @@ -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, UnkeyedListNode, UnkeyedListEntryNode> { + + private final FromNormalizedNodeSerializer, UnkeyedListEntryNode, ListSchemaNode> unkeyedListEntrySerializer; + + UnkeyedListNodeCnSnSerializer(UnkeyedListEntryNodeCnSnSerializer unkeyedListEntrySerializer) { + this.unkeyedListEntrySerializer = unkeyedListEntrySerializer; + } + + @Override + protected FromNormalizedNodeSerializer, UnkeyedListEntryNode, ListSchemaNode> getListEntryNodeSerializer() { + return unkeyedListEntrySerializer; + } +} \ No newline at end of file diff --git a/yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/TestUtils.java b/yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/TestUtils.java index 58c28a8c38..3ad62aea21 100644 --- a/yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/TestUtils.java +++ b/yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/TestUtils.java @@ -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 lst1 = Builders.mapBuilder().withNodeIdentifier( + CollectionNodeBuilder lst1 = Builders.unkeyedListBuilder().withNodeIdentifier( getNodeIdentifier("lst1")); - lst1.withChild(Builders.mapEntryBuilder() - .withNodeIdentifier(getNodeIdentifierPredicate("lst1", new HashMap())) + lst1.withChild(Builders.unkeyedListEntryBuilder() + .withNodeIdentifier(getNodeIdentifier("lst1")) .withValue(Collections.> emptyList()).build()); containerBuilder.withChild(lst1.build()); - CollectionNodeBuilder lst2 = Builders.mapBuilder().withNodeIdentifier( + CollectionNodeBuilder lst2 = Builders.unkeyedListBuilder().withNodeIdentifier( getNodeIdentifier("lst2")); Map lst2_1 = new HashMap<>(); @@ -212,7 +212,7 @@ public class TestUtils { List> 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 lst2_2 = new HashMap<>(); @@ -220,7 +220,7 @@ public class TestUtils { List> 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()); diff --git a/yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/parser/Bug2180Test.java b/yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/parser/Bug2180Test.java index c3f48bd36e..dbe1c7a8ea 100644 --- a/yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/parser/Bug2180Test.java +++ b/yang/yang-data-composite-node/src/test/java/org/opendaylight/yangtools/yang/data/composite/node/schema/parser/Bug2180Test.java @@ -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, MapNode, ListSchemaNode> mapNodeParser = - CnSnToNormalizedNodeParserFactory.getInstance().getMapNodeParser(); - MapNode mapNode = mapNodeParser.parse(new ArrayList>(), aceListSchemaNode); + ToNormalizedNodeParser, OrderedMapNode, ListSchemaNode> orderedListNodeParser = + CnSnToNormalizedNodeParserFactory.getInstance().getOrderedListNodeParser(); + MapNode mapNode = orderedListNodeParser.parse(new ArrayList>(), aceListSchemaNode); assertTrue(mapNode instanceof OrderedMapNode); } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/FromNormalizedNodeSerializerFactory.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/FromNormalizedNodeSerializerFactory.java index 319752d282..932560c32d 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/FromNormalizedNodeSerializerFactory.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/FromNormalizedNodeSerializerFactory.java @@ -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 { - FromNormalizedNodeSerializer getAugmentationNodeSerializer(); - FromNormalizedNodeSerializer getChoiceNodeSerializer(); - FromNormalizedNodeSerializer getContainerNodeSerializer(); - FromNormalizedNodeSerializer, LeafSchemaNode> getLeafNodeSerializer(); - FromNormalizedNodeSerializer, LeafListSchemaNode> getLeafSetEntryNodeSerializer(); - FromNormalizedNodeSerializer, LeafListSchemaNode> getLeafSetNodeSerializer(); - FromNormalizedNodeSerializer getMapEntryNodeSerializer(); - FromNormalizedNodeSerializer getMapNodeSerializer(); - FromNormalizedNodeSerializer getAnyXmlNodeSerializer(); + FromNormalizedNodeSerializer getAugmentationNodeSerializer(); + FromNormalizedNodeSerializer getChoiceNodeSerializer(); + FromNormalizedNodeSerializer getContainerNodeSerializer(); + FromNormalizedNodeSerializer, LeafSchemaNode> getLeafNodeSerializer(); + FromNormalizedNodeSerializer, LeafListSchemaNode> getLeafSetEntryNodeSerializer(); + FromNormalizedNodeSerializer, LeafListSchemaNode> getLeafSetNodeSerializer(); + FromNormalizedNodeSerializer getMapEntryNodeSerializer(); + FromNormalizedNodeSerializer getMapNodeSerializer(); + FromNormalizedNodeSerializer getUnkeyedListNodeSerializer(); + FromNormalizedNodeSerializer getAnyXmlNodeSerializer(); } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/ToNormalizedNodeParserFactory.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/ToNormalizedNodeParserFactory.java index 7c2700f7c4..c887d3ff7f 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/ToNormalizedNodeParserFactory.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/ToNormalizedNodeParserFactory.java @@ -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 { - ToNormalizedNodeParser getAugmentationNodeParser(); - ToNormalizedNodeParser getChoiceNodeParser(); - ToNormalizedNodeParser getContainerNodeParser(); - ToNormalizedNodeParser, LeafSchemaNode> getLeafNodeParser(); - ToNormalizedNodeParser, LeafListSchemaNode> getLeafSetEntryNodeParser(); - ToNormalizedNodeParser, LeafListSchemaNode> getLeafSetNodeParser(); - ToNormalizedNodeParser getMapEntryNodeParser(); - ToNormalizedNodeParser getMapNodeParser(); - ToNormalizedNodeParser getAnyXmlNodeParser(); + ToNormalizedNodeParser getAugmentationNodeParser(); + ToNormalizedNodeParser getChoiceNodeParser(); + ToNormalizedNodeParser getContainerNodeParser(); + ToNormalizedNodeParser, LeafSchemaNode> getLeafNodeParser(); + ToNormalizedNodeParser, LeafListSchemaNode> getLeafSetEntryNodeParser(); + ToNormalizedNodeParser, LeafListSchemaNode> getLeafSetNodeParser(); + ToNormalizedNodeParser getMapEntryNodeParser(); + ToNormalizedNodeParser getMapNodeParser(); + ToNormalizedNodeParser getUnkeyedListNodeParser(); + ToNormalizedNodeParser getUnkeyedListEntryNodeParser(); + ToNormalizedNodeParser getAnyXmlNodeParser(); + ToNormalizedNodeParser getOrderedListNodeParser(); } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/MapEntryNodeBaseParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListEntryNodeBaseParser.java similarity index 69% rename from yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/MapEntryNodeBaseParser.java rename to yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListEntryNodeBaseParser.java index de6c475773..aaf30e712a 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/MapEntryNodeBaseParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListEntryNodeBaseParser.java @@ -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 type of elements to be parsed + * @param + * type of elements to be parsed */ -public abstract class MapEntryNodeBaseParser extends BaseDispatcherParser { - - @Override - protected final DataContainerNodeBuilder getBuilder( - ListSchemaNode schema) { - return Builders.mapEntryBuilder(schema); - } - - @Override - public final MapEntryNode parse(Iterable elements, ListSchemaNode schema) { - checkOnlyOneNode(schema, elements); - return super.parse(elements, schema); - } +public abstract class ListEntryNodeBaseParser> extends + BaseDispatcherParser { @Override protected final Set getRealSchemasForAugment(ListSchemaNode schema, AugmentationSchema augmentSchema) { @@ -61,6 +47,12 @@ public abstract class MapEntryNodeBaseParser extends BaseDispatcherParser elements, ListSchemaNode schema) { + checkOnlyOneNode(schema, elements); + return super.parse(elements, schema); + } + @Override protected abstract Map 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 index 0000000000..67c97a767d --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/ListNodeBaseParser.java @@ -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 + * type of elements to be parsed + */ +public abstract class ListNodeBaseParser, O extends NormalizedNode, S extends ListSchemaNode> + implements ToNormalizedNodeParser { + + @Override + public final O parse(Iterable childNodes, S schema) { + CollectionNodeBuilder 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 getListEntryNodeParser(); + + /** + * + * @return prepares builder which will contain entries of list according to concrete list type + */ + protected abstract CollectionNodeBuilder provideBuilder(S schema); +} diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/MapNodeBaseParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/MapNodeBaseParser.java index 581d5f4b78..a57a694e12 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/MapNodeBaseParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/MapNodeBaseParser.java @@ -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 type of elements to be parsed + * @param + * type of elements to be parsed */ -public abstract class MapNodeBaseParser implements ToNormalizedNodeParser { - - @Override - public final MapNode parse(Iterable childNodes, ListSchemaNode schema) { - if (schema.isUserOrdered()) { - CollectionNodeBuilder listBuilder = Builders.orderedMapBuilder(schema); - - for (E childNode : childNodes) { - MapEntryNode listChild = getMapEntryNodeParser().parse(Collections.singletonList(childNode), schema); - listBuilder.withChild(listChild); - } +public abstract class MapNodeBaseParser extends ListNodeBaseParser { - return listBuilder.build(); - } else { - CollectionNodeBuilder listBuilder = Builders.mapBuilder(schema); - - for (E childNode : childNodes) { - MapEntryNode listChild = getMapEntryNodeParser().parse(Collections.singletonList(childNode), schema); - listBuilder.withChild(listChild); - } - - return listBuilder.build(); - } + protected CollectionNodeBuilder 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 getMapEntryNodeParser(); - -} +} \ 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/NodeParserDispatcher.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/NodeParserDispatcher.java index 220b2cb04d..69cc49a712 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/NodeParserDispatcher.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/NodeParserDispatcher.java @@ -51,7 +51,14 @@ public interface NodeParserDispatcher { } 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 index 0000000000..6278accb61 --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/OrderedListNodeBaseParser.java @@ -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 + * type of elements to be parsed + */ +public abstract class OrderedListNodeBaseParser extends + ListNodeBaseParser { + @Override + protected CollectionNodeBuilder 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 index 0000000000..14d47890cf --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/parser/UnkeyedListNodeBaseParser.java @@ -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 + * type of elements to be parsed + */ +public abstract class UnkeyedListNodeBaseParser extends + ListNodeBaseParser { + @Override + protected CollectionNodeBuilder provideBuilder(ListSchemaNode schema) { + CollectionNodeBuilder listBuilder = Builders.unkeyedListBuilder(); + return listBuilder.withNodeIdentifier(new NodeIdentifier(schema.getQName())); + } +} diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/MapEntryNodeBaseSerializer.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/ListEntryNodeBaseSerializer.java similarity index 73% rename from yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/MapEntryNodeBaseSerializer.java rename to yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/ListEntryNodeBaseSerializer.java index 827558e56e..38b3cda211 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/MapEntryNodeBaseSerializer.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/ListEntryNodeBaseSerializer.java @@ -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 type of serialized elements + * @param + * type of serialized elements */ -public abstract class MapEntryNodeBaseSerializer extends - BaseDispatcherSerializer { +public abstract class ListEntryNodeBaseSerializer> extends + BaseDispatcherSerializer { @Override protected final DataSchemaNode getSchemaForChild(ListSchemaNode schema, - DataContainerChild childNode) { + DataContainerChild childNode) { return SchemaUtils.findSchemaForChild(schema, childNode.getNodeType()); } @@ -39,7 +39,8 @@ public abstract class MapEntryNodeBaseSerializer extends } @Override - protected final Set getRealSchemasForAugment(ListSchemaNode schema, AugmentationSchema augmentationSchema) { + protected final Set 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 index 0000000000..c90df44844 --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/ListNodeBaseSerializer.java @@ -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 + * type of serialized elements + * @param + * containing node type + * @param + * entry node type which is inside containing (N) type + */ +public abstract class ListNodeBaseSerializer>, O extends DataContainerNode> + implements FromNormalizedNodeSerializer { + + @Override + public final Iterable serialize(final ListSchemaNode schema, final N node) { + return Iterables.concat(Iterables.transform(node.getValue(), new Function>() { + @Override + public Iterable apply(O input) { + final Iterable 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 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 index dba2c5db5c..0000000000 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/MapNodeBaseSerializer.java +++ /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 type of serialized elements - */ -public abstract class MapNodeBaseSerializer implements FromNormalizedNodeSerializer { - - @Override - public final Iterable serialize(final ListSchemaNode schema, final MapNode node) { - return Iterables.concat(Iterables.transform(node.getValue(), new Function>() { - @Override - public Iterable apply(MapEntryNode input) { - final Iterable 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 getMapEntryNodeDomSerializer(); -} diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/NodeSerializerDispatcher.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/NodeSerializerDispatcher.java index c686c31cba..e1ac42e5ec 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/NodeSerializerDispatcher.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/base/serializer/NodeSerializerDispatcher.java @@ -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 { 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 { (ChoiceNode) dataContainerChild); } - private Iterable onListNode(Object childSchema, + private Iterable onMapNode(Object childSchema, DataContainerChild dataContainerChild) { checkSchemaCompatibility(childSchema, ListSchemaNode.class, dataContainerChild); return factory.getMapNodeSerializer().serialize((ListSchemaNode) childSchema, (MapNode) dataContainerChild); } + private Iterable onUnkeyedListNode(Object childSchema, + DataContainerChild dataContainerChild) { + checkSchemaCompatibility(childSchema, ListSchemaNode.class, dataContainerChild); + return factory.getUnkeyedListNodeSerializer().serialize((ListSchemaNode) childSchema, (UnkeyedListNode) dataContainerChild); + } + private Iterable onLeafListNode(Object childSchema, DataContainerChild dataContainerChild) { checkSchemaCompatibility(childSchema, LeafListSchemaNode.class, dataContainerChild); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/DomToNormalizedNodeParserFactory.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/DomToNormalizedNodeParserFactory.java index a02b60b2fd..772f425d17 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/DomToNormalizedNodeParserFactory.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/DomToNormalizedNodeParserFactory.java @@ -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 getUnkeyedListNodeParser() { + return unkeyedListNodeParser; + } + + @Override + public ToNormalizedNodeParser getUnkeyedListEntryNodeParser() { + return unkeyedListEntryNodeParser; + } + + @Override + public ToNormalizedNodeParser getOrderedListNodeParser() { + return orderedListNodeParser; + } + @Override public ToNormalizedNodeParser 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 index 0000000000..92496d79f7 --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/ListEntryNodeDomParser.java @@ -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> extends ListEntryNodeBaseParser { + + private final NodeParserDispatcher dispatcher; + + ListEntryNodeDomParser(final NodeParserDispatcher dispatcher) { + this.dispatcher = Preconditions.checkNotNull(dispatcher); + } + + @Override + protected LinkedListMultimap mapChildElements(Iterable elements) { + return DomUtils.mapChildElementsForSingletonNode(elements.iterator().next()); + } + + @Override + protected NodeParserDispatcher getDispatcher() { + return dispatcher; + } + + @Override + protected Map getAttributes(Element element) { + return DomUtils.toAttributes(element.getAttributes()); + } +} diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapEntryNodeDomParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapEntryNodeDomParser.java index 65dde5cf5b..4d4d35aa7d 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapEntryNodeDomParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapEntryNodeDomParser.java @@ -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 { - - private final NodeParserDispatcher dispatcher; +final class MapEntryNodeDomParser extends ListEntryNodeDomParser { MapEntryNodeDomParser(final NodeParserDispatcher dispatcher) { - this.dispatcher = Preconditions.checkNotNull(dispatcher); - } - - @Override - protected LinkedListMultimap mapChildElements(Iterable elements) { - return DomUtils.mapChildElementsForSingletonNode(elements.iterator().next()); - } - - @Override - protected NodeParserDispatcher getDispatcher() { - return dispatcher; + super(dispatcher); } @Override - protected Map getAttributes(Element element) { - return DomUtils.toAttributes(element.getAttributes()); + protected final DataContainerNodeBuilder getBuilder( + ListSchemaNode schema) { + return Builders.mapEntryBuilder(schema); } } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapNodeDomParser.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapNodeDomParser.java index 0dd00aabb9..748564fdd1 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapNodeDomParser.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/MapNodeDomParser.java @@ -22,7 +22,7 @@ final class MapNodeDomParser extends MapNodeBaseParser { } @Override - protected ToNormalizedNodeParser getMapEntryNodeParser() { + protected ToNormalizedNodeParser 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 index 0000000000..787bff8856 --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/OrderedListNodeDomParser.java @@ -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 { + + private final MapEntryNodeDomParser mapEntryNodeParser; + + OrderedListNodeDomParser(MapEntryNodeDomParser mapEntryNodeParser) { + this.mapEntryNodeParser = mapEntryNodeParser; + } + + @Override + protected ToNormalizedNodeParser 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 index 0000000000..781f06cb71 --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListEntryNodeDomParser.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.data.impl.schema.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 { + + UnkeyedListEntryNodeDomParser(final NodeParserDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected final DataContainerNodeBuilder 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 index 0000000000..15eed32a2d --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/parser/UnkeyedListNodeDomParser.java @@ -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 { + + private final UnkeyedListEntryNodeDomParser unkeyedListEntryNodeParser; + + UnkeyedListNodeDomParser(UnkeyedListEntryNodeDomParser unkeyedListEntryNodeParser) { + this.unkeyedListEntryNodeParser = unkeyedListEntryNodeParser; + } + + @Override + protected ToNormalizedNodeParser getListEntryNodeParser() { + return unkeyedListEntryNodeParser; + } +} diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/DomFromNormalizedNodeSerializerFactory.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/DomFromNormalizedNodeSerializerFactory.java index b9d8ef2a75..a964914579 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/DomFromNormalizedNodeSerializerFactory.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/DomFromNormalizedNodeSerializerFactory.java @@ -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 dispatcher = new NodeSerializerDispatcher.BaseNodeSerializerDispatcher(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 getUnkeyedListNodeSerializer() { + return unkeyedListNodeSerializer; + } + @Override public FromNormalizedNodeSerializer 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 index 0000000000..f045f7232f --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/ListEntryNodeDomSerializer.java @@ -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 + * concrete entry node type + */ +abstract class ListEntryNodeDomSerializer> extends + ListEntryNodeBaseSerializer { + private final NodeSerializerDispatcher dispatcher; + private final Document doc; + + ListEntryNodeDomSerializer(final Document doc, final NodeSerializerDispatcher dispatcher) { + this.doc = Preconditions.checkNotNull(doc); + this.dispatcher = Preconditions.checkNotNull(dispatcher); + } + + @Override + public Iterable 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 getNodeDispatcher() { + return dispatcher; + } +} diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapEntryNodeDomSerializer.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapEntryNodeDomSerializer.java index dbe8a90fc6..6178bbab60 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapEntryNodeDomSerializer.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapEntryNodeDomSerializer.java @@ -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 { - private final NodeSerializerDispatcher dispatcher; - private final Document doc; - +final class MapEntryNodeDomSerializer extends ListEntryNodeDomSerializer { MapEntryNodeDomSerializer(final Document doc, final NodeSerializerDispatcher dispatcher) { - this.doc = Preconditions.checkNotNull(doc); - this.dispatcher = Preconditions.checkNotNull(dispatcher); - } - - @Override - public Iterable 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 getNodeDispatcher() { - return dispatcher; + super(doc, dispatcher); } } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapNodeDomSerializer.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapNodeDomSerializer.java index 5404f193bf..4dccd49305 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapNodeDomSerializer.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/MapNodeDomSerializer.java @@ -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 { +final class MapNodeDomSerializer extends ListNodeBaseSerializer { private final FromNormalizedNodeSerializer mapEntrySerializer; @@ -22,7 +23,7 @@ final class MapNodeDomSerializer extends MapNodeBaseSerializer { } @Override - protected FromNormalizedNodeSerializer getMapEntryNodeDomSerializer() { + protected FromNormalizedNodeSerializer 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 index 0000000000..1cef5165de --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListEntryNodeDomSerializer.java @@ -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 { + + UnkeyedListEntryNodeDomSerializer(final Document doc, final NodeSerializerDispatcher 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 index 0000000000..7e64d21e08 --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/transform/dom/serializer/UnkeyedListNodeDomSerializer.java @@ -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 { + + private final FromNormalizedNodeSerializer unkeyedListEntrySerializer; + + UnkeyedListNodeDomSerializer(UnkeyedListEntryNodeDomSerializer unkeyedListEntrySerializer) { + this.unkeyedListEntrySerializer = unkeyedListEntrySerializer; + } + + @Override + protected FromNormalizedNodeSerializer getListEntryNodeSerializer() { + return unkeyedListEntrySerializer; + } +} diff --git a/yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/AbstractContainerNodeModification.java b/yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/AbstractContainerNodeModification.java index fd6b9c6ab1..3534a563fa 100644 --- a/yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/AbstractContainerNodeModification.java +++ b/yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/AbstractContainerNodeModification.java @@ -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) modification, operations); } + private static Optional> onUnkeyedNode(ListSchemaNode schemaChild, + Optional> actual, + Optional> modification, OperationStack operations) + throws DataModificationException { + checkType(actual, UnkeyedListNode.class); + checkType(modification, UnkeyedListNode.class); + return UNKEYED_LIST_NODE_MODIFICATION.modify(schemaChild, (Optional) actual, + (Optional) modification, operations); + } + private static Optional> onAugmentationNode(AugmentationSchema schemaChild, Optional> actual, Optional> 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 index 0000000000..a6c2d61e69 --- /dev/null +++ b/yang/yang-data-operations/src/main/java/org/opendaylight/yangtools/yang/data/operations/UnkeyedListNodeModification.java @@ -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 { + + public static final MapEntryNodeModification MAP_ENTRY_NODE_MODIFICATION = new MapEntryNodeModification(); + + @Override + public Optional modify(ListSchemaNode schema, Optional actual, + Optional modification, OperationStack operationStack) throws DataModificationException { + + // Merge or None operation on parent, leaving actual if modification not present + if (modification.isPresent() == false) + return actual; + + List 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 build(ListSchemaNode schema, List resultNodes) { + if (resultNodes.isEmpty()) + return Optional.absent(); + + CollectionNodeBuilder b = Builders.unkeyedListBuilder(); + b.withNodeIdentifier(new NodeIdentifier(schema.getQName())); + + for (UnkeyedListEntryNode child : resultNodes) { + b.withChild(child); + } + + return Optional.of(b.build()); + } + + private List unkeyedListEntries(UnkeyedListNode unkeyedListNode) { + List unkeyedListEntries = Lists.newArrayList(); + + for (UnkeyedListEntryNode unkeyedListEntryNode : unkeyedListNode.getValue()) { + unkeyedListEntries.add(unkeyedListEntryNode); + } + + return unkeyedListEntries; + } + +} -- 2.36.6