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.base.Function;
14 import com.google.common.collect.FluentIterable;
16 import java.util.Iterator;
17 import java.util.List;
20 import org.opendaylight.yangtools.yang.common.QName;
21 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
22 import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
23 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
24 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
25 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
26 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
27 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
28 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
29 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
30 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
31 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
32 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
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 final class YangSchemaUtils {
42 private static final Function<PathArgument, QName> QNAME_FROM_PATH_ARGUMENT = new Function<PathArgument, QName>(){
45 public QName apply(final PathArgument input) {
49 return input.getNodeType();
53 private YangSchemaUtils() {
54 throw new UnsupportedOperationException("Utility class.");
57 public static DataSchemaNode getSchemaNode(final SchemaContext schema,final InstanceIdentifier path) {
58 checkArgument(schema != null,"YANG Schema must not be null.");
59 checkArgument(path != null,"Path must not be null.");
60 return getSchemaNode(schema, FluentIterable.from(path.getPathArguments()).transform(QNAME_FROM_PATH_ARGUMENT));
63 public static DataSchemaNode getSchemaNode(final SchemaContext schema,final Iterable<QName> path) {
64 checkArgument(schema != null,"YANG Schema must not be null.");
65 checkArgument(path != null,"Path must not be null.");
66 if(!path.iterator().hasNext()){
67 return toRootDataNode(schema);
70 QName firstNode = path.iterator().next();
71 DataNodeContainer previous = schema.findModuleByNamespaceAndRevision(firstNode.getNamespace(),
72 firstNode.getRevision());
73 Iterator<QName> iterator = path.iterator();
75 while (iterator.hasNext()) {
76 checkArgument(previous!= null, "Supplied path does not resolve into valid schema node.");
77 QName arg = iterator.next();
78 DataSchemaNode currentNode = previous.getDataChildByName(arg);
79 if (currentNode == null && previous instanceof DataNodeContainer) {
80 currentNode = searchInChoices(previous, arg);
82 if (currentNode instanceof DataNodeContainer) {
83 previous = (DataNodeContainer) currentNode;
84 } else if (currentNode instanceof LeafSchemaNode || currentNode instanceof LeafListSchemaNode) {
85 checkArgument(!iterator.hasNext(), "Path nests inside leaf node, which is not allowed.");
88 checkState(currentNode != null, "Current node should not be null for %s",path);
90 checkState(previous instanceof DataSchemaNode, "Schema node for %s should be instance of DataSchemaNode. Found %s",path,previous);
91 return (DataSchemaNode) previous;
94 private static DataSchemaNode searchInChoices(final DataNodeContainer node, final QName arg) {
95 for (DataSchemaNode child : node.getChildNodes()) {
96 if (child instanceof ChoiceNode) {
97 ChoiceNode choiceNode = (ChoiceNode) child;
98 DataSchemaNode potential = searchInCases(choiceNode, arg);
99 if (potential != null) {
107 private static DataSchemaNode searchInCases(final ChoiceNode choiceNode, final QName arg) {
108 Set<ChoiceCaseNode> cases = choiceNode.getCases();
109 for (ChoiceCaseNode caseNode : cases) {
110 DataSchemaNode node = caseNode.getDataChildByName(arg);
118 private static ContainerSchemaNode toRootDataNode(final SchemaContext schema) {
119 return new NetconfDataRootNode(schema);
122 private static final class NetconfDataRootNode implements ContainerSchemaNode {
124 public NetconfDataRootNode(final SchemaContext schema) {
125 // TODO Auto-generated constructor stub
129 public Set<TypeDefinition<?>> getTypeDefinitions() {
130 // TODO Auto-generated method stub
135 public Set<DataSchemaNode> getChildNodes() {
136 // TODO Auto-generated method stub
141 public Set<GroupingDefinition> getGroupings() {
142 // TODO Auto-generated method stub
147 public DataSchemaNode getDataChildByName(final QName name) {
148 // TODO Auto-generated method stub
153 public DataSchemaNode getDataChildByName(final String name) {
154 // TODO Auto-generated method stub
159 public Set<UsesNode> getUses() {
160 // TODO Auto-generated method stub
165 public Set<AugmentationSchema> getAvailableAugmentations() {
166 // TODO Auto-generated method stub
171 public boolean isAugmenting() {
172 // TODO Auto-generated method stub
177 public boolean isAddedByUses() {
178 // TODO Auto-generated method stub
183 public boolean isConfiguration() {
184 // TODO Auto-generated method stub
189 public ConstraintDefinition getConstraints() {
190 // TODO Auto-generated method stub
195 public QName getQName() {
196 // TODO Auto-generated method stub
201 public SchemaPath getPath() {
202 // TODO Auto-generated method stub
207 public String getDescription() {
208 // TODO Auto-generated method stub
213 public String getReference() {
214 // TODO Auto-generated method stub
219 public Status getStatus() {
220 // TODO Auto-generated method stub
225 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
226 // TODO Auto-generated method stub
231 public boolean isPresenceContainer() {
232 // TODO Auto-generated method stub