BUG-4688: switch revisions from Date to Revision
[yangtools.git] / yang / yang-model-util / src / main / java / org / opendaylight / yangtools / yang / model / util / AbstractSchemaContext.java
1 /*
2  * Copyright (c) 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.model.util;
10
11 import com.google.common.collect.SetMultimap;
12 import java.net.URI;
13 import java.util.ArrayList;
14 import java.util.Collections;
15 import java.util.Comparator;
16 import java.util.HashSet;
17 import java.util.LinkedHashSet;
18 import java.util.List;
19 import java.util.Optional;
20 import java.util.Set;
21 import java.util.TreeSet;
22 import javax.annotation.Nonnull;
23 import org.opendaylight.yangtools.yang.common.QName;
24 import org.opendaylight.yangtools.yang.common.Revision;
25 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
26 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
27 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
29 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
30 import org.opendaylight.yangtools.yang.model.api.Module;
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.SchemaContext;
34 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
35 import org.opendaylight.yangtools.yang.model.api.Status;
36 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
37 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
38 import org.opendaylight.yangtools.yang.model.api.UsesNode;
39
40 public abstract class AbstractSchemaContext implements SchemaContext {
41     protected static final Comparator<Module> REVISION_COMPARATOR =
42         (first, second) -> Revision.compare(first.getRevision(), second.getRevision());
43
44     protected static final TreeSet<Module> createModuleSet() {
45         return new TreeSet<>(REVISION_COMPARATOR);
46     }
47
48     /**
49      * Returns the namespace-to-module mapping.
50      *
51      * @return Map of modules where key is namespace
52      */
53     protected abstract SetMultimap<URI, Module> getNamespaceToModules();
54
55     /**
56      * Returns the module name-to-module mapping.
57      *
58      * @return Map of modules where key is name of module
59      */
60     protected abstract SetMultimap<String, Module> getNameToModules();
61
62     @Override
63     public Set<DataSchemaNode> getDataDefinitions() {
64         final Set<DataSchemaNode> dataDefs = new HashSet<>();
65         for (Module m : getModules()) {
66             dataDefs.addAll(m.getChildNodes());
67         }
68         return dataDefs;
69     }
70
71     @Override
72     public Set<NotificationDefinition> getNotifications() {
73         final Set<NotificationDefinition> notifications = new HashSet<>();
74         for (Module m : getModules()) {
75             notifications.addAll(m.getNotifications());
76         }
77         return notifications;
78     }
79
80     @Override
81     public Set<RpcDefinition> getOperations() {
82         final Set<RpcDefinition> rpcs = new HashSet<>();
83         for (Module m : getModules()) {
84             rpcs.addAll(m.getRpcs());
85         }
86         return rpcs;
87     }
88
89     @Override
90     public Set<ExtensionDefinition> getExtensions() {
91         final Set<ExtensionDefinition> extensions = new HashSet<>();
92         for (Module m : getModules()) {
93             extensions.addAll(m.getExtensionSchemaNodes());
94         }
95         return extensions;
96     }
97
98
99     @Override
100     public Optional<Module> findModule(final String name, final Optional<Revision> revision) {
101         for (final Module module : getNameToModules().get(name)) {
102             if (revision.equals(module.getRevision())) {
103                 return Optional.of(module);
104             }
105         }
106
107         return Optional.empty();
108     }
109
110     @Override
111     public Set<Module> findModules(final URI namespace) {
112         final Set<Module> ret = getNamespaceToModules().get(namespace);
113         return ret == null ? Collections.emptySet() : ret;
114     }
115
116     @Override
117     public boolean isAugmenting() {
118         return false;
119     }
120
121     @Override
122     public boolean isAddedByUses() {
123         return false;
124     }
125
126     @Override
127     public boolean isConfiguration() {
128         return false;
129     }
130
131     @Override
132     public ConstraintDefinition getConstraints() {
133         return null;
134     }
135
136     @Nonnull
137     @Override
138     public QName getQName() {
139         return SchemaContext.NAME;
140     }
141
142     @Nonnull
143     @Override
144     public SchemaPath getPath() {
145         return SchemaPath.ROOT;
146     }
147
148     @Override
149     public String getDescription() {
150         return null;
151     }
152
153     @Override
154     public String getReference() {
155         return null;
156     }
157
158     @Nonnull
159     @Override
160     public Status getStatus() {
161         return Status.CURRENT;
162     }
163
164     @Nonnull
165     @Override
166     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
167         final List<UnknownSchemaNode> result = new ArrayList<>();
168         for (Module module : getModules()) {
169             result.addAll(module.getUnknownSchemaNodes());
170         }
171         return Collections.unmodifiableList(result);
172     }
173
174     @Override
175     public Set<TypeDefinition<?>> getTypeDefinitions() {
176         final Set<TypeDefinition<?>> result = new LinkedHashSet<>();
177         for (Module module : getModules()) {
178             result.addAll(module.getTypeDefinitions());
179         }
180         return Collections.unmodifiableSet(result);
181     }
182
183     @Override
184     public Set<DataSchemaNode> getChildNodes() {
185         final Set<DataSchemaNode> result = new LinkedHashSet<>();
186         for (Module module : getModules()) {
187             result.addAll(module.getChildNodes());
188         }
189         return Collections.unmodifiableSet(result);
190     }
191
192     @Override
193     public Set<GroupingDefinition> getGroupings() {
194         final Set<GroupingDefinition> result = new LinkedHashSet<>();
195         for (Module module : getModules()) {
196             result.addAll(module.getGroupings());
197         }
198         return Collections.unmodifiableSet(result);
199     }
200
201     @Override
202     public DataSchemaNode getDataChildByName(final QName name) {
203         for (Module module : getModules()) {
204             final DataSchemaNode result = module.getDataChildByName(name);
205             if (result != null) {
206                 return result;
207             }
208         }
209         return null;
210     }
211
212     @Override
213     public Set<UsesNode> getUses() {
214         return Collections.emptySet();
215     }
216
217     @Override
218     public boolean isPresenceContainer() {
219         return false;
220     }
221
222     @Override
223     public Set<AugmentationSchema> getAvailableAugmentations() {
224         return Collections.emptySet();
225     }
226 }