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 java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.List;
16 import org.opendaylight.yangtools.yang.common.QName;
17 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
18 import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder;
19 import org.opendaylight.yangtools.yang.parser.builder.api.Builder;
20 import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder;
21 import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder;
22 import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder;
23 import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder;
24 import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder;
25 import org.opendaylight.yangtools.yang.parser.builder.impl.AnyXmlBuilder;
26 import org.opendaylight.yangtools.yang.parser.builder.impl.AugmentationSchemaBuilderImpl;
27 import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceBuilder;
28 import org.opendaylight.yangtools.yang.parser.builder.impl.ChoiceCaseBuilder;
29 import org.opendaylight.yangtools.yang.parser.builder.impl.ConstraintsBuilder;
30 import org.opendaylight.yangtools.yang.parser.builder.impl.ContainerSchemaNodeBuilder;
31 import org.opendaylight.yangtools.yang.parser.builder.impl.GroupingBuilderImpl;
32 import org.opendaylight.yangtools.yang.parser.builder.impl.IdentityrefTypeBuilder;
33 import org.opendaylight.yangtools.yang.parser.builder.impl.LeafListSchemaNodeBuilder;
34 import org.opendaylight.yangtools.yang.parser.builder.impl.LeafSchemaNodeBuilder;
35 import org.opendaylight.yangtools.yang.parser.builder.impl.ListSchemaNodeBuilder;
36 import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleBuilder;
37 import org.opendaylight.yangtools.yang.parser.builder.impl.TypeDefinitionBuilderImpl;
38 import org.opendaylight.yangtools.yang.parser.builder.impl.UnionTypeBuilder;
39 import org.opendaylight.yangtools.yang.parser.builder.impl.UnknownSchemaNodeBuilder;
40 import org.opendaylight.yangtools.yang.parser.builder.impl.UsesNodeBuilderImpl;
42 public class CopyUtils {
44 public static DataSchemaNodeBuilder copy(DataSchemaNodeBuilder old, Builder newParent, boolean updateQName) {
45 if (old instanceof AnyXmlBuilder) {
46 return copy((AnyXmlBuilder) old, newParent, updateQName);
47 } else if (old instanceof ChoiceBuilder) {
48 return copy((ChoiceBuilder) old, newParent, updateQName);
49 } else if (old instanceof ContainerSchemaNodeBuilder) {
50 return copy((ContainerSchemaNodeBuilder) old, newParent, updateQName);
51 } else if (old instanceof LeafSchemaNodeBuilder) {
52 return copy((LeafSchemaNodeBuilder) old, newParent, updateQName);
53 } else if (old instanceof LeafListSchemaNodeBuilder) {
54 return copy((LeafListSchemaNodeBuilder) old, newParent, updateQName);
55 } else if (old instanceof ListSchemaNodeBuilder) {
56 return copy((ListSchemaNodeBuilder) old, newParent, updateQName);
57 } else if (old instanceof ChoiceCaseBuilder) {
58 return copy((ChoiceCaseBuilder) old, newParent, updateQName);
60 throw new YangParseException(old.getModuleName(), old.getLine(), "Failed to copy node " + old);
64 private static AnyXmlBuilder copy(AnyXmlBuilder old, Builder newParent, boolean updateQName) {
65 DataBean data = getdata(old, newParent, updateQName);
66 QName newQName = data.qname;
67 SchemaPath newSchemaPath = data.schemaPath;
69 AnyXmlBuilder c = new AnyXmlBuilder(newParent.getModuleName(), newParent.getLine(), newQName, newSchemaPath);
70 copyConstraints(c.getConstraints(), old.getConstraints());
71 c.setParent(newParent);
72 c.setPath(newSchemaPath);
73 c.setDescription(old.getDescription());
74 c.setReference(old.getReference());
75 c.setStatus(old.getStatus());
76 c.setAugmenting(old.isAugmenting());
77 c.setAddedByUses(old.isAddedByUses());
78 c.setConfiguration(old.isConfiguration());
80 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
81 c.addUnknownNodeBuilder((copy(un, c, updateQName)));
87 private static ChoiceBuilder copy(ChoiceBuilder old, Builder newParent, boolean updateQName) {
88 DataBean data = getdata(old, newParent, updateQName);
89 QName newQName = data.qname;
90 SchemaPath newSchemaPath = data.schemaPath;
92 ChoiceBuilder c = new ChoiceBuilder(newParent.getModuleName(), newParent.getLine(), newQName);
93 copyConstraints(c.getConstraints(), old.getConstraints());
94 c.setParent(newParent);
95 c.setPath(newSchemaPath);
96 c.setDescription(old.getDescription());
97 c.setReference(old.getReference());
98 c.setStatus(old.getStatus());
99 c.setAugmenting(old.isAugmenting());
100 c.setAddedByUses(old.isAddedByUses());
101 c.setConfiguration(old.isConfiguration());
102 // TODO: built child nodes?
103 for (ChoiceCaseBuilder childNode : old.getCases()) {
104 c.addCase(copy(childNode, c, updateQName));
106 // TODO: built augments?
107 for (AugmentationSchemaBuilder augment : old.getAugmentations()) {
108 c.addAugmentation(copyAugment(augment, c));
111 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
112 c.addUnknownNodeBuilder((copy(un, c, updateQName)));
118 private static ChoiceCaseBuilder copy(ChoiceCaseBuilder old, Builder newParent, boolean updateQName) {
119 DataBean data = getdata(old, newParent, updateQName);
120 QName newQName = data.qname;
121 SchemaPath newSchemaPath = data.schemaPath;
123 ChoiceCaseBuilder c = new ChoiceCaseBuilder(newParent.getModuleName(), newParent.getLine(), newQName);
124 copyConstraints(c.getConstraints(), old.getConstraints());
125 c.setParent(newParent);
126 c.setPath(newSchemaPath);
127 c.setDescription(old.getDescription());
128 c.setReference(old.getReference());
129 c.setStatus(old.getStatus());
130 c.setAugmenting(old.isAugmenting());
131 // TODO: built child nodes?
132 for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
133 c.addChildNode(copy(childNode, c, updateQName));
135 // TODO: built groupings?
136 // TODO: copy groupings?
137 c.getGroupings().addAll(old.getGroupings());
138 // TODO: build typedefs?
139 for (TypeDefinitionBuilder tdb : old.getTypeDefinitionBuilders()) {
140 c.addTypedef(copy(tdb, c, updateQName));
143 for (UsesNodeBuilder oldUses : old.getUsesNodes()) {
144 c.addUsesNode(copyUses(oldUses, c));
147 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
148 c.addUnknownNodeBuilder((copy(un, c, updateQName)));
154 private static ContainerSchemaNodeBuilder copy(ContainerSchemaNodeBuilder old, Builder newParent,
155 boolean updateQName) {
156 DataBean data = getdata(old, newParent, updateQName);
157 QName newQName = data.qname;
158 SchemaPath newSchemaPath = data.schemaPath;
160 ContainerSchemaNodeBuilder c = new ContainerSchemaNodeBuilder(newParent.getModuleName(), newParent.getLine(),
161 newQName, newSchemaPath);
162 copyConstraints(c.getConstraints(), old.getConstraints());
163 c.setParent(newParent);
164 c.setPath(newSchemaPath);
165 c.setDescription(old.getDescription());
166 c.setReference(old.getReference());
167 c.setStatus(old.getStatus());
168 c.setPresence(old.isPresence());
169 c.setAugmenting(old.isAugmenting());
170 c.setAddedByUses(old.isAddedByUses());
171 c.setConfiguration(old.isConfiguration());
172 // TODO: built child nodes?
173 for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
174 c.addChildNode(copy(childNode, c, updateQName));
176 // TODO: built groupings?
177 for (GroupingBuilder grouping : old.getGroupingBuilders()) {
178 c.addGrouping(copy(grouping, c, updateQName));
181 // TODO: build typedefs?
182 for (TypeDefinitionBuilder tdb : old.getTypeDefinitionBuilders()) {
183 c.addTypedef(copy(tdb, c, updateQName));
186 for (UsesNodeBuilder oldUses : old.getUsesNodes()) {
187 c.addUsesNode(copyUses(oldUses, c));
189 // TODO: built augments?
190 for (AugmentationSchemaBuilder augment : old.getAugmentations()) {
191 c.addAugmentation(copyAugment(augment, c));
194 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
195 c.addUnknownNodeBuilder((copy(un, c, updateQName)));
201 private static LeafSchemaNodeBuilder copy(LeafSchemaNodeBuilder old, Builder newParent, boolean updateQName) {
202 DataBean data = getdata(old, newParent, updateQName);
203 QName newQName = data.qname;
204 SchemaPath newSchemaPath = data.schemaPath;
206 LeafSchemaNodeBuilder c = new LeafSchemaNodeBuilder(newParent.getModuleName(), newParent.getLine(), newQName,
208 copyConstraints(c.getConstraints(), old.getConstraints());
209 c.setParent(newParent);
210 c.setPath(newSchemaPath);
211 c.setDescription(old.getDescription());
212 c.setReference(old.getReference());
213 c.setStatus(old.getStatus());
214 c.setAugmenting(old.isAugmenting());
215 c.setAddedByUses(old.isAddedByUses());
216 c.setConfiguration(old.isConfiguration());
218 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
219 c.addUnknownNodeBuilder((copy(un, c, updateQName)));
222 if (old.getType() == null) {
223 c.setTypedef(copy(old.getTypedef(), c, updateQName));
225 c.setType(old.getType());
228 c.setDefaultStr(old.getDefaultStr());
229 c.setUnits(old.getUnits());
234 public static LeafListSchemaNodeBuilder copy(LeafListSchemaNodeBuilder old, Builder newParent, boolean updateQName) {
235 DataBean data = getdata(old, newParent, updateQName);
236 QName newQName = data.qname;
237 SchemaPath newSchemaPath = data.schemaPath;
239 LeafListSchemaNodeBuilder c = new LeafListSchemaNodeBuilder(newParent.getModuleName(), newParent.getLine(),
240 newQName, newSchemaPath);
241 copyConstraints(c.getConstraints(), old.getConstraints());
242 c.setParent(newParent);
243 c.setPath(newSchemaPath);
244 c.setDescription(old.getDescription());
245 c.setReference(old.getReference());
246 c.setStatus(old.getStatus());
247 c.setAugmenting(old.isAugmenting());
248 c.setAddedByUses(old.isAddedByUses());
249 c.setConfiguration(old.isConfiguration());
251 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
252 c.addUnknownNodeBuilder((copy(un, c, updateQName)));
255 if (old.getType() == null) {
256 c.setTypedef(copy(old.getTypedef(), c, updateQName));
258 c.setType(old.getType());
261 c.setUserOrdered(old.isUserOrdered());
266 private static ListSchemaNodeBuilder copy(ListSchemaNodeBuilder old, Builder newParent, boolean updateQName) {
267 DataBean data = getdata(old, newParent, updateQName);
268 QName newQName = data.qname;
269 SchemaPath newSchemaPath = data.schemaPath;
271 ListSchemaNodeBuilder c = new ListSchemaNodeBuilder(newParent.getModuleName(), newParent.getLine(), newQName,
273 copyConstraints(c.getConstraints(), old.getConstraints());
274 c.setParent(newParent);
275 c.setPath(newSchemaPath);
276 c.setDescription(old.getDescription());
277 c.setReference(old.getReference());
278 c.setStatus(old.getStatus());
279 c.setAugmenting(old.isAugmenting());
280 c.setAddedByUses(old.isAddedByUses());
281 c.setConfiguration(old.isConfiguration());
282 // TODO: built child nodes?
283 for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
284 c.addChildNode(copy(childNode, c, updateQName));
286 // TODO: built groupings?
287 for (GroupingBuilder grouping : old.getGroupingBuilders()) {
288 c.addGrouping(copy(grouping, c, updateQName));
291 // TODO: build typedefs?
292 for (TypeDefinitionBuilder tdb : old.getTypeDefinitionBuilders()) {
293 c.addTypedef(copy(tdb, c, updateQName));
296 for (UsesNodeBuilder oldUses : old.getUsesNodes()) {
297 c.addUsesNode(copyUses(oldUses, c));
299 // TODO: built augments?
300 for (AugmentationSchemaBuilder augment : old.getAugmentations()) {
301 c.addAugmentation(copyAugment(augment, c));
304 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
305 c.addUnknownNodeBuilder((copy(un, c, updateQName)));
308 c.setUserOrdered(old.isUserOrdered());
309 c.setKeyDefinition(old.getKeyDefinition());
314 public static GroupingBuilder copy(GroupingBuilder old, Builder newParent, boolean updateQName) {
315 DataBean data = getdata(old, newParent, updateQName);
316 QName newQName = data.qname;
317 SchemaPath newSchemaPath = data.schemaPath;
319 GroupingBuilder c = new GroupingBuilderImpl(newParent.getModuleName(), newParent.getLine(), newQName);
320 c.setParent(newParent);
321 c.setPath(newSchemaPath);
322 c.setDescription(old.getDescription());
323 c.setReference(old.getReference());
324 c.setStatus(old.getStatus());
325 c.setAddedByUses(old.isAddedByUses());
326 // TODO: built child nodes?
327 for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
328 c.addChildNode(copy(childNode, c, updateQName));
330 // TODO: built groupings?
331 for (GroupingBuilder grouping : old.getGroupingBuilders()) {
332 c.addGrouping(copy(grouping, c, updateQName));
335 // TODO: build typedefs?
336 for (TypeDefinitionBuilder tdb : old.getTypeDefinitionBuilders()) {
337 c.addTypedef(copy(tdb, c, updateQName));
340 for (UsesNodeBuilder oldUses : old.getUsesNodes()) {
341 c.addUsesNode(copyUses(oldUses, c));
344 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
345 c.addUnknownNodeBuilder((copy(un, c, updateQName)));
351 public static TypeDefinitionBuilder copy(TypeDefinitionBuilder old, Builder newParent, boolean updateQName) {
352 DataBean data = getdata(old, newParent, updateQName);
353 QName newQName = data.qname;
354 SchemaPath newSchemaPath = data.schemaPath;
355 TypeDefinitionBuilder type = null;
357 if (old instanceof UnionTypeBuilder) {
358 type = new UnionTypeBuilder(newParent.getModuleName(), newParent.getLine());
359 } else if (old instanceof IdentityrefTypeBuilder) {
360 type = new IdentityrefTypeBuilder(newParent.getModuleName(), newParent.getLine(),
361 ((IdentityrefTypeBuilder) old).getBaseString(), newSchemaPath);
363 type = new TypeDefinitionBuilderImpl(old.getModuleName(), newParent.getLine(), newQName);
364 type.setParent(newParent);
365 type.setPath(newSchemaPath);
367 if (old.getType() == null) {
368 type.setTypedef(copy(old.getTypedef(), type, updateQName));
370 type.setType(old.getType());
373 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
374 type.addUnknownNodeBuilder((copy(un, type, updateQName)));
377 type.setRanges(old.getRanges());
378 type.setLengths(old.getLengths());
379 type.setPatterns(old.getPatterns());
380 type.setFractionDigits(old.getFractionDigits());
381 type.setDescription(old.getDescription());
382 type.setReference(old.getReference());
383 type.setStatus(old.getStatus());
384 type.setUnits(old.getUnits());
385 type.setDefaultValue(old.getDefaultValue());
386 type.setAddedByUses(old.isAddedByUses());
392 private static ConstraintsBuilder copyConstraints(ConstraintsBuilder newConstraints, ConstraintsBuilder old) {
393 newConstraints.getMustDefinitions().addAll(old.getMustDefinitions());
394 newConstraints.addWhenCondition(old.getWhenCondition());
395 newConstraints.setMandatory(old.isMandatory());
396 newConstraints.setMinElements(old.getMinElements());
397 newConstraints.setMaxElements(old.getMaxElements());
398 return newConstraints;
401 public static UsesNodeBuilder copyUses(UsesNodeBuilder old, Builder newParent) {
402 UsesNodeBuilder u = new UsesNodeBuilderImpl(newParent.getModuleName(), newParent.getLine(),
403 old.getGroupingName());
404 u.setParent(newParent);
405 u.setGroupingPath(old.getGroupingPath());
406 u.setAugmenting(old.isAugmenting());
407 u.setAddedByUses(old.isAddedByUses());
408 u.getAugmentations().addAll(old.getAugmentations());
409 u.getRefineNodes().addAll(old.getRefineNodes());
410 u.getRefines().addAll(old.getRefines());
411 u.getFinalChildren().addAll(old.getFinalChildren());
412 u.getFinalGroupings().addAll(old.getFinalGroupings());
413 u.getFinalTypedefs().addAll(old.getFinalTypedefs());
414 u.getFinalUnknownNodes().addAll(old.getFinalUnknownNodes());
416 Set<DataSchemaNodeBuilder> oldChildren = old.getTargetChildren();
417 Set<DataSchemaNodeBuilder> newChildren = new HashSet<>();
418 if (oldChildren != null) {
419 for (DataSchemaNodeBuilder child : old.getTargetChildren()) {
420 newChildren.add(CopyUtils.copy(child, newParent, true));
423 u.setTargetChildren(newChildren);
425 Set<TypeDefinitionBuilder> oldTypedefs = old.getTargetTypedefs();
426 Set<TypeDefinitionBuilder> newTypedefs = new HashSet<>();
427 if (oldTypedefs != null) {
428 for (TypeDefinitionBuilder typedef : old.getTargetTypedefs()) {
429 newTypedefs.add(CopyUtils.copy(typedef, newParent, true));
432 u.setTargetTypedefs(newTypedefs);
434 Set<GroupingBuilder> oldGroupings = old.getTargetGroupings();
435 Set<GroupingBuilder> newGroupings = new HashSet<>();
436 if (oldGroupings != null) {
437 for (GroupingBuilder grouping : old.getTargetGroupings()) {
438 newGroupings.add(copy(grouping, newParent, true));
441 u.setTargetGroupings(newGroupings);
443 List<UnknownSchemaNodeBuilder> oldUN = old.getTargetUnknownNodes();
444 List<UnknownSchemaNodeBuilder> newUN = new ArrayList<>();
446 for (UnknownSchemaNodeBuilder un : oldUN) {
447 newUN.add(copy(un, newParent, true));
450 u.setTargetUnknownNodes(newUN);
452 // u.getTargetGroupingUses().addAll(old.getTargetGroupingUses());
453 for (UsesNodeBuilder uses : old.getTargetGroupingUses()) {
454 u.getTargetGroupingUses().add(copyUses(uses, uses.getParent()));
457 // add new uses to collection of uses in module
458 ModuleBuilder module = ParserUtils.getParentModule(newParent);
459 module.addUsesNode(u);
464 private static AugmentationSchemaBuilder copyAugment(AugmentationSchemaBuilder old, Builder newParent) {
465 AugmentationSchemaBuilder a = new AugmentationSchemaBuilderImpl(newParent.getModuleName(), newParent.getLine(),
466 old.getTargetPathAsString());
467 a.setParent(newParent);
469 a.setDescription(old.getDescription());
470 a.setReference(old.getReference());
471 a.setStatus(old.getStatus());
472 a.addWhenCondition(old.getWhenCondition());
473 // TODO: built child nodes?
474 for (DataSchemaNodeBuilder childNode : old.getChildNodeBuilders()) {
475 a.addChildNode(copy(childNode, a, false));
478 for (UsesNodeBuilder oldUses : old.getUsesNodes()) {
479 a.addUsesNode(copyUses(oldUses, a));
482 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
483 a.addUnknownNodeBuilder((copy(un, a, false)));
489 public static UnknownSchemaNodeBuilder copy(UnknownSchemaNodeBuilder old, Builder newParent, boolean updateQName) {
490 DataBean data = getdata(old, newParent, updateQName);
491 QName newQName = data.qname;
492 SchemaPath newSchemaPath = data.schemaPath;
494 UnknownSchemaNodeBuilder c = new UnknownSchemaNodeBuilder(newParent.getModuleName(), newParent.getLine(),
497 c.setParent(newParent);
498 c.setPath(newSchemaPath);
499 c.setDescription(old.getDescription());
500 c.setReference(old.getReference());
501 c.setStatus(old.getStatus());
502 c.setAddedByUses(old.isAddedByUses());
505 for (UnknownSchemaNodeBuilder un : old.getUnknownNodeBuilders()) {
506 c.addUnknownNodeBuilder((copy(un, c, updateQName)));
512 private static DataBean getdata(SchemaNodeBuilder old, Builder newParent, boolean updateQName) {
513 List<QName> newPath = null;
514 QName newQName = null;
515 if (newParent instanceof ModuleBuilder) {
516 ModuleBuilder parent = (ModuleBuilder) newParent;
518 newQName = new QName(parent.getNamespace(), parent.getRevision(), parent.getPrefix(), old.getQName()
520 newPath = Collections.singletonList(newQName);
522 newQName = old.getQName();
523 newPath = Collections.singletonList(newQName);
525 } else if (newParent instanceof AugmentationSchemaBuilder) {
526 // TODO: new parent is augment?
527 ModuleBuilder parent = ParserUtils.getParentModule(newParent);
529 newQName = new QName(parent.getNamespace(), parent.getRevision(), parent.getPrefix(), old.getQName()
531 newPath = Collections.singletonList(newQName);
533 newQName = old.getQName();
534 newPath = Collections.singletonList(newQName);
537 } else if (newParent instanceof SchemaNodeBuilder) {
538 SchemaNodeBuilder parent = (SchemaNodeBuilder) newParent;
539 QName parentQName = parent.getQName();
541 if (parentQName == null) {
542 System.out.println("NULL");
545 System.out.println("2NULL");
547 newQName = new QName(parentQName.getNamespace(), parentQName.getRevision(), parentQName.getPrefix(),
548 old.getQName().getLocalName());
549 newPath = new ArrayList<>(parent.getPath().getPath());
550 newPath.add(newQName);
552 newQName = old.getQName();
553 newPath = new ArrayList<>(parent.getPath().getPath());
554 newPath.add(newQName);
558 SchemaPath newSchemaPath = new SchemaPath(newPath, true);
559 return new DataBean(newQName, newSchemaPath);
562 private static class DataBean {
564 private SchemaPath schemaPath;
566 private DataBean(QName qname, SchemaPath schemaPath) {
568 this.schemaPath = schemaPath;