BUG 1131: untangling package cyclic dependencies in yang-parser-impl
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / UsesNodeBuilderImpl.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.parser.builder.impl;
9
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.Set;
16
17 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
18 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
19 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
21 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.UsesNode;
23 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.api.RefineBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractBuilder;
33 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
34
35 import com.google.common.collect.ImmutableList;
36 import com.google.common.collect.ImmutableMap;
37 import com.google.common.collect.ImmutableSet;
38
39 public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder {
40     private UsesNodeImpl instance;
41     private DataNodeContainerBuilder parentBuilder;
42     private final String groupingPathString;
43     private SchemaPath groupingPath;
44     private GroupingDefinition groupingDefinition;
45     private GroupingBuilder groupingBuilder;
46     private boolean addedByUses;
47     private boolean augmenting;
48     private boolean resolved;
49     private final Set<AugmentationSchemaBuilder> augmentationBuilders = new HashSet<>();
50     private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<>();
51     private final List<RefineBuilder> refines = new ArrayList<>();
52
53     public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) {
54         super(moduleName, line);
55         this.groupingPathString = groupingName;
56     }
57
58     @Override
59     public UsesNode build() {
60         if (instance != null) {
61             return instance;
62         }
63
64         instance = new UsesNodeImpl(groupingPath);
65         instance.setAddedByUses(addedByUses);
66
67         // AUGMENTATIONS
68         final Set<AugmentationSchema> augments = new HashSet<>();
69         for (AugmentationSchemaBuilder builder : augmentationBuilders) {
70             augments.add(builder.build());
71         }
72         instance.augmentations = ImmutableSet.copyOf(augments);
73
74         // REFINES
75         final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<>();
76         for (SchemaNodeBuilder refineBuilder : refineBuilders) {
77             SchemaNode refineNode = refineBuilder.build();
78             refineNodes.put(refineNode.getPath(), refineNode);
79         }
80         instance.refines = ImmutableMap.copyOf(refineNodes);
81
82         // UNKNOWN NODES
83         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
84             unknownNodes.add(b.build());
85         }
86         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
87
88         return instance;
89     }
90
91     @Override
92     public DataNodeContainerBuilder getParent() {
93         return parentBuilder;
94     }
95
96     @Override
97     public void setParent(final Builder parent) {
98         if (!(parent instanceof DataNodeContainerBuilder)) {
99             throw new YangParseException(getModuleName(), getLine(),
100                     "Parent of 'uses' has to be instance of DataNodeContainerBuilder, but was: '" + parent + "'.");
101         }
102         this.parentBuilder = (DataNodeContainerBuilder) parent;
103     }
104
105     @Override
106     public SchemaPath getGroupingPath() {
107         return groupingPath;
108     }
109
110     @Override
111     public GroupingDefinition getGroupingDefinition() {
112         return groupingDefinition;
113     }
114
115     @Override
116     public void setGroupingDefinition(final GroupingDefinition groupingDefinition) {
117         this.groupingDefinition = groupingDefinition;
118         if (groupingDefinition != null) {
119             this.groupingPath = groupingDefinition.getPath();
120         }
121     }
122
123     @Override
124     public GroupingBuilder getGroupingBuilder() {
125         return groupingBuilder;
126     }
127
128     @Override
129     public void setGrouping(final GroupingBuilder grouping) {
130         this.groupingBuilder = grouping;
131         if (groupingBuilder != null) {
132             this.groupingPath = groupingBuilder.getPath();
133         }
134     }
135
136     @Override
137     public String getGroupingPathAsString() {
138         return groupingPathString;
139     }
140
141     @Override
142     public Set<AugmentationSchemaBuilder> getAugmentations() {
143         return augmentationBuilders;
144     }
145
146     @Override
147     public void addAugment(final AugmentationSchemaBuilder augmentBuilder) {
148         augmentationBuilders.add(augmentBuilder);
149     }
150
151     @Override
152     public boolean isAddedByUses() {
153         return addedByUses;
154     }
155
156     @Override
157     public void setAddedByUses(final boolean addedByUses) {
158         this.addedByUses = addedByUses;
159     }
160
161     @Override
162     public boolean isAugmenting() {
163         return augmenting;
164     }
165
166     @Override
167     public void setAugmenting(final boolean augmenting) {
168         this.augmenting = augmenting;
169     }
170
171     @Override
172     public boolean isResolved() {
173         return resolved;
174     }
175
176     @Override
177     public void setResolved(final boolean resolved) {
178         this.resolved = resolved;
179     }
180
181     @Override
182     public List<SchemaNodeBuilder> getRefineNodes() {
183         return refineBuilders;
184     }
185
186     @Override
187     public void addRefineNode(final DataSchemaNodeBuilder refineNode) {
188         refineBuilders.add(refineNode);
189     }
190
191     @Override
192     public List<RefineBuilder> getRefines() {
193         return refines;
194     }
195
196     @Override
197     public void addRefine(final RefineBuilder refine) {
198         refines.add(refine);
199     }
200
201     @Override
202     public int hashCode() {
203         final int prime = 31;
204         int result = 1;
205         result = prime * result + ((groupingPathString == null) ? 0 : groupingPathString.hashCode());
206         result = prime * result + ((parentBuilder == null) ? 0 : parentBuilder.hashCode());
207         return result;
208     }
209
210     @Override
211     public boolean equals(final Object obj) {
212         if (this == obj) {
213             return true;
214         }
215         if (obj == null) {
216             return false;
217         }
218         if (getClass() != obj.getClass()) {
219             return false;
220         }
221         UsesNodeBuilderImpl other = (UsesNodeBuilderImpl) obj;
222         if (groupingPathString == null) {
223             if (other.groupingPathString != null) {
224                 return false;
225             }
226         } else if (!groupingPathString.equals(other.groupingPathString)) {
227             return false;
228         }
229         if (parentBuilder == null) {
230             if (other.parentBuilder != null) {
231                 return false;
232             }
233         } else if (!parentBuilder.equals(other.parentBuilder)) {
234             return false;
235         }
236         return true;
237     }
238
239     @Override
240     public String toString() {
241         return "uses '" + groupingPathString + "'";
242     }
243
244     private static final class UsesNodeImpl implements UsesNode {
245         private final SchemaPath groupingPath;
246         private ImmutableSet<AugmentationSchema> augmentations;
247         private boolean addedByUses;
248         private ImmutableMap<SchemaPath, SchemaNode> refines;
249         private ImmutableList<UnknownSchemaNode> unknownNodes;
250
251         private UsesNodeImpl(final SchemaPath groupingPath) {
252             this.groupingPath = groupingPath;
253         }
254
255         @Override
256         public SchemaPath getGroupingPath() {
257             return groupingPath;
258         }
259
260         @Override
261         public Set<AugmentationSchema> getAugmentations() {
262             return augmentations;
263         }
264
265         @Override
266         public boolean isAugmenting() {
267             return false;
268         }
269
270         @Override
271         public boolean isAddedByUses() {
272             return addedByUses;
273         }
274
275         private void setAddedByUses(final boolean addedByUses) {
276             this.addedByUses = addedByUses;
277         }
278
279         @Override
280         public Map<SchemaPath, SchemaNode> getRefines() {
281             return refines;
282         }
283
284         @SuppressWarnings("unused")
285         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
286             return unknownNodes;
287         }
288
289         @Override
290         public int hashCode() {
291             final int prime = 31;
292             int result = 1;
293             result = prime * result + ((groupingPath == null) ? 0 : groupingPath.hashCode());
294             result = prime * result + ((augmentations == null) ? 0 : augmentations.hashCode());
295             return result;
296         }
297
298         @Override
299         public boolean equals(final Object obj) {
300             if (this == obj) {
301                 return true;
302             }
303             if (obj == null) {
304                 return false;
305             }
306             if (getClass() != obj.getClass()) {
307                 return false;
308             }
309             final UsesNodeImpl other = (UsesNodeImpl) obj;
310             if (groupingPath == null) {
311                 if (other.groupingPath != null) {
312                     return false;
313                 }
314             } else if (!groupingPath.equals(other.groupingPath)) {
315                 return false;
316             }
317             if (augmentations == null) {
318                 if (other.augmentations != null) {
319                     return false;
320                 }
321             } else if (!augmentations.equals(other.augmentations)) {
322                 return false;
323             }
324             return true;
325         }
326
327         @Override
328         public String toString() {
329             StringBuilder sb = new StringBuilder(UsesNodeImpl.class.getSimpleName());
330             sb.append("[groupingPath=");
331             sb.append(groupingPath);
332             sb.append("]");
333             return sb.toString();
334         }
335     }
336
337 }