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