Introduce DataNodeContainer.findDataChildByName()
[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     @Override
151     public String getDescription() {
152         return null;
153     }
154
155     @Override
156     public String getReference() {
157         return null;
158     }
159
160     @Nonnull
161     @Override
162     public Status getStatus() {
163         return Status.CURRENT;
164     }
165
166     @Nonnull
167     @Override
168     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
169         final List<UnknownSchemaNode> result = new ArrayList<>();
170         for (Module module : getModules()) {
171             result.addAll(module.getUnknownSchemaNodes());
172         }
173         return Collections.unmodifiableList(result);
174     }
175
176     @Override
177     public Set<TypeDefinition<?>> getTypeDefinitions() {
178         final Set<TypeDefinition<?>> result = new LinkedHashSet<>();
179         for (Module module : getModules()) {
180             result.addAll(module.getTypeDefinitions());
181         }
182         return Collections.unmodifiableSet(result);
183     }
184
185     @Override
186     public Set<DataSchemaNode> getChildNodes() {
187         final Set<DataSchemaNode> result = new LinkedHashSet<>();
188         for (Module module : getModules()) {
189             result.addAll(module.getChildNodes());
190         }
191         return Collections.unmodifiableSet(result);
192     }
193
194     @Override
195     public Set<GroupingDefinition> getGroupings() {
196         final Set<GroupingDefinition> result = new LinkedHashSet<>();
197         for (Module module : getModules()) {
198             result.addAll(module.getGroupings());
199         }
200         return Collections.unmodifiableSet(result);
201     }
202
203     @Override
204     public Optional<DataSchemaNode> findDataChildByName(final QName name) {
205         requireNonNull(name);
206         for (Module module : getModules()) {
207             final Optional<DataSchemaNode> result = module.findDataChildByName(name);
208             if (result.isPresent()) {
209                 return result;
210             }
211         }
212         return Optional.empty();
213     }
214
215     @Override
216     public Set<UsesNode> getUses() {
217         return Collections.emptySet();
218     }
219
220     @Override
221     public boolean isPresenceContainer() {
222         return false;
223     }
224
225     @Override
226     public Set<AugmentationSchemaNode> getAvailableAugmentations() {
227         return Collections.emptySet();
228     }
229 }