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