Merge "BUG-865: fixed formatting of pom.xml"
[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 com.google.common.base.Preconditions;
11 import com.google.common.collect.ImmutableList;
12 import com.google.common.collect.ImmutableSet;
13 import java.net.URI;
14 import java.util.ArrayList;
15 import java.util.Date;
16 import java.util.List;
17 import java.util.Set;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
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.UnknownSchemaNode;
23 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationTargetBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainer;
28 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder;
29 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
30
31 public final class NotificationBuilder extends AbstractDocumentedDataNodeContainerBuilder implements SchemaNodeBuilder,
32         AugmentationTargetBuilder {
33     private NotificationDefinitionImpl instance;
34     // SchemaNode args
35     private SchemaPath schemaPath;
36     // AugmentationTarget args
37     private final List<AugmentationSchema> augmentations = new ArrayList<>();
38     private final List<AugmentationSchemaBuilder> augmentationBuilders = new ArrayList<>();
39
40     NotificationBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
41         super(moduleName, line, qname);
42         this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
43     }
44
45     NotificationBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path,
46             final NotificationDefinition base) {
47         super(moduleName, line, qname, path, base);
48         this.schemaPath = Preconditions.checkNotNull(path, "Schema Path must not be null");
49
50         URI ns = qname.getNamespace();
51         Date rev = qname.getRevision();
52         String pref = qname.getPrefix();
53         addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
54                 ns, rev, pref));
55
56         augmentations.addAll(base.getAvailableAugmentations());
57
58     }
59
60     @Override
61     public NotificationDefinition build() {
62         if (!(getParent() instanceof ModuleBuilder)) {
63             throw new YangParseException(getModuleName(), getLine(),
64                     "Notification can be defined only under module (was " + getParent() + ")");
65         }
66         if (instance != null) {
67             return instance;
68         }
69         buildChildren();
70
71         instance = new NotificationDefinitionImpl(qname, schemaPath, this);
72
73         // AUGMENTATIONS
74         for (AugmentationSchemaBuilder builder : augmentationBuilders) {
75             augmentations.add(builder.build());
76         }
77         instance.augmentations = ImmutableSet.copyOf(augmentations);
78
79         // UNKNOWN NODES
80         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
81             unknownNodes.add(b.build());
82         }
83         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
84
85         return instance;
86     }
87
88     @Override
89     public SchemaPath getPath() {
90         return schemaPath;
91     }
92
93     @Override
94     public void setPath(final SchemaPath path) {
95         this.schemaPath = path;
96     }
97
98     @Override
99     public void addAugmentation(final AugmentationSchemaBuilder augment) {
100         augmentationBuilders.add(augment);
101     }
102
103     @Override
104     public String toString() {
105         return "notification " + getQName().getLocalName();
106     }
107
108     @Override
109     protected String getStatementName() {
110         return "notification";
111     }
112
113     private static final class NotificationDefinitionImpl extends AbstractDocumentedDataNodeContainer implements
114             NotificationDefinition {
115         private final QName qname;
116         private final SchemaPath path;
117         private ImmutableSet<AugmentationSchema> augmentations;
118         private ImmutableList<UnknownSchemaNode> unknownNodes;
119
120         NotificationDefinitionImpl(final QName qname, final SchemaPath path, final NotificationBuilder builder) {
121             super(builder);
122             // TODO Auto-generated constructor stub
123             this.qname = qname;
124             this.path = path;
125         }
126
127         @Override
128         public QName getQName() {
129             return qname;
130         }
131
132         @Override
133         public SchemaPath getPath() {
134             return path;
135         }
136
137         @Override
138         public Set<AugmentationSchema> getAvailableAugmentations() {
139             return augmentations;
140         }
141
142         @Override
143         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
144             return unknownNodes;
145         }
146
147         @Override
148         public int hashCode() {
149             final int prime = 31;
150             int result = 1;
151             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
152             result = prime * result + ((path == null) ? 0 : path.hashCode());
153             return result;
154         }
155
156         @Override
157         public boolean equals(final Object obj) {
158             if (this == obj) {
159                 return true;
160             }
161             if (obj == null) {
162                 return false;
163             }
164             if (getClass() != obj.getClass()) {
165                 return false;
166             }
167             final NotificationDefinitionImpl other = (NotificationDefinitionImpl) obj;
168             if (qname == null) {
169                 if (other.qname != null) {
170                     return false;
171                 }
172             } else if (!qname.equals(other.qname)) {
173                 return false;
174             }
175             if (path == null) {
176                 if (other.path != null) {
177                     return false;
178                 }
179             } else if (!path.equals(other.path)) {
180                 return false;
181             }
182             return true;
183         }
184
185         @Override
186         public String toString() {
187             StringBuilder sb = new StringBuilder(NotificationDefinitionImpl.class.getSimpleName());
188             sb.append("[qname=").append(qname).append(", path=").append(path).append("]");
189             return sb.toString();
190         }
191     }
192
193 }