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