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