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 static java.util.Objects.requireNonNull;
13 import com.google.common.collect.SetMultimap;
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;
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;
42 public abstract class AbstractSchemaContext implements SchemaContext {
43 protected static final Comparator<Module> REVISION_COMPARATOR =
44 (first, second) -> Revision.compare(first.getRevision(), second.getRevision());
46 protected static final TreeSet<Module> createModuleSet() {
47 return new TreeSet<>(REVISION_COMPARATOR);
51 * Returns the namespace-to-module mapping.
53 * @return Map of modules where key is namespace
55 protected abstract SetMultimap<URI, Module> getNamespaceToModules();
58 * Returns the module name-to-module mapping.
60 * @return Map of modules where key is name of module
62 protected abstract SetMultimap<String, Module> getNameToModules();
65 public Set<DataSchemaNode> getDataDefinitions() {
66 final Set<DataSchemaNode> dataDefs = new HashSet<>();
67 for (Module m : getModules()) {
68 dataDefs.addAll(m.getChildNodes());
74 public Set<NotificationDefinition> getNotifications() {
75 final Set<NotificationDefinition> notifications = new HashSet<>();
76 for (Module m : getModules()) {
77 notifications.addAll(m.getNotifications());
83 public Set<RpcDefinition> getOperations() {
84 final Set<RpcDefinition> rpcs = new HashSet<>();
85 for (Module m : getModules()) {
86 rpcs.addAll(m.getRpcs());
92 public Set<ExtensionDefinition> getExtensions() {
93 final Set<ExtensionDefinition> extensions = new HashSet<>();
94 for (Module m : getModules()) {
95 extensions.addAll(m.getExtensionSchemaNodes());
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);
109 return Optional.empty();
113 public Set<Module> findModules(final URI namespace) {
114 final Set<Module> ret = getNamespaceToModules().get(namespace);
115 return ret == null ? Collections.emptySet() : ret;
119 public boolean isAugmenting() {
124 public boolean isAddedByUses() {
129 public boolean isConfiguration() {
134 public ConstraintDefinition getConstraints() {
140 public QName getQName() {
141 return SchemaContext.NAME;
146 public SchemaPath getPath() {
147 return SchemaPath.ROOT;
152 public Status getStatus() {
153 return Status.CURRENT;
158 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
159 final List<UnknownSchemaNode> result = new ArrayList<>();
160 for (Module module : getModules()) {
161 result.addAll(module.getUnknownSchemaNodes());
163 return Collections.unmodifiableList(result);
167 public Set<TypeDefinition<?>> getTypeDefinitions() {
168 final Set<TypeDefinition<?>> result = new LinkedHashSet<>();
169 for (Module module : getModules()) {
170 result.addAll(module.getTypeDefinitions());
172 return Collections.unmodifiableSet(result);
176 public Set<DataSchemaNode> getChildNodes() {
177 final Set<DataSchemaNode> result = new LinkedHashSet<>();
178 for (Module module : getModules()) {
179 result.addAll(module.getChildNodes());
181 return Collections.unmodifiableSet(result);
185 public Set<GroupingDefinition> getGroupings() {
186 final Set<GroupingDefinition> result = new LinkedHashSet<>();
187 for (Module module : getModules()) {
188 result.addAll(module.getGroupings());
190 return Collections.unmodifiableSet(result);
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()) {
202 return Optional.empty();
206 public Set<UsesNode> getUses() {
207 return Collections.emptySet();
211 public boolean isPresenceContainer() {
216 public Set<AugmentationSchemaNode> getAvailableAugmentations() {
217 return Collections.emptySet();