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.yangtools.sal.binding.generator.impl
10 import java.util.Collection
15 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil
16 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode
17 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema
18 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode
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.ExtensionDefinition
24 import org.opendaylight.yangtools.yang.model.api.FeatureDefinition
25 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition
26 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode
27 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode
28 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode
29 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode
30 import org.opendaylight.yangtools.yang.model.api.Module
31 import org.opendaylight.yangtools.yang.model.api.ModuleImport
32 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition
33 import org.opendaylight.yangtools.yang.model.api.RpcDefinition
34 import org.opendaylight.yangtools.yang.model.api.SchemaNode
35 import org.opendaylight.yangtools.yang.model.api.SchemaPath
36 import org.opendaylight.yangtools.yang.model.api.Status
37 import org.opendaylight.yangtools.yang.model.api.TypeDefinition
38 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode
39 import org.opendaylight.yangtools.yang.model.api.UsesNode
40 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition
41 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair
45 def static String generateYangSnipet(SchemaNode schemaNode) {
46 if (schemaNode == null)
50 «IF schemaNode instanceof DataSchemaNode»
51 «writeDataSchemaNode(schemaNode)»
53 «IF schemaNode instanceof EnumTypeDefinition.EnumPair»
54 «writeEnumPair(schemaNode)»
56 «IF schemaNode instanceof ExtensionDefinition»
57 «writeExtension(schemaNode)»
59 «IF schemaNode instanceof FeatureDefinition»
60 «writeFeature(schemaNode)»
62 «IF schemaNode instanceof GroupingDefinition»
63 «writeGroupingDef(schemaNode)»
65 «IF schemaNode instanceof IdentitySchemaNode»
66 «writeIdentity(schemaNode)»
68 «IF schemaNode instanceof NotificationDefinition»
69 «writeNotification(schemaNode)»
71 «IF schemaNode instanceof RpcDefinition»
72 «writeRPC(schemaNode)»
74 «IF schemaNode instanceof TypeDefinition<?>»
75 «writeTypeDefinition(schemaNode)»
77 «IF schemaNode instanceof UnknownSchemaNode»
78 «writeUnknownSchemaNode(schemaNode)»
83 def static String generateYangSnipet(Set<? extends SchemaNode> nodes) {
84 if (nodes.nullOrEmpty)
89 «IF node instanceof NotificationDefinition»
90 «writeNotification(node)»
91 «ELSEIF node instanceof RpcDefinition»
92 «writeRPC(node as RpcDefinition)»
98 def private static writeEnumPair(EnumPair pair) {
106 def private static String writeModuleImports(Set<ModuleImport> moduleImports) {
107 if (moduleImports.nullOrEmpty)
111 «FOR moduleImport : moduleImports SEPARATOR "\n"»
112 «IF moduleImport != null && !moduleImport.moduleName.nullOrEmpty»
113 import «moduleImport.moduleName» { prefix "«moduleImport.prefix»"; }
119 def private static writeRevision(Date moduleRevision, String moduleDescription) {
120 val revisionIndent = 12
123 revision «SimpleDateFormatUtil.getRevisionFormat.format(moduleRevision)» {
124 description "«YangTextTemplate.formatToParagraph(moduleDescription, revisionIndent)»";
129 def static String generateYangSnipet(Module module) {
132 module «module.name» {
133 yang-version «module.yangVersion»;
134 namespace "«module.QNameModule.namespace.toString»";
135 prefix "«module.prefix»";
137 «IF !module.imports.nullOrEmpty»
138 «writeModuleImports(module.imports)»
140 «IF module.revision != null»
141 «writeRevision(module.revision, module.description)»
143 «IF !module.childNodes.nullOrEmpty»
145 «writeDataSchemaNodes(module.childNodes)»
147 «IF !module.groupings.nullOrEmpty»
149 «writeGroupingDefs(module.groupings)»
151 «IF !module.augmentations.nullOrEmpty»
153 «writeAugments(module.augmentations)»
155 «IF !module.deviations.nullOrEmpty»
157 «writeDeviations(module.deviations)»
159 «IF !module.extensionSchemaNodes.nullOrEmpty»
161 «writeExtensions(module.extensionSchemaNodes)»
163 «IF !module.features.nullOrEmpty»
165 «writeFeatures(module.features)»
167 «IF !module.identities.nullOrEmpty»
169 «writeIdentities(module.identities)»
171 «IF !module.notifications.nullOrEmpty»
173 «writeNotifications(module.notifications)»
175 «IF !module.rpcs.nullOrEmpty»
177 «writeRPCs(module.rpcs)»
179 «IF !module.unknownSchemaNodes.nullOrEmpty»
181 «writeUnknownSchemaNodes(module.unknownSchemaNodes)»
183 «IF !module.uses.nullOrEmpty»
185 «writeUsesNodes(module.uses)»
191 def private static writeRPCs(Set<RpcDefinition> rpcDefs) {
201 def private static writeRPC(RpcDefinition rpc) {
202 var boolean isStatusDeprecated = rpc.status == Status::DEPRECATED
204 rpc «rpc.QName.localName» {
205 «IF !rpc.description.nullOrEmpty»
208 «IF !rpc.groupings.nullOrEmpty»
209 «writeGroupingDefs(rpc.groupings)»
211 «IF rpc.input != null»
212 «writeRpcInput(rpc.input)»
214 «IF rpc.output != null»
215 «writeRpcOutput(rpc.output)»
217 «IF !rpc.reference.nullOrEmpty»
221 «IF isStatusDeprecated»
228 def private static writeRpcInput(ContainerSchemaNode input) {
234 «IF !input.childNodes.nullOrEmpty»
235 «writeDataSchemaNodes(input.childNodes)»
242 def private static writeRpcOutput(ContainerSchemaNode output) {
248 «IF !output.childNodes.nullOrEmpty»
249 «writeDataSchemaNodes(output.childNodes)»
255 def private static writeNotifications(Set<NotificationDefinition> notifications) {
257 «FOR notification : notifications»
258 «IF notification != null»
259 «writeNotification(notification)»
265 def private static writeNotification(NotificationDefinition notification) {
266 var boolean isStatusDeprecated = notification.status == Status::DEPRECATED
268 notification «notification.QName.localName» {
269 «IF !notification.description.nullOrEmpty»
271 "«notification.description»";
273 «IF !notification.childNodes.nullOrEmpty»
274 «writeDataSchemaNodes(notification.childNodes)»
276 «IF !notification.availableAugmentations.nullOrEmpty»
277 «writeAugments(notification.availableAugmentations)»
279 «IF !notification.groupings.nullOrEmpty»
280 «writeGroupingDefs(notification.groupings)»
282 «IF !notification.uses.nullOrEmpty»
283 «writeUsesNodes(notification.uses)»
285 «IF !notification.reference.nullOrEmpty»
287 "«notification.reference»";
289 «IF isStatusDeprecated»
290 status «notification.status»;
296 def private static writeUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
297 if (unknownSchemaNodes.nullOrEmpty)
301 «FOR unknownSchemaNode : unknownSchemaNodes»
302 «writeUnknownSchemaNode(unknownSchemaNode)»
307 def private static writeUnknownSchemaNode(UnknownSchemaNode unknownSchemaNode) {
311 def private static writeUsesNodes(Set<UsesNode> usesNodes) {
312 if (usesNodes == null) {
317 «FOR usesNode : usesNodes»
318 «IF usesNode != null»
319 «writeUsesNode(usesNode)»
325 def private static writeUsesNode(UsesNode usesNode) {
326 val hasRefines = !usesNode.refines.empty
329 uses «usesNode.groupingPath.pathFromRoot.head.localName»«IF !hasRefines»;«ELSE» {«ENDIF»
331 «writeRefines(usesNode.refines)»
337 def private static writeRefines(Map<SchemaPath, SchemaNode> refines) {
339 «FOR path : refines.keySet»
340 «val schemaNode = refines.get(path)»
341 «writeRefine(path, schemaNode)»
346 def private static writeRefine(SchemaPath path, SchemaNode schemaNode) {
348 refine «path.pathFromRoot.last» {
349 «IF schemaNode instanceof DataSchemaNode»
350 «writeDataSchemaNode(schemaNode)»
356 def private static writeTypeDefinition(TypeDefinition<?> typeDefinition) {
357 var boolean isStatusDeprecated = typeDefinition.status == Status::DEPRECATED
359 type «typeDefinition.QName.localName»«IF !isStatusDeprecated»;«ELSE» {
360 status «typeDefinition.status»;
366 def private static writeIdentities(Set<IdentitySchemaNode> identities) {
367 if (identities.nullOrEmpty)
370 «FOR identity : identities»
371 «writeIdentity(identity)»
376 def private static writeIdentity(IdentitySchemaNode identity) {
377 if (identity == null)
380 identity «identity.QName.localName» {
381 «IF identity.baseIdentity != null»
382 base "()«identity.baseIdentity»";
384 «IF !identity.description.nullOrEmpty»
386 "«identity.description»";
388 «IF !identity.reference.nullOrEmpty»
390 "«identity.reference»";
392 «IF identity.status != null»
393 status «identity.status»;
399 def private static writeFeatures(Set<FeatureDefinition> features) {
401 «FOR feature : features»
403 «writeFeature(feature)»
409 def private static writeFeature(FeatureDefinition featureDef) {
411 feature «featureDef.QName.localName» {
412 «IF !featureDef.description.nullOrEmpty»
414 "«featureDef.description»";
416 «IF !featureDef.reference.nullOrEmpty»
418 "«featureDef.reference»";
420 «IF featureDef.status != null»
421 status «featureDef.status»;
427 def private static writeExtensions(List<ExtensionDefinition> extensions) {
429 «FOR anExtension : extensions»
430 «IF anExtension != null»
431 «writeExtension(anExtension)»
437 def private static writeExtension(ExtensionDefinition extensionDef) {
439 extension «extensionDef.QName.localName» {
440 «IF !extensionDef.description.nullOrEmpty»
442 "«extensionDef.description»";
444 «IF !extensionDef.argument.nullOrEmpty»
445 argument "«extensionDef.argument»";
447 «IF !extensionDef.reference.nullOrEmpty»
449 "«extensionDef.reference»";
451 «IF extensionDef.status != null»
452 status «extensionDef.status»;
458 def private static writeDeviations(Set<Deviation> deviations) {
460 «FOR deviation : deviations»
461 «IF deviation != null»
462 «writeDeviation(deviation)»
468 def private static writeDeviation(Deviation deviation) {
470 deviation «deviation.targetPath» {
471 «IF !deviation.reference.nullOrEmpty»
473 "«deviation.reference»";
475 «FOR dev : deviation.deviates»
476 «IF dev != null && dev.deviateType != null»
477 deviation «dev.deviateType.name»;
484 def private static writeAugments(Set<AugmentationSchema> augments) {
486 «FOR augment : augments»
488 «writeAugment(augment)»
494 def private static writeDataSchemaNodes(Collection<DataSchemaNode> dataSchemaNodes) {
496 «FOR schemaNode : dataSchemaNodes»
497 «writeDataSchemaNode(schemaNode)»
502 def private static CharSequence writeGroupingDefs(Set<GroupingDefinition> groupingDefs) {
504 «FOR groupingDef : groupingDefs»
505 «IF groupingDef != null»
506 «writeGroupingDef(groupingDef)»
512 def private static writeAugment(AugmentationSchema augment) {
514 augment «YangTextTemplate.formatToAugmentPath(augment.targetPath.pathFromRoot)» {
515 «IF augment.whenCondition != null && !augment.whenCondition.toString.nullOrEmpty»
516 when "«augment.whenCondition.toString»";
518 «IF !augment.description.nullOrEmpty»
520 "«augment.description»";
522 «IF !augment.reference.nullOrEmpty»
524 "«augment.reference»";
526 «IF augment.status != null»
527 status «augment.status»;
529 «IF !augment.childNodes.nullOrEmpty»
530 «writeDataSchemaNodes(augment.childNodes)»
532 «IF !augment.uses.nullOrEmpty»
533 «writeUsesNodes(augment.uses)»
539 def private static writeGroupingDef(GroupingDefinition groupingDef) {
540 var boolean isStatusDeprecated = groupingDef.status == Status::DEPRECATED
542 grouping «groupingDef.QName.localName» {
543 «IF !groupingDef.groupings.nullOrEmpty»
544 «writeGroupingDefs(groupingDef.groupings)»
546 «IF !groupingDef.childNodes.nullOrEmpty»
547 «writeDataSchemaNodes(groupingDef.childNodes)»
549 «IF isStatusDeprecated»
550 status «groupingDef.status»;
552 «IF !groupingDef.unknownSchemaNodes.nullOrEmpty»
553 «writeUnknownSchemaNodes(groupingDef.unknownSchemaNodes)»
559 def private static writeContSchemaNode(ContainerSchemaNode contSchemaNode) {
560 var boolean isStatusDeprecated = contSchemaNode.status == Status::DEPRECATED
562 container «contSchemaNode.getQName.localName» {
563 «IF !contSchemaNode.childNodes.nullOrEmpty»
564 «writeDataSchemaNodes(contSchemaNode.childNodes)»
566 «IF !contSchemaNode.availableAugmentations.nullOrEmpty»
567 «writeAugments(contSchemaNode.availableAugmentations)»
569 «IF !contSchemaNode.groupings.nullOrEmpty»
570 «writeGroupingDefs(contSchemaNode.groupings)»
572 «IF !contSchemaNode.uses.nullOrEmpty»
573 «writeUsesNodes(contSchemaNode.uses)»
575 «IF isStatusDeprecated»
576 status «contSchemaNode.status»;
578 «IF !contSchemaNode.unknownSchemaNodes.nullOrEmpty»
579 «writeUnknownSchemaNodes(contSchemaNode.unknownSchemaNodes)»
585 def private static writeAnyXmlSchemaNode(AnyXmlSchemaNode anyXmlSchemaNode) {
586 var boolean isStatusDeprecated = anyXmlSchemaNode.status == Status::DEPRECATED
588 anyxml «anyXmlSchemaNode.getQName.localName»«IF !isStatusDeprecated»;«ELSE» {
589 status «anyXmlSchemaNode.status»;
595 def private static writeLeafSchemaNode(LeafSchemaNode leafSchemaNode) {
596 var boolean isStatusDeprecated = leafSchemaNode.status == Status::DEPRECATED
598 leaf «leafSchemaNode.getQName.localName» {
599 type «leafSchemaNode.type.getQName.localName»;
600 «IF isStatusDeprecated»
601 status «leafSchemaNode.status»;
607 def private static writeLeafListSchemaNode(LeafListSchemaNode leafListSchemaNode) {
608 var boolean isStatusDeprecated = leafListSchemaNode.status == Status::DEPRECATED
610 leaf-list «leafListSchemaNode.getQName.localName» {
611 type «leafListSchemaNode.type.getQName.localName»;
612 «IF isStatusDeprecated»
613 status «leafListSchemaNode.status»;
619 def private static writeChoiceCaseNode(ChoiceCaseNode choiceCaseNode) {
620 var boolean isStatusDeprecated = choiceCaseNode.status == Status::DEPRECATED
622 case «choiceCaseNode.getQName.localName» {
623 «FOR childNode : choiceCaseNode.childNodes»
624 «writeDataSchemaNode(childNode)»
626 «IF isStatusDeprecated»
627 status «choiceCaseNode.status»;
633 def private static writeChoiceNode(ChoiceSchemaNode choiceNode) {
634 var boolean isStatusDeprecated = choiceNode.status == Status::DEPRECATED
636 choice «choiceNode.getQName.localName» {
637 «FOR child : choiceNode.cases»
638 «writeDataSchemaNode(child)»
640 «IF isStatusDeprecated»
641 status «choiceNode.status»;
647 def private static writeListSchemaNode(ListSchemaNode listSchemaNode) {
648 var boolean isStatusDeprecated = listSchemaNode.status == Status::DEPRECATED
651 list «listSchemaNode.getQName.localName» {
652 key «FOR listKey : listSchemaNode.keyDefinition SEPARATOR " "»"«listKey.localName»"
654 «IF !listSchemaNode.childNodes.nullOrEmpty»
655 «writeDataSchemaNodes(listSchemaNode.childNodes)»
657 «IF !listSchemaNode.availableAugmentations.nullOrEmpty»
658 «writeAugments(listSchemaNode.availableAugmentations)»
660 «IF !listSchemaNode.groupings.nullOrEmpty»
661 «writeGroupingDefs(listSchemaNode.groupings)»
663 «IF !listSchemaNode.uses.nullOrEmpty»
664 «writeUsesNodes(listSchemaNode.uses)»
666 «IF isStatusDeprecated»
667 status «listSchemaNode.status»;
669 «IF !listSchemaNode.unknownSchemaNodes.nullOrEmpty»
670 «writeUnknownSchemaNodes(listSchemaNode.unknownSchemaNodes)»
676 def private static CharSequence writeDataSchemaNode(DataSchemaNode child) {
678 «IF child instanceof ContainerSchemaNode»
679 «writeContSchemaNode(child)»
681 «IF child instanceof AnyXmlSchemaNode»
682 «writeAnyXmlSchemaNode(child)»
684 «IF child instanceof LeafSchemaNode»
685 «writeLeafSchemaNode(child)»
687 «IF child instanceof LeafListSchemaNode»
688 «writeLeafListSchemaNode(child)»
690 «IF child instanceof ChoiceCaseNode»
691 «writeChoiceCaseNode(child)»
693 «IF child instanceof ChoiceSchemaNode»
694 «writeChoiceNode(child)»
696 «IF child instanceof ListSchemaNode»
697 «writeListSchemaNode(child)»