Merge "When a node is going down, remove edges in both directions associated with...
[controller.git] / opendaylight / sal / yang-prototype / yang / yang-data-impl / src / main / java / org / opendaylight / controller / yang / data / impl / CompositeNodeTOImpl.java
1 /*\r
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.controller.yang.data.impl;\r
9 \r
10 import java.util.ArrayList;\r
11 import java.util.List;\r
12 import java.util.Map;\r
13 \r
14 import org.opendaylight.controller.yang.common.QName;\r
15 import org.opendaylight.controller.yang.data.api.CompositeNode;\r
16 import org.opendaylight.controller.yang.data.api.ModifyAction;\r
17 import org.opendaylight.controller.yang.data.api.MutableCompositeNode;\r
18 import org.opendaylight.controller.yang.data.api.Node;\r
19 import org.opendaylight.controller.yang.data.api.SimpleNode;\r
20 \r
21 /**\r
22  * @author michal.rehak\r
23  * \r
24  */\r
25 public class CompositeNodeTOImpl extends AbstractNodeTO<List<Node<?>>>\r
26         implements CompositeNode {\r
27 \r
28     private Map<QName, List<Node<?>>> nodeMap;\r
29 \r
30     /**\r
31      * @param qname\r
32      * @param parent use null to create top composite node (without parent)\r
33      * @param value\r
34      */\r
35     public CompositeNodeTOImpl(QName qname, CompositeNode parent,\r
36             List<Node<?>> value) {\r
37         super(qname, parent, value);\r
38         if (value != null) {\r
39             nodeMap = NodeUtils.buildNodeMap(getValue());\r
40         }\r
41         init();\r
42     }\r
43 \r
44     /**\r
45      * @param qname\r
46      * @param parent use null to create top composite node (without parent)\r
47      * @param value\r
48      * @param modifyAction \r
49      */\r
50     public CompositeNodeTOImpl(QName qname, CompositeNode parent,\r
51             List<Node<?>> value, ModifyAction modifyAction) {\r
52         super(qname, parent, value, modifyAction);\r
53         init();\r
54     }\r
55     \r
56 \r
57     /**\r
58      * @return the nodeMap\r
59      */\r
60     protected Map<QName, List<Node<?>>> getNodeMap() {\r
61         return nodeMap;\r
62     }\r
63     \r
64     @Override\r
65     public List<Node<?>> getChildren() {\r
66         return getValue();\r
67     }\r
68 \r
69     @Override\r
70     public SimpleNode<?> getFirstSimpleByName(QName leafQName) {\r
71         List<SimpleNode<?>> list = getSimpleNodesByName(leafQName);\r
72         if (list.isEmpty())\r
73             return null;\r
74         return list.get(0);\r
75     }\r
76 \r
77     @Override\r
78     public List<CompositeNode> getCompositesByName(QName children) {\r
79         List<Node<?>> toFilter = getNodeMap().get(children);\r
80         List<CompositeNode> list = new ArrayList<CompositeNode>();\r
81         for (Node<?> node : toFilter) {\r
82             if (node instanceof CompositeNode)\r
83                 list.add((CompositeNode) node);\r
84         }\r
85         return list;\r
86     }\r
87 \r
88     @Override\r
89     public List<SimpleNode<?>> getSimpleNodesByName(QName children) {\r
90         List<Node<?>> toFilter = getNodeMap().get(children);\r
91         List<SimpleNode<?>> list = new ArrayList<SimpleNode<?>>();\r
92 \r
93         for (Node<?> node : toFilter) {\r
94             if (node instanceof SimpleNode<?>)\r
95                 list.add((SimpleNode<?>) node);\r
96         }\r
97         return list;\r
98     }\r
99 \r
100     @Override\r
101     public CompositeNode getFirstCompositeByName(QName container) {\r
102         List<CompositeNode> list = getCompositesByName(container);\r
103         if (list.isEmpty()) {\r
104             return null;\r
105         }\r
106         return list.get(0);\r
107     }\r
108 \r
109     /**\r
110      * @param leaf\r
111      * @return TODO:: do we need this method?\r
112      */\r
113     public SimpleNode<?> getFirstLeafByName(QName leaf) {\r
114         List<SimpleNode<?>> list = getSimpleNodesByName(leaf);\r
115         if (list.isEmpty()) {\r
116             return null;\r
117         }\r
118         return list.get(0);\r
119     }\r
120 \r
121     @Override\r
122     public List<CompositeNode> getCompositesByName(String children) {\r
123         return getCompositesByName(new QName(getNodeType(), children));\r
124     }\r
125     \r
126     @Override\r
127     public List<SimpleNode<?>> getSimpleNodesByName(String children) {\r
128         return getSimpleNodesByName(new QName(getNodeType(), children));\r
129     }\r
130 \r
131     /**\r
132      * @param value\r
133      */\r
134     protected void init() {\r
135         if (getValue() != null) {\r
136             nodeMap = NodeUtils.buildNodeMap(getValue());\r
137         }\r
138     }\r
139     \r
140     @Override\r
141     public MutableCompositeNode asMutable() {\r
142         throw new IllegalAccessError("cast to mutable is not supported - "+getClass().getSimpleName());\r
143     }\r
144     \r
145     @Override\r
146     public String toString() {\r
147         return super.toString() + ", children.size = " \r
148                 + (getChildren() != null ? getChildren().size() : "n/a");\r
149     }\r
150     \r
151     \r
152 \r
153 }\r