2 * Copyright (c) 2013 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.yangtools.yang.parser.util;
10 import static org.opendaylight.yangtools.yang.parser.util.ParserUtils.*;
12 import java.lang.reflect.Method;
13 import java.util.List;
15 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
16 import org.opendaylight.yangtools.yang.model.api.ChoiceNode;
17 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
18 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
19 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
20 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
22 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
23 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
27 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.impl.AnyXmlBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.impl.ContainerSchemaNodeBuilder;
32 import org.opendaylight.yangtools.yang.parser.builder.impl.LeafListSchemaNodeBuilder;
33 import org.opendaylight.yangtools.yang.parser.builder.impl.LeafSchemaNodeBuilder;
34 import org.opendaylight.yangtools.yang.parser.builder.impl.ListSchemaNodeBuilder;
35 import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
38 * Utility class with helper methods to perform operations tied to refine
41 public class RefineUtils {
43 private RefineUtils() {
47 * Find original builder of node to refine and return copy of this builder.
49 * We must create and use a copy of builder to preserve original builder
50 * state, because this object will be refined (modified) and later added to
51 * {@link UsesNodeBuilder}.
54 * @param targetGrouping
55 * builder of grouping which should contains node to refine
57 * refine object containing informations about refine
62 public static DataSchemaNodeBuilder getRefineNodeFromGroupingBuilder(final GroupingBuilder targetGrouping,
63 final RefineHolder refine, final String moduleName) {
64 DataSchemaNodeBuilder result = null;
65 final Builder lookedUpBuilder = targetGrouping.getDataChildByName(refine.getName());
66 if (lookedUpBuilder == null) {
67 throw new YangParseException(moduleName, refine.getLine(), "Target node '" + refine.getName()
70 if (lookedUpBuilder instanceof LeafSchemaNodeBuilder) {
71 result = new LeafSchemaNodeBuilder((LeafSchemaNodeBuilder) lookedUpBuilder);
72 } else if (lookedUpBuilder instanceof ContainerSchemaNodeBuilder) {
73 result = new ContainerSchemaNodeBuilder((ContainerSchemaNodeBuilder) lookedUpBuilder);
74 } else if (lookedUpBuilder instanceof ListSchemaNodeBuilder) {
75 result = new ListSchemaNodeBuilder((ListSchemaNodeBuilder) lookedUpBuilder);
76 } else if (lookedUpBuilder instanceof LeafListSchemaNodeBuilder) {
77 result = new LeafListSchemaNodeBuilder((LeafListSchemaNodeBuilder) lookedUpBuilder);
78 } else if (lookedUpBuilder instanceof ChoiceBuilder) {
79 result = new ChoiceBuilder((ChoiceBuilder) lookedUpBuilder);
80 } else if (lookedUpBuilder instanceof AnyXmlBuilder) {
81 result = new AnyXmlBuilder((AnyXmlBuilder) lookedUpBuilder);
83 throw new YangParseException(moduleName, refine.getLine(), "Target '" + refine.getName()
84 + "' can not be refined");
90 * Create builder object from refine target node.
93 * grouping which should contains node to refine
95 * refine object containing informations about refine
98 public static DataSchemaNodeBuilder getRefineNodeFromGroupingDefinition(final GroupingDefinition grouping,
99 final RefineHolder refine) {
100 final String moduleName = refine.getModuleName();
101 final int line = refine.getLine();
102 DataSchemaNodeBuilder result = null;
103 final Object lookedUpNode = grouping.getDataChildByName(refine.getName());
104 if (lookedUpNode == null) {
105 throw new YangParseException(moduleName, line, "Refine target node '" + refine.getName() + "' not found");
107 if (lookedUpNode instanceof LeafSchemaNode) {
108 result = createLeafBuilder((LeafSchemaNode) lookedUpNode, moduleName, line);
109 } else if (lookedUpNode instanceof ContainerSchemaNode) {
110 result = createContainer((ContainerSchemaNode) lookedUpNode, moduleName, line);
111 } else if (lookedUpNode instanceof ListSchemaNode) {
112 result = createList((ListSchemaNode) lookedUpNode, moduleName, line);
113 } else if (lookedUpNode instanceof LeafListSchemaNode) {
114 result = createLeafList((LeafListSchemaNode) lookedUpNode, moduleName, line);
115 } else if (lookedUpNode instanceof ChoiceNode) {
116 result = createChoice((ChoiceNode) lookedUpNode, moduleName, line);
117 } else if (lookedUpNode instanceof AnyXmlSchemaNode) {
118 result = createAnyXml((AnyXmlSchemaNode) lookedUpNode, moduleName, line);
120 throw new YangParseException(moduleName, line, "Target '" + refine.getName() + "' can not be refined");
125 public static void refineLeaf(LeafSchemaNodeBuilder leaf, RefineHolder refine) {
126 String defaultStr = refine.getDefaultStr();
127 Boolean mandatory = refine.isMandatory();
128 MustDefinition must = refine.getMust();
129 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodeBuilders();
131 if (defaultStr != null && !("".equals(defaultStr))) {
132 leaf.setDefaultStr(defaultStr);
134 if (mandatory != null) {
135 leaf.getConstraints().setMandatory(mandatory);
138 leaf.getConstraints().addMustDefinition(must);
140 if (unknownNodes != null) {
141 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
142 leaf.addUnknownNodeBuilder(unknown);
147 public static void refineContainer(ContainerSchemaNodeBuilder container, RefineHolder refine, int line) {
148 Boolean presence = refine.isPresence();
149 MustDefinition must = refine.getMust();
150 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodeBuilders();
152 if (presence != null) {
153 container.setPresence(presence);
156 container.getConstraints().addMustDefinition(must);
158 if (unknownNodes != null) {
159 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
160 container.addUnknownNodeBuilder(unknown);
165 public static void refineList(ListSchemaNodeBuilder list, RefineHolder refine, int line) {
166 MustDefinition must = refine.getMust();
167 Integer min = refine.getMinElements();
168 Integer max = refine.getMaxElements();
169 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodeBuilders();
172 list.getConstraints().addMustDefinition(must);
175 list.getConstraints().setMinElements(min);
178 list.getConstraints().setMaxElements(max);
180 if (unknownNodes != null) {
181 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
182 list.addUnknownNodeBuilder(unknown);
187 public static void refineLeafList(LeafListSchemaNodeBuilder leafList, RefineHolder refine, int line) {
188 MustDefinition must = refine.getMust();
189 Integer min = refine.getMinElements();
190 Integer max = refine.getMaxElements();
191 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodeBuilders();
194 leafList.getConstraints().addMustDefinition(must);
197 leafList.getConstraints().setMinElements(min);
200 leafList.getConstraints().setMaxElements(max);
202 if (unknownNodes != null) {
203 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
204 leafList.addUnknownNodeBuilder(unknown);
209 public static void refineChoice(ChoiceBuilder choice, RefineHolder refine, int line) {
210 String defaultStr = refine.getDefaultStr();
211 Boolean mandatory = refine.isMandatory();
212 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodeBuilders();
214 if (defaultStr != null) {
215 choice.setDefaultCase(defaultStr);
217 if (mandatory != null) {
218 choice.getConstraints().setMandatory(mandatory);
220 if (unknownNodes != null) {
221 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
222 choice.addUnknownNodeBuilder(unknown);
227 public static void refineAnyxml(AnyXmlBuilder anyXml, RefineHolder refine, int line) {
228 Boolean mandatory = refine.isMandatory();
229 MustDefinition must = refine.getMust();
230 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodeBuilders();
232 if (mandatory != null) {
233 anyXml.getConstraints().setMandatory(mandatory);
236 anyXml.getConstraints().addMustDefinition(must);
238 if (unknownNodes != null) {
239 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
240 anyXml.addUnknownNodeBuilder(unknown);
246 * Check if refine can be performed on given node.
251 * refine object containing information about refine process
253 public static void checkRefine(SchemaNodeBuilder node, RefineHolder refine) {
254 String moduleName = refine.getModuleName();
255 int line = refine.getLine();
256 String name = node.getQName().getLocalName();
258 String defaultStr = refine.getDefaultStr();
259 Boolean mandatory = refine.isMandatory();
260 Boolean presence = refine.isPresence();
261 MustDefinition must = refine.getMust();
262 Integer min = refine.getMinElements();
263 Integer max = refine.getMaxElements();
265 if (node instanceof AnyXmlBuilder) {
266 checkRefineDefault(node, defaultStr, moduleName, line);
267 checkRefinePresence(node, presence, moduleName, line);
268 checkRefineMinMax(name, min, max, moduleName, line);
269 } else if (node instanceof ChoiceBuilder) {
270 checkRefinePresence(node, presence, moduleName, line);
271 checkRefineMust(node, must, moduleName, line);
272 checkRefineMinMax(name, min, max, moduleName, line);
273 } else if (node instanceof ContainerSchemaNodeBuilder) {
274 checkRefineDefault(node, defaultStr, moduleName, line);
275 checkRefineMandatory(node, mandatory, moduleName, line);
276 checkRefineMust(node, must, moduleName, line);
277 checkRefineMinMax(name, min, max, moduleName, line);
278 } else if (node instanceof LeafSchemaNodeBuilder) {
279 checkRefinePresence(node, presence, moduleName, line);
280 checkRefineMinMax(name, min, max, moduleName, line);
281 } else if (node instanceof LeafListSchemaNodeBuilder || node instanceof ListSchemaNodeBuilder) {
282 checkRefineDefault(node, defaultStr, moduleName, line);
283 checkRefinePresence(node, presence, moduleName, line);
284 checkRefineMandatory(node, mandatory, moduleName, line);
285 } else if (node instanceof GroupingBuilder || node instanceof TypeDefinitionBuilder
286 || node instanceof UsesNodeBuilder) {
287 checkRefineDefault(node, defaultStr, moduleName, line);
288 checkRefinePresence(node, presence, moduleName, line);
289 checkRefineMandatory(node, mandatory, moduleName, line);
290 checkRefineMust(node, must, moduleName, line);
291 checkRefineMinMax(name, min, max, moduleName, line);
295 private static void checkRefineDefault(SchemaNodeBuilder node, String defaultStr, String moduleName, int line) {
296 if (defaultStr != null) {
297 throw new YangParseException(moduleName, line, "Can not refine 'default' for '"
298 + node.getQName().getLocalName() + "'.");
302 private static void checkRefineMandatory(SchemaNodeBuilder node, Boolean mandatory, String moduleName, int line) {
303 if (mandatory != null) {
304 throw new YangParseException(moduleName, line, "Can not refine 'mandatory' for '"
305 + node.getQName().getLocalName() + "'.");
309 private static void checkRefinePresence(SchemaNodeBuilder node, Boolean presence, String moduleName, int line) {
310 if (presence != null) {
311 throw new YangParseException(moduleName, line, "Can not refine 'presence' for '"
312 + node.getQName().getLocalName() + "'.");
316 private static void checkRefineMust(SchemaNodeBuilder node, MustDefinition must, String moduleName, int line) {
318 throw new YangParseException(moduleName, line, "Can not refine 'must' for '"
319 + node.getQName().getLocalName() + "'.");
323 private static void checkRefineMinMax(String refineTargetName, Integer min, Integer max, String moduleName, int line) {
324 if (min != null || max != null) {
325 throw new YangParseException(moduleName, line, "Can not refine 'min-elements' or 'max-elements' for '"
326 + refineTargetName + "'.");
331 * Perform refine operation of following parameters:
333 * <li>description</li>
338 * These parameters may be refined for any node.
343 * refine object containing information about refine process
345 public static void refineDefault(final Builder node, final RefineHolder refine) {
346 final String moduleName = refine.getModuleName();
347 final int line = refine.getLine();
348 Class<? extends Builder> cls = node.getClass();
350 String description = refine.getDescription();
351 if (description != null) {
353 Method method = cls.getDeclaredMethod("setDescription", String.class);
354 method.invoke(node, description);
355 } catch (Exception e) {
356 throw new YangParseException(moduleName, line, "Cannot refine description in " + cls.getName(), e);
360 String reference = refine.getReference();
361 if (reference != null) {
363 Method method = cls.getDeclaredMethod("setReference", String.class);
364 method.invoke(node, reference);
365 } catch (Exception e) {
366 throw new YangParseException(moduleName, line, "Cannot refine reference in " + cls.getName(), e);
370 Boolean config = refine.isConfiguration();
371 if (config != null) {
373 Method method = cls.getDeclaredMethod("setConfiguration", Boolean.class);
374 method.invoke(node, config);
375 } catch (Exception e) {
376 throw new YangParseException(moduleName, line, "Cannot refine config in " + cls.getName(), e);
382 * Perform refine operation on given node.
384 * @param nodeToRefine
385 * builder of node to refine
387 * refine object containing information about refine process
389 * current line in yang model
391 public static void performRefine(SchemaNodeBuilder nodeToRefine, RefineHolder refine, int line) {
392 checkRefine(nodeToRefine, refine);
393 refineDefault(nodeToRefine, refine);
394 if (nodeToRefine instanceof LeafSchemaNodeBuilder) {
395 refineLeaf((LeafSchemaNodeBuilder) nodeToRefine, refine);
396 } else if (nodeToRefine instanceof ContainerSchemaNodeBuilder) {
397 refineContainer((ContainerSchemaNodeBuilder) nodeToRefine, refine, line);
398 } else if (nodeToRefine instanceof ListSchemaNodeBuilder) {
399 refineList((ListSchemaNodeBuilder) nodeToRefine, refine, line);
400 } else if (nodeToRefine instanceof LeafListSchemaNodeBuilder) {
401 refineLeafList((LeafListSchemaNodeBuilder) nodeToRefine, refine, line);
402 } else if (nodeToRefine instanceof ChoiceBuilder) {
403 refineChoice((ChoiceBuilder) nodeToRefine, refine, line);
404 } else if (nodeToRefine instanceof AnyXmlBuilder) {
405 refineAnyxml((AnyXmlBuilder) nodeToRefine, refine, line);