BUG-1270: optimize Builders with QName(Module)
[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
14 import java.util.ArrayList;
15 import java.util.List;
16 import java.util.Set;
17
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         addedUnknownNodes.addAll(BuilderUtils.wrapUnknownNodes(moduleName, line, base.getUnknownSchemaNodes(), path,
51                 qname));
52         augmentations.addAll(base.getAvailableAugmentations());
53
54     }
55
56     @Override
57     public NotificationDefinition build() {
58         if (!(getParent() instanceof ModuleBuilder)) {
59             throw new YangParseException(getModuleName(), getLine(),
60                     "Notification can be defined only under module (was " + getParent() + ")");
61         }
62         if (instance != null) {
63             return instance;
64         }
65         buildChildren();
66
67         instance = new NotificationDefinitionImpl(qname, schemaPath, this);
68
69         // AUGMENTATIONS
70         for (AugmentationSchemaBuilder builder : augmentationBuilders) {
71             augmentations.add(builder.build());
72         }
73         instance.augmentations = ImmutableSet.copyOf(augmentations);
74
75         // UNKNOWN NODES
76         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
77             unknownNodes.add(b.build());
78         }
79         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
80
81         return instance;
82     }
83
84     @Override
85     public SchemaPath getPath() {
86         return schemaPath;
87     }
88
89     @Override
90     public void setPath(final SchemaPath path) {
91         this.schemaPath = path;
92     }
93
94     @Override
95     public void addAugmentation(final AugmentationSchemaBuilder augment) {
96         augmentationBuilders.add(augment);
97     }
98
99     @Override
100     public String toString() {
101         return "notification " + getQName().getLocalName();
102     }
103
104     @Override
105     protected String getStatementName() {
106         return "notification";
107     }
108
109     private static final class NotificationDefinitionImpl extends AbstractDocumentedDataNodeContainer implements
110     NotificationDefinition {
111         private final QName qname;
112         private final SchemaPath path;
113         private ImmutableSet<AugmentationSchema> augmentations;
114         private ImmutableList<UnknownSchemaNode> unknownNodes;
115
116         NotificationDefinitionImpl(final QName qname, final SchemaPath path, final NotificationBuilder builder) {
117             super(builder);
118             // TODO Auto-generated constructor stub
119             this.qname = qname;
120             this.path = path;
121         }
122
123         @Override
124         public QName getQName() {
125             return qname;
126         }
127
128         @Override
129         public SchemaPath getPath() {
130             return path;
131         }
132
133         @Override
134         public Set<AugmentationSchema> getAvailableAugmentations() {
135             return augmentations;
136         }
137
138         @Override
139         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
140             return unknownNodes;
141         }
142
143         @Override
144         public int hashCode() {
145             final int prime = 31;
146             int result = 1;
147             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
148             result = prime * result + ((path == null) ? 0 : path.hashCode());
149             return result;
150         }
151
152         @Override
153         public boolean equals(final Object obj) {
154             if (this == obj) {
155                 return true;
156             }
157             if (obj == null) {
158                 return false;
159             }
160             if (getClass() != obj.getClass()) {
161                 return false;
162             }
163             final NotificationDefinitionImpl other = (NotificationDefinitionImpl) obj;
164             if (qname == null) {
165                 if (other.qname != null) {
166                     return false;
167                 }
168             } else if (!qname.equals(other.qname)) {
169                 return false;
170             }
171             if (path == null) {
172                 if (other.path != null) {
173                     return false;
174                 }
175             } else if (!path.equals(other.path)) {
176                 return false;
177             }
178             return true;
179         }
180
181         @Override
182         public String toString() {
183             StringBuilder sb = new StringBuilder(NotificationDefinitionImpl.class.getSimpleName());
184             sb.append("[qname=").append(qname).append(", path=").append(path).append("]");
185             return sb.toString();
186         }
187     }
188
189 }