Added support for yang-ext:context-reference extension.
[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\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      * Template method which generates inner classes inside this interface.\r
125      * \r
126      * @return string with the source code for inner classes in JAVA format\r
127      */\r
128     def private generateInnerClasses() '''\r
129         «IF !enclosedGeneratedTypes.empty»\r
130             «FOR innerClass : enclosedGeneratedTypes SEPARATOR "\n"»\r
131                 «IF (innerClass instanceof GeneratedTransferObject)»\r
132                     «val classTemplate = new ClassTemplate(innerClass as GeneratedTransferObject)»\r
133                     «classTemplate.generateAsInnerClass»\r
134                     \r
135                 «ENDIF»\r
136             «ENDFOR»\r
137         «ENDIF»\r
138     '''\r
139 \r
140     /**\r
141      * Template method which generates JAVA enum type.\r
142      * \r
143      * @return string with inner enum source code in JAVA format\r
144      */    \r
145     def private generateEnums() '''\r
146         «IF !enums.empty»\r
147             «FOR e : enums SEPARATOR "\n"»\r
148                 «val enumTemplate = new EnumTemplate(e)»\r
149                 «enumTemplate.generateAsInnerClass»\r
150             «ENDFOR»\r
151         «ENDIF»\r
152     '''\r
153     \r
154     /**\r
155      * Template method wich generates JAVA constants.\r
156      * \r
157      * @return string with constants in JAVA format \r
158      */    \r
159     def private generateConstants() '''\r
160         «IF !consts.empty»\r
161             «FOR c : consts»\r
162                 «IF c.name != TypeConstants.PATTERN_CONSTANT_NAME»\r
163                     public static final «c.type.importedName» «c.name» = «c.value»;\r
164                 «ENDIF»\r
165             «ENDFOR»\r
166         «ENDIF»\r
167     '''\r
168 \r
169     /**\r
170      * Template method which generates the declaration of the methods.\r
171      * \r
172      * @return string with the declaration of methods source code in JAVA format \r
173      */    \r
174     def private generateMethods() '''\r
175         «IF !methods.empty»\r
176             «FOR m : methods SEPARATOR "\n"»\r
177                 «m.comment.generateComment»\r
178                 «m.annotations.generateAnnotations»\r
179                 «m.returnType.importedName» «m.name»(«m.parameters.generateParameters»);\r
180             «ENDFOR»\r
181         «ENDIF»\r
182     '''\r
183     \r
184     /**\r
185      * Template method which generates method parameters with their types from <code>parameters</code>.\r
186      * \r
187      * @param parameters\r
188      * list of parameter instances which are transformed to the method parameters\r
189      * @return string with the list of the method parameters with their types in JAVA format\r
190      */\r
191     def private generateParameters(List<MethodSignature.Parameter> parameters) '''«\r
192         IF !parameters.empty»«\r
193             FOR parameter : parameters SEPARATOR ", "»«\r
194                 parameter.type.importedName» «parameter.name»«\r
195             ENDFOR»«\r
196         ENDIF\r
197     »'''\r
198 \r
199     \r
200 }\r
201 \r