CompositeNode and its mutable/immutable objects 47/2547/1
authormsunal <msunal@cisco.com>
Fri, 8 Nov 2013 12:07:40 +0000 (13:07 +0100)
committermsunal <msunal@cisco.com>
Fri, 8 Nov 2013 12:07:40 +0000 (13:07 +0100)
- getChildren() method in CompositeNodeTOImpl returns immutable List
- getChildren() method in MutableCompositeNodeTOImpl returns mutable List
- XmlTreeBuilder calls init() on MutableCompositeNode after children are added

Signed-off-by: Martin Sunal <msunal@cisco.com>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/CompositeNodeTOImpl.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/MutableCompositeNodeTOImpl.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/XmlTreeBuilder.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/XmlTreeBuilderTest.java

index 3ac347ca844cd784889c054a43c3fdb34a564521..5eb8b5c32f502bc18a84d854d060468a663264fe 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.yangtools.yang.data.impl;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -61,7 +62,7 @@ public class CompositeNodeTOImpl extends AbstractNodeTO<List<Node<?>>> implement
 
     @Override
     public List<Node<?>> getChildren() {
-        return getValue();
+        return Collections.unmodifiableList(getValue() == null ? new ArrayList<Node<?>>() : getValue());
     }
 
     @Override
index 75c98715c982c50acd7e0eb3f9e74dc5726fa6e5..e7efe7ef7f725851f3e034addf6a25a4a6836ab6 100644 (file)
@@ -7,6 +7,7 @@
  */\r
 package org.opendaylight.yangtools.yang.data.impl;\r
 \r
+import java.util.ArrayList;\r
 import java.util.List;\r
 import java.util.Map;\r
 \r
@@ -38,7 +39,7 @@ public class MutableCompositeNodeTOImpl extends CompositeNodeTOImpl
     }\r
 \r
     /**\r
-     * update nodeMap\r
+     * update nodeMap - it should be invoked after children was changed\r
      */\r
     @Override\r
     public void init() {\r
@@ -46,10 +47,16 @@ public class MutableCompositeNodeTOImpl extends CompositeNodeTOImpl
             nodeMap = NodeUtils.buildNodeMap(getChildren());\r
         }\r
     }\r
+    \r
+    @Override\r
+    public List<Node<?>> getChildren() {\r
+        return getValue() == null ? new ArrayList<Node<?>>() : getValue();\r
+    }\r
 \r
     @Override\r
     public void setValue(List<Node<?>> value) {\r
         super.setValue(value);\r
+        init();\r
     }\r
 \r
     @Override\r
index 7f9d84ed1a73f2f96491bfa2420c5e8e03915c34..ccba69b4b925df413397dd5d4c3babebaa656d0c 100644 (file)
@@ -77,9 +77,9 @@ public final class XmlTreeBuilder {
                 if (!processingQueue.isEmpty()) {
                     parentNode = processingQueue.peek();
                 }
-                CompositeNode compParentNode = null;
-                if (parentNode instanceof CompositeNode) {
-                    compParentNode = (CompositeNode) parentNode;
+                MutableCompositeNode compParentNode = null;
+                if (parentNode instanceof MutableCompositeNode) {
+                    compParentNode = (MutableCompositeNode) parentNode;
                 }
                 Node<?> newNode = null;
                 if (isCompositeNodeEvent(event)) {
@@ -96,6 +96,9 @@ public final class XmlTreeBuilder {
                 }
             } else if (event.isEndElement()) {
                 root = processingQueue.pop();
+                if (root instanceof MutableCompositeNode) {
+                    ((MutableCompositeNode) root).init();
+                }
             }
         }
         return root;
@@ -218,7 +221,7 @@ public final class XmlTreeBuilder {
      * @see CompositeNode
      * @see MutableCompositeNode
      */
-    private static CompositeNode resolveCompositeNodeFromStartElement(final StartElement startElement,
+    private static MutableCompositeNode resolveCompositeNodeFromStartElement(final StartElement startElement,
             CompositeNode parent) {
         checkArgument(startElement != null, "Start Element cannot be NULL!");
 
index 6f8253407aa794fe748422a17e68b9cef5b4c202..3cddd8c844ea559ae2fce5e5e2c2b796758ba23e 100644 (file)
@@ -13,6 +13,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.FileInputStream;
 import java.io.InputStream;
+import java.util.List;
 
 import javax.xml.stream.XMLStreamException;
 
@@ -106,4 +107,20 @@ public class XmlTreeBuilderTest {
                assertNotNull(deviceId);
                assertNotNull(deviceIP);
        }
+       
+       @Test
+       public void nodeMapInCompositeNodeTest() {
+           Node<?> rootNode = null;
+            try {
+                    rootNode = XmlTreeBuilder.buildDataTree(inputStream);
+            } catch (XMLStreamException e) {
+                    e.printStackTrace();
+            }
+            
+            CompositeNode compRootNode = (CompositeNode)rootNode;
+            List<CompositeNode> params = compRootNode.getCompositesByName("params");
+            assertEquals(1, params.size());
+            List<CompositeNode> compositesByName = params.get(0).getCompositesByName("param");
+            assertEquals(2, compositesByName.size());
+       }
 }
\ No newline at end of file