Updated code generation
[yangtools.git] / code-generator / binding-java-api-generator / src / main / java / org / opendaylight / yangtools / sal / java / api / generator / InterfaceTemplate.xtend
index 70ea929bc3aef6ba2a9056440dcbee1bfda917b4..0ebc3ccbe99b83ae25a4695b99aee8c5631a2637 100644 (file)
-package org.opendaylight.yangtools.sal.java.api.generator
-
-import java.util.List
-import java.util.Map
-import org.opendaylight.yangtools.binding.generator.util.TypeConstants
-import org.opendaylight.yangtools.sal.binding.model.api.Constant
-import org.opendaylight.yangtools.sal.binding.model.api.Enumeration
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType
-import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature
-import org.opendaylight.yangtools.sal.binding.model.api.Type
-import java.util.LinkedHashMap
-/**
- * Template for generating JAVA interfaces. 
- */
-class InterfaceTemplate {
-    
-    /**
-     * Generated type which is transformed to interface JAVA file.
-     */
-    val GeneratedType genType
-    
-    /**
-     * Map of imports for this <code>genTO</code>.
-     */
-    val Map<String, String> imports
-    
-    /**
-     * List of constant instances which are generated as JAVA public static final attributes.
-     */
-    val List<Constant> consts
-    
-    /**
-     * List of method signatures which are generated as method declarations.
-     */
-    val List<MethodSignature> methods
-    
-    /**
-     * List of enumeration which are generated as JAVA enum type.
-     */
-    val List<Enumeration> enums
-    
-    /**
-     * List of generated types which are enclosed inside <code>genType</code>
-     */
-    val List<GeneratedType> enclosedGeneratedTypes
-    
-    /**
-     * Creates the instance of this class which is used for generating the interface file source 
-     * code from <code>genType</code>.
-     * 
-     * @throws IllegalArgumentException if <code>genType</code> equals <code>null</code>
-     */
-    new(GeneratedType genType) {
-        if (genType == null) {
-            throw new IllegalArgumentException("Generated type reference cannot be NULL!")
-        }
-        
-        this.genType = genType
-        imports = GeneratorUtil.createImports(genType)
-        consts = genType.constantDefinitions
-        methods = genType.methodDefinitions
-        enums = genType.enumerations
-        enclosedGeneratedTypes = genType.enclosedTypes
-    }
-    
-    /**
-     * Generates the source code for interface with package name, imports and interface body.
-     * 
-     * @return string with the code for the interface file in JAVA format
-     */
-    def String generate() {
-        val body = generateBody
-        val pkgAndImports = generatePkgAndImports
-        return pkgAndImports.toString + body.toString
-    }
-    
-    /**
-     * Template method which generate the whole body of the interface.
-     * 
-     * @return string with code for interface body in JAVA format
-     */
-    def private generateBody() '''
-        «genType.comment.generateComment»
-        «generateIfcDeclaration» {
-        
-            «generateInnerClasses»
-        
-            «generateEnums»
-        
-            «generateConstants»
-        
-            «generateMethods»
-        
-        }
-        
-    '''
-    
-    /**
-     * Template method which generates JAVA comment.
-     * 
-     * @param comment 
-     * string with the comment for whole JAVA interface
-     * @return string with comment in JAVA format
-     */
-    def private generateComment(String comment) '''
-        «IF comment != null && !comment.empty»
-            /*
-            «comment»
-            */
-        «ENDIF»
-    '''
-    
-    /**
-     * Template method which generates the interface name declaration.
-     * 
-     * @return string with the code for the interface declaration in JAVA format
-     */
-    def private generateIfcDeclaration() '''
-        public interface «genType.name»«
-        IF (!genType.implements.empty)»«
-            " extends "»«
-            FOR type : genType.implements SEPARATOR ", "»«
-                type.resolveName»«
-            ENDFOR»«
-        ENDIF
-    »'''
-    
-    /**
-     * Template method which generates inner classes inside this interface.
-     * 
-     * @return string with the source code for inner classes in JAVA format
-     */
-    def private generateInnerClasses() '''
-        «IF !enclosedGeneratedTypes.empty»
-            «FOR innerClass : enclosedGeneratedTypes SEPARATOR "\n"»
-                «IF (innerClass instanceof GeneratedTransferObject)»
-                    «val classTemplate = new ClassTemplate(innerClass as GeneratedTransferObject)»
-                    «classTemplate.generateAsInnerClass»
-                    
-                «ENDIF»
-            «ENDFOR»
-        «ENDIF»
-    '''
-
-    /**
-     * Template method which generates JAVA enum type.
-     * 
-     * @return string with inner enum source code in JAVA format
-     */    
-    def private generateEnums() '''
-        «IF !enums.empty»
-            «FOR e : enums SEPARATOR "\n"»
-                «val enumTemplate = new EnumTemplate(e)»
-                «enumTemplate.generateAsInnerClass»
-            «ENDFOR»
-        «ENDIF»
-    '''
-    
-    /**
-     * Template method wich generates JAVA constants.
-     * 
-     * @return string with constants in JAVA format 
-     */    
-    def private generateConstants() '''
-        «IF !consts.empty»
-            «FOR c : consts»
-                «IF c.name != TypeConstants.PATTERN_CONSTANT_NAME»
-                    public static final «c.type.resolveName» «c.name» = «c.value»;
-                «ENDIF»
-            «ENDFOR»
-        «ENDIF»
-    '''
-
-    /**
-     * Template method which generates the declaration of the methods.
-     * 
-     * @return string with the declaration of methods source code in JAVA format 
-     */    
-    def private generateMethods() '''
-        «IF !methods.empty»
-            «FOR m : methods SEPARATOR "\n"»
-                «m.comment.generateComment»
-                «m.returnType.resolveName» «m.name»(«m.parameters.generateParameters»);
-            «ENDFOR»
-        «ENDIF»
-    '''
-    
-    /**
-     * Template method which generates method parameters with their types from <code>parameters</code>.
-     * 
-     * @param parameters
-     * list of parameter instances which are transformed to the method parameters
-     * @return string with the list of the method parameters with their types in JAVA format
-     */
-    def private generateParameters(List<MethodSignature.Parameter> parameters) '''«
-        IF !parameters.empty»«
-            FOR parameter : parameters SEPARATOR ", "»«
-                parameter.type.resolveName» «parameter.name»«
-            ENDFOR»«
-        ENDIF
-    »'''
-    
-
-    /**
-     * Template method which generates the map of all the required imports for and imports 
-     * from extended type (and recursivelly so on).
-     * 
-     * @return map which maps type name to package name   
-     */
-    def private Map<String, String> resolveImports() {
-        val innerTypeImports = GeneratorUtil.createChildImports(genType)
-        val Map<String, String> resolvedImports = new LinkedHashMap
-        for (Map.Entry<String, String> entry : imports.entrySet() + innerTypeImports.entrySet) {
-            val typeName = entry.getKey();
-            val packageName = entry.getValue();
-            if (packageName != genType.packageName && packageName != genType.fullyQualifiedName) {
-                resolvedImports.put(typeName, packageName);
-            }
-        }
-        return resolvedImports
-    }
-    
-    /**
-     * Template method which generate package name line and import lines.
-     * 
-     * @result string with package and import lines in JAVA format
-     */    
-    def private generatePkgAndImports() '''
-        package «genType.packageName»;
-        
-        
-        «IF !imports.empty»
-            «FOR entry : resolveImports.entrySet»
-                import «entry.value».«entry.key»;
-            «ENDFOR»
-        «ENDIF»
-        
-    '''    
-    
-    /**
-     * Adds package to imports if it is necessary and returns necessary type name (with or without package name)
-     *  
-     * @param type JAVA <code>Type</code> 
-     * @return string with the type name (with or without package name)
-     */      
-    def private resolveName(Type type) {
-        GeneratorUtil.putTypeIntoImports(genType, type, imports);
-        GeneratorUtil.getExplicitType(genType, type, imports)
-    }
-    
-}   
\ No newline at end of file
+package org.opendaylight.yangtools.sal.java.api.generator\r
+\r
+import java.util.List\r
+import org.opendaylight.yangtools.binding.generator.util.TypeConstants\r
+import org.opendaylight.yangtools.sal.binding.model.api.Constant\r
+import org.opendaylight.yangtools.sal.binding.model.api.Enumeration\r
+import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject\r
+import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType\r
+import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature\r
+\r
+\r
+/**\r
+ * Template for generating JAVA interfaces. \r
+ */\r
+class InterfaceTemplate extends BaseTemplate {\r
+    \r
+    /**\r
+     * List of constant instances which are generated as JAVA public static final attributes.\r
+     */\r
+    val List<Constant> consts\r
+    \r
+    /**\r
+     * List of method signatures which are generated as method declarations.\r
+     */\r
+    val List<MethodSignature> methods\r
+    \r
+    /**\r
+     * List of enumeration which are generated as JAVA enum type.\r
+     */\r
+    val List<Enumeration> enums\r
+    \r
+    /**\r
+     * List of generated types which are enclosed inside <code>genType</code>\r
+     */\r
+    val List<GeneratedType> enclosedGeneratedTypes\r
+    \r
+    /**\r
+     * Creates the instance of this class which is used for generating the interface file source \r
+     * code from <code>genType</code>.\r
+     * \r
+     * @throws IllegalArgumentException if <code>genType</code> equals <code>null</code>\r
+     */\r
+    new(GeneratedType genType) {\r
+        super(genType)\r
+        if (genType == null) {\r
+            throw new IllegalArgumentException("Generated type reference cannot be NULL!")\r
+        }\r
+        \r
+        consts = genType.constantDefinitions\r
+        methods = genType.methodDefinitions\r
+        enums = genType.enumerations\r
+        enclosedGeneratedTypes = genType.enclosedTypes\r
+    }\r
+    \r
+\r
+    \r
+    /**\r
+     * Template method which generate the whole body of the interface.\r
+     * \r
+     * @return string with code for interface body in JAVA format\r
+     */\r
+    override body() '''\r
+        «type.comment.generateComment»\r
+        public interface «type.name»\r
+            «superInterfaces» {\r
+        \r
+            «generateInnerClasses»\r
+        \r
+            «generateEnums»\r
+        \r
+            «generateConstants»\r
+        \r
+            «generateMethods»\r
+        \r
+        }\r
+        \r
+    '''\r
+    \r
+    /**\r
+     * Template method which generates JAVA comment.\r
+     * \r
+     * @param comment \r
+     * string with the comment for whole JAVA interface\r
+     * @return string with comment in JAVA format\r
+     */\r
+    def private generateComment(String comment) '''\r
+        «IF comment != null && !comment.empty»\r
+            /*\r
+            «comment»\r
+            */\r
+        «ENDIF»\r
+    '''\r
+    \r
+    /**\r
+     * Template method which generates the interface name declaration.\r
+     * \r
+     * @return string with the code for the interface declaration in JAVA format\r
+     */\r
+    def private superInterfaces() \r
+    '''\r
+    «IF (!type.implements.empty)»\r
+         extends\r
+         «FOR type : type.implements SEPARATOR ","»\r
+         \r
+             «type.importedName»\r
+         «ENDFOR»\r
+     « ENDIF»\r
+     '''\r
+    /**\r
+     * Template method which generates inner classes inside this interface.\r
+     * \r
+     * @return string with the source code for inner classes in JAVA format\r
+     */\r
+    def private generateInnerClasses() '''\r
+        «IF !enclosedGeneratedTypes.empty»\r
+            «FOR innerClass : enclosedGeneratedTypes SEPARATOR "\n"»\r
+                «IF (innerClass instanceof GeneratedTransferObject)»\r
+                    «val classTemplate = new ClassTemplate(innerClass as GeneratedTransferObject)»\r
+                    «classTemplate.generateAsInnerClass»\r
+                    \r
+                «ENDIF»\r
+            «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+\r
+    /**\r
+     * Template method which generates JAVA enum type.\r
+     * \r
+     * @return string with inner enum source code in JAVA format\r
+     */    \r
+    def private generateEnums() '''\r
+        «IF !enums.empty»\r
+            «FOR e : enums SEPARATOR "\n"»\r
+                «val enumTemplate = new EnumTemplate(e)»\r
+                «enumTemplate.generateAsInnerClass»\r
+            «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+    \r
+    /**\r
+     * Template method wich generates JAVA constants.\r
+     * \r
+     * @return string with constants in JAVA format \r
+     */    \r
+    def private generateConstants() '''\r
+        «IF !consts.empty»\r
+            «FOR c : consts»\r
+                «IF c.name != TypeConstants.PATTERN_CONSTANT_NAME»\r
+                    public static final «c.type.importedName» «c.name» = «c.value»;\r
+                «ENDIF»\r
+            «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+\r
+    /**\r
+     * Template method which generates the declaration of the methods.\r
+     * \r
+     * @return string with the declaration of methods source code in JAVA format \r
+     */    \r
+    def private generateMethods() '''\r
+        «IF !methods.empty»\r
+            «FOR m : methods SEPARATOR "\n"»\r
+                «m.comment.generateComment»\r
+                «m.returnType.importedName» «m.name»(«m.parameters.generateParameters»);\r
+            «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+    \r
+    /**\r
+     * Template method which generates method parameters with their types from <code>parameters</code>.\r
+     * \r
+     * @param parameters\r
+     * list of parameter instances which are transformed to the method parameters\r
+     * @return string with the list of the method parameters with their types in JAVA format\r
+     */\r
+    def private generateParameters(List<MethodSignature.Parameter> parameters) '''«\r
+        IF !parameters.empty»«\r
+            FOR parameter : parameters SEPARATOR ", "»«\r
+                parameter.type.importedName» «parameter.name»«\r
+            ENDFOR»«\r
+        ENDIF\r
+    »'''\r
+\r
+    \r
+}\r
+\r