2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.builder.impl;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
18 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
19 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
20 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
22 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.UsesNode;
24 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
33 import org.opendaylight.yangtools.yang.parser.util.RefineHolder;
34 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
36 public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder {
37 private boolean isBuilt;
38 private UsesNodeImpl instance;
39 private DataNodeContainerBuilder parent;
40 private final String groupingName;
41 private SchemaPath groupingPath;
42 private GroupingDefinition groupingDefinition;
43 private GroupingBuilder groupingBuilder;
44 private boolean addedByUses;
45 private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<AugmentationSchemaBuilder>();
46 private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<SchemaNodeBuilder>();
47 private final List<RefineHolder> refines = new ArrayList<RefineHolder>();
49 private Set<DataSchemaNodeBuilder> targetChildren = new HashSet<>();
50 private Set<GroupingBuilder> targetGroupings = new HashSet<>();
51 private Set<TypeDefinitionBuilder> targetTypedefs = new HashSet<>();
52 private List<UnknownSchemaNodeBuilder> targetUnknownNodes = new ArrayList<>();
54 private final boolean isCopy;
55 private boolean dataCollected;
58 public boolean isCopy() {
63 public boolean isDataCollected() {
68 public void setDataCollected(boolean dataCollected) {
69 this.dataCollected = dataCollected;
72 public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) {
73 super(moduleName, line);
74 this.groupingName = groupingName;
78 public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName, final boolean isCopy) {
79 super(moduleName, line);
80 this.groupingName = groupingName;
85 public UsesNode build() {
87 instance = new UsesNodeImpl(groupingPath);
88 instance.setAddedByUses(addedByUses);
91 final Set<AugmentationSchema> augments = new HashSet<AugmentationSchema>();
92 for (AugmentationSchemaBuilder builder : addedAugments) {
93 augments.add(builder.build());
95 instance.setAugmentations(augments);
98 final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<SchemaPath, SchemaNode>();
99 for (SchemaNodeBuilder refineBuilder : refineBuilders) {
100 SchemaNode refineNode = refineBuilder.build();
101 refineNodes.put(refineNode.getPath(), refineNode);
103 instance.setRefines(refineNodes);
106 List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
107 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
108 unknownNodes.add(b.build());
110 instance.setUnknownSchemaNodes(unknownNodes);
119 public DataNodeContainerBuilder getParent() {
124 public void setParent(Builder parent) {
125 if (!(parent instanceof DataNodeContainerBuilder)) {
126 throw new YangParseException(moduleName, line,
127 "Parent of 'uses' has to be instance of DataNodeContainerBuilder, but was: '" + parent + "'.");
129 this.parent = (DataNodeContainerBuilder) parent;
133 public SchemaPath getGroupingPath() {
138 public GroupingDefinition getGroupingDefinition() {
139 return groupingDefinition;
143 public void setGroupingDefinition(GroupingDefinition groupingDefinition) {
144 this.groupingDefinition = groupingDefinition;
145 if (groupingDefinition != null) {
146 this.groupingPath = groupingDefinition.getPath();
151 public GroupingBuilder getGroupingBuilder() {
152 return groupingBuilder;
156 public void setGrouping(GroupingBuilder grouping) {
157 this.groupingBuilder = grouping;
158 if (groupingBuilder != null) {
159 this.groupingPath = groupingBuilder.getPath();
164 public String getGroupingPathAsString() {
169 public Set<AugmentationSchemaBuilder> getAugmentations() {
170 return addedAugments;
174 public void addAugment(final AugmentationSchemaBuilder augmentBuilder) {
175 addedAugments.add(augmentBuilder);
179 public boolean isAddedByUses() {
184 public void setAddedByUses(final boolean addedByUses) {
185 this.addedByUses = addedByUses;
189 public List<SchemaNodeBuilder> getRefineNodes() {
190 return refineBuilders;
194 public void addRefineNode(DataSchemaNodeBuilder refineNode) {
195 refineBuilders.add(refineNode);
199 public List<RefineHolder> getRefines() {
204 public void addRefine(RefineHolder refine) {
209 public Set<DataSchemaNodeBuilder> getTargetChildren() {
210 return targetChildren;
214 public void setTargetChildren(Set<DataSchemaNodeBuilder> targetChildren) {
215 this.targetChildren = targetChildren;
219 public Set<GroupingBuilder> getTargetGroupings() {
220 return targetGroupings;
224 public void setTargetGroupings(Set<GroupingBuilder> targetGroupings) {
225 this.targetGroupings = targetGroupings;
229 public Set<TypeDefinitionBuilder> getTargetTypedefs() {
230 return targetTypedefs;
234 public void setTargetTypedefs(Set<TypeDefinitionBuilder> targetTypedefs) {
235 this.targetTypedefs = targetTypedefs;
239 public List<UnknownSchemaNodeBuilder> getTargetUnknownNodes() {
240 return targetUnknownNodes;
244 public void setTargetUnknownNodes(List<UnknownSchemaNodeBuilder> targetUnknownNodes) {
245 this.targetUnknownNodes = targetUnknownNodes;
249 public int hashCode() {
250 final int prime = 31;
252 result = prime * result + ((groupingName == null) ? 0 : groupingName.hashCode());
253 result = prime * result + ((parent == null) ? 0 : parent.hashCode());
254 result = prime * result + ((refines == null) ? 0 : refines.hashCode());
259 public boolean equals(Object obj) {
266 if (getClass() != obj.getClass()) {
269 UsesNodeBuilderImpl other = (UsesNodeBuilderImpl) obj;
270 if (groupingName == null) {
271 if (other.groupingName != null) {
274 } else if (!groupingName.equals(other.groupingName)) {
277 if (parent == null) {
278 if (other.parent != null) {
281 } else if (!parent.equals(other.parent)) {
284 if (refines == null) {
285 if (other.refines != null) {
288 } else if (!refines.equals(other.refines)) {
295 public String toString() {
296 return "uses '" + groupingName + "'";
299 public final class UsesNodeImpl implements UsesNode {
300 private final SchemaPath groupingPath;
301 private Set<AugmentationSchema> augmentations = Collections.emptySet();
302 private boolean addedByUses;
303 private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();
304 private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
306 private UsesNodeImpl(final SchemaPath groupingPath) {
307 this.groupingPath = groupingPath;
311 public SchemaPath getGroupingPath() {
316 public Set<AugmentationSchema> getAugmentations() {
317 return augmentations;
320 private void setAugmentations(final Set<AugmentationSchema> augmentations) {
321 if (augmentations != null) {
322 this.augmentations = augmentations;
327 public boolean isAugmenting() {
332 public boolean isAddedByUses() {
336 private void setAddedByUses(final boolean addedByUses) {
337 this.addedByUses = addedByUses;
341 public Map<SchemaPath, SchemaNode> getRefines() {
345 private void setRefines(Map<SchemaPath, SchemaNode> refines) {
346 if (refines != null) {
347 this.refines = refines;
351 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
355 private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
356 if (unknownSchemaNodes != null) {
357 this.unknownNodes = unknownSchemaNodes;
361 public UsesNodeBuilder toBuilder() {
362 return UsesNodeBuilderImpl.this;
366 public int hashCode() {
367 final int prime = 31;
369 result = prime * result + ((groupingPath == null) ? 0 : groupingPath.hashCode());
370 result = prime * result + ((augmentations == null) ? 0 : augmentations.hashCode());
375 public boolean equals(Object obj) {
382 if (getClass() != obj.getClass()) {
385 final UsesNodeImpl other = (UsesNodeImpl) obj;
386 if (groupingPath == null) {
387 if (other.groupingPath != null) {
390 } else if (!groupingPath.equals(other.groupingPath)) {
393 if (augmentations == null) {
394 if (other.augmentations != null) {
397 } else if (!augmentations.equals(other.augmentations)) {
404 public String toString() {
405 StringBuilder sb = new StringBuilder(UsesNodeImpl.class.getSimpleName());
406 sb.append("[groupingPath=");
407 sb.append(groupingPath);
409 return sb.toString();