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.controller.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.controller.yang.common.QName;
19 import org.opendaylight.controller.yang.model.api.AugmentationSchema;
20 import org.opendaylight.controller.yang.model.api.DataSchemaNode;
21 import org.opendaylight.controller.yang.model.api.GroupingDefinition;
22 import org.opendaylight.controller.yang.model.api.RevisionAwareXPath;
23 import org.opendaylight.controller.yang.model.api.SchemaPath;
24 import org.opendaylight.controller.yang.model.api.Status;
25 import org.opendaylight.controller.yang.model.api.TypeDefinition;
26 import org.opendaylight.controller.yang.model.api.UnknownSchemaNode;
27 import org.opendaylight.controller.yang.model.api.UsesNode;
28 import org.opendaylight.controller.yang.model.util.RevisionAwareXPathImpl;
29 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
30 import org.opendaylight.controller.yang.parser.builder.api.Builder;
31 import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder;
32 import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder;
33 import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder;
34 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
35 import org.opendaylight.controller.yang.parser.util.YangModelBuilderUtil;
36 import org.opendaylight.controller.yang.parser.util.YangParseException;
38 public final class AugmentationSchemaBuilderImpl implements AugmentationSchemaBuilder {
39 private boolean built;
40 private final AugmentationSchemaImpl instance;
41 private final int line;
42 private final Builder parent;
44 private String whenCondition;
45 private String description;
46 private String reference;
47 private Status status = Status.CURRENT;
49 private final String augmentTargetStr;
50 private SchemaPath dirtyAugmentTarget;
51 private SchemaPath finalAugmentTarget;
53 private final Set<DataSchemaNodeBuilder> childNodes = new HashSet<DataSchemaNodeBuilder>();
54 private final Set<GroupingBuilder> groupings = new HashSet<GroupingBuilder>();
55 private final Set<UsesNodeBuilder> usesNodes = new HashSet<UsesNodeBuilder>();
56 private final List<UnknownSchemaNodeBuilder> addedUnknownNodes = new ArrayList<UnknownSchemaNodeBuilder>();
57 private boolean resolved;
59 AugmentationSchemaBuilderImpl(final String augmentTargetStr, final int line, final Builder parent) {
60 this.augmentTargetStr = augmentTargetStr;
63 final SchemaPath targetPath = YangModelBuilderUtil
64 .parseAugmentPath(augmentTargetStr);
65 dirtyAugmentTarget = targetPath;
66 instance = new AugmentationSchemaImpl(targetPath);
70 public int getLine() {
75 public Builder getParent() {
81 public void addChildNode(DataSchemaNodeBuilder childNode) {
82 childNodes.add(childNode);
86 public Set<DataSchemaNode> getChildNodes() {
87 return Collections.emptySet();
91 public Set<DataSchemaNodeBuilder> getChildNodeBuilders() {
96 public Set<GroupingDefinition> getGroupings() {
97 return Collections.emptySet();
101 public Set<GroupingBuilder> getGroupingBuilders() {
106 public void addGrouping(GroupingBuilder grouping) {
107 groupings.add(grouping);
111 public void addUsesNode(UsesNodeBuilder usesBuilder) {
112 usesNodes.add(usesBuilder);
116 * Always returns null.
119 public QName getQName() {
124 * Always returns null.
127 public SchemaPath getPath() {
132 public AugmentationSchema build() {
134 instance.setDescription(description);
135 instance.setReference(reference);
136 instance.setStatus(status);
137 instance.setTargetPath(finalAugmentTarget);
139 RevisionAwareXPath whenStmt;
140 if (whenCondition == null) {
143 whenStmt = new RevisionAwareXPathImpl(whenCondition, false);
145 instance.setWhenCondition(whenStmt);
148 final Map<QName, DataSchemaNode> childs = new HashMap<QName, DataSchemaNode>();
149 for (DataSchemaNodeBuilder node : childNodes) {
150 childs.put(node.getQName(), node.build());
152 instance.setChildNodes(childs);
155 final Set<GroupingDefinition> groupingDefinitions = new HashSet<GroupingDefinition>();
156 for (GroupingBuilder builder : groupings) {
157 groupingDefinitions.add(builder.build());
159 instance.setGroupings(groupingDefinitions);
162 final Set<UsesNode> usesNodeDefinitions = new HashSet<UsesNode>();
163 for (UsesNodeBuilder builder : usesNodes) {
164 usesNodeDefinitions.add(builder.build());
166 instance.setUses(usesNodeDefinitions);
169 List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
170 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
171 unknownNodes.add(b.build());
173 instance.setUnknownSchemaNodes(unknownNodes);
181 public boolean isResolved() {
186 public void setResolved(boolean resolved) {
187 this.resolved = resolved;
190 public String getWhenCondition() {
191 return whenCondition;
194 public void addWhenCondition(String whenCondition) {
195 this.whenCondition = whenCondition;
199 public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
200 return Collections.emptySet();
204 public void addTypedef(TypeDefinitionBuilder type) {
205 throw new YangParseException(line,
206 "Augmentation can not contains typedef statement.");
210 public void setDescription(String description) {
211 this.description = description;
215 public void setReference(String reference) {
216 this.reference = reference;
220 public void setStatus(Status status) {
222 this.status = status;
227 public SchemaPath getTargetPath() {
228 return dirtyAugmentTarget;
232 public void setTargetPath(SchemaPath path) {
233 this.finalAugmentTarget = path;
237 public String getTargetPathAsString() {
238 return augmentTargetStr;
241 public List<UnknownSchemaNodeBuilder> getUnknownNodes() {
242 return addedUnknownNodes;
246 public void addUnknownSchemaNode(UnknownSchemaNodeBuilder unknownNode) {
247 addedUnknownNodes.add(unknownNode);
251 public int hashCode() {
252 final int prime = 17;
256 + ((augmentTargetStr == null) ? 0 : augmentTargetStr.hashCode());
257 result = prime * result
258 + ((whenCondition == null) ? 0 : whenCondition.hashCode());
259 result = prime * result
260 + ((childNodes == null) ? 0 : childNodes.hashCode());
265 public boolean equals(Object obj) {
272 if (getClass() != obj.getClass()) {
275 AugmentationSchemaBuilderImpl other = (AugmentationSchemaBuilderImpl) obj;
276 if (augmentTargetStr == null) {
277 if (other.augmentTargetStr != null) {
280 } else if (!augmentTargetStr.equals(other.augmentTargetStr)) {
283 if (whenCondition == null) {
284 if (other.whenCondition != null) {
287 } else if (!whenCondition.equals(other.whenCondition)) {
290 if (childNodes == null) {
291 if (other.childNodes != null) {
294 } else if (!childNodes.equals(other.childNodes)) {
300 private final class AugmentationSchemaImpl implements AugmentationSchema {
301 private SchemaPath targetPath;
302 private RevisionAwareXPath whenCondition;
303 private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
304 private Set<GroupingDefinition> groupings = Collections.emptySet();
305 private Set<UsesNode> uses = Collections.emptySet();
306 private String description;
307 private String reference;
308 private Status status;
309 private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
311 private AugmentationSchemaImpl(SchemaPath targetPath) {
312 this.targetPath = targetPath;
316 public SchemaPath getTargetPath() {
320 private void setTargetPath(SchemaPath path) {
321 this.targetPath = path;
325 public RevisionAwareXPath getWhenCondition() {
326 return whenCondition;
329 private void setWhenCondition(RevisionAwareXPath whenCondition) {
330 this.whenCondition = whenCondition;
334 public Set<DataSchemaNode> getChildNodes() {
335 return new HashSet<DataSchemaNode>(childNodes.values());
338 private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
339 if (childNodes != null) {
340 this.childNodes = childNodes;
345 public Set<GroupingDefinition> getGroupings() {
349 private void setGroupings(Set<GroupingDefinition> groupings) {
350 if (groupings != null) {
351 this.groupings = groupings;
356 public Set<UsesNode> getUses() {
360 private void setUses(Set<UsesNode> uses) {
367 * Always returns an empty set, because augmentation can not contains
371 public Set<TypeDefinition<?>> getTypeDefinitions() {
372 return Collections.emptySet();
376 public String getDescription() {
380 private void setDescription(String description) {
381 this.description = description;
385 public String getReference() {
389 private void setReference(String reference) {
390 this.reference = reference;
394 public Status getStatus() {
398 private void setStatus(Status status) {
399 this.status = status;
402 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
406 private void setUnknownSchemaNodes(
407 List<UnknownSchemaNode> unknownSchemaNodes) {
408 if (unknownSchemaNodes != null) {
409 this.unknownNodes = unknownSchemaNodes;
414 public DataSchemaNode getDataChildByName(QName name) {
415 return childNodes.get(name);
419 public DataSchemaNode getDataChildByName(String name) {
420 DataSchemaNode result = null;
421 for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
422 if (entry.getKey().getLocalName().equals(name)) {
423 result = entry.getValue();
431 public int hashCode() {
432 final int prime = 17;
434 result = prime * result
435 + ((targetPath == null) ? 0 : targetPath.hashCode());
436 result = prime * result
437 + ((whenCondition == null) ? 0 : whenCondition.hashCode());
438 result = prime * result
439 + ((childNodes == null) ? 0 : childNodes.hashCode());
444 public boolean equals(Object obj) {
451 if (getClass() != obj.getClass()) {
454 AugmentationSchemaImpl other = (AugmentationSchemaImpl) obj;
455 if (targetPath == null) {
456 if (other.targetPath != null) {
459 } else if (!targetPath.equals(other.targetPath)) {
462 if (whenCondition == null) {
463 if (other.whenCondition != null) {
466 } else if (!whenCondition.equals(other.whenCondition)) {
469 if (childNodes == null) {
470 if (other.childNodes != null) {
473 } else if (!childNodes.equals(other.childNodes)) {
480 public String toString() {
481 StringBuilder sb = new StringBuilder(
482 AugmentationSchemaImpl.class.getSimpleName());
484 sb.append("targetPath=" + targetPath);
485 sb.append(", when=" + whenCondition);
487 return sb.toString();