484fbfb3dba45c78de72109307779d0a3480f739
[controller.git] / opendaylight / sal / yang-prototype / code-generator / binding-java-api-generator / src / main / java / org / opendaylight / controller / sal / java / api / generator / BuilderTemplate.xtend
1 package org.opendaylight.controller.sal.java.api.generator
2
3 import java.util.List
4 import java.util.Set
5
6 class BuilderTemplate {
7
8     val static BUILDER = 'Builder'
9     val static IMPL = 'Impl'
10
11     def generate(BuilderClassDescriptor cd) '''
12         package «cd.packageName»;
13         «IF !cd.importsNames.empty»
14             
15             «FOR in : cd.importsNames»
16                 import «in»;
17             «ENDFOR»
18         «ENDIF»
19         
20         public class «cd.className»«BUILDER» {
21         
22             «fields(cd.fields, cd.augmentField)»
23
24             «IF !cd.fields.empty»
25                 «FOR field : cd.fields SEPARATOR '\n'»
26                     public «cd.className»«BUILDER» set«field.name.toFirstUpper»(«field.type.name»«field.type.generics.print» «field.name») {
27                         this.«field.name» = «field.name»;
28                         return this;
29                     }
30                 «ENDFOR»
31             «ENDIF»
32             «IF cd.augmentField != null»
33                 
34                 public «cd.className»«BUILDER» add«cd.augmentField.name.toFirstUpper»(Class<? extends «cd.augmentField.type.name»«cd.augmentField.type.generics.print»> augmentationType, «cd.augmentField.type.name»«cd.augmentField.type.generics.print» augmentation) {
35                     this.«cd.augmentField.name».put(augmentationType, augmentation);
36                     return this;
37                 }
38             «ENDIF»
39
40             public «cd.className» build() {
41                 return new «cd.className»«IMPL»();
42             }
43
44             private class «cd.className»«IMPL» implements «cd.className» {
45
46                 «fields(cd.fields, cd.augmentField)»
47
48                 private «cd.className»«IMPL»() {
49                     «IF !cd.fields.empty»
50                         «FOR field : cd.fields»
51                             this.«field.name» = «cd.className»«BUILDER».this.«field.name»;
52                         «ENDFOR»
53                     «ENDIF»
54                     «IF cd.augmentField != null»
55                         this.«cd.augmentField.name».putAll(«cd.className»«BUILDER».this.«cd.augmentField.name»);
56                     «ENDIF»
57                 }
58
59                 «IF !cd.fields.empty»
60                     «FOR field : cd.fields SEPARATOR '\n'»
61                         @Override
62                         public «field.type.name»«field.type.generics.print» get«field.name.toFirstUpper»() {
63                             return «field.name»;
64                         }
65                     «ENDFOR»
66                 «ENDIF»
67                 «IF cd.augmentField != null»
68
69                     @Override
70                     public <E extends «cd.augmentField.type.name»«cd.augmentField.type.generics.print»> E get«cd.augmentField.name.toFirstUpper»(Class<E> augmentationType) {
71                         if (augmentationType == null) {
72                             throw new IllegalArgumentException("Augmentation Type reference cannot be NULL!");
73                         }
74                         return (E) «cd.augmentField.name».get(augmentationType);
75                     }
76                 «ENDIF»
77
78             }
79
80         }
81     '''
82
83     def private fields(Set<BuilderClassDescriptor.FieldDeclaration> fields, BuilderClassDescriptor.FieldDeclaration augmentField) '''
84         «IF !fields.empty»
85             «FOR field : fields»
86                 private «field.type.name»«field.type.generics.print» «field.name»;
87             «ENDFOR»
88         «ENDIF»
89         «IF augmentField != null»
90             private Map<Class<? extends «augmentField.type.name»«augmentField.type.generics.print»>, «augmentField.type.name»«augmentField.type.generics.print»> «augmentField.name» = new HashMap<>();
91         «ENDIF»
92     '''
93
94     def private print(List<BuilderClassDescriptor.TypeDeclaration> generics) '''«IF generics != null && !generics.empty»<«FOR generic : generics SEPARATOR ', '»«generic.name»«ENDFOR»>«ENDIF»'''
95
96 }