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.java.api.generator
10 import java.util.Collection
14 import org.opendaylight.mdsal.binding.model.util.FormattingUtils
15 import org.opendaylight.yangtools.yang.common.Revision
16 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode
17 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode
18 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode
19 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode
20 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode
21 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode
22 import org.opendaylight.yangtools.yang.model.api.Deviation
23 import org.opendaylight.yangtools.yang.model.api.DocumentedNode
24 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition
25 import org.opendaylight.yangtools.yang.model.api.FeatureDefinition
26 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition
27 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode
28 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode
29 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode
30 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode
31 import org.opendaylight.yangtools.yang.model.api.Module
32 import org.opendaylight.yangtools.yang.model.api.ModuleImport
33 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition
34 import org.opendaylight.yangtools.yang.model.api.RpcDefinition
35 import org.opendaylight.yangtools.yang.model.api.SchemaNode
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 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition
42 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair
44 final class YangTemplate {
46 private static val String SKIP_PROPERTY_NAME = "mdsal.skip.verbose"
48 private static val SKIP = Boolean.getBoolean(SKIP_PROPERTY_NAME)
50 private static val SKIPPED_EMPTY = '''(Empty due to «SKIP_PROPERTY_NAME» property = true)'''
52 def static String generateYangSnippet(Module module) {
56 module «module.name» {
57 yang-version «module.yangVersion»;
58 namespace "«module.QNameModule.namespace.toString»";
59 prefix "«module.prefix»";
61 «IF !module.imports.nullOrEmpty»
62 «writeModuleImports(module.imports)»
64 «IF module.revision.present»
65 «writeRevision(module.revision.get, module.description.orElse(null))»
67 «IF !module.childNodes.nullOrEmpty»
69 «writeDataSchemaNodes(module.childNodes)»
71 «IF !module.groupings.nullOrEmpty»
73 «writeGroupingDefs(module.groupings)»
75 «IF !module.augmentations.nullOrEmpty»
77 «writeAugments(module.augmentations)»
79 «IF !module.deviations.nullOrEmpty»
81 «writeDeviations(module.deviations)»
83 «IF !module.extensionSchemaNodes.nullOrEmpty»
85 «writeExtensions(module.extensionSchemaNodes)»
87 «IF !module.features.nullOrEmpty»
89 «writeFeatures(module.features)»
91 «IF !module.identities.nullOrEmpty»
93 «writeIdentities(module.identities)»
95 «IF !module.notifications.nullOrEmpty»
97 «writeNotifications(module.notifications)»
99 «IF !module.rpcs.nullOrEmpty»
101 «writeRPCs(module.rpcs)»
103 «IF !module.unknownSchemaNodes.nullOrEmpty»
105 «writeUnknownSchemaNodes(module.unknownSchemaNodes)»
107 «IF !module.uses.nullOrEmpty»
109 «writeUsesNodes(module.uses)»
115 def static String generateYangSnippet(DocumentedNode schemaNode) {
116 if (schemaNode === null)
118 if (schemaNode instanceof Module)
119 return generateYangSnippet(schemaNode)
123 «IF schemaNode instanceof DataSchemaNode»
124 «writeDataSchemaNode(schemaNode)»
126 «IF schemaNode instanceof EnumTypeDefinition.EnumPair»
127 «writeEnumPair(schemaNode)»
129 «IF schemaNode instanceof ExtensionDefinition»
130 «writeExtension(schemaNode)»
132 «IF schemaNode instanceof FeatureDefinition»
133 «writeFeature(schemaNode)»
135 «IF schemaNode instanceof GroupingDefinition»
136 «writeGroupingDef(schemaNode)»
138 «IF schemaNode instanceof IdentitySchemaNode»
139 «writeIdentity(schemaNode)»
141 «IF schemaNode instanceof NotificationDefinition»
142 «writeNotification(schemaNode)»
144 «IF schemaNode instanceof RpcDefinition»
145 «writeRPC(schemaNode)»
147 «IF schemaNode instanceof TypeDefinition<?>»
148 «writeTypeDefinition(schemaNode)»
150 «IF schemaNode instanceof UnknownSchemaNode»
151 «writeUnknownSchemaNode(schemaNode)»
156 def private static writeEnumPair(EnumPair pair) {
164 def private static String writeModuleImports(Set<ModuleImport> moduleImports) {
165 if (moduleImports.nullOrEmpty)
169 «FOR moduleImport : moduleImports SEPARATOR "\n"»
170 «IF moduleImport !== null && !moduleImport.moduleName.nullOrEmpty»
171 import «moduleImport.moduleName» { prefix "«moduleImport.prefix»"; }
177 def private static writeRevision(Revision moduleRevision, String moduleDescription) {
178 val revisionIndent = 12
181 revision «moduleRevision.toString» {
182 description "«FormattingUtils.formatToParagraph(moduleDescription, revisionIndent)»";
187 def private static writeRPCs(Set<RpcDefinition> rpcDefs) {
197 def private static writeRPC(RpcDefinition rpc) {
198 var boolean isStatusDeprecated = rpc.status == Status::DEPRECATED
200 rpc «rpc.QName.localName» {
201 «IF rpc.description.present»
202 "«rpc.description.get»";
204 «IF !rpc.groupings.nullOrEmpty»
205 «writeGroupingDefs(rpc.groupings)»
207 «IF rpc.input !== null»
208 «writeRpcInput(rpc.input)»
210 «IF rpc.output !== null»
211 «writeRpcOutput(rpc.output)»
213 «IF rpc.reference.present»
215 "«rpc.reference.get»";
217 «IF isStatusDeprecated»
224 def private static writeRpcInput(ContainerSchemaNode input) {
230 «IF !input.childNodes.nullOrEmpty»
231 «writeDataSchemaNodes(input.childNodes)»
238 def private static writeRpcOutput(ContainerSchemaNode output) {
244 «IF !output.childNodes.nullOrEmpty»
245 «writeDataSchemaNodes(output.childNodes)»
251 def private static writeNotifications(Set<NotificationDefinition> notifications) {
253 «FOR notification : notifications»
254 «IF notification !== null»
255 «writeNotification(notification)»
261 def private static writeNotification(NotificationDefinition notification) {
262 var boolean isStatusDeprecated = notification.status == Status::DEPRECATED
264 notification «notification.QName.localName» {
265 «IF notification.description.present»
267 "«notification.description.get»";
269 «IF !notification.childNodes.nullOrEmpty»
270 «writeDataSchemaNodes(notification.childNodes)»
272 «IF !notification.availableAugmentations.nullOrEmpty»
273 «writeAugments(notification.availableAugmentations)»
275 «IF !notification.groupings.nullOrEmpty»
276 «writeGroupingDefs(notification.groupings)»
278 «IF !notification.uses.nullOrEmpty»
279 «writeUsesNodes(notification.uses)»
281 «IF notification.reference.present»
283 "«notification.reference.get»";
285 «IF isStatusDeprecated»
286 status «notification.status»;
292 def private static writeUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
293 if (unknownSchemaNodes.nullOrEmpty)
297 «FOR unknownSchemaNode : unknownSchemaNodes»
298 «writeUnknownSchemaNode(unknownSchemaNode)»
303 def private static writeUnknownSchemaNode(UnknownSchemaNode unknownSchemaNode) {
307 def private static writeUsesNodes(Set<UsesNode> usesNodes) {
308 if (usesNodes === null) {
313 «FOR usesNode : usesNodes»
314 «IF usesNode !== null»
315 «writeUsesNode(usesNode)»
321 def private static writeUsesNode(UsesNode usesNode) {
322 val hasRefines = !usesNode.refines.empty
325 uses «usesNode.groupingPath.pathFromRoot.head.localName»«IF !hasRefines»;«ELSE» {«ENDIF»
327 «writeRefines(usesNode.refines)»
333 def private static writeRefines(Map<SchemaPath, SchemaNode> refines) {
335 «FOR path : refines.keySet»
336 «val schemaNode = refines.get(path)»
337 «writeRefine(path, schemaNode)»
342 def private static writeRefine(SchemaPath path, SchemaNode schemaNode) {
344 refine «path.pathFromRoot.last» {
345 «IF schemaNode instanceof DataSchemaNode»
346 «writeDataSchemaNode(schemaNode)»
352 def private static writeTypeDefinition(TypeDefinition<?> typeDefinition) {
353 var boolean isStatusDeprecated = typeDefinition.status == Status::DEPRECATED
355 type «typeDefinition.QName.localName»«IF !isStatusDeprecated»;«ELSE» {
356 status «typeDefinition.status»;
362 def private static writeIdentities(Set<IdentitySchemaNode> identities) {
363 if (identities.nullOrEmpty)
366 «FOR identity : identities»
367 «writeIdentity(identity)»
372 def private static writeIdentity(IdentitySchemaNode identity) {
373 if (identity === null)
376 identity «identity.QName.localName» {
377 «FOR baseIdentity : identity.baseIdentities»
378 base "()«baseIdentity»";
380 «IF identity.description.present»
382 "«identity.description.get»";
384 «IF identity.reference.present»
386 "«identity.reference.get»";
388 «IF identity.status !== null»
389 status «identity.status»;
395 def private static writeFeatures(Set<FeatureDefinition> features) {
397 «FOR feature : features»
398 «IF feature !== null»
399 «writeFeature(feature)»
405 def private static writeFeature(FeatureDefinition featureDef) {
407 feature «featureDef.QName.localName» {
408 «IF featureDef.description.present»
410 "«featureDef.description.get»";
412 «IF featureDef.reference.present»
414 "«featureDef.reference.get»";
416 «IF featureDef.status !== null»
417 status «featureDef.status»;
423 def private static writeExtensions(List<ExtensionDefinition> extensions) {
425 «FOR anExtension : extensions»
426 «IF anExtension !== null»
427 «writeExtension(anExtension)»
433 def private static writeExtension(ExtensionDefinition extensionDef) {
435 extension «extensionDef.QName.localName» {
436 «IF extensionDef.description.present»
438 "«extensionDef.description.get»";
440 «IF !extensionDef.argument.nullOrEmpty»
441 argument "«extensionDef.argument»";
443 «IF extensionDef.reference.present»
445 "«extensionDef.reference.get»";
447 «IF extensionDef.status !== null»
448 status «extensionDef.status»;
454 def private static writeDeviations(Set<Deviation> deviations) {
456 «FOR deviation : deviations»
457 «IF deviation !== null»
458 «writeDeviation(deviation)»
464 def private static writeDeviation(Deviation deviation) {
466 deviation «deviation.targetPath» {
467 «IF deviation.reference.present»
469 "«deviation.reference.get»";
471 «FOR dev : deviation.deviates»
472 «IF dev !== null && dev.deviateType !== null»
473 deviation «dev.deviateType.name»;
480 def private static writeAugments(Set<AugmentationSchemaNode> augments) {
482 «FOR augment : augments»
483 «IF augment !== null»
484 «writeAugment(augment)»
490 def private static writeDataSchemaNodes(Collection<DataSchemaNode> dataSchemaNodes) {
492 «FOR schemaNode : dataSchemaNodes»
493 «writeDataSchemaNode(schemaNode)»
498 def private static CharSequence writeGroupingDefs(Set<GroupingDefinition> groupingDefs) {
500 «FOR groupingDef : groupingDefs»
501 «IF groupingDef !== null»
502 «writeGroupingDef(groupingDef)»
508 def private static writeAugment(AugmentationSchemaNode augment) {
510 augment «FormattingUtils.formatToAugmentPath(augment.targetPath.pathFromRoot)» {
511 «IF augment.whenCondition !== null && !augment.whenCondition.toString.nullOrEmpty»
512 when "«augment.whenCondition.toString»";
514 «IF augment.description.present»
516 "«augment.description.get»";
518 «IF augment.reference.present»
520 "«augment.reference.get»";
522 «IF augment.status !== null»
523 status «augment.status»;
525 «IF !augment.childNodes.nullOrEmpty»
526 «writeDataSchemaNodes(augment.childNodes)»
528 «IF !augment.uses.nullOrEmpty»
529 «writeUsesNodes(augment.uses)»
535 def private static writeGroupingDef(GroupingDefinition groupingDef) {
536 var boolean isStatusDeprecated = groupingDef.status == Status::DEPRECATED
538 grouping «groupingDef.QName.localName» {
539 «IF !groupingDef.groupings.nullOrEmpty»
540 «writeGroupingDefs(groupingDef.groupings)»
542 «IF !groupingDef.childNodes.nullOrEmpty»
543 «writeDataSchemaNodes(groupingDef.childNodes)»
545 «IF isStatusDeprecated»
546 status «groupingDef.status»;
548 «IF !groupingDef.unknownSchemaNodes.nullOrEmpty»
549 «writeUnknownSchemaNodes(groupingDef.unknownSchemaNodes)»
555 def private static writeContSchemaNode(ContainerSchemaNode contSchemaNode) {
556 var boolean isStatusDeprecated = contSchemaNode.status == Status::DEPRECATED
558 container «contSchemaNode.getQName.localName» {
559 «IF !contSchemaNode.childNodes.nullOrEmpty»
560 «writeDataSchemaNodes(contSchemaNode.childNodes)»
562 «IF !contSchemaNode.availableAugmentations.nullOrEmpty»
563 «writeAugments(contSchemaNode.availableAugmentations)»
565 «IF !contSchemaNode.groupings.nullOrEmpty»
566 «writeGroupingDefs(contSchemaNode.groupings)»
568 «IF !contSchemaNode.uses.nullOrEmpty»
569 «writeUsesNodes(contSchemaNode.uses)»
571 «IF isStatusDeprecated»
572 status «contSchemaNode.status»;
574 «IF !contSchemaNode.unknownSchemaNodes.nullOrEmpty»
575 «writeUnknownSchemaNodes(contSchemaNode.unknownSchemaNodes)»
581 def private static writeAnyXmlSchemaNode(AnyXmlSchemaNode anyXmlSchemaNode) {
582 var boolean isStatusDeprecated = anyXmlSchemaNode.status == Status::DEPRECATED
584 anyxml «anyXmlSchemaNode.getQName.localName»«IF !isStatusDeprecated»;«ELSE» {
585 status «anyXmlSchemaNode.status»;
591 def private static writeLeafSchemaNode(LeafSchemaNode leafSchemaNode) {
592 var boolean isStatusDeprecated = leafSchemaNode.status == Status::DEPRECATED
594 leaf «leafSchemaNode.getQName.localName» {
595 type «leafSchemaNode.type.getQName.localName»;
596 «IF isStatusDeprecated»
597 status «leafSchemaNode.status»;
603 def private static writeLeafListSchemaNode(LeafListSchemaNode leafListSchemaNode) {
604 var boolean isStatusDeprecated = leafListSchemaNode.status == Status::DEPRECATED
606 leaf-list «leafListSchemaNode.getQName.localName» {
607 type «leafListSchemaNode.type.getQName.localName»;
608 «IF isStatusDeprecated»
609 status «leafListSchemaNode.status»;
615 def private static writeCaseSchemaNode(CaseSchemaNode choiceCaseNode) {
616 var boolean isStatusDeprecated = choiceCaseNode.status == Status::DEPRECATED
618 case «choiceCaseNode.getQName.localName» {
619 «FOR childNode : choiceCaseNode.childNodes»
620 «writeDataSchemaNode(childNode)»
622 «IF isStatusDeprecated»
623 status «choiceCaseNode.status»;
629 def private static writeChoiceNode(ChoiceSchemaNode choiceNode) {
630 var boolean isStatusDeprecated = choiceNode.status == Status::DEPRECATED
632 choice «choiceNode.getQName.localName» {
633 «FOR child : choiceNode.cases.values»
634 «writeDataSchemaNode(child)»
636 «IF isStatusDeprecated»
637 status «choiceNode.status»;
643 def private static writeListSchemaNode(ListSchemaNode listSchemaNode) {
644 var boolean isStatusDeprecated = listSchemaNode.status == Status::DEPRECATED
647 list «listSchemaNode.getQName.localName» {
648 «IF !listSchemaNode.keyDefinition.empty»
649 key «FOR listKey : listSchemaNode.keyDefinition SEPARATOR " "»"«listKey.localName»"«ENDFOR»;
651 «IF !listSchemaNode.childNodes.nullOrEmpty»
652 «writeDataSchemaNodes(listSchemaNode.childNodes)»
654 «IF !listSchemaNode.availableAugmentations.nullOrEmpty»
655 «writeAugments(listSchemaNode.availableAugmentations)»
657 «IF !listSchemaNode.groupings.nullOrEmpty»
658 «writeGroupingDefs(listSchemaNode.groupings)»
660 «IF !listSchemaNode.uses.nullOrEmpty»
661 «writeUsesNodes(listSchemaNode.uses)»
663 «IF isStatusDeprecated»
664 status «listSchemaNode.status»;
666 «IF !listSchemaNode.unknownSchemaNodes.nullOrEmpty»
667 «writeUnknownSchemaNodes(listSchemaNode.unknownSchemaNodes)»
673 def private static CharSequence writeDataSchemaNode(DataSchemaNode child) {
675 «IF child instanceof ContainerSchemaNode»
676 «writeContSchemaNode(child)»
678 «IF child instanceof AnyXmlSchemaNode»
679 «writeAnyXmlSchemaNode(child)»
681 «IF child instanceof LeafSchemaNode»
682 «writeLeafSchemaNode(child)»
684 «IF child instanceof LeafListSchemaNode»
685 «writeLeafListSchemaNode(child)»
687 «IF child instanceof CaseSchemaNode»
688 «writeCaseSchemaNode(child)»
690 «IF child instanceof ChoiceSchemaNode»
691 «writeChoiceNode(child)»
693 «IF child instanceof ListSchemaNode»
694 «writeListSchemaNode(child)»