BUG-1513: introduce ChoiceSchemaNode
[mdsal.git] / code-generator / binding-generator-impl / src / main / java / org / opendaylight / yangtools / sal / binding / generator / impl / YangTemplate.xtend
index 98d7ef1d9e120bc4540bf7fa7e8d910ac58cf125..913d68542a79a8b4c7e63eac7cf4e0994648d626 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.sal.binding.generator.impl
 
-import java.text.SimpleDateFormat
 import java.util.Collection
 import java.util.Date
 import java.util.List
@@ -18,7 +17,7 @@ import org.opendaylight.yangtools.yang.common.QName
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema
 import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode
-import org.opendaylight.yangtools.yang.model.api.ChoiceNode
+import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode
 import org.opendaylight.yangtools.yang.model.api.Deviation
@@ -40,45 +39,50 @@ import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode
 import org.opendaylight.yangtools.yang.model.api.UsesNode
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair
+import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil
+import com.google.common.base.CharMatcher
 
 class YangTemplate {
 
+    // FIXME: this is not thread-safe and seems to be unused!
     private static var Module module = null
 
+    private static val CharMatcher NEWLINE_OR_TAB = CharMatcher.anyOf("\n\t")
+
     def static String generateYangSnipet(SchemaNode schemaNode) {
         if (schemaNode == null)
             return ''
 
         '''
             «IF schemaNode instanceof DataSchemaNode»
-            «writeDataSchemaNode(schemaNode as DataSchemaNode
+            «writeDataSchemaNode(schemaNode)»
             «ENDIF»
             «IF schemaNode instanceof EnumTypeDefinition.EnumPair»
-            «writeEnumPair(schemaNode as EnumTypeDefinition.EnumPair
+            «writeEnumPair(schemaNode)»
             «ENDIF»
             «IF schemaNode instanceof ExtensionDefinition»
-            «writeExtension(schemaNode as ExtensionDefinition
+            «writeExtension(schemaNode)»
             «ENDIF»
             «IF schemaNode instanceof FeatureDefinition»
-            «writeFeature(schemaNode as FeatureDefinition
+            «writeFeature(schemaNode)»
             «ENDIF»
             «IF schemaNode instanceof GroupingDefinition»
-            «writeGroupingDef(schemaNode as GroupingDefinition
+            «writeGroupingDef(schemaNode)»
             «ENDIF»
             «IF schemaNode instanceof IdentitySchemaNode»
-            «writeIdentity(schemaNode as IdentitySchemaNode
+            «writeIdentity(schemaNode)»
             «ENDIF»
             «IF schemaNode instanceof NotificationDefinition»
-            «writeNotification(schemaNode as NotificationDefinition
+            «writeNotification(schemaNode)»
             «ENDIF»
             «IF schemaNode instanceof RpcDefinition»
-            «writeRPC(schemaNode as RpcDefinition
+            «writeRPC(schemaNode)»
             «ENDIF»
             «IF schemaNode instanceof TypeDefinition<?>»
-            «writeTypeDefinition(schemaNode as TypeDefinition<?>
+            «writeTypeDefinition(schemaNode)»
             «ENDIF»
             «IF schemaNode instanceof UnknownSchemaNode»
-            «writeUnknownSchemaNode(schemaNode as UnknownSchemaNode
+            «writeUnknownSchemaNode(schemaNode)»
             «ENDIF»
         '''
     }
@@ -90,7 +94,7 @@ class YangTemplate {
         '''
             «FOR node : nodes»
                 «IF node instanceof NotificationDefinition»
-                «writeNotification(node as NotificationDefinition
+                «writeNotification(node)»
                 «ELSEIF node instanceof RpcDefinition»
                 «writeRPC(node as RpcDefinition)»
                 «ENDIF»
@@ -121,16 +125,11 @@ class YangTemplate {
         '''
     }
 
-    def static formatDate(Date moduleRevision) {
-        val SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd")
-        return dateFormat.format(moduleRevision)
-    }
-
     def static writeRevision(Date moduleRevision, String moduleDescription) {
         val revisionIndent = 12
 
         '''
-            revision «formatDate(moduleRevision)» {
+            revision «SimpleDateFormatUtil.getRevisionFormat.format(moduleRevision)» {
                 description "«formatToParagraph(moduleDescription, revisionIndent)»";
             }
         '''
@@ -240,7 +239,7 @@ class YangTemplate {
 
         '''
             input {
-                «IF input instanceof DataSchemaNode && !input.childNodes.nullOrEmpty»
+                «IF !input.childNodes.nullOrEmpty»
                 «writeDataSchemaNodes(input.childNodes)»
                 «ENDIF»
             }
@@ -254,7 +253,7 @@ class YangTemplate {
 
         '''
             output {
-                «IF output instanceof DataSchemaNode && !output.childNodes.nullOrEmpty»
+                «IF !output.childNodes.nullOrEmpty»
                 «writeDataSchemaNodes(output.childNodes)»
                 «ENDIF»
             }
@@ -372,7 +371,7 @@ class YangTemplate {
         '''
             refine «path.pathFromRoot.last» {
                 «IF schemaNode instanceof DataSchemaNode»
-                «writeDataSchemaNode(schemaNode as DataSchemaNode
+                «writeDataSchemaNode(schemaNode)»
                 «ENDIF»
             }
         '''
@@ -646,7 +645,7 @@ class YangTemplate {
         '''
     }
 
-    def static writeChoiceNode(ChoiceNode choiceNode) {
+    def static writeChoiceNode(ChoiceSchemaNode choiceNode) {
         '''
             choice «choiceNode.getQName.localName» {
                 «FOR child : choiceNode.cases»
@@ -683,25 +682,25 @@ class YangTemplate {
     def static CharSequence writeDataSchemaNode(DataSchemaNode child) {
         '''
             «IF child instanceof ContainerSchemaNode»
-                «writeContSchemaNode(child as ContainerSchemaNode
+                «writeContSchemaNode(child)»
             «ENDIF»
             «IF child instanceof AnyXmlSchemaNode»
-                «writeAnyXmlSchemaNode(child as AnyXmlSchemaNode
+                «writeAnyXmlSchemaNode(child)»
             «ENDIF»
             «IF child instanceof LeafSchemaNode»
-                «writeLeafSchemaNode(child as LeafSchemaNode
+                «writeLeafSchemaNode(child)»
             «ENDIF»
             «IF child instanceof LeafListSchemaNode»
-                «writeLeafListSchemaNode(child as LeafListSchemaNode
+                «writeLeafListSchemaNode(child)»
             «ENDIF»
             «IF child instanceof ChoiceCaseNode»
-                «writeChoiceCaseNode(child as ChoiceCaseNode
+                «writeChoiceCaseNode(child)»
             «ENDIF»
-            «IF child instanceof ChoiceNode»
-                «writeChoiceNode(child as ChoiceNode
+            «IF child instanceof ChoiceSchemaNode»
+                «writeChoiceNode(child)»
             «ENDIF»
             «IF child instanceof ListSchemaNode»
-                «writeListSchemaNode(child as ListSchemaNode
+                «writeListSchemaNode(child)»
             «ENDIF»
         '''
     }
@@ -736,8 +735,7 @@ class YangTemplate {
         val lineIndent = computeNextLineIndent(nextLineIndent);
 
         formattedText = formattedText.replace("*/", "&#42;&#47;");
-        formattedText = formattedText.replace("\n", "");
-        formattedText = formattedText.replace("\t", "");
+        formattedText = NEWLINE_OR_TAB.removeFrom(formattedText);
         formattedText = formattedText.replaceAll(" +", " ");
 
         val StringTokenizer tokenizer = new StringTokenizer(formattedText, " ", true);
@@ -785,8 +783,7 @@ class YangTemplate {
             val ns = pathElement.namespace
             val localName = pathElement.localName
 
-            sb.append("\\")
-            sb.append('(')
+            sb.append("\\(")
             sb.append(ns)
             sb.append(')')
             sb.append(localName)