2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.yangtools.yang.model.util;
11 import com.google.common.collect.SetMultimap;
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;
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;
40 public abstract class AbstractSchemaContext implements SchemaContext {
41 protected static final Comparator<Module> REVISION_COMPARATOR =
42 (first, second) -> Revision.compare(first.getRevision(), second.getRevision());
44 protected static final TreeSet<Module> createModuleSet() {
45 return new TreeSet<>(REVISION_COMPARATOR);
49 * Returns the namespace-to-module mapping.
51 * @return Map of modules where key is namespace
53 protected abstract SetMultimap<URI, Module> getNamespaceToModules();
56 * Returns the module name-to-module mapping.
58 * @return Map of modules where key is name of module
60 protected abstract SetMultimap<String, Module> getNameToModules();
63 public Set<DataSchemaNode> getDataDefinitions() {
64 final Set<DataSchemaNode> dataDefs = new HashSet<>();
65 for (Module m : getModules()) {
66 dataDefs.addAll(m.getChildNodes());
72 public Set<NotificationDefinition> getNotifications() {
73 final Set<NotificationDefinition> notifications = new HashSet<>();
74 for (Module m : getModules()) {
75 notifications.addAll(m.getNotifications());
81 public Set<RpcDefinition> getOperations() {
82 final Set<RpcDefinition> rpcs = new HashSet<>();
83 for (Module m : getModules()) {
84 rpcs.addAll(m.getRpcs());
90 public Set<ExtensionDefinition> getExtensions() {
91 final Set<ExtensionDefinition> extensions = new HashSet<>();
92 for (Module m : getModules()) {
93 extensions.addAll(m.getExtensionSchemaNodes());
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);
107 return Optional.empty();
111 public Set<Module> findModules(final URI namespace) {
112 final Set<Module> ret = getNamespaceToModules().get(namespace);
113 return ret == null ? Collections.emptySet() : ret;
117 public boolean isAugmenting() {
122 public boolean isAddedByUses() {
127 public boolean isConfiguration() {
132 public ConstraintDefinition getConstraints() {
138 public QName getQName() {
139 return SchemaContext.NAME;
144 public SchemaPath getPath() {
145 return SchemaPath.ROOT;
149 public String getDescription() {
154 public String getReference() {
160 public Status getStatus() {
161 return Status.CURRENT;
166 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
167 final List<UnknownSchemaNode> result = new ArrayList<>();
168 for (Module module : getModules()) {
169 result.addAll(module.getUnknownSchemaNodes());
171 return Collections.unmodifiableList(result);
175 public Set<TypeDefinition<?>> getTypeDefinitions() {
176 final Set<TypeDefinition<?>> result = new LinkedHashSet<>();
177 for (Module module : getModules()) {
178 result.addAll(module.getTypeDefinitions());
180 return Collections.unmodifiableSet(result);
184 public Set<DataSchemaNode> getChildNodes() {
185 final Set<DataSchemaNode> result = new LinkedHashSet<>();
186 for (Module module : getModules()) {
187 result.addAll(module.getChildNodes());
189 return Collections.unmodifiableSet(result);
193 public Set<GroupingDefinition> getGroupings() {
194 final Set<GroupingDefinition> result = new LinkedHashSet<>();
195 for (Module module : getModules()) {
196 result.addAll(module.getGroupings());
198 return Collections.unmodifiableSet(result);
202 public DataSchemaNode getDataChildByName(final QName name) {
203 for (Module module : getModules()) {
204 final DataSchemaNode result = module.getDataChildByName(name);
205 if (result != null) {
213 public Set<UsesNode> getUses() {
214 return Collections.emptySet();
218 public boolean isPresenceContainer() {
223 public Set<AugmentationSchema> getAvailableAugmentations() {
224 return Collections.emptySet();