MutableCopomositeNodeTOImpl as mutable implementation of CompositeNode
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / MutableCompositeNodeTOImpl.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.yangtools.yang.data.impl;\r
9 \r
10 import java.util.ArrayList;\r
11 import java.util.Collection;\r
12 import java.util.Collections;\r
13 import java.util.HashMap;\r
14 import java.util.List;\r
15 import java.util.Map;\r
16 import java.util.Set;\r
17 \r
18 import org.opendaylight.yangtools.yang.common.QName;\r
19 import org.opendaylight.yangtools.yang.data.api.CompositeNode;\r
20 import org.opendaylight.yangtools.yang.data.api.ModifyAction;\r
21 import org.opendaylight.yangtools.yang.data.api.MutableCompositeNode;\r
22 import org.opendaylight.yangtools.yang.data.api.Node;\r
23 import org.opendaylight.yangtools.yang.data.api.SimpleNode;\r
24 \r
25 /**\r
26  * @author michal.rehak\r
27  * \r
28  */\r
29 public class MutableCompositeNodeTOImpl extends AbstractNodeTO<List<Node<?>>> implements MutableCompositeNode {\r
30 \r
31     private Map<QName, List<Node<?>>> nodeMap = new HashMap<>();\r
32     private CompositeNode original;\r
33 \r
34     public MutableCompositeNodeTOImpl(QName qname, CompositeNode parent, List<Node<?>> value, ModifyAction modifyAction) {\r
35         super(qname, parent, value, modifyAction);\r
36         init();\r
37     }\r
38 \r
39     /**\r
40      * update nodeMap - it should be invoked after children was changed\r
41      */\r
42     @Override\r
43     public void init() {\r
44         if (!getChildren().isEmpty()) {\r
45             nodeMap = NodeUtils.buildNodeMap(getChildren());\r
46         }\r
47     }\r
48 \r
49     @Override\r
50     public List<Node<?>> getChildren() {\r
51         return getValue() == null ? new ArrayList<Node<?>>() : getValue();\r
52     }\r
53 \r
54     @Override\r
55     public List<Node<?>> setValue(List<Node<?>> value) {\r
56         List<Node<?>> oldVal = super.setValue(value);\r
57         init();\r
58         return oldVal;\r
59     }\r
60 \r
61     @Override\r
62     public void setModifyAction(ModifyAction action) {\r
63         super.setModificationAction(action);\r
64     }\r
65 \r
66     protected Map<QName, List<Node<?>>> getNodeMap() {\r
67         return nodeMap;\r
68     }\r
69 \r
70     @Override\r
71     public MutableCompositeNode asMutable() {\r
72         return this;\r
73     }\r
74 \r
75     @Override\r
76     public CompositeNode getOriginal() {\r
77         return original;\r
78     }\r
79 \r
80     /**\r
81      * @param original\r
82      *            the original to set\r
83      */\r
84     public void setOriginal(CompositeNode original) {\r
85         this.original = original;\r
86     }\r
87 \r
88     @Override\r
89     public SimpleNode<?> getFirstSimpleByName(QName leafQName) {\r
90         List<SimpleNode<?>> list = getSimpleNodesByName(leafQName);\r
91         if (list.isEmpty()) {\r
92             return null;\r
93         }\r
94         return list.get(0);\r
95     }\r
96 \r
97     @Override\r
98     public List<CompositeNode> getCompositesByName(QName children) {\r
99         List<Node<?>> toFilter = getNodeMap().get(children);\r
100         if (toFilter == null) {\r
101             return Collections.emptyList();\r
102         }\r
103         List<CompositeNode> list = new ArrayList<CompositeNode>();\r
104         for (Node<?> node : toFilter) {\r
105             if (node instanceof CompositeNode) {\r
106                 list.add((CompositeNode) node);\r
107             }\r
108         }\r
109         return list;\r
110     }\r
111 \r
112     @Override\r
113     public List<SimpleNode<?>> getSimpleNodesByName(QName children) {\r
114         List<Node<?>> toFilter = getNodeMap().get(children);\r
115         if (toFilter == null) {\r
116             return Collections.emptyList();\r
117         }\r
118         List<SimpleNode<?>> list = new ArrayList<SimpleNode<?>>();\r
119 \r
120         for (Node<?> node : toFilter) {\r
121             if (node instanceof SimpleNode<?>) {\r
122                 list.add((SimpleNode<?>) node);\r
123             }\r
124         }\r
125         return list;\r
126     }\r
127 \r
128     @Override\r
129     public CompositeNode getFirstCompositeByName(QName container) {\r
130         List<CompositeNode> list = getCompositesByName(container);\r
131         if (list.isEmpty()) {\r
132             return null;\r
133         }\r
134         return list.get(0);\r
135     }\r
136 \r
137     /**\r
138      * @param leaf\r
139      * @return TODO:: do we need this method?\r
140      */\r
141     public SimpleNode<?> getFirstLeafByName(QName leaf) {\r
142         List<SimpleNode<?>> list = getSimpleNodesByName(leaf);\r
143         if (list.isEmpty()) {\r
144             return null;\r
145         }\r
146         return list.get(0);\r
147     }\r
148 \r
149     @Override\r
150     public List<CompositeNode> getCompositesByName(String children) {\r
151         return getCompositesByName(new QName(getNodeType(), children));\r
152     }\r
153 \r
154     @Override\r
155     public List<SimpleNode<?>> getSimpleNodesByName(String children) {\r
156         return getSimpleNodesByName(new QName(getNodeType(), children));\r
157     }\r
158 \r
159     @Override\r
160     public String toString() {\r
161         return super.toString() + ", children.size = " + (getChildren() != null ? getChildren().size() : "n/a");\r
162     }\r
163 \r
164     @Override\r
165     public void clear() {\r
166         nodeMap.clear();\r
167     }\r
168 \r
169     @Override\r
170     public boolean containsKey(Object key) {\r
171         return nodeMap.containsKey(key);\r
172     }\r
173 \r
174     @Override\r
175     public boolean containsValue(Object value) {\r
176         return nodeMap.containsValue(value);\r
177     }\r
178 \r
179     @Override\r
180     public Set<java.util.Map.Entry<QName, List<Node<?>>>> entrySet() {\r
181         return nodeMap.entrySet();\r
182     }\r
183 \r
184     @Override\r
185     public boolean equals(Object obj) {\r
186         return super.equals(obj);\r
187     }\r
188 \r
189     @Override\r
190     public int size() {\r
191         return nodeMap.size();\r
192     }\r
193 \r
194     @Override\r
195     public boolean isEmpty() {\r
196         return nodeMap.isEmpty();\r
197     }\r
198 \r
199     @Override\r
200     public List<Node<?>> get(Object key) {\r
201         return nodeMap.get(key);\r
202     }\r
203 \r
204     @Override\r
205     public List<Node<?>> put(QName key, List<Node<?>> value) {\r
206         return nodeMap.put(key, value);\r
207     }\r
208 \r
209     @Override\r
210     public List<Node<?>> remove(Object key) {\r
211         return nodeMap.remove(key);\r
212     }\r
213 \r
214     @Override\r
215     public void putAll(Map<? extends QName, ? extends List<Node<?>>> m) {\r
216         nodeMap.putAll(m);\r
217     }\r
218 \r
219     @Override\r
220     public Set<QName> keySet() {\r
221         return nodeMap.keySet();\r
222     }\r
223 \r
224     @Override\r
225     public Collection<List<Node<?>>> values() {\r
226         return nodeMap.values();\r
227     }\r
228 }\r