2 * Copyright (c) 2014 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
8 package org.opendaylight.controller.sal.dom.broker.util;
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static com.google.common.base.Preconditions.checkState;
13 import com.google.common.collect.Lists;
14 import java.util.Collection;
15 import java.util.Iterator;
16 import java.util.List;
17 import java.util.Optional;
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
21 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
22 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
23 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
26 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
27 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
28 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
29 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
30 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
31 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
33 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
34 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
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 final class YangSchemaUtils {
43 private YangSchemaUtils() {
44 throw new UnsupportedOperationException("Utility class.");
47 public static DataSchemaNode getSchemaNode(final SchemaContext schema, final YangInstanceIdentifier path) {
48 checkArgument(schema != null, "YANG Schema must not be null.");
49 checkArgument(path != null, "Path must not be null.");
50 return getSchemaNode(schema, Lists.transform(path.getPathArguments(), PathArgument::getNodeType));
53 public static DataSchemaNode getSchemaNode(final SchemaContext schema, final Iterable<QName> path) {
54 checkArgument(schema != null, "YANG Schema must not be null.");
55 checkArgument(path != null, "Path must not be null.");
56 if (!path.iterator().hasNext()) {
57 return toRootDataNode(schema);
60 QName firstNode = path.iterator().next();
61 DataNodeContainer previous = schema.findModule(firstNode.getModule()).orElse(null);
62 Iterator<QName> iterator = path.iterator();
64 while (iterator.hasNext()) {
65 checkArgument(previous != null, "Supplied path does not resolve into valid schema node.");
66 QName arg = iterator.next();
67 DataSchemaNode currentNode = previous.getDataChildByName(arg);
68 if (currentNode == null) {
69 currentNode = searchInChoices(previous, arg);
71 if (currentNode instanceof DataNodeContainer) {
72 previous = (DataNodeContainer) currentNode;
73 } else if (currentNode instanceof LeafSchemaNode || currentNode instanceof LeafListSchemaNode) {
74 checkArgument(!iterator.hasNext(), "Path nests inside leaf node, which is not allowed.");
77 checkState(currentNode != null, "Current node should not be null for %s", path);
79 checkState(previous instanceof DataSchemaNode,
80 "Schema node for %s should be instance of DataSchemaNode. Found %s", path, previous);
81 return (DataSchemaNode) previous;
84 private static DataSchemaNode searchInChoices(final DataNodeContainer node, final QName arg) {
85 for (DataSchemaNode child : node.getChildNodes()) {
86 if (child instanceof ChoiceSchemaNode) {
87 ChoiceSchemaNode choiceNode = (ChoiceSchemaNode) child;
88 DataSchemaNode potential = searchInCases(choiceNode, arg);
89 if (potential != null) {
97 private static DataSchemaNode searchInCases(final ChoiceSchemaNode choiceNode, final QName arg) {
98 for (CaseSchemaNode caseNode : choiceNode.getCases().values()) {
99 DataSchemaNode node = caseNode.getDataChildByName(arg);
107 private static ContainerSchemaNode toRootDataNode(final SchemaContext schema) {
108 return new NetconfDataRootNode(schema);
111 private static final class NetconfDataRootNode implements ContainerSchemaNode {
113 NetconfDataRootNode(final SchemaContext schema) {
114 // TODO Auto-generated constructor stub
118 public Set<TypeDefinition<?>> getTypeDefinitions() {
119 // TODO Auto-generated method stub
124 public Set<DataSchemaNode> getChildNodes() {
125 // TODO Auto-generated method stub
130 public Set<GroupingDefinition> getGroupings() {
131 // TODO Auto-generated method stub
136 public Optional<DataSchemaNode> findDataChildByName(final QName name) {
137 // TODO Auto-generated method stub
142 public Set<UsesNode> getUses() {
143 // TODO Auto-generated method stub
148 public Set<AugmentationSchemaNode> getAvailableAugmentations() {
149 // TODO Auto-generated method stub
154 public boolean isAugmenting() {
155 // TODO Auto-generated method stub
160 public boolean isAddedByUses() {
161 // TODO Auto-generated method stub
166 public boolean isConfiguration() {
167 // TODO Auto-generated method stub
172 public QName getQName() {
173 // TODO Auto-generated method stub
178 public SchemaPath getPath() {
179 // TODO Auto-generated method stub
184 public Optional<String> getDescription() {
185 return Optional.empty();
189 public Optional<String> getReference() {
190 return Optional.empty();
194 public Status getStatus() {
195 // TODO Auto-generated method stub
200 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
201 // TODO Auto-generated method stub
206 public boolean isPresenceContainer() {
207 // TODO Auto-generated method stub
212 public Set<NotificationDefinition> getNotifications() {
213 // TODO Auto-generated method stub
218 public Set<ActionDefinition> getActions() {
219 // TODO Auto-generated method stub
224 public Optional<RevisionAwareXPath> getWhenCondition() {
225 // TODO Auto-generated method stub
230 public Collection<MustDefinition> getMustConstraints() {
231 // TODO Auto-generated method stub