Generation of java files from templates
[controller.git] / opendaylight / sal / yang-prototype / code-generator / binding-java-api-generator / src / main / java / org / opendaylight / controller / sal / java / api / generator / InterfaceTemplate.xtend
1 package org.opendaylight.controller.sal.java.api.generator
2
3 import java.util.List
4 import java.util.Map
5 import org.opendaylight.controller.binding.generator.util.TypeConstants
6 import org.opendaylight.controller.sal.binding.model.api.Constant
7 import org.opendaylight.controller.sal.binding.model.api.Enumeration
8 import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject
9 import org.opendaylight.controller.sal.binding.model.api.GeneratedType
10 import org.opendaylight.controller.sal.binding.model.api.MethodSignature
11 import org.opendaylight.controller.sal.binding.model.api.Type
12 import java.util.LinkedHashMap
13
14 class InterfaceTemplate {
15     
16     val GeneratedType genType
17     val Map<String, String> imports
18     val List<Constant> consts
19     val List<MethodSignature> methods
20     val List<Enumeration> enums
21     val List<GeneratedType> enclosedGeneratedTypes
22     
23     new(GeneratedType genType) {
24         if (genType == null) {
25             throw new IllegalArgumentException("Generated type reference cannot be NULL!")
26         }
27         
28         this.genType = genType
29         imports = GeneratorUtil.createImports(genType)
30         consts = genType.constantDefinitions
31         methods = genType.methodDefinitions
32         enums = genType.enumerations
33         enclosedGeneratedTypes = genType.enclosedTypes
34     }
35     
36     def generate() {
37         val body = generateBody
38         val pkgAndImports = generatePkgAndImports
39         return pkgAndImports.toString + body.toString
40     }
41     
42     def private generateBody() '''
43         «genType.comment.generateComment»
44         «generateIfcDeclaration» {
45         
46             «generateInnerClasses»
47         
48             «generateEnums»
49         
50             «generateConstants»
51         
52             «generateMethods»
53         
54         }
55         
56     '''
57     
58     def private generateComment(String comment) '''
59         «IF comment != null && !comment.empty»
60             /*
61             «comment»
62             */
63         «ENDIF»
64     '''
65     
66     def private generateIfcDeclaration() '''
67         public interface «genType.name»«
68         IF (!genType.implements.empty)»«
69             " extends "»«
70             FOR type : genType.implements SEPARATOR ", "»«
71                 type.resolveName»«
72             ENDFOR»«
73         ENDIF
74     »'''
75     
76     def private generateInnerClasses() '''
77         «IF !enclosedGeneratedTypes.empty»
78             «FOR innerClass : enclosedGeneratedTypes SEPARATOR "\n"»
79                 «IF (innerClass instanceof GeneratedTransferObject)»
80                     «val classTemplate = new ClassTemplate(innerClass as GeneratedTransferObject)»
81                     «classTemplate.generateAsInnerClass»
82                 «ENDIF»
83             «ENDFOR»
84         «ENDIF»
85     '''
86     
87     def private generateEnums() '''
88         «IF !enums.empty»
89             «FOR e : enums SEPARATOR "\n"»
90                 «val enumTemplate = new EnumTemplate(e)»
91                 «enumTemplate.generateAsInnerClass»
92             «ENDFOR»
93         «ENDIF»
94     '''
95     
96     def private generateConstants() '''
97         «IF !consts.empty»
98             «FOR c : consts»
99                 «IF c.name != TypeConstants.PATTERN_CONSTANT_NAME»
100                     public static final «c.type.resolveName» «c.name» = «c.value»;
101                 «ENDIF»
102             «ENDFOR»
103         «ENDIF»
104     '''
105     
106     def private generateMethods() '''
107         «IF !methods.empty»
108             «FOR m : methods SEPARATOR "\n"»
109                 «m.comment.generateComment»
110                 «m.returnType.resolveName» «m.name»(«m.parameters.generateParameters»);
111             «ENDFOR»
112         «ENDIF»
113     '''
114     
115     def private generateParameters(List<MethodSignature.Parameter> parameters) '''«
116         IF !parameters.empty»«
117             FOR parameter : parameters SEPARATOR ", "»«
118                 parameter.type.resolveName» «parameter.name»«
119             ENDFOR»«
120         ENDIF
121     »'''
122     
123     def private generatePkgAndImports() '''
124         package «genType.packageName»;
125         
126         
127         «IF !imports.empty»
128             «FOR entry : resolveImports.entrySet»
129                 import «entry.value».«entry.key»;
130             «ENDFOR»
131         «ENDIF»
132         
133     '''
134     
135     def private Map<String, String> resolveImports() {
136         val innerTypeImports = GeneratorUtil.createChildImports(genType)
137         val Map<String, String> resolvedImports = new LinkedHashMap
138         for (Map.Entry<String, String> entry : imports.entrySet() + innerTypeImports.entrySet) {
139             val typeName = entry.getKey();
140             val packageName = entry.getValue();
141             if (packageName != genType.packageName && packageName != genType.fullyQualifiedName) {
142                 resolvedImports.put(typeName, packageName);
143             }
144         }
145         return resolvedImports
146     }
147     
148     def private resolveName(Type type) {
149         GeneratorUtil.putTypeIntoImports(genType, type, imports);
150         GeneratorUtil.getExplicitType(genType, type, imports)
151     }
152     
153 }