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