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.yangtools.yang.parser.builder.impl;
11 import java.util.ArrayList;
12 import java.util.Date;
13 import java.util.List;
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;
37 import com.google.common.base.Preconditions;
38 import com.google.common.collect.ImmutableList;
39 import com.google.common.collect.ImmutableSet;
41 public final class NotificationBuilder extends AbstractDataNodeContainerBuilder implements SchemaNodeBuilder,
42 AugmentationTargetBuilder {
43 private NotificationDefinitionImpl instance;
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<>();
53 NotificationBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
54 super(moduleName, line, qname);
55 this.schemaPath = path;
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;
62 description = base.getDescription();
63 reference = base.getReference();
64 status = base.getStatus();
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,
75 augmentations.addAll(base.getAvailableAugmentations());
76 usesNodes.addAll(base.getUses());
80 public NotificationDefinition build() {
81 if (!(getParent() instanceof ModuleBuilder)) {
82 throw new YangParseException(getModuleName(), getLine(), "Notification can be defined only under module (was " + getParent() + ")");
84 if (instance != null) {
88 instance = new NotificationDefinitionImpl(qname, schemaPath);
90 instance.description = description;
91 instance.reference = reference;
92 instance.status = status;
95 for (DataSchemaNodeBuilder node : addedChildNodes) {
96 childNodes.put(node.getQName(), node.build());
98 instance.childNodes = ImmutableSet.copyOf(childNodes.values());
101 for (GroupingBuilder builder : addedGroupings) {
102 groupings.add(builder.build());
104 instance.groupings = ImmutableSet.copyOf(groupings);
107 for (TypeDefinitionBuilder entry : addedTypedefs) {
108 typedefs.add(entry.build());
110 instance.typeDefinitions = ImmutableSet.copyOf(typedefs);
113 for (UsesNodeBuilder builder : addedUsesNodes) {
114 usesNodes.add(builder.build());
116 instance.uses = ImmutableSet.copyOf(usesNodes);
119 for (AugmentationSchemaBuilder builder : augmentationBuilders) {
120 augmentations.add(builder.build());
122 instance.augmentations = ImmutableSet.copyOf(augmentations);
125 for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
126 unknownNodes.add(b.build());
128 instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
135 public Set<TypeDefinitionBuilder> getTypeDefinitionBuilders() {
136 return addedTypedefs;
140 public void addTypedef(final TypeDefinitionBuilder type) {
141 addedTypedefs.add(type);
145 public SchemaPath getPath() {
150 public void setPath(final SchemaPath path) {
151 this.schemaPath = path;
155 public String getDescription() {
160 public void setDescription(final String description) {
161 this.description = description;
165 public String getReference() {
170 public void setReference(final String reference) {
171 this.reference = reference;
175 public Status getStatus() {
180 public void setStatus(final Status status) {
181 this.status = Preconditions.checkNotNull(status, "status cannot be null");
185 public void addAugmentation(final AugmentationSchemaBuilder augment) {
186 augmentationBuilders.add(augment);
190 public String toString() {
191 return "notification " + getQName().getLocalName();
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;
207 private NotificationDefinitionImpl(final QName qname, final SchemaPath path) {
213 public QName getQName() {
218 public SchemaPath getPath() {
223 public String getDescription() {
228 public String getReference() {
233 public Status getStatus() {
238 public Set<DataSchemaNode> getChildNodes() {
243 public Set<GroupingDefinition> getGroupings() {
248 public Set<UsesNode> getUses() {
253 public Set<TypeDefinition<?>> getTypeDefinitions() {
254 return typeDefinitions;
258 public Set<AugmentationSchema> getAvailableAugmentations() {
259 return augmentations;
263 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
268 public DataSchemaNode getDataChildByName(final QName name) {
269 return getChildNode(childNodes, name);
273 public DataSchemaNode getDataChildByName(final String name) {
274 return getChildNode(childNodes, name);
278 public int hashCode() {
279 final int prime = 31;
281 result = prime * result + ((qname == null) ? 0 : qname.hashCode());
282 result = prime * result + ((path == null) ? 0 : path.hashCode());
287 public boolean equals(final Object obj) {
294 if (getClass() != obj.getClass()) {
297 final NotificationDefinitionImpl other = (NotificationDefinitionImpl) obj;
299 if (other.qname != null) {
302 } else if (!qname.equals(other.qname)) {
306 if (other.path != null) {
309 } else if (!path.equals(other.path)) {
316 public String toString() {
317 StringBuilder sb = new StringBuilder(NotificationDefinitionImpl.class.getSimpleName());
318 sb.append("[qname=" + qname + ", path=" + path + "]");
319 return sb.toString();