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
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 private static val SKIPPED_EMPTY = '''(Empty due to «SKIP_PROPERTY_NAME» property = true)'''
51 def static String generateYangSnipet(SchemaNode schemaNode) {
52 if (schemaNode === null)
57 «IF schemaNode instanceof DataSchemaNode»
58 «writeDataSchemaNode(schemaNode)»
60 «IF schemaNode instanceof EnumTypeDefinition.EnumPair»
61 «writeEnumPair(schemaNode)»
63 «IF schemaNode instanceof ExtensionDefinition»
64 «writeExtension(schemaNode)»
66 «IF schemaNode instanceof FeatureDefinition»
67 «writeFeature(schemaNode)»
69 «IF schemaNode instanceof GroupingDefinition»
70 «writeGroupingDef(schemaNode)»
72 «IF schemaNode instanceof IdentitySchemaNode»
73 «writeIdentity(schemaNode)»
75 «IF schemaNode instanceof NotificationDefinition»
76 «writeNotification(schemaNode)»
78 «IF schemaNode instanceof RpcDefinition»
79 «writeRPC(schemaNode)»
81 «IF schemaNode instanceof TypeDefinition<?>»
82 «writeTypeDefinition(schemaNode)»
84 «IF schemaNode instanceof UnknownSchemaNode»
85 «writeUnknownSchemaNode(schemaNode)»
90 def static String generateYangSnipet(Set<? extends SchemaNode> nodes) {
91 if (nodes.nullOrEmpty)
97 «IF node instanceof NotificationDefinition»
98 «writeNotification(node)»
99 «ELSEIF node instanceof RpcDefinition»
100 «writeRPC(node as RpcDefinition)»
106 def private static writeEnumPair(EnumPair pair) {
114 def private static String writeModuleImports(Set<ModuleImport> moduleImports) {
115 if (moduleImports.nullOrEmpty)
119 «FOR moduleImport : moduleImports SEPARATOR "\n"»
120 «IF moduleImport !== null && !moduleImport.moduleName.nullOrEmpty»
121 import «moduleImport.moduleName» { prefix "«moduleImport.prefix»"; }
127 def private static writeRevision(Date moduleRevision, String moduleDescription) {
128 val revisionIndent = 12
131 revision «SimpleDateFormatUtil.getRevisionFormat.format(moduleRevision)» {
132 description "«YangTextTemplate.formatToParagraph(moduleDescription, revisionIndent)»";
137 def static String generateYangSnipet(Module module) {
141 module «module.name» {
142 yang-version «module.yangVersion»;
143 namespace "«module.QNameModule.namespace.toString»";
144 prefix "«module.prefix»";
146 «IF !module.imports.nullOrEmpty»
147 «writeModuleImports(module.imports)»
149 «IF module.revision !== null»
150 «writeRevision(module.revision, module.description)»
152 «IF !module.childNodes.nullOrEmpty»
154 «writeDataSchemaNodes(module.childNodes)»
156 «IF !module.groupings.nullOrEmpty»
158 «writeGroupingDefs(module.groupings)»
160 «IF !module.augmentations.nullOrEmpty»
162 «writeAugments(module.augmentations)»
164 «IF !module.deviations.nullOrEmpty»
166 «writeDeviations(module.deviations)»
168 «IF !module.extensionSchemaNodes.nullOrEmpty»
170 «writeExtensions(module.extensionSchemaNodes)»
172 «IF !module.features.nullOrEmpty»
174 «writeFeatures(module.features)»
176 «IF !module.identities.nullOrEmpty»
178 «writeIdentities(module.identities)»
180 «IF !module.notifications.nullOrEmpty»
182 «writeNotifications(module.notifications)»
184 «IF !module.rpcs.nullOrEmpty»
186 «writeRPCs(module.rpcs)»
188 «IF !module.unknownSchemaNodes.nullOrEmpty»
190 «writeUnknownSchemaNodes(module.unknownSchemaNodes)»
192 «IF !module.uses.nullOrEmpty»
194 «writeUsesNodes(module.uses)»
200 def private static writeRPCs(Set<RpcDefinition> rpcDefs) {
210 def private static writeRPC(RpcDefinition rpc) {
211 var boolean isStatusDeprecated = rpc.status == Status::DEPRECATED
213 rpc «rpc.QName.localName» {
214 «IF !rpc.description.nullOrEmpty»
217 «IF !rpc.groupings.nullOrEmpty»
218 «writeGroupingDefs(rpc.groupings)»
220 «IF rpc.input !== null»
221 «writeRpcInput(rpc.input)»
223 «IF rpc.output !== null»
224 «writeRpcOutput(rpc.output)»
226 «IF !rpc.reference.nullOrEmpty»
230 «IF isStatusDeprecated»
237 def private static writeRpcInput(ContainerSchemaNode input) {
243 «IF !input.childNodes.nullOrEmpty»
244 «writeDataSchemaNodes(input.childNodes)»
251 def private static writeRpcOutput(ContainerSchemaNode output) {
257 «IF !output.childNodes.nullOrEmpty»
258 «writeDataSchemaNodes(output.childNodes)»
264 def private static writeNotifications(Set<NotificationDefinition> notifications) {
266 «FOR notification : notifications»
267 «IF notification !== null»
268 «writeNotification(notification)»
274 def private static writeNotification(NotificationDefinition notification) {
275 var boolean isStatusDeprecated = notification.status == Status::DEPRECATED
277 notification «notification.QName.localName» {
278 «IF !notification.description.nullOrEmpty»
280 "«notification.description»";
282 «IF !notification.childNodes.nullOrEmpty»
283 «writeDataSchemaNodes(notification.childNodes)»
285 «IF !notification.availableAugmentations.nullOrEmpty»
286 «writeAugments(notification.availableAugmentations)»
288 «IF !notification.groupings.nullOrEmpty»
289 «writeGroupingDefs(notification.groupings)»
291 «IF !notification.uses.nullOrEmpty»
292 «writeUsesNodes(notification.uses)»
294 «IF !notification.reference.nullOrEmpty»
296 "«notification.reference»";
298 «IF isStatusDeprecated»
299 status «notification.status»;
305 def private static writeUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
306 if (unknownSchemaNodes.nullOrEmpty)
310 «FOR unknownSchemaNode : unknownSchemaNodes»
311 «writeUnknownSchemaNode(unknownSchemaNode)»
316 def private static writeUnknownSchemaNode(UnknownSchemaNode unknownSchemaNode) {
320 def private static writeUsesNodes(Set<UsesNode> usesNodes) {
321 if (usesNodes === null) {
326 «FOR usesNode : usesNodes»
327 «IF usesNode !== null»
328 «writeUsesNode(usesNode)»
334 def private static writeUsesNode(UsesNode usesNode) {
335 val hasRefines = !usesNode.refines.empty
338 uses «usesNode.groupingPath.pathFromRoot.head.localName»«IF !hasRefines»;«ELSE» {«ENDIF»
340 «writeRefines(usesNode.refines)»
346 def private static writeRefines(Map<SchemaPath, SchemaNode> refines) {
348 «FOR path : refines.keySet»
349 «val schemaNode = refines.get(path)»
350 «writeRefine(path, schemaNode)»
355 def private static writeRefine(SchemaPath path, SchemaNode schemaNode) {
357 refine «path.pathFromRoot.last» {
358 «IF schemaNode instanceof DataSchemaNode»
359 «writeDataSchemaNode(schemaNode)»
365 def private static writeTypeDefinition(TypeDefinition<?> typeDefinition) {
366 var boolean isStatusDeprecated = typeDefinition.status == Status::DEPRECATED
368 type «typeDefinition.QName.localName»«IF !isStatusDeprecated»;«ELSE» {
369 status «typeDefinition.status»;
375 def private static writeIdentities(Set<IdentitySchemaNode> identities) {
376 if (identities.nullOrEmpty)
379 «FOR identity : identities»
380 «writeIdentity(identity)»
385 def private static writeIdentity(IdentitySchemaNode identity) {
386 if (identity === null)
389 identity «identity.QName.localName» {
390 «IF identity.baseIdentity !== null»
391 base "()«identity.baseIdentity»";
393 «IF !identity.description.nullOrEmpty»
395 "«identity.description»";
397 «IF !identity.reference.nullOrEmpty»
399 "«identity.reference»";
401 «IF identity.status !== null»
402 status «identity.status»;
408 def private static writeFeatures(Set<FeatureDefinition> features) {
410 «FOR feature : features»
411 «IF feature !== null»
412 «writeFeature(feature)»
418 def private static writeFeature(FeatureDefinition featureDef) {
420 feature «featureDef.QName.localName» {
421 «IF !featureDef.description.nullOrEmpty»
423 "«featureDef.description»";
425 «IF !featureDef.reference.nullOrEmpty»
427 "«featureDef.reference»";
429 «IF featureDef.status !== null»
430 status «featureDef.status»;
436 def private static writeExtensions(List<ExtensionDefinition> extensions) {
438 «FOR anExtension : extensions»
439 «IF anExtension !== null»
440 «writeExtension(anExtension)»
446 def private static writeExtension(ExtensionDefinition extensionDef) {
448 extension «extensionDef.QName.localName» {
449 «IF !extensionDef.description.nullOrEmpty»
451 "«extensionDef.description»";
453 «IF !extensionDef.argument.nullOrEmpty»
454 argument "«extensionDef.argument»";
456 «IF !extensionDef.reference.nullOrEmpty»
458 "«extensionDef.reference»";
460 «IF extensionDef.status !== null»
461 status «extensionDef.status»;
467 def private static writeDeviations(Set<Deviation> deviations) {
469 «FOR deviation : deviations»
470 «IF deviation !== null»
471 «writeDeviation(deviation)»
477 def private static writeDeviation(Deviation deviation) {
479 deviation «deviation.targetPath» {
480 «IF !deviation.reference.nullOrEmpty»
482 "«deviation.reference»";
484 «FOR dev : deviation.deviates»
485 «IF dev !== null && dev.deviateType !== null»
486 deviation «dev.deviateType.name»;
493 def private static writeAugments(Set<AugmentationSchema> augments) {
495 «FOR augment : augments»
496 «IF augment !== null»
497 «writeAugment(augment)»
503 def private static writeDataSchemaNodes(Collection<DataSchemaNode> dataSchemaNodes) {
505 «FOR schemaNode : dataSchemaNodes»
506 «writeDataSchemaNode(schemaNode)»
511 def private static CharSequence writeGroupingDefs(Set<GroupingDefinition> groupingDefs) {
513 «FOR groupingDef : groupingDefs»
514 «IF groupingDef !== null»
515 «writeGroupingDef(groupingDef)»
521 def private static writeAugment(AugmentationSchema augment) {
523 augment «YangTextTemplate.formatToAugmentPath(augment.targetPath.pathFromRoot)» {
524 «IF augment.whenCondition !== null && !augment.whenCondition.toString.nullOrEmpty»
525 when "«augment.whenCondition.toString»";
527 «IF !augment.description.nullOrEmpty»
529 "«augment.description»";
531 «IF !augment.reference.nullOrEmpty»
533 "«augment.reference»";
535 «IF augment.status !== null»
536 status «augment.status»;
538 «IF !augment.childNodes.nullOrEmpty»
539 «writeDataSchemaNodes(augment.childNodes)»
541 «IF !augment.uses.nullOrEmpty»
542 «writeUsesNodes(augment.uses)»
548 def private static writeGroupingDef(GroupingDefinition groupingDef) {
549 var boolean isStatusDeprecated = groupingDef.status == Status::DEPRECATED
551 grouping «groupingDef.QName.localName» {
552 «IF !groupingDef.groupings.nullOrEmpty»
553 «writeGroupingDefs(groupingDef.groupings)»
555 «IF !groupingDef.childNodes.nullOrEmpty»
556 «writeDataSchemaNodes(groupingDef.childNodes)»
558 «IF isStatusDeprecated»
559 status «groupingDef.status»;
561 «IF !groupingDef.unknownSchemaNodes.nullOrEmpty»
562 «writeUnknownSchemaNodes(groupingDef.unknownSchemaNodes)»
568 def private static writeContSchemaNode(ContainerSchemaNode contSchemaNode) {
569 var boolean isStatusDeprecated = contSchemaNode.status == Status::DEPRECATED
571 container «contSchemaNode.getQName.localName» {
572 «IF !contSchemaNode.childNodes.nullOrEmpty»
573 «writeDataSchemaNodes(contSchemaNode.childNodes)»
575 «IF !contSchemaNode.availableAugmentations.nullOrEmpty»
576 «writeAugments(contSchemaNode.availableAugmentations)»
578 «IF !contSchemaNode.groupings.nullOrEmpty»
579 «writeGroupingDefs(contSchemaNode.groupings)»
581 «IF !contSchemaNode.uses.nullOrEmpty»
582 «writeUsesNodes(contSchemaNode.uses)»
584 «IF isStatusDeprecated»
585 status «contSchemaNode.status»;
587 «IF !contSchemaNode.unknownSchemaNodes.nullOrEmpty»
588 «writeUnknownSchemaNodes(contSchemaNode.unknownSchemaNodes)»
594 def private static writeAnyXmlSchemaNode(AnyXmlSchemaNode anyXmlSchemaNode) {
595 var boolean isStatusDeprecated = anyXmlSchemaNode.status == Status::DEPRECATED
597 anyxml «anyXmlSchemaNode.getQName.localName»«IF !isStatusDeprecated»;«ELSE» {
598 status «anyXmlSchemaNode.status»;
604 def private static writeLeafSchemaNode(LeafSchemaNode leafSchemaNode) {
605 var boolean isStatusDeprecated = leafSchemaNode.status == Status::DEPRECATED
607 leaf «leafSchemaNode.getQName.localName» {
608 type «leafSchemaNode.type.getQName.localName»;
609 «IF isStatusDeprecated»
610 status «leafSchemaNode.status»;
616 def private static writeLeafListSchemaNode(LeafListSchemaNode leafListSchemaNode) {
617 var boolean isStatusDeprecated = leafListSchemaNode.status == Status::DEPRECATED
619 leaf-list «leafListSchemaNode.getQName.localName» {
620 type «leafListSchemaNode.type.getQName.localName»;
621 «IF isStatusDeprecated»
622 status «leafListSchemaNode.status»;
628 def private static writeChoiceCaseNode(ChoiceCaseNode choiceCaseNode) {
629 var boolean isStatusDeprecated = choiceCaseNode.status == Status::DEPRECATED
631 case «choiceCaseNode.getQName.localName» {
632 «FOR childNode : choiceCaseNode.childNodes»
633 «writeDataSchemaNode(childNode)»
635 «IF isStatusDeprecated»
636 status «choiceCaseNode.status»;
642 def private static writeChoiceNode(ChoiceSchemaNode choiceNode) {
643 var boolean isStatusDeprecated = choiceNode.status == Status::DEPRECATED
645 choice «choiceNode.getQName.localName» {
646 «FOR child : choiceNode.cases»
647 «writeDataSchemaNode(child)»
649 «IF isStatusDeprecated»
650 status «choiceNode.status»;
656 def private static writeListSchemaNode(ListSchemaNode listSchemaNode) {
657 var boolean isStatusDeprecated = listSchemaNode.status == Status::DEPRECATED
660 list «listSchemaNode.getQName.localName» {
661 key «FOR listKey : listSchemaNode.keyDefinition SEPARATOR " "»"«listKey.localName»"
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 ChoiceCaseNode»
700 «writeChoiceCaseNode(child)»
702 «IF child instanceof ChoiceSchemaNode»
703 «writeChoiceNode(child)»
705 «IF child instanceof ListSchemaNode»
706 «writeListSchemaNode(child)»