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.mdsal.binding.generator.impl
10 import java.util.Collection
14 import org.opendaylight.yangtools.yang.common.Revision
15 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode
16 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode
17 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode
18 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode
19 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode
20 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode
21 import org.opendaylight.yangtools.yang.model.api.Deviation
22 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition
23 import org.opendaylight.yangtools.yang.model.api.FeatureDefinition
24 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition
25 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode
26 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode
27 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode
28 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode
29 import org.opendaylight.yangtools.yang.model.api.Module
30 import org.opendaylight.yangtools.yang.model.api.ModuleImport
31 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition
32 import org.opendaylight.yangtools.yang.model.api.RpcDefinition
33 import org.opendaylight.yangtools.yang.model.api.SchemaNode
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
39 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition
40 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair
44 private static val String SKIP_PROPERTY_NAME = "mdsal.skip.verbose"
46 private static val SKIP = Boolean.getBoolean(SKIP_PROPERTY_NAME)
48 private static val SKIPPED_EMPTY = '''(Empty due to «SKIP_PROPERTY_NAME» property = true)'''
50 def static String generateYangSnipet(SchemaNode schemaNode) {
51 if (schemaNode === null)
56 «IF schemaNode instanceof DataSchemaNode»
57 «writeDataSchemaNode(schemaNode)»
59 «IF schemaNode instanceof EnumTypeDefinition.EnumPair»
60 «writeEnumPair(schemaNode)»
62 «IF schemaNode instanceof ExtensionDefinition»
63 «writeExtension(schemaNode)»
65 «IF schemaNode instanceof FeatureDefinition»
66 «writeFeature(schemaNode)»
68 «IF schemaNode instanceof GroupingDefinition»
69 «writeGroupingDef(schemaNode)»
71 «IF schemaNode instanceof IdentitySchemaNode»
72 «writeIdentity(schemaNode)»
74 «IF schemaNode instanceof NotificationDefinition»
75 «writeNotification(schemaNode)»
77 «IF schemaNode instanceof RpcDefinition»
78 «writeRPC(schemaNode)»
80 «IF schemaNode instanceof TypeDefinition<?>»
81 «writeTypeDefinition(schemaNode)»
83 «IF schemaNode instanceof UnknownSchemaNode»
84 «writeUnknownSchemaNode(schemaNode)»
89 def static String generateYangSnipet(Set<? extends SchemaNode> nodes) {
90 if (nodes.nullOrEmpty)
96 «IF node instanceof NotificationDefinition»
97 «writeNotification(node)»
98 «ELSEIF node instanceof RpcDefinition»
105 def private static writeEnumPair(EnumPair pair) {
113 def private static String writeModuleImports(Set<ModuleImport> moduleImports) {
114 if (moduleImports.nullOrEmpty)
118 «FOR moduleImport : moduleImports SEPARATOR "\n"»
119 «IF moduleImport !== null && !moduleImport.moduleName.nullOrEmpty»
120 import «moduleImport.moduleName» { prefix "«moduleImport.prefix»"; }
126 def private static writeRevision(Revision moduleRevision, String moduleDescription) {
127 val revisionIndent = 12
130 revision «moduleRevision.toString» {
131 description "«YangTextTemplate.formatToParagraph(moduleDescription, revisionIndent)»";
136 def static String generateYangSnipet(Module module) {
140 module «module.name» {
141 yang-version «module.yangVersion»;
142 namespace "«module.QNameModule.namespace.toString»";
143 prefix "«module.prefix»";
145 «IF !module.imports.nullOrEmpty»
146 «writeModuleImports(module.imports)»
148 «IF module.revision.present»
149 «writeRevision(module.revision.get, module.description.orElse(null))»
151 «IF !module.childNodes.nullOrEmpty»
153 «writeDataSchemaNodes(module.childNodes)»
155 «IF !module.groupings.nullOrEmpty»
157 «writeGroupingDefs(module.groupings)»
159 «IF !module.augmentations.nullOrEmpty»
161 «writeAugments(module.augmentations)»
163 «IF !module.deviations.nullOrEmpty»
165 «writeDeviations(module.deviations)»
167 «IF !module.extensionSchemaNodes.nullOrEmpty»
169 «writeExtensions(module.extensionSchemaNodes)»
171 «IF !module.features.nullOrEmpty»
173 «writeFeatures(module.features)»
175 «IF !module.identities.nullOrEmpty»
177 «writeIdentities(module.identities)»
179 «IF !module.notifications.nullOrEmpty»
181 «writeNotifications(module.notifications)»
183 «IF !module.rpcs.nullOrEmpty»
185 «writeRPCs(module.rpcs)»
187 «IF !module.unknownSchemaNodes.nullOrEmpty»
189 «writeUnknownSchemaNodes(module.unknownSchemaNodes)»
191 «IF !module.uses.nullOrEmpty»
193 «writeUsesNodes(module.uses)»
199 def private static writeRPCs(Set<RpcDefinition> rpcDefs) {
209 def private static writeRPC(RpcDefinition rpc) {
210 var boolean isStatusDeprecated = rpc.status == Status::DEPRECATED
212 rpc «rpc.QName.localName» {
213 «IF rpc.description.present»
214 "«rpc.description.get»";
216 «IF !rpc.groupings.nullOrEmpty»
217 «writeGroupingDefs(rpc.groupings)»
219 «IF rpc.input !== null»
220 «writeRpcInput(rpc.input)»
222 «IF rpc.output !== null»
223 «writeRpcOutput(rpc.output)»
225 «IF rpc.reference.present»
227 "«rpc.reference.get»";
229 «IF isStatusDeprecated»
236 def private static writeRpcInput(ContainerSchemaNode input) {
242 «IF !input.childNodes.nullOrEmpty»
243 «writeDataSchemaNodes(input.childNodes)»
250 def private static writeRpcOutput(ContainerSchemaNode output) {
256 «IF !output.childNodes.nullOrEmpty»
257 «writeDataSchemaNodes(output.childNodes)»
263 def private static writeNotifications(Set<NotificationDefinition> notifications) {
265 «FOR notification : notifications»
266 «IF notification !== null»
267 «writeNotification(notification)»
273 def private static writeNotification(NotificationDefinition notification) {
274 var boolean isStatusDeprecated = notification.status == Status::DEPRECATED
276 notification «notification.QName.localName» {
277 «IF notification.description.present»
279 "«notification.description.get»";
281 «IF !notification.childNodes.nullOrEmpty»
282 «writeDataSchemaNodes(notification.childNodes)»
284 «IF !notification.availableAugmentations.nullOrEmpty»
285 «writeAugments(notification.availableAugmentations)»
287 «IF !notification.groupings.nullOrEmpty»
288 «writeGroupingDefs(notification.groupings)»
290 «IF !notification.uses.nullOrEmpty»
291 «writeUsesNodes(notification.uses)»
293 «IF notification.reference.present»
295 "«notification.reference.get»";
297 «IF isStatusDeprecated»
298 status «notification.status»;
304 def private static writeUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
305 if (unknownSchemaNodes.nullOrEmpty)
309 «FOR unknownSchemaNode : unknownSchemaNodes»
310 «writeUnknownSchemaNode(unknownSchemaNode)»
315 def private static writeUnknownSchemaNode(UnknownSchemaNode unknownSchemaNode) {
319 def private static writeUsesNodes(Set<UsesNode> usesNodes) {
320 if (usesNodes === null) {
325 «FOR usesNode : usesNodes»
326 «IF usesNode !== null»
327 «writeUsesNode(usesNode)»
333 def private static writeUsesNode(UsesNode usesNode) {
334 val hasRefines = !usesNode.refines.empty
337 uses «usesNode.groupingPath.pathFromRoot.head.localName»«IF !hasRefines»;«ELSE» {«ENDIF»
339 «writeRefines(usesNode.refines)»
345 def private static writeRefines(Map<SchemaPath, SchemaNode> refines) {
347 «FOR path : refines.keySet»
348 «val schemaNode = refines.get(path)»
349 «writeRefine(path, schemaNode)»
354 def private static writeRefine(SchemaPath path, SchemaNode schemaNode) {
356 refine «path.pathFromRoot.last» {
357 «IF schemaNode instanceof DataSchemaNode»
358 «writeDataSchemaNode(schemaNode)»
364 def private static writeTypeDefinition(TypeDefinition<?> typeDefinition) {
365 var boolean isStatusDeprecated = typeDefinition.status == Status::DEPRECATED
367 type «typeDefinition.QName.localName»«IF !isStatusDeprecated»;«ELSE» {
368 status «typeDefinition.status»;
374 def private static writeIdentities(Set<IdentitySchemaNode> identities) {
375 if (identities.nullOrEmpty)
378 «FOR identity : identities»
379 «writeIdentity(identity)»
384 def private static writeIdentity(IdentitySchemaNode identity) {
385 if (identity === null)
388 identity «identity.QName.localName» {
389 «FOR baseIdentity : identity.baseIdentities»
390 base "()«baseIdentity»";
392 «IF identity.description.present»
394 "«identity.description.get»";
396 «IF identity.reference.present»
398 "«identity.reference.get»";
400 «IF identity.status !== null»
401 status «identity.status»;
407 def private static writeFeatures(Set<FeatureDefinition> features) {
409 «FOR feature : features»
410 «IF feature !== null»
411 «writeFeature(feature)»
417 def private static writeFeature(FeatureDefinition featureDef) {
419 feature «featureDef.QName.localName» {
420 «IF featureDef.description.present»
422 "«featureDef.description.get»";
424 «IF featureDef.reference.present»
426 "«featureDef.reference.get»";
428 «IF featureDef.status !== null»
429 status «featureDef.status»;
435 def private static writeExtensions(List<ExtensionDefinition> extensions) {
437 «FOR anExtension : extensions»
438 «IF anExtension !== null»
439 «writeExtension(anExtension)»
445 def private static writeExtension(ExtensionDefinition extensionDef) {
447 extension «extensionDef.QName.localName» {
448 «IF extensionDef.description.present»
450 "«extensionDef.description.get»";
452 «IF !extensionDef.argument.nullOrEmpty»
453 argument "«extensionDef.argument»";
455 «IF extensionDef.reference.present»
457 "«extensionDef.reference.get»";
459 «IF extensionDef.status !== null»
460 status «extensionDef.status»;
466 def private static writeDeviations(Set<Deviation> deviations) {
468 «FOR deviation : deviations»
469 «IF deviation !== null»
470 «writeDeviation(deviation)»
476 def private static writeDeviation(Deviation deviation) {
478 deviation «deviation.targetPath» {
479 «IF deviation.reference.present»
481 "«deviation.reference.get»";
483 «FOR dev : deviation.deviates»
484 «IF dev !== null && dev.deviateType !== null»
485 deviation «dev.deviateType.name»;
492 def private static writeAugments(Set<AugmentationSchemaNode> augments) {
494 «FOR augment : augments»
495 «IF augment !== null»
496 «writeAugment(augment)»
502 def private static writeDataSchemaNodes(Collection<DataSchemaNode> dataSchemaNodes) {
504 «FOR schemaNode : dataSchemaNodes»
505 «writeDataSchemaNode(schemaNode)»
510 def private static CharSequence writeGroupingDefs(Set<GroupingDefinition> groupingDefs) {
512 «FOR groupingDef : groupingDefs»
513 «IF groupingDef !== null»
514 «writeGroupingDef(groupingDef)»
520 def private static writeAugment(AugmentationSchemaNode augment) {
522 augment «YangTextTemplate.formatToAugmentPath(augment.targetPath.pathFromRoot)» {
523 «IF augment.whenCondition !== null && !augment.whenCondition.toString.nullOrEmpty»
524 when "«augment.whenCondition.toString»";
526 «IF augment.description.present»
528 "«augment.description.get»";
530 «IF augment.reference.present»
532 "«augment.reference.get»";
534 «IF augment.status !== null»
535 status «augment.status»;
537 «IF !augment.childNodes.nullOrEmpty»
538 «writeDataSchemaNodes(augment.childNodes)»
540 «IF !augment.uses.nullOrEmpty»
541 «writeUsesNodes(augment.uses)»
547 def private static writeGroupingDef(GroupingDefinition groupingDef) {
548 var boolean isStatusDeprecated = groupingDef.status == Status::DEPRECATED
550 grouping «groupingDef.QName.localName» {
551 «IF !groupingDef.groupings.nullOrEmpty»
552 «writeGroupingDefs(groupingDef.groupings)»
554 «IF !groupingDef.childNodes.nullOrEmpty»
555 «writeDataSchemaNodes(groupingDef.childNodes)»
557 «IF isStatusDeprecated»
558 status «groupingDef.status»;
560 «IF !groupingDef.unknownSchemaNodes.nullOrEmpty»
561 «writeUnknownSchemaNodes(groupingDef.unknownSchemaNodes)»
567 def private static writeContSchemaNode(ContainerSchemaNode contSchemaNode) {
568 var boolean isStatusDeprecated = contSchemaNode.status == Status::DEPRECATED
570 container «contSchemaNode.getQName.localName» {
571 «IF !contSchemaNode.childNodes.nullOrEmpty»
572 «writeDataSchemaNodes(contSchemaNode.childNodes)»
574 «IF !contSchemaNode.availableAugmentations.nullOrEmpty»
575 «writeAugments(contSchemaNode.availableAugmentations)»
577 «IF !contSchemaNode.groupings.nullOrEmpty»
578 «writeGroupingDefs(contSchemaNode.groupings)»
580 «IF !contSchemaNode.uses.nullOrEmpty»
581 «writeUsesNodes(contSchemaNode.uses)»
583 «IF isStatusDeprecated»
584 status «contSchemaNode.status»;
586 «IF !contSchemaNode.unknownSchemaNodes.nullOrEmpty»
587 «writeUnknownSchemaNodes(contSchemaNode.unknownSchemaNodes)»
593 def private static writeAnyXmlSchemaNode(AnyXmlSchemaNode anyXmlSchemaNode) {
594 var boolean isStatusDeprecated = anyXmlSchemaNode.status == Status::DEPRECATED
596 anyxml «anyXmlSchemaNode.getQName.localName»«IF !isStatusDeprecated»;«ELSE» {
597 status «anyXmlSchemaNode.status»;
603 def private static writeLeafSchemaNode(LeafSchemaNode leafSchemaNode) {
604 var boolean isStatusDeprecated = leafSchemaNode.status == Status::DEPRECATED
606 leaf «leafSchemaNode.getQName.localName» {
607 type «leafSchemaNode.type.getQName.localName»;
608 «IF isStatusDeprecated»
609 status «leafSchemaNode.status»;
615 def private static writeLeafListSchemaNode(LeafListSchemaNode leafListSchemaNode) {
616 var boolean isStatusDeprecated = leafListSchemaNode.status == Status::DEPRECATED
618 leaf-list «leafListSchemaNode.getQName.localName» {
619 type «leafListSchemaNode.type.getQName.localName»;
620 «IF isStatusDeprecated»
621 status «leafListSchemaNode.status»;
627 def private static writeCaseSchemaNode(CaseSchemaNode choiceCaseNode) {
628 var boolean isStatusDeprecated = choiceCaseNode.status == Status::DEPRECATED
630 case «choiceCaseNode.getQName.localName» {
631 «FOR childNode : choiceCaseNode.childNodes»
632 «writeDataSchemaNode(childNode)»
634 «IF isStatusDeprecated»
635 status «choiceCaseNode.status»;
641 def private static writeChoiceNode(ChoiceSchemaNode choiceNode) {
642 var boolean isStatusDeprecated = choiceNode.status == Status::DEPRECATED
644 choice «choiceNode.getQName.localName» {
645 «FOR child : choiceNode.cases.values»
646 «writeDataSchemaNode(child)»
648 «IF isStatusDeprecated»
649 status «choiceNode.status»;
655 def private static writeListSchemaNode(ListSchemaNode listSchemaNode) {
656 var boolean isStatusDeprecated = listSchemaNode.status == Status::DEPRECATED
659 list «listSchemaNode.getQName.localName» {
660 «IF !listSchemaNode.keyDefinition.empty»
661 key «FOR listKey : listSchemaNode.keyDefinition SEPARATOR " "»"«listKey.localName»"«ENDFOR»;
663 «IF !listSchemaNode.childNodes.nullOrEmpty»
664 «writeDataSchemaNodes(listSchemaNode.childNodes)»
666 «IF !listSchemaNode.availableAugmentations.nullOrEmpty»
667 «writeAugments(listSchemaNode.availableAugmentations)»
669 «IF !listSchemaNode.groupings.nullOrEmpty»
670 «writeGroupingDefs(listSchemaNode.groupings)»
672 «IF !listSchemaNode.uses.nullOrEmpty»
673 «writeUsesNodes(listSchemaNode.uses)»
675 «IF isStatusDeprecated»
676 status «listSchemaNode.status»;
678 «IF !listSchemaNode.unknownSchemaNodes.nullOrEmpty»
679 «writeUnknownSchemaNodes(listSchemaNode.unknownSchemaNodes)»
685 def private static CharSequence writeDataSchemaNode(DataSchemaNode child) {
687 «IF child instanceof ContainerSchemaNode»
688 «writeContSchemaNode(child)»
690 «IF child instanceof AnyXmlSchemaNode»
691 «writeAnyXmlSchemaNode(child)»
693 «IF child instanceof LeafSchemaNode»
694 «writeLeafSchemaNode(child)»
696 «IF child instanceof LeafListSchemaNode»
697 «writeLeafListSchemaNode(child)»
699 «IF child instanceof CaseSchemaNode»
700 «writeCaseSchemaNode(child)»
702 «IF child instanceof ChoiceSchemaNode»
703 «writeChoiceNode(child)»
705 «IF child instanceof ListSchemaNode»
706 «writeListSchemaNode(child)»