Bug 2366 - Effective statements impl for new yang parser.
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / ModuleEffectiveStatementImpl.java
1 /**
2  * Copyright (c) 2015 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.stmt.rfc6020.effective;
9
10 import com.google.common.collect.ImmutableList;
11 import com.google.common.collect.ImmutableSet;
12
13 import org.opendaylight.yangtools.yang.parser.spi.source.ModuleNameToModuleQName;
14 import java.util.Collection;
15 import java.util.HashSet;
16 import java.util.LinkedList;
17 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
18 import java.net.URI;
19 import java.util.Date;
20 import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleImpl;
21 import java.util.List;
22 import java.util.Set;
23 import org.opendaylight.yangtools.yang.common.QNameModule;
24 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
25 import org.opendaylight.yangtools.yang.model.api.Deviation;
26 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
27 import org.opendaylight.yangtools.yang.model.api.FeatureDefinition;
28 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
30 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
31 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
32 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
33 import org.opendaylight.yangtools.concepts.Immutable;
34 import org.opendaylight.yangtools.yang.model.api.Module;
35 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
36 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
37
38 public class ModuleEffectiveStatementImpl extends
39         AbstractEffectiveDocumentedDataNodeContainer<String, ModuleStatement>
40         implements Module, Immutable {
41
42     private final QNameModule qnameModule;
43     private final String name;
44     private String sourcePath;
45     private String prefix;
46     private String yangVersion;
47     private String organization;
48     private String contact;
49     private ImmutableSet<ModuleImport> imports;
50     private ImmutableSet<Module> submodules;
51     private ImmutableSet<FeatureDefinition> features;
52     private ImmutableSet<NotificationDefinition> notifications;
53     private ImmutableSet<AugmentationSchema> augmentations;
54     private ImmutableSet<RpcDefinition> rpcs;
55     private ImmutableSet<Deviation> deviations;
56     private ImmutableList<ExtensionDefinition> extensionNodes;
57     private ImmutableSet<IdentitySchemaNode> identities;
58     private ImmutableList<UnknownSchemaNode> unknownNodes;
59     private String source;
60
61     public ModuleEffectiveStatementImpl(
62             StmtContext<String, ModuleStatement, ?> ctx) {
63         super(ctx);
64
65         name = argument();
66         qnameModule = ctx.getFromNamespace(ModuleNameToModuleQName.class, name);
67         // :TODO init other fields
68
69         initSubstatementCollections();
70
71     }
72
73     private void initSubstatementCollections() {
74         Collection<? extends EffectiveStatement<?, ?>> effectiveSubstatements = effectiveSubstatements();
75
76         LinkedList<UnknownSchemaNode> unknownNodes = new LinkedList<UnknownSchemaNode>();
77         HashSet<AugmentationSchema> augmentations = new HashSet<AugmentationSchema>();
78
79         for (EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements) {
80             if (effectiveStatement instanceof UnknownSchemaNode) {
81                 UnknownSchemaNode unknownNode = (UnknownSchemaNode) effectiveStatement;
82                 unknownNodes.add(unknownNode);
83             }
84             if (effectiveStatement instanceof AugmentationSchema) {
85                 AugmentationSchema augmentationSchema = (AugmentationSchema) effectiveStatement;
86                 augmentations.add(augmentationSchema);
87             }
88         }
89
90         this.unknownNodes = ImmutableList.copyOf(unknownNodes);
91         this.augmentations = ImmutableSet.copyOf(augmentations);
92
93         // :TODO other substatement collections ...
94     }
95
96     @Override
97     public String getModuleSourcePath() {
98         return sourcePath;
99     }
100
101     @Override
102     public URI getNamespace() {
103         return qnameModule.getNamespace();
104     }
105
106     @Override
107     public String getName() {
108         return name;
109     }
110
111     @Override
112     public Date getRevision() {
113         return qnameModule.getRevision();
114     }
115
116     @Override
117     public String getPrefix() {
118         return prefix;
119     }
120
121     @Override
122     public String getYangVersion() {
123         return yangVersion;
124     }
125
126     @Override
127     public String getOrganization() {
128         return organization;
129     }
130
131     @Override
132     public String getContact() {
133         return contact;
134     }
135
136     @Override
137     public Set<ModuleImport> getImports() {
138         return imports;
139     }
140
141     @Override
142     public Set<Module> getSubmodules() {
143         return submodules;
144     }
145
146     @Override
147     public Set<FeatureDefinition> getFeatures() {
148         return features;
149     }
150
151     @Override
152     public Set<NotificationDefinition> getNotifications() {
153         return notifications;
154     }
155
156     @Override
157     public Set<AugmentationSchema> getAugmentations() {
158         return augmentations;
159     }
160
161     @Override
162     public Set<RpcDefinition> getRpcs() {
163         return rpcs;
164     }
165
166     @Override
167     public Set<Deviation> getDeviations() {
168         return deviations;
169     }
170
171     @Override
172     public List<ExtensionDefinition> getExtensionSchemaNodes() {
173         return extensionNodes;
174     }
175
176     @Override
177     public Set<IdentitySchemaNode> getIdentities() {
178         return identities;
179     }
180
181     @Override
182     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
183         return unknownNodes;
184     }
185
186     @Override
187     public String getSource() {
188         return source;
189     }
190
191     @Override
192     public int hashCode() {
193         final int prime = 31;
194         int result = 1;
195         result = prime * result + ((name == null) ? 0 : name.hashCode());
196         result = prime * result
197                 + ((yangVersion == null) ? 0 : yangVersion.hashCode());
198         result = prime * result + qnameModule.hashCode();
199         return result;
200     }
201
202     @Override
203     public boolean equals(final Object obj) {
204         if (this == obj) {
205             return true;
206         }
207         if (obj == null) {
208             return false;
209         }
210         if (getClass() != obj.getClass()) {
211             return false;
212         }
213         ModuleEffectiveStatementImpl other = (ModuleEffectiveStatementImpl) obj;
214         if (name == null) {
215             if (other.name != null) {
216                 return false;
217             }
218         } else if (!name.equals(other.name)) {
219             return false;
220         }
221         if (!qnameModule.equals(other.qnameModule)) {
222             return false;
223         }
224         if (yangVersion == null) {
225             if (other.yangVersion != null) {
226                 return false;
227             }
228         } else if (!yangVersion.equals(other.yangVersion)) {
229             return false;
230         }
231         return true;
232     }
233
234     // private static <T extends SchemaNode> Set<T> toImmutableSortedSet(final
235     // Set<T> original) {
236     // TreeSet<T> sorted = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
237     // sorted.addAll(original);
238     // return Collections.unmodifiableSet(sorted);
239     // }
240
241     @Override
242     public String toString() {
243         StringBuilder sb = new StringBuilder(ModuleImpl.class.getSimpleName());
244         sb.append("[");
245         sb.append("name=").append(name);
246         sb.append(", namespace=").append(getNamespace());
247         sb.append(", revision=").append(getRevision());
248         sb.append(", prefix=").append(prefix);
249         sb.append(", yangVersion=").append(yangVersion);
250         sb.append("]");
251         return sb.toString();
252     }
253
254     @Override
255     public QNameModule getQNameModule() {
256         return qnameModule;
257     }
258
259 }