@@ -58,32 +58,32 @@ public JavaPoetGenerator(TypeResolver typeResolver, String baseURL) {
58
58
59
59
public void generate (PrintWriter printWriter ) throws IOException {
60
60
61
- TypeSpec .Builder builder = TypeSpec .classBuilder (CONTAINER_CLASS_NAME )
61
+ TypeSpec .Builder containerTypeBuilder = TypeSpec .classBuilder (CONTAINER_CLASS_NAME )
62
62
.addModifiers (PUBLIC , FINAL );
63
63
if (baseURL .equals ("" )) {
64
- builder .addJavadoc ("$S" , "Warning: this class was generated from a local file and will not provide absolute _schemaURL fields in facets" );
64
+ containerTypeBuilder .addJavadoc ("$S" , "Warning: this class was generated from a local file and will not provide absolute _schemaURL fields in facets" );
65
65
66
66
}
67
67
68
- builder .addField (FieldSpec .builder (ClassName .get (URI .class ), "producer" , PRIVATE , FINAL ).build ());
69
- builder .addMethod (MethodSpec .constructorBuilder ()
68
+ containerTypeBuilder .addField (FieldSpec .builder (ClassName .get (URI .class ), "producer" , PRIVATE , FINAL ).build ());
69
+ containerTypeBuilder .addMethod (MethodSpec .constructorBuilder ()
70
70
.addModifiers (PUBLIC )
71
71
.addParameter (
72
72
ParameterSpec .builder (ClassName .get (URI .class ), "producer" ).build ()
73
73
)
74
74
.addCode ("this.producer = producer;\n " )
75
75
.build ());
76
76
77
- generateTypes (builder );
78
- TypeSpec openLineage = builder .build ();
77
+ generateTypes (containerTypeBuilder );
78
+ TypeSpec openLineage = containerTypeBuilder .build ();
79
79
80
80
JavaFile javaFile = JavaFile .builder (PACKAGE , openLineage )
81
81
.build ();
82
82
83
83
javaFile .writeTo (printWriter );
84
84
}
85
85
86
- private void generateTypes (TypeSpec .Builder builder ) {
86
+ private void generateTypes (TypeSpec .Builder containerTypeBuilder ) {
87
87
Collection <ObjectType > types = typeResolver .getTypes ();
88
88
for (ObjectType type : types ) {
89
89
@@ -97,8 +97,12 @@ private void generateTypes(TypeSpec.Builder builder) {
97
97
interfaceBuilder .addMethod (getter );
98
98
}
99
99
TypeSpec intrfc = interfaceBuilder .build ();
100
- builder .addType (intrfc );
100
+ containerTypeBuilder .addType (intrfc );
101
101
} else {
102
+ TypeSpec .Builder builderClassBuilder = TypeSpec .classBuilder (type .getName () + "Builder" )
103
+ .addModifiers (PUBLIC , FINAL );
104
+ List <CodeBlock > builderParams = new ArrayList <>();
105
+
102
106
TypeSpec .Builder classBuilder = TypeSpec .classBuilder (type .getName ())
103
107
.addModifiers (STATIC , PUBLIC , FINAL );
104
108
for (String parent : type .getParents ()) {
@@ -119,6 +123,20 @@ private void generateTypes(TypeSpec.Builder builder) {
119
123
String schemaURL = baseURL + "#/definitions/" + type .getName ();
120
124
constructor .addCode ("this.$N = URI.create($S);\n " , f .getName (), schemaURL );
121
125
} else {
126
+ if (!(f .getName ().equals ("_producer" ) || f .getName ().equals ("producer" ))) {
127
+ builderClassBuilder .addField (getTypeName (f .getType ()), f .getName (), PRIVATE );
128
+ builderClassBuilder .addMethod (
129
+ MethodSpec
130
+ .methodBuilder ("set" + titleCase (f .getName ()))
131
+ .addParameter (getTypeName (f .getType ()), f .getName ())
132
+ .addJavadoc ("@param $N $N\n " , f .getName (), f .getDescription () == null ? "the " + f .getName () : f .getDescription ())
133
+ .addModifiers (PUBLIC )
134
+ .returns (ClassName .get (CONTAINER_CLASS , type .getName () + "Builder" ))
135
+ .addJavadoc ("@return this\n " )
136
+ .addCode ("this.$N = $N;\n " , f .getName (), f .getName ())
137
+ .addCode ("return this;" )
138
+ .build ());
139
+ }
122
140
constructor .addJavadoc ("@param $N $N\n " , f .getName (), f .getDescription () == null ? "the " + f .getName () : f .getDescription ());
123
141
constructor .addParameter (
124
142
ParameterSpec .builder (getTypeName (f .getType ()), f .getName ())
@@ -127,10 +145,12 @@ private void generateTypes(TypeSpec.Builder builder) {
127
145
constructor .addCode ("this.$N = $N;\n " , f .getName (), f .getName ());
128
146
if (f .getName ().equals ("_producer" ) || f .getName ().equals ("producer" )) {
129
147
factoryParams .add (CodeBlock .of ("this.producer" ));
148
+ builderParams .add (CodeBlock .of ("OpenLineage.this.producer" ));
130
149
} else {
131
150
factory .addParameter (ParameterSpec .builder (getTypeName (f .getType ()), f .getName ()).build ());
132
151
factory .addJavadoc ("@param $N $N\n " , f .getName (), f .getDescription () == null ? "the " + f .getName () : f .getDescription ());
133
152
factoryParams .add (CodeBlock .of ("$N" , f .getName ()));
153
+ builderParams .add (CodeBlock .of ("$N" , f .getName ()));
134
154
}
135
155
}
136
156
MethodSpec getter = getter (f )
@@ -143,7 +163,21 @@ private void generateTypes(TypeSpec.Builder builder) {
143
163
factory .addCode ("return new $N(" , type .getName ());
144
164
factory .addCode (CodeBlock .join (factoryParams , ", " ));
145
165
factory .addCode (");\n " );
146
- builder .addMethod (factory .build ());
166
+ containerTypeBuilder .addMethod (factory .build ());
167
+
168
+ containerTypeBuilder .addMethod (MethodSpec .methodBuilder ("new" + type .getName () + "Builder" )
169
+ .addModifiers (PUBLIC )
170
+ .returns (ClassName .get (CONTAINER_CLASS , type .getName () + "Builder" ))
171
+ .addCode ("return new $N();" , type .getName () + "Builder" )
172
+ .build ());
173
+
174
+ Builder build = MethodSpec
175
+ .methodBuilder ("build" )
176
+ .addModifiers (PUBLIC )
177
+ .returns (getTypeName (type ))
178
+ .addCode ("var __result = new $N(" , type .getName ())
179
+ .addCode (CodeBlock .join (builderParams , ", " ))
180
+ .addCode (");\n " );
147
181
148
182
// additionalFields
149
183
if (type .isHasAdditionalProperties ()) {
@@ -163,12 +197,32 @@ private void generateTypes(TypeSpec.Builder builder) {
163
197
.addAnnotation (JsonAnySetter .class )
164
198
.build ());
165
199
200
+ builderClassBuilder .addField (
201
+ FieldSpec .builder (additionalPropertiesType , fieldName , PRIVATE , FINAL )
202
+ .initializer ("new $T<>()" , HashMap .class )
203
+ .build ());
204
+ builderClassBuilder .addMethod (MethodSpec
205
+ .methodBuilder ("put" )
206
+ .addModifiers (PUBLIC )
207
+ .addParameter (TypeName .get (String .class ), "key" )
208
+ .addParameter (additionalPropertiesValueType , "value" )
209
+ .addCode ("this.$N.put(key, value);" , fieldName )
210
+ .build ());
211
+
212
+ build .addCode ("__result.getAdditionalProperties().putAll(additionalProperties);\n " );
213
+
166
214
constructor .addCode (CodeBlock .builder ().addStatement ("this.$N = new $T<>()" , fieldName , HashMap .class ).build ());
167
215
}
168
216
217
+
218
+ builderClassBuilder .addMethod (
219
+ build
220
+ .addCode ("return __result;\n " )
221
+ .build ());
222
+
169
223
classBuilder .addMethod (constructor .build ());
170
- TypeSpec clss = classBuilder .build ();
171
- builder .addType (clss );
224
+ containerTypeBuilder . addType ( classBuilder .build () );
225
+ containerTypeBuilder .addType (builderClassBuilder . build () );
172
226
}
173
227
}
174
228
0 commit comments