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