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.builder.impl;
10 import java.util.List;
11 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
12 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
13 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
14 import org.opendaylight.yangtools.yang.parser.builder.api.DocumentedNodeBuilder;
15 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
16 import org.opendaylight.yangtools.yang.parser.builder.api.RefineBuilder;
17 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
18 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
19 import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder;
20 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
21 import org.opendaylight.yangtools.yang.parser.util.YangParseException;
24 * Utility class with helper methods to perform operations tied to refine
27 * @deprecated Pre-Beryllium implementation, scheduled for removal.
30 public final class RefineUtils {
32 private RefineUtils() {
35 private static void refineLeaf(final LeafSchemaNodeBuilder leaf, final RefineBuilder refine) {
36 String defaultStr = refine.getDefaultStr();
37 Boolean mandatory = refine.isMandatory();
38 MustDefinition must = refine.getMust();
39 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodes();
41 if (defaultStr != null && !defaultStr.isEmpty()) {
42 leaf.setDefaultStr(defaultStr);
44 if (mandatory != null) {
45 leaf.getConstraints().setMandatory(mandatory);
48 leaf.getConstraints().addMustDefinition(must);
50 if (unknownNodes != null) {
51 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
52 unknown.setParent(leaf);
53 leaf.addUnknownNodeBuilder(unknown);
58 private static void refineContainer(final ContainerSchemaNodeBuilder container, final RefineBuilder refine) {
59 Boolean presence = refine.isPresence();
60 MustDefinition must = refine.getMust();
61 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodes();
63 if (presence != null) {
64 container.setPresence(presence);
67 container.getConstraints().addMustDefinition(must);
69 if (unknownNodes != null) {
70 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
71 unknown.setParent(container);
72 container.addUnknownNodeBuilder(unknown);
77 private static void refineList(final ListSchemaNodeBuilder list, final RefineBuilder refine) {
78 MustDefinition must = refine.getMust();
79 Integer min = refine.getMinElements();
80 Integer max = refine.getMaxElements();
81 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodes();
84 list.getConstraints().addMustDefinition(must);
87 list.getConstraints().setMinElements(min);
90 list.getConstraints().setMaxElements(max);
92 if (unknownNodes != null) {
93 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
94 unknown.setParent(list);
95 list.addUnknownNodeBuilder(unknown);
100 public static void refineLeafList(final LeafListSchemaNodeBuilder leafList, final RefineBuilder refine) {
101 MustDefinition must = refine.getMust();
102 Integer min = refine.getMinElements();
103 Integer max = refine.getMaxElements();
104 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodes();
107 leafList.getConstraints().addMustDefinition(must);
110 leafList.getConstraints().setMinElements(min);
113 leafList.getConstraints().setMaxElements(max);
115 if (unknownNodes != null) {
116 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
117 unknown.setParent(leafList);
118 leafList.addUnknownNodeBuilder(unknown);
123 public static void refineChoice(final ChoiceBuilder choice, final RefineBuilder refine) {
124 String defaultStr = refine.getDefaultStr();
125 Boolean mandatory = refine.isMandatory();
126 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodes();
128 if (defaultStr != null) {
129 choice.setDefaultCase(defaultStr);
131 if (mandatory != null) {
132 choice.getConstraints().setMandatory(mandatory);
134 if (unknownNodes != null) {
135 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
136 unknown.setParent(choice);
137 choice.addUnknownNodeBuilder(unknown);
142 public static void refineAnyxml(final AnyXmlBuilder anyXml, final RefineBuilder refine) {
143 Boolean mandatory = refine.isMandatory();
144 MustDefinition must = refine.getMust();
145 List<UnknownSchemaNodeBuilder> unknownNodes = refine.getUnknownNodes();
147 if (mandatory != null) {
148 anyXml.getConstraints().setMandatory(mandatory);
151 anyXml.getConstraints().addMustDefinition(must);
153 if (unknownNodes != null) {
154 for (UnknownSchemaNodeBuilder unknown : unknownNodes) {
155 unknown.setParent(anyXml);
156 anyXml.addUnknownNodeBuilder(unknown);
162 * Check if refine can be performed on given node.
167 * refine object containing information about refine process
169 private static void checkRefine(final SchemaNodeBuilder node, final RefineBuilder refine) {
170 String moduleName = refine.getModuleName();
171 int line = refine.getLine();
172 String name = node.getQName().getLocalName();
174 String defaultStr = refine.getDefaultStr();
175 Boolean mandatory = refine.isMandatory();
176 Boolean presence = refine.isPresence();
177 MustDefinition must = refine.getMust();
178 Integer min = refine.getMinElements();
179 Integer max = refine.getMaxElements();
181 if (node instanceof AnyXmlBuilder) {
182 checkRefineDefault(node, defaultStr, moduleName, line);
183 checkRefinePresence(node, presence, moduleName, line);
184 checkRefineMinMax(name, min, max, moduleName, line);
185 } else if (node instanceof ChoiceBuilder) {
186 checkRefinePresence(node, presence, moduleName, line);
187 checkRefineMust(node, must, moduleName, line);
188 checkRefineMinMax(name, min, max, moduleName, line);
189 } else if (node instanceof ContainerSchemaNodeBuilder) {
190 checkRefineDefault(node, defaultStr, moduleName, line);
191 checkRefineMandatory(node, mandatory, moduleName, line);
192 checkRefineMinMax(name, min, max, moduleName, line);
193 } else if (node instanceof LeafSchemaNodeBuilder) {
194 checkRefinePresence(node, presence, moduleName, line);
195 checkRefineMinMax(name, min, max, moduleName, line);
196 } else if (node instanceof LeafListSchemaNodeBuilder || node instanceof ListSchemaNodeBuilder) {
197 checkRefineDefault(node, defaultStr, moduleName, line);
198 checkRefinePresence(node, presence, moduleName, line);
199 checkRefineMandatory(node, mandatory, moduleName, line);
200 } else if (node instanceof GroupingBuilder || node instanceof TypeDefinitionBuilder
201 || node instanceof UsesNodeBuilder) {
202 checkRefineDefault(node, defaultStr, moduleName, line);
203 checkRefinePresence(node, presence, moduleName, line);
204 checkRefineMandatory(node, mandatory, moduleName, line);
205 checkRefineMust(node, must, moduleName, line);
206 checkRefineMinMax(name, min, max, moduleName, line);
210 private static void checkRefineDefault(final SchemaNodeBuilder node, final String defaultStr, final String moduleName, final int line) {
211 if (defaultStr != null) {
212 throw new YangParseException(moduleName, line, "Can not refine 'default' for '"
213 + node.getQName().getLocalName() + "'.");
217 private static void checkRefineMandatory(final SchemaNodeBuilder node, final Boolean mandatory, final String moduleName, final int line) {
218 if (mandatory != null) {
219 throw new YangParseException(moduleName, line, "Can not refine 'mandatory' for '"
220 + node.getQName().getLocalName() + "'.");
224 private static void checkRefinePresence(final SchemaNodeBuilder node, final Boolean presence, final String moduleName, final int line) {
225 if (presence != null) {
226 throw new YangParseException(moduleName, line, "Can not refine 'presence' for '"
227 + node.getQName().getLocalName() + "'.");
231 private static void checkRefineMust(final SchemaNodeBuilder node, final MustDefinition must, final String moduleName, final int line) {
233 throw new YangParseException(moduleName, line, "Can not refine 'must' for '"
234 + node.getQName().getLocalName() + "'.");
238 private static void checkRefineMinMax(final String refineTargetName, final Integer min, final Integer max, final String moduleName, final int line) {
239 if (min != null || max != null) {
240 throw new YangParseException(moduleName, line, "Can not refine 'min-elements' or 'max-elements' for '"
241 + refineTargetName + "'.");
246 * Perform refine operation of following parameters:
248 * <li>description</li>
253 * These parameters may be refined for any node.
258 * refine object containing information about refine process
260 private static void refineDefault(final Builder node, final RefineBuilder refine) {
261 final String moduleName = refine.getModuleName();
262 final int line = refine.getLine();
265 final DocumentedNodeBuilder documentedNode;
266 if(node instanceof DocumentedNodeBuilder) {
267 documentedNode = ((DocumentedNodeBuilder) node);
269 documentedNode = null;
272 String description = refine.getDescription();
275 if (description != null) {
276 if(documentedNode != null) {
277 documentedNode.setDescription(description);
279 throw new YangParseException(moduleName, line, String.format("Cannot refine description in of target %s",refine.getTargetPathString()));
284 String reference = refine.getReference();
285 if (reference != null) {
286 if(documentedNode != null) {
287 documentedNode.setReference(reference);
289 throw new YangParseException(moduleName, line, String.format("Cannot refine reference in of target %s",refine.getTargetPathString()));
293 Boolean config = refine.isConfiguration();
294 if (config != null) {
295 if(node instanceof DataSchemaNodeBuilder) {
296 ((DataSchemaNodeBuilder) node).setConfiguration(config);
298 throw new YangParseException(moduleName, line, String.format("Cannot refine config of target %s ",refine.getTargetPathString()));
304 * Perform refine operation on given node.
306 * @param nodeToRefine
307 * builder of node to refine
309 * refine object containing information about refine process
311 static void performRefine(final SchemaNodeBuilder nodeToRefine, final RefineBuilder refine) {
312 checkRefine(nodeToRefine, refine);
313 refineDefault(nodeToRefine, refine);
314 if (nodeToRefine instanceof LeafSchemaNodeBuilder) {
315 refineLeaf((LeafSchemaNodeBuilder) nodeToRefine, refine);
316 } else if (nodeToRefine instanceof ContainerSchemaNodeBuilder) {
317 refineContainer((ContainerSchemaNodeBuilder) nodeToRefine, refine);
318 } else if (nodeToRefine instanceof ListSchemaNodeBuilder) {
319 refineList((ListSchemaNodeBuilder) nodeToRefine, refine);
320 } else if (nodeToRefine instanceof LeafListSchemaNodeBuilder) {
321 refineLeafList((LeafListSchemaNodeBuilder) nodeToRefine, refine);
322 } else if (nodeToRefine instanceof ChoiceBuilder) {
323 refineChoice((ChoiceBuilder) nodeToRefine, refine);
324 } else if (nodeToRefine instanceof AnyXmlBuilder) {
325 refineAnyxml((AnyXmlBuilder) nodeToRefine, refine);