1 package org.opendaylight.yangtools.yang.parser.builder.impl;
3 import static com.google.common.base.Preconditions.checkNotNull;
5 import com.google.common.base.Optional;
6 import com.google.common.collect.ImmutableList;
7 import com.google.common.collect.ImmutableSet;
9 import java.util.Collections;
10 import java.util.Date;
11 import java.util.List;
13 import java.util.TreeSet;
14 import org.opendaylight.yangtools.concepts.Immutable;
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;
29 public final class ModuleImpl extends AbstractDocumentedDataNodeContainer implements Module, Immutable {
31 private final URI namespace;
32 private final String name;
33 private final String sourcePath;
34 private final Optional<Date> revision;
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<FeatureDefinition> features;
41 private final Set<NotificationDefinition> notifications;
42 private final Set<AugmentationSchema> augmentations;
43 private final Set<RpcDefinition> rpcs;
44 private final Set<Deviation> deviations;
45 private final List<ExtensionDefinition> extensionNodes;
46 private final Set<IdentitySchemaNode> identities;
47 private final List<UnknownSchemaNode> unknownNodes;
48 private final String source;
53 * <b>Note</b>Constructor has intentionality limited visibility to package, since
54 * this class should be only instantiated via builders.
60 ModuleImpl(final String name, final String sourcePath, final ModuleBuilder builder) {
62 this.name = checkNotNull(name, "Missing name");
63 this.sourcePath = sourcePath; //TODO: can this be nullable?
64 this.imports = ImmutableSet.copyOf(builder.imports);
65 this.namespace = builder.getNamespace();
66 this.prefix = builder.getPrefix();
67 this.revision = builder.getRevision() == null ? Optional.<Date>absent():
68 Optional.of(new Date(builder.getRevision().getTime()));
69 this.yangVersion = builder.getYangVersion();
70 this.organization = builder.getOrganization();
71 this.contact = builder.getContact();
72 this.features = toImmutableSortedSet(builder.getFeatures());
73 this.notifications = toImmutableSortedSet(builder.getNotifications());
74 this.augmentations = ImmutableSet.copyOf(builder.getAugments());
75 this.rpcs = toImmutableSortedSet(builder.getRpcs());
76 this.deviations = ImmutableSet.copyOf(builder.getDeviations());
77 this.extensionNodes = ImmutableList.copyOf(builder.getExtensions());
78 this.identities = ImmutableSet.copyOf(builder.getIdentities());
79 this.unknownNodes = ImmutableList.copyOf(builder.getExtensionInstances());
80 this.source = checkNotNull(builder.getSource(), "Missing source");
85 public String getModuleSourcePath() {
90 public URI getNamespace() {
95 public String getName() {
100 public Date getRevision() {
101 if (revision.isPresent()) {
102 return new Date(revision.get().getTime());
109 public String getPrefix() {
114 public String getYangVersion() {
119 public String getOrganization() {
124 public String getContact() {
129 public Set<ModuleImport> getImports() {
134 public Set<FeatureDefinition> getFeatures() {
139 public Set<NotificationDefinition> getNotifications() {
140 return notifications;
144 public Set<AugmentationSchema> getAugmentations() {
145 return augmentations;
149 public Set<RpcDefinition> getRpcs() {
154 public Set<Deviation> getDeviations() {
159 public List<ExtensionDefinition> getExtensionSchemaNodes() {
160 return extensionNodes;
164 public Set<IdentitySchemaNode> getIdentities() {
169 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
173 public String getSource() {
178 public int hashCode() {
179 final int prime = 31;
181 result = prime * result + ((namespace == null) ? 0 : namespace.hashCode());
182 result = prime * result + ((name == null) ? 0 : name.hashCode());
183 result = prime * result + ((revision == null) ? 0 : revision.hashCode());
184 result = prime * result + ((yangVersion == null) ? 0 : yangVersion.hashCode());
189 public boolean equals(final Object obj) {
196 if (getClass() != obj.getClass()) {
199 ModuleImpl other = (ModuleImpl) obj;
200 if (namespace == null) {
201 if (other.namespace != null) {
204 } else if (!namespace.equals(other.namespace)) {
208 if (other.name != null) {
211 } else if (!name.equals(other.name)) {
214 if (revision == null) {
215 if (other.revision != null) {
218 } else if (!revision.equals(other.revision)) {
221 if (yangVersion == null) {
222 if (other.yangVersion != null) {
225 } else if (!yangVersion.equals(other.yangVersion)) {
231 private static <T extends SchemaNode> Set<T> toImmutableSortedSet(final Set<T> original) {
232 TreeSet<T> sorted = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
233 sorted.addAll(original);
234 return Collections.unmodifiableSet(sorted);
238 public String toString() {
239 StringBuilder sb = new StringBuilder(ModuleImpl.class.getSimpleName());
241 sb.append("name=").append(name);
242 sb.append(", namespace=").append(namespace);
243 sb.append(", revision=").append(revision);
244 sb.append(", prefix=").append(prefix);
245 sb.append(", yangVersion=").append(yangVersion);
247 return sb.toString();