Implemented build of default instance for union types.
[mdsal.git] / code-generator / binding-java-api-generator / src / main / java / org / opendaylight / yangtools / sal / java / api / generator / InterfaceTemplate.xtend
1 package org.opendaylight.yangtools.sal.java.api.generator\r
2 \r
3 import java.util.List\r
4 import org.opendaylight.yangtools.binding.generator.util.TypeConstants\r
5 import org.opendaylight.yangtools.sal.binding.model.api.Constant\r
6 import org.opendaylight.yangtools.sal.binding.model.api.Enumeration\r
7 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject\r
8 import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType\r
9 import org.opendaylight.yangtools.sal.binding.model.api.MethodSignature\rimport org.opendaylight.yangtools.sal.binding.model.api.AnnotationType
10
11 /**\r
12  * Template for generating JAVA interfaces. \r
13  */\r
14 class InterfaceTemplate extends BaseTemplate {\r
15     \r
16     /**\r
17      * List of constant instances which are generated as JAVA public static final attributes.\r
18      */\r
19     val List<Constant> consts\r
20     \r
21     /**\r
22      * List of method signatures which are generated as method declarations.\r
23      */\r
24     val List<MethodSignature> methods\r
25     \r
26     /**\r
27      * List of enumeration which are generated as JAVA enum type.\r
28      */\r
29     val List<Enumeration> enums\r
30     \r
31     /**\r
32      * List of generated types which are enclosed inside <code>genType</code>\r
33      */\r
34     val List<GeneratedType> enclosedGeneratedTypes\r
35     \r
36     /**\r
37      * Creates the instance of this class which is used for generating the interface file source \r
38      * code from <code>genType</code>.\r
39      * \r
40      * @throws IllegalArgumentException if <code>genType</code> equals <code>null</code>\r
41      */\r
42     new(GeneratedType genType) {\r
43         super(genType)\r
44         if (genType == null) {\r
45             throw new IllegalArgumentException("Generated type reference cannot be NULL!")\r
46         }\r
47         \r
48         consts = genType.constantDefinitions\r
49         methods = genType.methodDefinitions\r
50         enums = genType.enumerations\r
51         enclosedGeneratedTypes = genType.enclosedTypes\r
52     }\r
53     \r
54 \r
55     \r
56     /**\r
57      * Template method which generate the whole body of the interface.\r
58      * \r
59      * @return string with code for interface body in JAVA format\r
60      */\r
61     override body() '''\r
62         «type.comment.generateComment»\r
63         public interface «type.name»\r
64             «superInterfaces»\r
65         {\r
66         \r
67             «generateInnerClasses»\r
68         \r
69             «generateEnums»\r
70         \r
71             «generateConstants»\r
72         \r
73             «generateMethods»\r
74         \r
75         }\r
76         \r
77     '''\r
78     \r
79     /**\r
80      * Template method which generates JAVA comment.\r
81      * \r
82      * @param comment \r
83      * string with the comment for whole JAVA interface\r
84      * @return string with comment in JAVA format\r
85      */\r
86     def private generateComment(String comment) '''\r
87         «IF comment != null && !comment.empty»\r
88             /*\r
89             «comment»\r
90             */\r
91         «ENDIF»\r
92     '''\r
93 \r
94     def private generateAnnotations(List<AnnotationType> annotations) '''\r
95         «IF annotations != null && !annotations.empty»\r
96             «FOR annotation : annotations»\r
97                 @«annotation.name»\r
98                 «IF annotation.parameters != null && !annotation.parameters.empty»\r
99                 (\r
100                 «FOR param : annotation.parameters SEPARATOR ","»\r
101                     «param.name»=«param.value»\r
102                 «ENDFOR»\r
103                 )\r
104                 «ENDIF»\r
105             «ENDFOR»\r
106         «ENDIF»\r
107     '''\r
108 \r
109     /**\r
110      * Template method which generates the interface name declaration.\r
111      * \r
112      * @return string with the code for the interface declaration in JAVA format\r
113      */\r
114     def private superInterfaces() \r
115     '''\r
116     «IF (!type.implements.empty)»\r
117          extends\r
118          «FOR type : type.implements SEPARATOR ","»\r
119              «type.importedName»\r
120          «ENDFOR»\r
121      « ENDIF»\r
122      '''\r
123 \r
124     /**\r
125      * Template method which generates inner classes inside this interface.\r
126      * \r
127      * @return string with the source code for inner classes in JAVA format\r
128      */\r
129     def private generateInnerClasses() '''\r
130         «IF !enclosedGeneratedTypes.empty»\r
131             «FOR innerClass : enclosedGeneratedTypes SEPARATOR "\n"»\r
132                 «IF (innerClass instanceof GeneratedTransferObject)»\r
133                     «IF (innerClass as GeneratedTransferObject).unionType»\r
134                         «val unionTemplate = new UnionTemplate(innerClass as GeneratedTransferObject)»\r
135                         «unionTemplate.generateAsInnerClass»\r
136                         «this.importMap.putAll(unionTemplate.importMap)»\r
137                     «ELSE»\r
138                         «val classTemplate = new ClassTemplate(innerClass as GeneratedTransferObject)»\r
139                         «classTemplate.generateAsInnerClass»\r
140                         «this.importMap.putAll(classTemplate.importMap)»\r
141                     «ENDIF»\r
142 \r
143                 «ENDIF»\r
144             «ENDFOR»\r
145         «ENDIF»\r
146     '''\r
147 \r
148     /**\r
149      * Template method which generates JAVA enum type.\r
150      * \r
151      * @return string with inner enum source code in JAVA format\r
152      */    \r
153     def private generateEnums() '''\r
154         «IF !enums.empty»\r
155             «FOR e : enums SEPARATOR "\n"»\r
156                 «val enumTemplate = new EnumTemplate(e)»\r
157                 «enumTemplate.generateAsInnerClass»\r
158             «ENDFOR»\r
159         «ENDIF»\r
160     '''\r
161     \r
162     /**\r
163      * Template method wich generates JAVA constants.\r
164      * \r
165      * @return string with constants in JAVA format \r
166      */    \r
167     def private generateConstants() '''\r
168         «IF !consts.empty»\r
169             «FOR c : consts»\r
170                 «IF c.name != TypeConstants.PATTERN_CONSTANT_NAME»\r
171                     public static final «c.type.importedName» «c.name» = «c.value»;\r
172                 «ENDIF»\r
173             «ENDFOR»\r
174         «ENDIF»\r
175     '''\r
176 \r
177     /**\r
178      * Template method which generates the declaration of the methods.\r
179      * \r
180      * @return string with the declaration of methods source code in JAVA format \r
181      */    \r
182     def private generateMethods() '''\r
183         «IF !methods.empty»\r
184             «FOR m : methods SEPARATOR "\n"»\r
185                 «m.comment.generateComment»\r
186                 «m.annotations.generateAnnotations»\r
187                 «m.returnType.importedName» «m.name»(«m.parameters.generateParameters»);\r
188             «ENDFOR»\r
189         «ENDIF»\r
190     '''\r
191 \r
192 }\r
193 \r