7aa67a111648a85aafe531401ff058d798a04eba
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / sal / dom / broker / util / YangSchemaUtils.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.controller.sal.dom.broker.util;
9
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static com.google.common.base.Preconditions.checkState;
12
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;
18 import java.util.Set;
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;
41
42 public final class YangSchemaUtils {
43     private YangSchemaUtils() {
44         throw new UnsupportedOperationException("Utility class.");
45     }
46
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));
51     }
52
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);
58         }
59
60         QName firstNode = path.iterator().next();
61         DataNodeContainer previous = schema.findModule(firstNode.getModule()).orElse(null);
62         Iterator<QName> iterator = path.iterator();
63
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);
70             }
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.");
75                 return currentNode;
76             }
77             checkState(currentNode != null, "Current node should not be null for %s", path);
78         }
79         checkState(previous instanceof DataSchemaNode,
80             "Schema node for %s should be instance of DataSchemaNode. Found %s", path, previous);
81         return (DataSchemaNode) previous;
82     }
83
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) {
90                     return potential;
91                 }
92             }
93         }
94         return null;
95     }
96
97     private static DataSchemaNode searchInCases(final ChoiceSchemaNode choiceNode, final QName arg) {
98         for (CaseSchemaNode caseNode : choiceNode.getCases().values()) {
99             DataSchemaNode node = caseNode.getDataChildByName(arg);
100             if (node != null) {
101                 return node;
102             }
103         }
104         return null;
105     }
106
107     private static ContainerSchemaNode toRootDataNode(final SchemaContext schema) {
108         return new NetconfDataRootNode(schema);
109     }
110
111     private static final class NetconfDataRootNode implements ContainerSchemaNode {
112
113         NetconfDataRootNode(final SchemaContext schema) {
114             // TODO Auto-generated constructor stub
115         }
116
117         @Override
118         public Set<TypeDefinition<?>> getTypeDefinitions() {
119             // TODO Auto-generated method stub
120             return null;
121         }
122
123         @Override
124         public Set<DataSchemaNode> getChildNodes() {
125             // TODO Auto-generated method stub
126             return null;
127         }
128
129         @Override
130         public Set<GroupingDefinition> getGroupings() {
131             // TODO Auto-generated method stub
132             return null;
133         }
134
135         @Override
136         public Optional<DataSchemaNode> findDataChildByName(final QName name) {
137             // TODO Auto-generated method stub
138             return null;
139         }
140
141         @Override
142         public Set<UsesNode> getUses() {
143             // TODO Auto-generated method stub
144             return null;
145         }
146
147         @Override
148         public Set<AugmentationSchemaNode> getAvailableAugmentations() {
149             // TODO Auto-generated method stub
150             return null;
151         }
152
153         @Override
154         public boolean isAugmenting() {
155             // TODO Auto-generated method stub
156             return false;
157         }
158
159         @Override
160         public boolean isAddedByUses() {
161             // TODO Auto-generated method stub
162             return false;
163         }
164
165         @Override
166         public boolean isConfiguration() {
167             // TODO Auto-generated method stub
168             return false;
169         }
170
171         @Override
172         public QName getQName() {
173             // TODO Auto-generated method stub
174             return null;
175         }
176
177         @Override
178         public SchemaPath getPath() {
179             // TODO Auto-generated method stub
180             return null;
181         }
182
183         @Override
184         public Optional<String> getDescription() {
185             return Optional.empty();
186         }
187
188         @Override
189         public Optional<String> getReference() {
190             return Optional.empty();
191         }
192
193         @Override
194         public Status getStatus() {
195             // TODO Auto-generated method stub
196             return null;
197         }
198
199         @Override
200         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
201             // TODO Auto-generated method stub
202             return null;
203         }
204
205         @Override
206         public boolean isPresenceContainer() {
207             // TODO Auto-generated method stub
208             return false;
209         }
210
211         @Override
212         public Set<NotificationDefinition> getNotifications() {
213             // TODO Auto-generated method stub
214             return null;
215         }
216
217         @Override
218         public Set<ActionDefinition> getActions() {
219             // TODO Auto-generated method stub
220             return null;
221         }
222
223         @Override
224         public Optional<RevisionAwareXPath> getWhenCondition() {
225             // TODO Auto-generated method stub
226             return null;
227         }
228
229         @Override
230         public Collection<MustDefinition> getMustConstraints() {
231             // TODO Auto-generated method stub
232             return null;
233         }
234     }
235
236 }