Merge "BUG-1304: rework BindingGeneratorImpl from xtend to java"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / ModuleImpl.java
1 package org.opendaylight.yangtools.yang.parser.builder.impl;
2
3 import static com.google.common.base.Preconditions.checkNotNull;
4
5 import com.google.common.collect.ImmutableList;
6 import com.google.common.collect.ImmutableSet;
7 import java.net.URI;
8 import java.util.Collections;
9 import java.util.Date;
10 import java.util.List;
11 import java.util.Set;
12 import java.util.TreeSet;
13 import org.opendaylight.yangtools.concepts.Immutable;
14 import org.opendaylight.yangtools.yang.common.QNameModule;
15 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
16 import org.opendaylight.yangtools.yang.model.api.Deviation;
17 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
18 import org.opendaylight.yangtools.yang.model.api.FeatureDefinition;
19 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.Module;
21 import org.opendaylight.yangtools.yang.model.api.ModuleImport;
22 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
23 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
24 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
26 import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainer;
27 import org.opendaylight.yangtools.yang.parser.builder.util.Comparators;
28
29 public final class ModuleImpl extends AbstractDocumentedDataNodeContainer implements Module, Immutable {
30
31     private final QNameModule qnameModule;
32     private final String name;
33     private final String sourcePath;
34     private final String prefix;
35     private final String yangVersion;
36     private final String organization;
37     private final String contact;
38     private final Set<ModuleImport> imports;
39     private final Set<FeatureDefinition> features;
40     private final Set<NotificationDefinition> notifications;
41     private final Set<AugmentationSchema> augmentations;
42     private final Set<RpcDefinition> rpcs;
43     private final Set<Deviation> deviations;
44     private final List<ExtensionDefinition> extensionNodes;
45     private final Set<IdentitySchemaNode> identities;
46     private final List<UnknownSchemaNode> unknownNodes;
47     private final String source;
48
49     /**
50      *
51      *
52      * <b>Note</b>Constructor has intentionality limited visibility to package, since
53      * this class should be only instantiated via builders.
54      *
55      * @param name
56      * @param sourcePath
57      * @param builder
58      */
59     ModuleImpl(final String name, final String sourcePath, final ModuleBuilder builder) {
60         super(builder);
61         this.name = checkNotNull(name, "Missing name");
62         this.sourcePath = sourcePath; //TODO: can this be nullable?
63         this.imports = ImmutableSet.<ModuleImport> copyOf(builder.imports.values());
64         this.prefix = builder.getPrefix();
65
66         this.qnameModule = QNameModule.create(builder.getNamespace(),
67                 builder.getRevision() == null ? null : new Date(builder.getRevision().getTime()));
68         this.yangVersion = builder.getYangVersion();
69         this.organization = builder.getOrganization();
70         this.contact = builder.getContact();
71         this.features = toImmutableSortedSet(builder.getFeatures());
72         this.notifications = toImmutableSortedSet(builder.getNotifications());
73         this.augmentations = ImmutableSet.copyOf(builder.getAugments());
74         this.rpcs = toImmutableSortedSet(builder.getRpcs());
75         this.deviations = ImmutableSet.copyOf(builder.getDeviations());
76         this.extensionNodes = ImmutableList.copyOf(builder.getExtensions());
77         this.identities = ImmutableSet.copyOf(builder.getIdentities());
78         this.unknownNodes = ImmutableList.copyOf(builder.getExtensionInstances());
79         this.source = checkNotNull(builder.getSource(), "Missing source");
80
81     }
82
83     @Override
84     public String getModuleSourcePath() {
85         return sourcePath;
86     }
87
88     @Override
89     public URI getNamespace() {
90         return qnameModule.getNamespace();
91     }
92
93     @Override
94     public String getName() {
95         return name;
96     }
97
98     @Override
99     public Date getRevision() {
100         return qnameModule.getRevision();
101     }
102
103     @Override
104     public String getPrefix() {
105         return prefix;
106     }
107
108     @Override
109     public String getYangVersion() {
110         return yangVersion;
111     }
112
113     @Override
114     public String getOrganization() {
115         return organization;
116     }
117
118     @Override
119     public String getContact() {
120         return contact;
121     }
122
123     @Override
124     public Set<ModuleImport> getImports() {
125         return imports;
126     }
127
128     @Override
129     public Set<FeatureDefinition> getFeatures() {
130         return features;
131     }
132
133     @Override
134     public Set<NotificationDefinition> getNotifications() {
135         return notifications;
136     }
137
138     @Override
139     public Set<AugmentationSchema> getAugmentations() {
140         return augmentations;
141     }
142
143     @Override
144     public Set<RpcDefinition> getRpcs() {
145         return rpcs;
146     }
147
148     @Override
149     public Set<Deviation> getDeviations() {
150         return deviations;
151     }
152
153     @Override
154     public List<ExtensionDefinition> getExtensionSchemaNodes() {
155         return extensionNodes;
156     }
157
158     @Override
159     public Set<IdentitySchemaNode> getIdentities() {
160         return identities;
161     }
162
163     @Override
164     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
165         return unknownNodes;
166     }
167
168     @Override
169     public String getSource() {
170         return source;
171     }
172
173     @Override
174     public int hashCode() {
175         final int prime = 31;
176         int result = 1;
177         result = prime * result + ((name == null) ? 0 : name.hashCode());
178         result = prime * result + ((yangVersion == null) ? 0 : yangVersion.hashCode());
179         result = prime * result + qnameModule.hashCode();
180         return result;
181     }
182
183     @Override
184     public boolean equals(final Object obj) {
185         if (this == obj) {
186             return true;
187         }
188         if (obj == null) {
189             return false;
190         }
191         if (getClass() != obj.getClass()) {
192             return false;
193         }
194         ModuleImpl other = (ModuleImpl) obj;
195         if (name == null) {
196             if (other.name != null) {
197                 return false;
198             }
199         } else if (!name.equals(other.name)) {
200             return false;
201         }
202         if (!qnameModule.equals(other.qnameModule)) {
203             return false;
204         }
205         if (yangVersion == null) {
206             if (other.yangVersion != null) {
207                 return false;
208             }
209         } else if (!yangVersion.equals(other.yangVersion)) {
210             return false;
211         }
212         return true;
213     }
214
215     private static <T extends SchemaNode> Set<T> toImmutableSortedSet(final Set<T> original) {
216         TreeSet<T> sorted = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
217         sorted.addAll(original);
218         return Collections.unmodifiableSet(sorted);
219     }
220
221     @Override
222     public String toString() {
223         StringBuilder sb = new StringBuilder(ModuleImpl.class.getSimpleName());
224         sb.append("[");
225         sb.append("name=").append(name);
226         sb.append(", namespace=").append(getNamespace());
227         sb.append(", revision=").append(getRevision());
228         sb.append(", prefix=").append(prefix);
229         sb.append(", yangVersion=").append(yangVersion);
230         sb.append("]");
231         return sb.toString();
232     }
233
234     @Override
235     public QNameModule getQNameModule() {
236         return qnameModule;
237     }
238 }