Added 'code-generator' and 'model' projects from controller project.
[yangtools.git] / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / AugmentationSchemaBuilderImpl.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.Collections;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.Set;
16 import java.util.TreeMap;
17 import java.util.TreeSet;
18
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
21 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
23 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
24 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
25 import org.opendaylight.yangtools.yang.model.api.Status;
26 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
27 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.UsesNode;
29 import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
30 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
33 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
34 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
35 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
36 import org.opendaylight.yangtools.yang.parser.util.Comparators;
37 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
38 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
39
40 public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContainerBuilder implements
41         AugmentationSchemaBuilder {
42     private boolean built;
43     private final AugmentationSchemaImpl instance;
44
45     private String whenCondition;
46     private String description;
47     private String reference;
48     private Status status = Status.CURRENT;
49
50     private final String augmentTargetStr;
51     private SchemaPath dirtyAugmentTarget;
52     private SchemaPath finalAugmentTarget;
53
54     private final Set<UsesNodeBuilder> usesNodes = new HashSet<UsesNodeBuilder>();
55     private boolean resolved;
56
57     AugmentationSchemaBuilderImpl(final String moduleName, final int line, final String augmentTargetStr) {
58         super(moduleName, line, null);
59         this.augmentTargetStr = augmentTargetStr;
60         final SchemaPath targetPath = ParserUtils.parseXPathString(augmentTargetStr);
61         dirtyAugmentTarget = targetPath;
62         instance = new AugmentationSchemaImpl(targetPath);
63     }
64
65     @Override
66     public Set<GroupingDefinition> getGroupings() {
67         return Collections.emptySet();
68     }
69
70     @Override
71     public Set<GroupingBuilder> getGroupingBuilders() {
72         return Collections.emptySet();
73     }
74
75     @Override
76     public void addGrouping(GroupingBuilder grouping) {
77         throw new YangParseException(moduleName, line, "augment can not contains grouping statement");
78     }
79
80     @Override
81     public void addUsesNode(UsesNodeBuilder usesBuilder) {
82         usesNodes.add(usesBuilder);
83     }
84
85     /**
86      * Always returns null.
87      */
88     @Override
89     public SchemaPath getPath() {
90         return null;
91     }
92
93     @Override
94     public AugmentationSchema build() {
95         if (!built) {
96             // process uses
97             for(UsesNodeBuilder use : usesNodes) {
98                 addedChildNodes.addAll(use.getTargetChildren());
99                 addedUnknownNodes.addAll(use.getTargetUnknownNodes());
100             }
101
102             instance.setDescription(description);
103             instance.setReference(reference);
104             instance.setStatus(status);
105             instance.setTargetPath(finalAugmentTarget);
106
107             RevisionAwareXPath whenStmt;
108             if (whenCondition == null) {
109                 whenStmt = null;
110             } else {
111                 whenStmt = new RevisionAwareXPathImpl(whenCondition, false);
112             }
113             instance.setWhenCondition(whenStmt);
114
115             // CHILD NODES
116             final Map<QName, DataSchemaNode> childs = new TreeMap<QName, DataSchemaNode>(Comparators.QNAME_COMP);
117             for (DataSchemaNodeBuilder node : addedChildNodes) {
118                 childs.put(node.getQName(), node.build());
119             }
120             instance.setChildNodes(childs);
121
122             // USES
123             final Set<UsesNode> usesNodeDefinitions = new HashSet<UsesNode>();
124             for (UsesNodeBuilder builder : usesNodes) {
125                 usesNodeDefinitions.add(builder.build());
126             }
127             instance.setUses(usesNodeDefinitions);
128
129             // UNKNOWN NODES
130             List<UnknownSchemaNode> unknownNodes = new ArrayList<UnknownSchemaNode>();
131             for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
132                 unknownNodes.add(b.build());
133             }
134             Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP);
135             instance.setUnknownSchemaNodes(unknownNodes);
136
137             built = true;
138         }
139         return instance;
140     }
141
142     @Override
143     public boolean isResolved() {
144         return resolved;
145     }
146
147     @Override
148     public void setResolved(boolean resolved) {
149         this.resolved = resolved;
150     }
151
152     public String getWhenCondition() {
153         return whenCondition;
154     }
155
156     public void addWhenCondition(String whenCondition) {
157         this.whenCondition = whenCondition;
158     }
159
160     @Override
161     public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
162         return Collections.emptySet();
163     }
164
165     @Override
166     public void addTypedef(TypeDefinitionBuilder type) {
167         throw new YangParseException(moduleName, line, "Augmentation can not contains typedef statement.");
168     }
169
170     @Override
171     public void setDescription(String description) {
172         this.description = description;
173     }
174
175     @Override
176     public void setReference(String reference) {
177         this.reference = reference;
178     }
179
180     @Override
181     public void setStatus(Status status) {
182         if (status != null) {
183             this.status = status;
184         }
185     }
186
187     @Override
188     public SchemaPath getTargetPath() {
189         return dirtyAugmentTarget;
190     }
191
192     @Override
193     public void setTargetPath(SchemaPath path) {
194         this.finalAugmentTarget = path;
195     }
196
197     @Override
198     public String getTargetPathAsString() {
199         return augmentTargetStr;
200     }
201
202     @Override
203     public int hashCode() {
204         final int prime = 17;
205         int result = 1;
206         result = prime * result + ((augmentTargetStr == null) ? 0 : augmentTargetStr.hashCode());
207         result = prime * result + ((whenCondition == null) ? 0 : whenCondition.hashCode());
208         result = prime * result + ((childNodes == null) ? 0 : childNodes.hashCode());
209         return result;
210     }
211
212     @Override
213     public boolean equals(Object obj) {
214         if (this == obj) {
215             return true;
216         }
217         if (obj == null) {
218             return false;
219         }
220         if (getClass() != obj.getClass()) {
221             return false;
222         }
223         AugmentationSchemaBuilderImpl other = (AugmentationSchemaBuilderImpl) obj;
224         if (augmentTargetStr == null) {
225             if (other.augmentTargetStr != null) {
226                 return false;
227             }
228         } else if (!augmentTargetStr.equals(other.augmentTargetStr)) {
229             return false;
230         }
231         if (whenCondition == null) {
232             if (other.whenCondition != null) {
233                 return false;
234             }
235         } else if (!whenCondition.equals(other.whenCondition)) {
236             return false;
237         }
238         if (childNodes == null) {
239             if (other.childNodes != null) {
240                 return false;
241             }
242         } else if (!childNodes.equals(other.childNodes)) {
243             return false;
244         }
245         return true;
246     }
247
248     public String toString() {
249         return "augment " + augmentTargetStr;
250     }
251
252     private final class AugmentationSchemaImpl implements AugmentationSchema {
253         private SchemaPath targetPath;
254         private RevisionAwareXPath whenCondition;
255         private Map<QName, DataSchemaNode> childNodes = Collections.emptyMap();
256         private Set<UsesNode> uses = Collections.emptySet();
257         private String description;
258         private String reference;
259         private Status status;
260         private List<UnknownSchemaNode> unknownNodes = Collections.emptyList();
261
262         private AugmentationSchemaImpl(SchemaPath targetPath) {
263             this.targetPath = targetPath;
264         }
265
266         @Override
267         public SchemaPath getTargetPath() {
268             return targetPath;
269         }
270
271         private void setTargetPath(SchemaPath path) {
272             this.targetPath = path;
273         }
274
275         @Override
276         public RevisionAwareXPath getWhenCondition() {
277             return whenCondition;
278         }
279
280         private void setWhenCondition(RevisionAwareXPath whenCondition) {
281             this.whenCondition = whenCondition;
282         }
283
284         @Override
285         public Set<DataSchemaNode> getChildNodes() {
286             final Set<DataSchemaNode> result = new TreeSet<DataSchemaNode>(Comparators.SCHEMA_NODE_COMP);
287             result.addAll(childNodes.values());
288             return result;
289         }
290
291         private void setChildNodes(Map<QName, DataSchemaNode> childNodes) {
292             if (childNodes != null) {
293                 this.childNodes = childNodes;
294             }
295         }
296
297         /**
298          * Always returns an empty set, because augment can not contains
299          * grouping statement.
300          */
301         @Override
302         public Set<GroupingDefinition> getGroupings() {
303             return Collections.emptySet();
304         }
305
306         @Override
307         public Set<UsesNode> getUses() {
308             return uses;
309         }
310
311         private void setUses(Set<UsesNode> uses) {
312             if (uses != null) {
313                 this.uses = uses;
314             }
315         }
316
317         /**
318          * Always returns an empty set, because augment can not contains type
319          * definitions.
320          */
321         @Override
322         public Set<TypeDefinition<?>> getTypeDefinitions() {
323             return Collections.emptySet();
324         }
325
326         @Override
327         public String getDescription() {
328             return description;
329         }
330
331         private void setDescription(String description) {
332             this.description = description;
333         }
334
335         @Override
336         public String getReference() {
337             return reference;
338         }
339
340         private void setReference(String reference) {
341             this.reference = reference;
342         }
343
344         @Override
345         public Status getStatus() {
346             return status;
347         }
348
349         private void setStatus(Status status) {
350             this.status = status;
351         }
352
353         @Override
354         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
355             return unknownNodes;
356         }
357
358         private void setUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
359             if (unknownSchemaNodes != null) {
360                 this.unknownNodes = unknownSchemaNodes;
361             }
362         }
363
364         @Override
365         public DataSchemaNode getDataChildByName(QName name) {
366             return childNodes.get(name);
367         }
368
369         @Override
370         public DataSchemaNode getDataChildByName(String name) {
371             DataSchemaNode result = null;
372             for (Map.Entry<QName, DataSchemaNode> entry : childNodes.entrySet()) {
373                 if (entry.getKey().getLocalName().equals(name)) {
374                     result = entry.getValue();
375                     break;
376                 }
377             }
378             return result;
379         }
380
381         @Override
382         public int hashCode() {
383             final int prime = 17;
384             int result = 1;
385             result = prime * result + ((targetPath == null) ? 0 : targetPath.hashCode());
386             result = prime * result + ((whenCondition == null) ? 0 : whenCondition.hashCode());
387             result = prime * result + ((childNodes == null) ? 0 : childNodes.hashCode());
388             return result;
389         }
390
391         @Override
392         public boolean equals(Object obj) {
393             if (this == obj) {
394                 return true;
395             }
396             if (obj == null) {
397                 return false;
398             }
399             if (getClass() != obj.getClass()) {
400                 return false;
401             }
402             AugmentationSchemaImpl other = (AugmentationSchemaImpl) obj;
403             if (targetPath == null) {
404                 if (other.targetPath != null) {
405                     return false;
406                 }
407             } else if (!targetPath.equals(other.targetPath)) {
408                 return false;
409             }
410             if (whenCondition == null) {
411                 if (other.whenCondition != null) {
412                     return false;
413                 }
414             } else if (!whenCondition.equals(other.whenCondition)) {
415                 return false;
416             }
417             if (childNodes == null) {
418                 if (other.childNodes != null) {
419                     return false;
420                 }
421             } else if (!childNodes.equals(other.childNodes)) {
422                 return false;
423             }
424             return true;
425         }
426
427         @Override
428         public String toString() {
429             StringBuilder sb = new StringBuilder(AugmentationSchemaImpl.class.getSimpleName());
430             sb.append("[");
431             sb.append("targetPath=" + targetPath);
432             sb.append(", when=" + whenCondition);
433             sb.append("]");
434             return sb.toString();
435         }
436     }
437
438 }