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