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 // FIXME: this is not thread-safe and seems to be unused!
46 private static var Module module = null
48 def static String generateYangSnipet(SchemaNode schemaNode) {
49 if (schemaNode == null)
53 «IF schemaNode instanceof DataSchemaNode»
54 «writeDataSchemaNode(schemaNode)»
56 «IF schemaNode instanceof EnumTypeDefinition.EnumPair»
57 «writeEnumPair(schemaNode)»
59 «IF schemaNode instanceof ExtensionDefinition»
60 «writeExtension(schemaNode)»
62 «IF schemaNode instanceof FeatureDefinition»
63 «writeFeature(schemaNode)»
65 «IF schemaNode instanceof GroupingDefinition»
66 «writeGroupingDef(schemaNode)»
68 «IF schemaNode instanceof IdentitySchemaNode»
69 «writeIdentity(schemaNode)»
71 «IF schemaNode instanceof NotificationDefinition»
72 «writeNotification(schemaNode)»
74 «IF schemaNode instanceof RpcDefinition»
75 «writeRPC(schemaNode)»
77 «IF schemaNode instanceof TypeDefinition<?>»
78 «writeTypeDefinition(schemaNode)»
80 «IF schemaNode instanceof UnknownSchemaNode»
81 «writeUnknownSchemaNode(schemaNode)»
86 def static String generateYangSnipet(Set<? extends SchemaNode> nodes) {
87 if (nodes.nullOrEmpty)
92 «IF node instanceof NotificationDefinition»
93 «writeNotification(node)»
94 «ELSEIF node instanceof RpcDefinition»
95 «writeRPC(node as RpcDefinition)»
101 def private static writeEnumPair(EnumPair pair) {
102 var boolean hasEnumPairValue = pair.value != null
104 enum «pair.name»«IF !hasEnumPairValue»;«ELSE»{
111 def private static String writeModuleImports(Set<ModuleImport> moduleImports) {
112 if (moduleImports.nullOrEmpty)
116 «FOR moduleImport : moduleImports SEPARATOR "\n"»
117 «IF moduleImport != null && !moduleImport.moduleName.nullOrEmpty»
118 import «moduleImport.moduleName» { prefix "«moduleImport.prefix»"; }
124 def private static writeRevision(Date moduleRevision, String moduleDescription) {
125 val revisionIndent = 12
128 revision «SimpleDateFormatUtil.getRevisionFormat.format(moduleRevision)» {
129 description "«YangTextTemplate.formatToParagraph(moduleDescription, revisionIndent)»";
134 def static String generateYangSnipet(Module module) {
137 module «module.name» {
138 yang-version «module.yangVersion»;
139 namespace "«module.QNameModule.namespace.toString»";
140 prefix "«module.prefix»";
142 «IF !module.imports.nullOrEmpty»
143 «writeModuleImports(module.imports)»
145 «IF module.revision != null»
146 «writeRevision(module.revision, module.description)»
148 «IF !module.childNodes.nullOrEmpty»
150 «writeDataSchemaNodes(module.childNodes)»
152 «IF !module.groupings.nullOrEmpty»
154 «writeGroupingDefs(module.groupings)»
156 «IF !module.augmentations.nullOrEmpty»
158 «writeAugments(module.augmentations)»
160 «IF !module.deviations.nullOrEmpty»
162 «writeDeviations(module.deviations)»
164 «IF !module.extensionSchemaNodes.nullOrEmpty»
166 «writeExtensions(module.extensionSchemaNodes)»
168 «IF !module.features.nullOrEmpty»
170 «writeFeatures(module.features)»
172 «IF !module.identities.nullOrEmpty»
174 «writeIdentities(module.identities)»
176 «IF !module.notifications.nullOrEmpty»
178 «writeNotifications(module.notifications)»
180 «IF !module.rpcs.nullOrEmpty»
182 «writeRPCs(module.rpcs)»
184 «IF !module.unknownSchemaNodes.nullOrEmpty»
186 «writeUnknownSchemaNodes(module.unknownSchemaNodes)»
188 «IF !module.uses.nullOrEmpty»
190 «writeUsesNodes(module.uses)»
196 def private static writeRPCs(Set<RpcDefinition> rpcDefs) {
206 def private static writeRPC(RpcDefinition rpc) {
207 var boolean isStatusDeprecated = rpc.status == Status::DEPRECATED
209 rpc «rpc.QName.localName» {
210 «IF !rpc.description.nullOrEmpty»
213 «IF !rpc.groupings.nullOrEmpty»
214 «writeGroupingDefs(rpc.groupings)»
216 «IF rpc.input != null»
217 «writeRpcInput(rpc.input)»
219 «IF rpc.output != null»
220 «writeRpcOutput(rpc.output)»
222 «IF !rpc.reference.nullOrEmpty»
226 «IF isStatusDeprecated»
233 def private static writeRpcInput(ContainerSchemaNode input) {
239 «IF !input.childNodes.nullOrEmpty»
240 «writeDataSchemaNodes(input.childNodes)»
247 def private static writeRpcOutput(ContainerSchemaNode output) {
253 «IF !output.childNodes.nullOrEmpty»
254 «writeDataSchemaNodes(output.childNodes)»
260 def private static writeNotifications(Set<NotificationDefinition> notifications) {
262 «FOR notification : notifications»
263 «IF notification != null»
264 «writeNotification(notification)»
270 def private static writeNotification(NotificationDefinition notification) {
271 var boolean isStatusDeprecated = notification.status == Status::DEPRECATED
273 notification «notification.QName.localName» {
274 «IF !notification.description.nullOrEmpty»
276 "«notification.description»";
278 «IF !notification.childNodes.nullOrEmpty»
279 «writeDataSchemaNodes(notification.childNodes)»
281 «IF !notification.availableAugmentations.nullOrEmpty»
282 «writeAugments(notification.availableAugmentations)»
284 «IF !notification.groupings.nullOrEmpty»
285 «writeGroupingDefs(notification.groupings)»
287 «IF !notification.uses.nullOrEmpty»
288 «writeUsesNodes(notification.uses)»
290 «IF !notification.reference.nullOrEmpty»
292 "«notification.reference»";
294 «IF isStatusDeprecated»
295 status «notification.status»;
301 def private static writeUnknownSchemaNodes(List<UnknownSchemaNode> unknownSchemaNodes) {
302 if (unknownSchemaNodes.nullOrEmpty)
306 «FOR unknownSchemaNode : unknownSchemaNodes»
307 «writeUnknownSchemaNode(unknownSchemaNode)»
312 def private static writeUnknownSchemaNode(UnknownSchemaNode unknownSchemaNode) {
316 def private static writeUsesNodes(Set<UsesNode> usesNodes) {
317 if (usesNodes == null) {
322 «FOR usesNode : usesNodes»
323 «IF usesNode != null»
324 «writeUsesNode(usesNode)»
330 def private static writeUsesNode(UsesNode usesNode) {
331 val hasRefines = !usesNode.refines.empty
334 uses «usesNode.groupingPath.pathFromRoot.head.localName»«IF !hasRefines»;«ELSE» {«ENDIF»
336 «writeRefines(usesNode.refines)»
342 def private static writeRefines(Map<SchemaPath, SchemaNode> refines) {
344 «FOR path : refines.keySet»
345 «val schemaNode = refines.get(path)»
346 «writeRefine(path, schemaNode)»
351 def private static writeRefine(SchemaPath path, SchemaNode schemaNode) {
353 refine «path.pathFromRoot.last» {
354 «IF schemaNode instanceof DataSchemaNode»
355 «writeDataSchemaNode(schemaNode)»
361 def private static writeTypeDefinition(TypeDefinition<?> typeDefinition) {
362 var boolean isStatusDeprecated = typeDefinition.status == Status::DEPRECATED
364 type «typeDefinition.QName.localName»«IF !isStatusDeprecated»;«ELSE» {
365 status «typeDefinition.status»;
371 def private static writeIdentities(Set<IdentitySchemaNode> identities) {
372 if (identities.nullOrEmpty)
375 «FOR identity : identities»
376 «writeIdentity(identity)»
381 def private static writeIdentity(IdentitySchemaNode identity) {
382 if (identity == null)
385 identity «identity.QName.localName» {
386 «IF identity.baseIdentity != null»
387 base "(«writeIdentityNs(identity.baseIdentity)»)«identity.baseIdentity»";
389 «IF !identity.description.nullOrEmpty»
391 "«identity.description»";
393 «IF !identity.reference.nullOrEmpty»
395 "«identity.reference»";
397 «IF identity.status != null»
398 status «identity.status»;
404 def private static writeIdentityNs(IdentitySchemaNode identity) {
408 val identityNs = identity.QName.namespace
410 if(!module.namespace.equals(identityNs))
411 return identityNs + ":"
415 def private static writeFeatures(Set<FeatureDefinition> features) {
417 «FOR feature : features»
419 «writeFeature(feature)»
425 def private static writeFeature(FeatureDefinition featureDef) {
427 feature «featureDef.QName.localName» {
428 «IF !featureDef.description.nullOrEmpty»
430 "«featureDef.description»";
432 «IF !featureDef.reference.nullOrEmpty»
434 "«featureDef.reference»";
436 «IF featureDef.status != null»
437 status «featureDef.status»;
443 def private static writeExtensions(List<ExtensionDefinition> extensions) {
445 «FOR anExtension : extensions»
446 «IF anExtension != null»
447 «writeExtension(anExtension)»
453 def private static writeExtension(ExtensionDefinition extensionDef) {
455 extension «extensionDef.QName.localName» {
456 «IF !extensionDef.description.nullOrEmpty»
458 "«extensionDef.description»";
460 «IF !extensionDef.argument.nullOrEmpty»
461 argument "«extensionDef.argument»";
463 «IF !extensionDef.reference.nullOrEmpty»
465 "«extensionDef.reference»";
467 «IF extensionDef.status != null»
468 status «extensionDef.status»;
474 def private static writeDeviations(Set<Deviation> deviations) {
476 «FOR deviation : deviations»
477 «IF deviation != null»
478 «writeDeviation(deviation)»
484 def private static writeDeviation(Deviation deviation) {
486 deviation «deviation.targetPath» {
487 «IF !deviation.reference.nullOrEmpty»
489 "«deviation.reference»";
491 «FOR dev : deviation.deviates»
492 «IF dev != null && dev.deviateType != null»
493 deviation «dev.deviateType.name»;
500 def private static writeAugments(Set<AugmentationSchema> augments) {
502 «FOR augment : augments»
504 «writeAugment(augment)»
510 def private static writeDataSchemaNodes(Collection<DataSchemaNode> dataSchemaNodes) {
512 «FOR schemaNode : dataSchemaNodes»
513 «writeDataSchemaNode(schemaNode)»
518 def private static CharSequence writeGroupingDefs(Set<GroupingDefinition> groupingDefs) {
520 «FOR groupingDef : groupingDefs»
521 «IF groupingDef != null»
522 «writeGroupingDef(groupingDef)»
528 def private static writeAugment(AugmentationSchema augment) {
530 augment «YangTextTemplate.formatToAugmentPath(augment.targetPath.pathFromRoot)» {
531 «IF augment.whenCondition != null && !augment.whenCondition.toString.nullOrEmpty»
532 when "«augment.whenCondition.toString»";
534 «IF !augment.description.nullOrEmpty»
536 "«augment.description»";
538 «IF !augment.reference.nullOrEmpty»
540 "«augment.reference»";
542 «IF augment.status != null»
543 status «augment.status»;
545 «IF !augment.childNodes.nullOrEmpty»
546 «writeDataSchemaNodes(augment.childNodes)»
548 «IF !augment.uses.nullOrEmpty»
549 «writeUsesNodes(augment.uses)»
555 def private static writeGroupingDef(GroupingDefinition groupingDef) {
556 var boolean isStatusDeprecated = groupingDef.status == Status::DEPRECATED
558 grouping «groupingDef.QName.localName» {
559 «IF !groupingDef.groupings.nullOrEmpty»
560 «writeGroupingDefs(groupingDef.groupings)»
562 «IF !groupingDef.childNodes.nullOrEmpty»
563 «writeDataSchemaNodes(groupingDef.childNodes)»
565 «IF isStatusDeprecated»
566 status «groupingDef.status»;
568 «IF !groupingDef.unknownSchemaNodes.nullOrEmpty»
569 «writeUnknownSchemaNodes(groupingDef.unknownSchemaNodes)»
575 def private static writeContSchemaNode(ContainerSchemaNode contSchemaNode) {
576 var boolean isStatusDeprecated = contSchemaNode.status == Status::DEPRECATED
578 container «contSchemaNode.getQName.localName» {
579 «IF !contSchemaNode.childNodes.nullOrEmpty»
580 «writeDataSchemaNodes(contSchemaNode.childNodes)»
582 «IF !contSchemaNode.availableAugmentations.nullOrEmpty»
583 «writeAugments(contSchemaNode.availableAugmentations)»
585 «IF !contSchemaNode.groupings.nullOrEmpty»
586 «writeGroupingDefs(contSchemaNode.groupings)»
588 «IF !contSchemaNode.uses.nullOrEmpty»
589 «writeUsesNodes(contSchemaNode.uses)»
591 «IF isStatusDeprecated»
592 status «contSchemaNode.status»;
594 «IF !contSchemaNode.unknownSchemaNodes.nullOrEmpty»
595 «writeUnknownSchemaNodes(contSchemaNode.unknownSchemaNodes)»
601 def private static writeAnyXmlSchemaNode(AnyXmlSchemaNode anyXmlSchemaNode) {
602 var boolean isStatusDeprecated = anyXmlSchemaNode.status == Status::DEPRECATED
604 anyxml «anyXmlSchemaNode.getQName.localName»«IF !isStatusDeprecated»;«ELSE» {
605 status «anyXmlSchemaNode.status»;
611 def private static writeLeafSchemaNode(LeafSchemaNode leafSchemaNode) {
612 var boolean isStatusDeprecated = leafSchemaNode.status == Status::DEPRECATED
614 leaf «leafSchemaNode.getQName.localName» {
615 type «leafSchemaNode.type.getQName.localName»;
616 «IF isStatusDeprecated»
617 status «leafSchemaNode.status»;
623 def private static writeLeafListSchemaNode(LeafListSchemaNode leafListSchemaNode) {
624 var boolean isStatusDeprecated = leafListSchemaNode.status == Status::DEPRECATED
626 leaf-list «leafListSchemaNode.getQName.localName» {
627 type «leafListSchemaNode.type.getQName.localName»;
628 «IF isStatusDeprecated»
629 status «leafListSchemaNode.status»;
635 def private static writeChoiceCaseNode(ChoiceCaseNode choiceCaseNode) {
636 var boolean isStatusDeprecated = choiceCaseNode.status == Status::DEPRECATED
638 case «choiceCaseNode.getQName.localName» {
639 «FOR childNode : choiceCaseNode.childNodes»
640 «writeDataSchemaNode(childNode)»
642 «IF isStatusDeprecated»
643 status «choiceCaseNode.status»;
649 def private static writeChoiceNode(ChoiceSchemaNode choiceNode) {
650 var boolean isStatusDeprecated = choiceNode.status == Status::DEPRECATED
652 choice «choiceNode.getQName.localName» {
653 «FOR child : choiceNode.cases»
654 «writeDataSchemaNode(child)»
656 «IF isStatusDeprecated»
657 status «choiceNode.status»;
663 def private static writeListSchemaNode(ListSchemaNode listSchemaNode) {
664 var boolean isStatusDeprecated = listSchemaNode.status == Status::DEPRECATED
667 list «listSchemaNode.getQName.localName» {
668 key «FOR listKey : listSchemaNode.keyDefinition SEPARATOR " "»"«listKey.localName»"
670 «IF !listSchemaNode.childNodes.nullOrEmpty»
671 «writeDataSchemaNodes(listSchemaNode.childNodes)»
673 «IF !listSchemaNode.availableAugmentations.nullOrEmpty»
674 «writeAugments(listSchemaNode.availableAugmentations)»
676 «IF !listSchemaNode.groupings.nullOrEmpty»
677 «writeGroupingDefs(listSchemaNode.groupings)»
679 «IF !listSchemaNode.uses.nullOrEmpty»
680 «writeUsesNodes(listSchemaNode.uses)»
682 «IF isStatusDeprecated»
683 status «listSchemaNode.status»;
685 «IF !listSchemaNode.unknownSchemaNodes.nullOrEmpty»
686 «writeUnknownSchemaNodes(listSchemaNode.unknownSchemaNodes)»
692 def private static CharSequence writeDataSchemaNode(DataSchemaNode child) {
694 «IF child instanceof ContainerSchemaNode»
695 «writeContSchemaNode(child)»
697 «IF child instanceof AnyXmlSchemaNode»
698 «writeAnyXmlSchemaNode(child)»
700 «IF child instanceof LeafSchemaNode»
701 «writeLeafSchemaNode(child)»
703 «IF child instanceof LeafListSchemaNode»
704 «writeLeafListSchemaNode(child)»
706 «IF child instanceof ChoiceCaseNode»
707 «writeChoiceCaseNode(child)»
709 «IF child instanceof ChoiceSchemaNode»
710 «writeChoiceNode(child)»
712 «IF child instanceof ListSchemaNode»
713 «writeListSchemaNode(child)»