f5e0bb697a69bf5b090a50f43de1fed22d4ccb63
[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 com.google.common.collect.ImmutableList;
11 import com.google.common.collect.ImmutableMap;
12 import com.google.common.collect.ImmutableSet;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Objects;
19 import java.util.Set;
20 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
21 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
22 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
24 import org.opendaylight.yangtools.yang.model.api.UsesNode;
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.RefineBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
33 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
34 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractBuilder;
35 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
36
37 public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder {
38     private UsesNodeImpl instance;
39     private DataNodeContainerBuilder parentBuilder;
40     private final SchemaPath targetGroupingPath;
41     private SchemaPath groupingPath;
42     private GroupingDefinition groupingDefinition;
43     private GroupingBuilder groupingBuilder;
44     private boolean addedByUses;
45     private boolean augmenting;
46     private boolean resolved;
47     private final Set<AugmentationSchemaBuilder> augmentationBuilders = new HashSet<>();
48     private final List<SchemaNodeBuilder> refineBuilders = new ArrayList<>();
49     private final List<RefineBuilder> refines = new ArrayList<>();
50
51     public UsesNodeBuilderImpl(final String moduleName, final int line, final SchemaPath targetGroupingPath) {
52         super(moduleName, line);
53         this.targetGroupingPath = targetGroupingPath;
54     }
55
56     @Override
57     public UsesNode build() {
58         if (instance != null) {
59             return instance;
60         }
61
62         instance = new UsesNodeImpl(groupingPath);
63         instance.setAddedByUses(addedByUses);
64
65         // AUGMENTATIONS
66         final Set<AugmentationSchema> augments = new HashSet<>();
67         for (AugmentationSchemaBuilder builder : augmentationBuilders) {
68             if (!builder.isUnsupportedTarget()) {
69                 augments.add(builder.build());
70             }
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 SchemaPath getTargetGroupingPath() {
138         return targetGroupingPath;
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 + Objects.hashCode(groupingPath);
206         result = prime * result + Objects.hashCode(parentBuilder);
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 (groupingPath == null) {
223             if (other.groupingPath != null) {
224                 return false;
225             }
226         } else if (!groupingPath.equals(other.groupingPath)) {
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 '" + groupingPath + "'";
242     }
243
244 }