2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
\r
4 * This program and the accompanying materials are made available under the
\r
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
8 package org.opendaylight.controller.yang.parser.builder.impl;
\r
10 import java.util.ArrayList;
\r
11 import java.util.Collections;
\r
12 import java.util.HashMap;
\r
13 import java.util.HashSet;
\r
14 import java.util.List;
\r
15 import java.util.Map;
\r
16 import java.util.Set;
\r
18 import org.opendaylight.controller.yang.common.QName;
\r
19 import org.opendaylight.controller.yang.model.api.AugmentationSchema;
\r
20 import org.opendaylight.controller.yang.model.api.SchemaNode;
\r
21 import org.opendaylight.controller.yang.model.api.SchemaPath;
\r
22 import org.opendaylight.controller.yang.model.api.UsesNode;
\r
23 import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder;
\r
24 import org.opendaylight.controller.yang.parser.builder.api.Builder;
\r
25 import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder;
\r
26 import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder;
\r
27 import org.opendaylight.controller.yang.parser.util.RefineHolder;
\r
29 final class UsesNodeBuilderImpl implements UsesNodeBuilder, Builder {
\r
30 private final UsesNodeImpl instance;
\r
31 private final int line;
\r
32 private final SchemaPath groupingPath;
\r
33 private final Set<AugmentationSchemaBuilder> addedAugments = new HashSet<AugmentationSchemaBuilder>();
\r
34 private List<SchemaNodeBuilder> refineBuilders = new ArrayList<SchemaNodeBuilder>();
\r
35 private List<RefineHolder> refines = new ArrayList<RefineHolder>();
\r
37 UsesNodeBuilderImpl(final String groupingPathStr, final int line) {
\r
38 this.groupingPath = parseUsesPath(groupingPathStr);
\r
40 instance = new UsesNodeImpl(groupingPath);
\r
44 public UsesNode build() {
\r
46 final Set<AugmentationSchema> augments = new HashSet<AugmentationSchema>();
\r
47 for (AugmentationSchemaBuilder builder : addedAugments) {
\r
48 augments.add(builder.build());
\r
50 instance.setAugmentations(augments);
\r
53 final Map<SchemaPath, SchemaNode> refineNodes = new HashMap<SchemaPath, SchemaNode>();
\r
54 for (SchemaNodeBuilder refineBuilder : refineBuilders) {
\r
55 SchemaNode refineNode = refineBuilder.build();
\r
56 refineNodes.put(refineNode.getPath(), refineNode);
\r
58 instance.setRefines(refineNodes);
\r
64 public int getLine() {
\r
69 public SchemaPath getGroupingPath() {
\r
70 return groupingPath;
\r
74 public void addAugment(final AugmentationSchemaBuilder augmentBuilder) {
\r
75 addedAugments.add(augmentBuilder);
\r
79 public void setAugmenting(final boolean augmenting) {
\r
80 instance.setAugmenting(augmenting);
\r
84 public void addRefineNode(SchemaNodeBuilder refineNode) {
\r
85 refineBuilders.add(refineNode);
\r
89 public List<RefineHolder> getRefines() {
\r
94 public void addRefine(RefineHolder refine) {
\r
95 refines.add(refine);
\r
98 private SchemaPath parseUsesPath(final String groupingPathStr) {
\r
99 final String[] splittedPath = groupingPathStr.split("/");
\r
100 final List<QName> path = new ArrayList<QName>();
\r
102 for (String pathElement : splittedPath) {
\r
103 final String[] splittedElement = pathElement.split(":");
\r
104 if (splittedElement.length == 1) {
\r
105 name = new QName(null, null, null, splittedElement[0]);
\r
107 name = new QName(null, null, splittedElement[0],
\r
108 splittedElement[1]);
\r
112 final boolean absolute = groupingPathStr.startsWith("/");
\r
113 return new SchemaPath(path, absolute);
\r
116 private final class UsesNodeImpl implements UsesNode {
\r
117 private final SchemaPath groupingPath;
\r
118 private Set<AugmentationSchema> augmentations = Collections.emptySet();
\r
119 private boolean augmenting;
\r
120 private Map<SchemaPath, SchemaNode> refines = Collections.emptyMap();
\r
122 private UsesNodeImpl(final SchemaPath groupingPath) {
\r
123 this.groupingPath = groupingPath;
\r
127 public SchemaPath getGroupingPath() {
\r
128 return groupingPath;
\r
132 public Set<AugmentationSchema> getAugmentations() {
\r
133 return augmentations;
\r
136 private void setAugmentations(
\r
137 final Set<AugmentationSchema> augmentations) {
\r
138 if (augmentations != null) {
\r
139 this.augmentations = augmentations;
\r
144 public boolean isAugmenting() {
\r
148 private void setAugmenting(final boolean augmenting) {
\r
149 this.augmenting = augmenting;
\r
153 public Map<SchemaPath, SchemaNode> getRefines() {
\r
157 private void setRefines(Map<SchemaPath, SchemaNode> refines) {
\r
158 if (refines != null) {
\r
159 this.refines = refines;
\r
164 public int hashCode() {
\r
165 final int prime = 31;
\r
167 result = prime * result
\r
168 + ((groupingPath == null) ? 0 : groupingPath.hashCode());
\r
169 result = prime * result
\r
170 + ((augmentations == null) ? 0 : augmentations.hashCode());
\r
171 result = prime * result + (augmenting ? 1231 : 1237);
\r
176 public boolean equals(Object obj) {
\r
183 if (getClass() != obj.getClass()) {
\r
186 final UsesNodeImpl other = (UsesNodeImpl) obj;
\r
187 if (groupingPath == null) {
\r
188 if (other.groupingPath != null) {
\r
191 } else if (!groupingPath.equals(other.groupingPath)) {
\r
194 if (augmentations == null) {
\r
195 if (other.augmentations != null) {
\r
198 } else if (!augmentations.equals(other.augmentations)) {
\r
201 if (augmenting != other.augmenting) {
\r
208 public String toString() {
\r
209 StringBuilder sb = new StringBuilder(
\r
210 UsesNodeImpl.class.getSimpleName());
\r
211 sb.append("[groupingPath=" + groupingPath + "]");
\r
212 return sb.toString();
\r