Updated code generation
[yangtools.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\r
10 \r
11 \r
12 /**\r
13  * Template for generating JAVA interfaces. \r
14  */\r
15 class InterfaceTemplate extends BaseTemplate {\r
16     \r
17     /**\r
18      * List of constant instances which are generated as JAVA public static final attributes.\r
19      */\r
20     val List<Constant> consts\r
21     \r
22     /**\r
23      * List of method signatures which are generated as method declarations.\r
24      */\r
25     val List<MethodSignature> methods\r
26     \r
27     /**\r
28      * List of enumeration which are generated as JAVA enum type.\r
29      */\r
30     val List<Enumeration> enums\r
31     \r
32     /**\r
33      * List of generated types which are enclosed inside <code>genType</code>\r
34      */\r
35     val List<GeneratedType> enclosedGeneratedTypes\r
36     \r
37     /**\r
38      * Creates the instance of this class which is used for generating the interface file source \r
39      * code from <code>genType</code>.\r
40      * \r
41      * @throws IllegalArgumentException if <code>genType</code> equals <code>null</code>\r
42      */\r
43     new(GeneratedType genType) {\r
44         super(genType)\r
45         if (genType == null) {\r
46             throw new IllegalArgumentException("Generated type reference cannot be NULL!")\r
47         }\r
48         \r
49         consts = genType.constantDefinitions\r
50         methods = genType.methodDefinitions\r
51         enums = genType.enumerations\r
52         enclosedGeneratedTypes = genType.enclosedTypes\r
53     }\r
54     \r
55 \r
56     \r
57     /**\r
58      * Template method which generate the whole body of the interface.\r
59      * \r
60      * @return string with code for interface body in JAVA format\r
61      */\r
62     override body() '''\r
63         «type.comment.generateComment»\r
64         public interface «type.name»\r
65             «superInterfaces» {\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     /**\r
95      * Template method which generates the interface name declaration.\r
96      * \r
97      * @return string with the code for the interface declaration in JAVA format\r
98      */\r
99     def private superInterfaces() \r
100     '''\r
101     «IF (!type.implements.empty)»\r
102          extends\r
103          «FOR type : type.implements SEPARATOR ","»\r
104          \r
105              «type.importedName»\r
106          «ENDFOR»\r
107      « ENDIF»\r
108      '''\r
109     /**\r
110      * Template method which generates inner classes inside this interface.\r
111      * \r
112      * @return string with the source code for inner classes in JAVA format\r
113      */\r
114     def private generateInnerClasses() '''\r
115         «IF !enclosedGeneratedTypes.empty»\r
116             «FOR innerClass : enclosedGeneratedTypes SEPARATOR "\n"»\r
117                 «IF (innerClass instanceof GeneratedTransferObject)»\r
118                     «val classTemplate = new ClassTemplate(innerClass as GeneratedTransferObject)»\r
119                     «classTemplate.generateAsInnerClass»\r
120                     \r
121                 «ENDIF»\r
122             «ENDFOR»\r
123         «ENDIF»\r
124     '''\r
125 \r
126     /**\r
127      * Template method which generates JAVA enum type.\r
128      * \r
129      * @return string with inner enum source code in JAVA format\r
130      */    \r
131     def private generateEnums() '''\r
132         «IF !enums.empty»\r
133             «FOR e : enums SEPARATOR "\n"»\r
134                 «val enumTemplate = new EnumTemplate(e)»\r
135                 «enumTemplate.generateAsInnerClass»\r
136             «ENDFOR»\r
137         «ENDIF»\r
138     '''\r
139     \r
140     /**\r
141      * Template method wich generates JAVA constants.\r
142      * \r
143      * @return string with constants in JAVA format \r
144      */    \r
145     def private generateConstants() '''\r
146         «IF !consts.empty»\r
147             «FOR c : consts»\r
148                 «IF c.name != TypeConstants.PATTERN_CONSTANT_NAME»\r
149                     public static final «c.type.importedName» «c.name» = «c.value»;\r
150                 «ENDIF»\r
151             «ENDFOR»\r
152         «ENDIF»\r
153     '''\r
154 \r
155     /**\r
156      * Template method which generates the declaration of the methods.\r
157      * \r
158      * @return string with the declaration of methods source code in JAVA format \r
159      */    \r
160     def private generateMethods() '''\r
161         «IF !methods.empty»\r
162             «FOR m : methods SEPARATOR "\n"»\r
163                 «m.comment.generateComment»\r
164                 «m.returnType.importedName» «m.name»(«m.parameters.generateParameters»);\r
165             «ENDFOR»\r
166         «ENDIF»\r
167     '''\r
168     \r
169     /**\r
170      * Template method which generates method parameters with their types from <code>parameters</code>.\r
171      * \r
172      * @param parameters\r
173      * list of parameter instances which are transformed to the method parameters\r
174      * @return string with the list of the method parameters with their types in JAVA format\r
175      */\r
176     def private generateParameters(List<MethodSignature.Parameter> parameters) '''«\r
177         IF !parameters.empty»«\r
178             FOR parameter : parameters SEPARATOR ", "»«\r
179                 parameter.type.importedName» «parameter.name»«\r
180             ENDFOR»«\r
181         ENDIF\r
182     »'''\r
183 \r
184     \r
185 }\r
186 \r