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 private static val String SKIP_PROPERTY_NAME = "mdsal.skip.verbose"
47 private static val SKIP = Boolean.getBoolean(SKIP_PROPERTY_NAME);
49 def static String generateYangSnipet(SchemaNode schemaNode) {
50 if (schemaNode == null)
53 return '''(Empty due to «SKIP_PROPERTY_NAME» property = true)'''
55 «IF schemaNode instanceof DataSchemaNode»
56 «writeDataSchemaNode(schemaNode)»
58 «IF schemaNode instanceof EnumTypeDefinition.EnumPair»
59 «writeEnumPair(schemaNode)»
61 «IF schemaNode instanceof ExtensionDefinition»
62 «writeExtension(schemaNode)»
64 «IF schemaNode instanceof FeatureDefinition»
65 «writeFeature(schemaNode)»
67 «IF schemaNode instanceof GroupingDefinition»
68 «writeGroupingDef(schemaNode)»
70 «IF schemaNode instanceof IdentitySchemaNode»
71 «writeIdentity(schemaNode)»
73 «IF schemaNode instanceof NotificationDefinition»
74 «writeNotification(schemaNode)»
76 «IF schemaNode instanceof RpcDefinition»
77 «writeRPC(schemaNode)»
79 «IF schemaNode instanceof TypeDefinition<?>»
80 «writeTypeDefinition(schemaNode)»
82 «IF schemaNode instanceof UnknownSchemaNode»
83 «writeUnknownSchemaNode(schemaNode)»
88 def static String generateYangSnipet(Set<? extends SchemaNode> nodes) {
89 if (nodes.nullOrEmpty)
92 return '''(Empty due to «SKIP_PROPERTY_NAME» property = true)'''
95 «IF node instanceof NotificationDefinition»
96 «writeNotification(node)»
97 «ELSEIF node instanceof RpcDefinition»
98 «writeRPC(node as RpcDefinition)»
104 def private static writeEnumPair(EnumPair pair) {
112 def private static String writeModuleImports(Set<ModuleImport> moduleImports) {
113 if (moduleImports.nullOrEmpty)
117 «FOR moduleImport : moduleImports SEPARATOR "\n"»
118 «IF moduleImport != null && !moduleImport.moduleName.nullOrEmpty»
119 import «moduleImport.moduleName» { prefix "«moduleImport.prefix»"; }
125 def private static writeRevision(Date moduleRevision, String moduleDescription) {
126 val revisionIndent = 12
129 revision «SimpleDateFormatUtil.getRevisionFormat.format(moduleRevision)» {
130 description "«YangTextTemplate.formatToParagraph(moduleDescription, revisionIndent)»";
135 def static String generateYangSnipet(Module module) {
137 return '''(Empty due to «SKIP_PROPERTY_NAME» property = true)'''
139 module «module.name» {
140 yang-version «module.yangVersion»;
141 namespace "«module.QNameModule.namespace.toString»";
142 prefix "«module.prefix»";
144 «IF !module.imports.nullOrEmpty»
145 «writeModuleImports(module.imports)»
147 «IF module.revision != null»
148 «writeRevision(module.revision, module.description)»
150 «IF !module.childNodes.nullOrEmpty»
152 «writeDataSchemaNodes(module.childNodes)»
154 «IF !module.groupings.nullOrEmpty»
156 «writeGroupingDefs(module.groupings)»
158 «IF !module.augmentations.nullOrEmpty»
160 «writeAugments(module.augmentations)»
162 «IF !module.deviations.nullOrEmpty»
164 «writeDeviations(module.deviations)»
166 «IF !module.extensionSchemaNodes.nullOrEmpty»
168 «writeExtensions(module.extensionSchemaNodes)»
170 «IF !module.features.nullOrEmpty»
172 «writeFeatures(module.features)»
174 «IF !module.identities.nullOrEmpty»
176 «writeIdentities(module.identities)»
178 «IF !module.notifications.nullOrEmpty»
180 «writeNotifications(module.notifications)»
182 «IF !module.rpcs.nullOrEmpty»
184 «writeRPCs(module.rpcs)»
186 «IF !module.unknownSchemaNodes.nullOrEmpty»
188 «writeUnknownSchemaNodes(module.unknownSchemaNodes)»
190 «IF !module.uses.nullOrEmpty»
192 «writeUsesNodes(module.uses)»
198 def private static writeRPCs(Set<RpcDefinition> rpcDefs) {
208 def private static writeRPC(RpcDefinition rpc) {
209 var boolean isStatusDeprecated = rpc.status == Status::DEPRECATED
211 rpc «rpc.QName.localName» {
212 «IF !rpc.description.nullOrEmpty»
215 «IF !rpc.groupings.nullOrEmpty»
216 «writeGroupingDefs(rpc.groupings)»
218 «IF rpc.input != null»
219 «writeRpcInput(rpc.input)»
221 «IF rpc.output != null»
222 «writeRpcOutput(rpc.output)»
224 «IF !rpc.reference.nullOrEmpty»
228 «IF isStatusDeprecated»
235 def private static writeRpcInput(ContainerSchemaNode input) {
241 «IF !input.childNodes.nullOrEmpty»
242 «writeDataSchemaNodes(input.childNodes)»
249 def private static writeRpcOutput(ContainerSchemaNode output) {
255 «IF !output.childNodes.nullOrEmpty»
256 «writeDataSchemaNodes(output.childNodes)»
262 def private static writeNotifications(Set<NotificationDefinition> notifications) {
264 «FOR notification : notifications»
265 «IF notification != null»
266 «writeNotification(notification)»
272 def private static writeNotification(NotificationDefinition notification) {
273 var boolean isStatusDeprecated = notification.status == Status::DEPRECATED
275 notification «notification.QName.localName» {
276 «IF !notification.description.nullOrEmpty»
278 "«notification.description»";
280 «IF !notification.childNodes.nullOrEmpty»
281 «writeDataSchemaNodes(notification.childNodes)»
283 «IF !notification.availableAugmentations.nullOrEmpty»
284 «writeAugments(notification.availableAugmentations)»
286 «IF !notification.groupings.nullOrEmpty»
287 «writeGroupingDefs(notification.groupings)»
289 «IF !notification.uses.nullOrEmpty»
290 «writeUsesNodes(notification.uses)»
292 «IF !notification.reference.nullOrEmpty»
294 "«notification.reference»";
296 «IF isStatusDeprecated»
297 status «notification.status»;
303 def private static writeUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
304 if (unknownSchemaNodes.nullOrEmpty)
308 «FOR unknownSchemaNode : unknownSchemaNodes»
309 «writeUnknownSchemaNode(unknownSchemaNode)»
314 def private static writeUnknownSchemaNode(UnknownSchemaNode unknownSchemaNode) {
318 def private static writeUsesNodes(Set<UsesNode> usesNodes) {
319 if (usesNodes == null) {
324 «FOR usesNode : usesNodes»
325 «IF usesNode != null»
326 «writeUsesNode(usesNode)»
332 def private static writeUsesNode(UsesNode usesNode) {
333 val hasRefines = !usesNode.refines.empty
336 uses «usesNode.groupingPath.pathFromRoot.head.localName»«IF !hasRefines»;«ELSE» {«ENDIF»
338 «writeRefines(usesNode.refines)»
344 def private static writeRefines(Map<SchemaPath, SchemaNode> refines) {
346 «FOR path : refines.keySet»
347 «val schemaNode = refines.get(path)»
348 «writeRefine(path, schemaNode)»
353 def private static writeRefine(SchemaPath path, SchemaNode schemaNode) {
355 refine «path.pathFromRoot.last» {
356 «IF schemaNode instanceof DataSchemaNode»
357 «writeDataSchemaNode(schemaNode)»
363 def private static writeTypeDefinition(TypeDefinition<?> typeDefinition) {
364 var boolean isStatusDeprecated = typeDefinition.status == Status::DEPRECATED
366 type «typeDefinition.QName.localName»«IF !isStatusDeprecated»;«ELSE» {
367 status «typeDefinition.status»;
373 def private static writeIdentities(Set<IdentitySchemaNode> identities) {
374 if (identities.nullOrEmpty)
377 «FOR identity : identities»
378 «writeIdentity(identity)»
383 def private static writeIdentity(IdentitySchemaNode identity) {
384 if (identity == null)
387 identity «identity.QName.localName» {
388 «IF identity.baseIdentity != null»
389 base "()«identity.baseIdentity»";
391 «IF !identity.description.nullOrEmpty»
393 "«identity.description»";
395 «IF !identity.reference.nullOrEmpty»
397 "«identity.reference»";
399 «IF identity.status != null»
400 status «identity.status»;
406 def private static writeFeatures(Set<FeatureDefinition> features) {
408 «FOR feature : features»
410 «writeFeature(feature)»
416 def private static writeFeature(FeatureDefinition featureDef) {
418 feature «featureDef.QName.localName» {
419 «IF !featureDef.description.nullOrEmpty»
421 "«featureDef.description»";
423 «IF !featureDef.reference.nullOrEmpty»
425 "«featureDef.reference»";
427 «IF featureDef.status != null»
428 status «featureDef.status»;
434 def private static writeExtensions(List<ExtensionDefinition> extensions) {
436 «FOR anExtension : extensions»
437 «IF anExtension != null»
438 «writeExtension(anExtension)»
444 def private static writeExtension(ExtensionDefinition extensionDef) {
446 extension «extensionDef.QName.localName» {
447 «IF !extensionDef.description.nullOrEmpty»
449 "«extensionDef.description»";
451 «IF !extensionDef.argument.nullOrEmpty»
452 argument "«extensionDef.argument»";
454 «IF !extensionDef.reference.nullOrEmpty»
456 "«extensionDef.reference»";
458 «IF extensionDef.status != null»
459 status «extensionDef.status»;
465 def private static writeDeviations(Set<Deviation> deviations) {
467 «FOR deviation : deviations»
468 «IF deviation != null»
469 «writeDeviation(deviation)»
475 def private static writeDeviation(Deviation deviation) {
477 deviation «deviation.targetPath» {
478 «IF !deviation.reference.nullOrEmpty»
480 "«deviation.reference»";
482 «FOR dev : deviation.deviates»
483 «IF dev != null && dev.deviateType != null»
484 deviation «dev.deviateType.name»;
491 def private static writeAugments(Set<AugmentationSchema> augments) {
493 «FOR augment : augments»
495 «writeAugment(augment)»
501 def private static writeDataSchemaNodes(Collection<DataSchemaNode> dataSchemaNodes) {
503 «FOR schemaNode : dataSchemaNodes»
504 «writeDataSchemaNode(schemaNode)»
509 def private static CharSequence writeGroupingDefs(Set<GroupingDefinition> groupingDefs) {
511 «FOR groupingDef : groupingDefs»
512 «IF groupingDef != null»
513 «writeGroupingDef(groupingDef)»
519 def private static writeAugment(AugmentationSchema augment) {
521 augment «YangTextTemplate.formatToAugmentPath(augment.targetPath.pathFromRoot)» {
522 «IF augment.whenCondition != null && !augment.whenCondition.toString.nullOrEmpty»
523 when "«augment.whenCondition.toString»";
525 «IF !augment.description.nullOrEmpty»
527 "«augment.description»";
529 «IF !augment.reference.nullOrEmpty»
531 "«augment.reference»";
533 «IF augment.status != null»
534 status «augment.status»;
536 «IF !augment.childNodes.nullOrEmpty»
537 «writeDataSchemaNodes(augment.childNodes)»
539 «IF !augment.uses.nullOrEmpty»
540 «writeUsesNodes(augment.uses)»
546 def private static writeGroupingDef(GroupingDefinition groupingDef) {
547 var boolean isStatusDeprecated = groupingDef.status == Status::DEPRECATED
549 grouping «groupingDef.QName.localName» {
550 «IF !groupingDef.groupings.nullOrEmpty»
551 «writeGroupingDefs(groupingDef.groupings)»
553 «IF !groupingDef.childNodes.nullOrEmpty»
554 «writeDataSchemaNodes(groupingDef.childNodes)»
556 «IF isStatusDeprecated»
557 status «groupingDef.status»;
559 «IF !groupingDef.unknownSchemaNodes.nullOrEmpty»
560 «writeUnknownSchemaNodes(groupingDef.unknownSchemaNodes)»
566 def private static writeContSchemaNode(ContainerSchemaNode contSchemaNode) {
567 var boolean isStatusDeprecated = contSchemaNode.status == Status::DEPRECATED
569 container «contSchemaNode.getQName.localName» {
570 «IF !contSchemaNode.childNodes.nullOrEmpty»
571 «writeDataSchemaNodes(contSchemaNode.childNodes)»
573 «IF !contSchemaNode.availableAugmentations.nullOrEmpty»
574 «writeAugments(contSchemaNode.availableAugmentations)»
576 «IF !contSchemaNode.groupings.nullOrEmpty»
577 «writeGroupingDefs(contSchemaNode.groupings)»
579 «IF !contSchemaNode.uses.nullOrEmpty»
580 «writeUsesNodes(contSchemaNode.uses)»
582 «IF isStatusDeprecated»
583 status «contSchemaNode.status»;
585 «IF !contSchemaNode.unknownSchemaNodes.nullOrEmpty»
586 «writeUnknownSchemaNodes(contSchemaNode.unknownSchemaNodes)»
592 def private static writeAnyXmlSchemaNode(AnyXmlSchemaNode anyXmlSchemaNode) {
593 var boolean isStatusDeprecated = anyXmlSchemaNode.status == Status::DEPRECATED
595 anyxml «anyXmlSchemaNode.getQName.localName»«IF !isStatusDeprecated»;«ELSE» {
596 status «anyXmlSchemaNode.status»;
602 def private static writeLeafSchemaNode(LeafSchemaNode leafSchemaNode) {
603 var boolean isStatusDeprecated = leafSchemaNode.status == Status::DEPRECATED
605 leaf «leafSchemaNode.getQName.localName» {
606 type «leafSchemaNode.type.getQName.localName»;
607 «IF isStatusDeprecated»
608 status «leafSchemaNode.status»;
614 def private static writeLeafListSchemaNode(LeafListSchemaNode leafListSchemaNode) {
615 var boolean isStatusDeprecated = leafListSchemaNode.status == Status::DEPRECATED
617 leaf-list «leafListSchemaNode.getQName.localName» {
618 type «leafListSchemaNode.type.getQName.localName»;
619 «IF isStatusDeprecated»
620 status «leafListSchemaNode.status»;
626 def private static writeChoiceCaseNode(ChoiceCaseNode choiceCaseNode) {
627 var boolean isStatusDeprecated = choiceCaseNode.status == Status::DEPRECATED
629 case «choiceCaseNode.getQName.localName» {
630 «FOR childNode : choiceCaseNode.childNodes»
631 «writeDataSchemaNode(childNode)»
633 «IF isStatusDeprecated»
634 status «choiceCaseNode.status»;
640 def private static writeChoiceNode(ChoiceSchemaNode choiceNode) {
641 var boolean isStatusDeprecated = choiceNode.status == Status::DEPRECATED
643 choice «choiceNode.getQName.localName» {
644 «FOR child : choiceNode.cases»
645 «writeDataSchemaNode(child)»
647 «IF isStatusDeprecated»
648 status «choiceNode.status»;
654 def private static writeListSchemaNode(ListSchemaNode listSchemaNode) {
655 var boolean isStatusDeprecated = listSchemaNode.status == Status::DEPRECATED
658 list «listSchemaNode.getQName.localName» {
659 key «FOR listKey : listSchemaNode.keyDefinition SEPARATOR " "»"«listKey.localName»"
661 «IF !listSchemaNode.childNodes.nullOrEmpty»
662 «writeDataSchemaNodes(listSchemaNode.childNodes)»
664 «IF !listSchemaNode.availableAugmentations.nullOrEmpty»
665 «writeAugments(listSchemaNode.availableAugmentations)»
667 «IF !listSchemaNode.groupings.nullOrEmpty»
668 «writeGroupingDefs(listSchemaNode.groupings)»
670 «IF !listSchemaNode.uses.nullOrEmpty»
671 «writeUsesNodes(listSchemaNode.uses)»
673 «IF isStatusDeprecated»
674 status «listSchemaNode.status»;
676 «IF !listSchemaNode.unknownSchemaNodes.nullOrEmpty»
677 «writeUnknownSchemaNodes(listSchemaNode.unknownSchemaNodes)»
683 def private static CharSequence writeDataSchemaNode(DataSchemaNode child) {
685 «IF child instanceof ContainerSchemaNode»
686 «writeContSchemaNode(child)»
688 «IF child instanceof AnyXmlSchemaNode»
689 «writeAnyXmlSchemaNode(child)»
691 «IF child instanceof LeafSchemaNode»
692 «writeLeafSchemaNode(child)»
694 «IF child instanceof LeafListSchemaNode»
695 «writeLeafListSchemaNode(child)»
697 «IF child instanceof ChoiceCaseNode»
698 «writeChoiceCaseNode(child)»
700 «IF child instanceof ChoiceSchemaNode»
701 «writeChoiceNode(child)»
703 «IF child instanceof ListSchemaNode»
704 «writeListSchemaNode(child)»