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