Merge "AnyXmlNode builders"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / NotificationBuilder.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.net.URI;
11 import java.util.ArrayList;
12 import java.util.Date;
13 import java.util.List;
14 import java.util.Set;
15
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
18 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
19 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
20 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
21 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
22 import org.opendaylight.yangtools.yang.model.api.Status;
23 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
24 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.UsesNode;
26 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
33 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
34 import org.opendaylight.yangtools.yang.parser.util.ParserUtils;
35 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
36
37 import com.google.common.base.Preconditions;
38 import com.google.common.collect.ImmutableList;
39 import com.google.common.collect.ImmutableSet;
40
41 public final class NotificationBuilder extends AbstractDataNodeContainerBuilder implements SchemaNodeBuilder,
42         AugmentationTargetBuilder {
43     private NotificationDefinitionImpl instance;
44     // SchemaNode args
45     private SchemaPath schemaPath;
46     private String description;
47     private String reference;
48     private Status status = Status.CURRENT;
49     // AugmentationTarget args
50     private final List<AugmentationSchema> augmentations = new ArrayList<>();
51     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
52
53     NotificationBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
54         super(moduleName, line, qname);
55         this.schemaPath = path;
56     }
57
58     NotificationBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path, final NotificationDefinition base) {
59         super(moduleName, line, qname);
60         this.schemaPath = path;
61
62         description = base.getDescription();
63         reference = base.getReference();
64         status = base.getStatus();
65
66         URI ns = qname.getNamespace();
67         Date rev = qname.getRevision();
68         String pref = qname.getPrefix();
69         addedChildNodes.addAll(ParserUtils.wrapChildNodes(moduleName, line, base.getChildNodes(), path, ns, rev, pref));
70         addedGroupings.addAll(ParserUtils.wrapGroupings(moduleName, line, base.getGroupings(), path, ns, rev, pref));
71         addedTypedefs.addAll(ParserUtils.wrapTypedefs(moduleName, line, base, path, ns, rev, pref));
72         addedUnknownNodes.addAll(ParserUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path, ns,
73                 rev, pref));
74
75         augmentations.addAll(base.getAvailableAugmentations());
76         usesNodes.addAll(base.getUses());
77     }
78
79     @Override
80     public NotificationDefinition build() {
81         if (!(getParent() instanceof ModuleBuilder)) {
82             throw new YangParseException(getModuleName(), getLine(), "Notification can be defined only under module (was " + getParent() + ")");
83         }
84         if (instance != null) {
85             return instance;
86         }
87
88         instance = new NotificationDefinitionImpl(qname, schemaPath);
89
90         instance.description = description;
91         instance.reference = reference;
92         instance.status = status;
93
94         // CHILD NODES
95         for (DataSchemaNodeBuilder node : addedChildNodes) {
96             childNodes.put(node.getQName(), node.build());
97         }
98         instance.childNodes = ImmutableSet.copyOf(childNodes.values());
99
100         // GROUPINGS
101         for (GroupingBuilder builder : addedGroupings) {
102             groupings.add(builder.build());
103         }
104         instance.groupings = ImmutableSet.copyOf(groupings);
105
106         // TYPEDEFS
107         for (TypeDefinitionBuilder entry : addedTypedefs) {
108             typedefs.add(entry.build());
109         }
110         instance.typeDefinitions = ImmutableSet.copyOf(typedefs);
111
112         // USES
113         for (UsesNodeBuilder builder : addedUsesNodes) {
114             usesNodes.add(builder.build());
115         }
116         instance.uses = ImmutableSet.copyOf(usesNodes);
117
118         // AUGMENTATIONS
119         for (AugmentationSchemaBuilder builder : augmentationBuilders) {
120             augmentations.add(builder.build());
121         }
122         instance.augmentations = ImmutableSet.copyOf(augmentations);
123
124         // UNKNOWN NODES
125         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
126             unknownNodes.add(b.build());
127         }
128         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
129
130         return instance;
131     }
132
133
134     @Override
135     public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
136         return addedTypedefs;
137     }
138
139     @Override
140     public void addTypedef(final TypeDefinitionBuilder type) {
141         addedTypedefs.add(type);
142     }
143
144     @Override
145     public SchemaPath getPath() {
146         return schemaPath;
147     }
148
149     @Override
150     public void setPath(final SchemaPath path) {
151         this.schemaPath = path;
152     }
153
154     @Override
155     public String getDescription() {
156         return description;
157     }
158
159     @Override
160     public void setDescription(final String description) {
161         this.description = description;
162     }
163
164     @Override
165     public String getReference() {
166         return reference;
167     }
168
169     @Override
170     public void setReference(final String reference) {
171         this.reference = reference;
172     }
173
174     @Override
175     public Status getStatus() {
176         return status;
177     }
178
179     @Override
180     public void setStatus(final Status status) {
181         this.status = Preconditions.checkNotNull(status, "status cannot be null");
182     }
183
184     @Override
185     public void addAugmentation(final AugmentationSchemaBuilder augment) {
186         augmentationBuilders.add(augment);
187     }
188
189     @Override
190     public String toString() {
191         return "notification " + getQName().getLocalName();
192     }
193
194     private static final class NotificationDefinitionImpl implements NotificationDefinition {
195         private final QName qname;
196         private final SchemaPath path;
197         private String description;
198         private String reference;
199         private Status status;
200         private ImmutableSet<AugmentationSchema> augmentations;
201         private ImmutableSet<DataSchemaNode> childNodes;
202         private ImmutableSet<GroupingDefinition> groupings;
203         private ImmutableSet<TypeDefinition<?>> typeDefinitions;
204         private ImmutableSet<UsesNode> uses;
205         private ImmutableList<UnknownSchemaNode> unknownNodes;
206
207         private NotificationDefinitionImpl(final QName qname, final SchemaPath path) {
208             this.qname = qname;
209             this.path = path;
210         }
211
212         @Override
213         public QName getQName() {
214             return qname;
215         }
216
217         @Override
218         public SchemaPath getPath() {
219             return path;
220         }
221
222         @Override
223         public String getDescription() {
224             return description;
225         }
226
227         @Override
228         public String getReference() {
229             return reference;
230         }
231
232         @Override
233         public Status getStatus() {
234             return status;
235         }
236
237         @Override
238         public Set<DataSchemaNode> getChildNodes() {
239             return childNodes;
240         }
241
242         @Override
243         public Set<GroupingDefinition> getGroupings() {
244             return groupings;
245         }
246
247         @Override
248         public Set<UsesNode> getUses() {
249             return uses;
250         }
251
252         @Override
253         public Set<TypeDefinition<?>> getTypeDefinitions() {
254             return typeDefinitions;
255         }
256
257         @Override
258         public Set<AugmentationSchema> getAvailableAugmentations() {
259             return augmentations;
260         }
261
262         @Override
263         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
264             return unknownNodes;
265         }
266
267         @Override
268         public DataSchemaNode getDataChildByName(final QName name) {
269             return getChildNode(childNodes, name);
270         }
271
272         @Override
273         public DataSchemaNode getDataChildByName(final String name) {
274             return getChildNode(childNodes, name);
275         }
276
277         @Override
278         public int hashCode() {
279             final int prime = 31;
280             int result = 1;
281             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
282             result = prime * result + ((path == null) ? 0 : path.hashCode());
283             return result;
284         }
285
286         @Override
287         public boolean equals(final Object obj) {
288             if (this == obj) {
289                 return true;
290             }
291             if (obj == null) {
292                 return false;
293             }
294             if (getClass() != obj.getClass()) {
295                 return false;
296             }
297             final NotificationDefinitionImpl other = (NotificationDefinitionImpl) obj;
298             if (qname == null) {
299                 if (other.qname != null) {
300                     return false;
301                 }
302             } else if (!qname.equals(other.qname)) {
303                 return false;
304             }
305             if (path == null) {
306                 if (other.path != null) {
307                     return false;
308                 }
309             } else if (!path.equals(other.path)) {
310                 return false;
311             }
312             return true;
313         }
314
315         @Override
316         public String toString() {
317             StringBuilder sb = new StringBuilder(NotificationDefinitionImpl.class.getSimpleName());
318             sb.append("[qname=" + qname + ", path=" + path + "]");
319             return sb.toString();
320         }
321     }
322
323 }