25
25
import com .google .errorprone .annotations .MustBeClosed ;
26
26
import com .palantir .conjure .java .ConjureAnnotations ;
27
27
import com .palantir .conjure .java .Options ;
28
+ import com .palantir .conjure .java .lib .internal .ConjureErrors ;
28
29
import com .palantir .conjure .java .lib .internal .ConjureErrors .BaseEndpointError ;
29
30
import com .palantir .conjure .java .services .IsUndertowAsyncMarkerVisitor ;
30
31
import com .palantir .conjure .java .services .ServiceGenerators ;
31
32
import com .palantir .conjure .java .services .ServiceGenerators .EndpointErrorsJavaDoc ;
32
33
import com .palantir .conjure .java .services .ServiceGenerators .EndpointJavaDocGenerationOptions ;
33
34
import com .palantir .conjure .java .services .ServiceGenerators .RequestLineJavaDoc ;
34
35
import com .palantir .conjure .java .util .ErrorGenerationUtils ;
36
+ import com .palantir .conjure .java .util .ErrorGenerationUtils .ErrorsAndParameters ;
35
37
import com .palantir .conjure .java .util .Packages ;
36
38
import com .palantir .conjure .spec .EndpointDefinition ;
37
39
import com .palantir .conjure .spec .EndpointError ;
40
+ import com .palantir .conjure .spec .ErrorTypeName ;
38
41
import com .palantir .conjure .spec .ServiceDefinition ;
39
42
import com .palantir .conjure .visitor .TypeVisitor ;
40
43
import com .palantir .dialogue .Channel ;
@@ -66,12 +69,17 @@ public final class DialogueInterfaceGenerator {
66
69
private final Options options ;
67
70
private final ParameterTypeMapper parameterTypes ;
68
71
private final ReturnTypeMapper returnTypes ;
72
+ private final ErrorsAndParameters errorsAndParameters ;
69
73
70
74
public DialogueInterfaceGenerator (
71
- Options options , ParameterTypeMapper parameterTypes , ReturnTypeMapper returnTypes ) {
75
+ Options options ,
76
+ ParameterTypeMapper parameterTypes ,
77
+ ReturnTypeMapper returnTypes ,
78
+ ErrorsAndParameters errorsAndParameters ) {
72
79
this .options = options ;
73
80
this .parameterTypes = parameterTypes ;
74
81
this .returnTypes = returnTypes ;
82
+ this .errorsAndParameters = errorsAndParameters ;
75
83
}
76
84
77
85
public JavaFile generateBlocking (
@@ -190,29 +198,7 @@ private TypeSpec responseTypeForEndpoint(String packageName, ClassName className
190
198
// Create a record for each of the endpoint's errors
191
199
List <TypeSpec > errorTypes = new ArrayList <>();
192
200
for (EndpointError endpointError : endpointDef .getErrors ()) {
193
- String errorTypeName = CaseFormat .UPPER_CAMEL .to (
194
- CaseFormat .UPPER_UNDERSCORE , endpointError .getError ().getName ());
195
- ClassName errorTypesClassName = ClassName .get (
196
- endpointError .getError ().getPackage (),
197
- ErrorGenerationUtils .errorTypesClassName (
198
- endpointError .getError ().getNamespace ()),
199
- errorTypeName );
200
- ClassName parametersClassName = ClassName .get (
201
- endpointError .getError ().getPackage (),
202
- ErrorGenerationUtils .errorTypesClassName (
203
- endpointError .getError ().getNamespace ()),
204
- ErrorGenerationUtils .errorParametersClassName (
205
- endpointError .getError ().getName ()));
206
- TypeSpec endpointErrorType = TypeSpec .classBuilder (ClassName .get (
207
- packageName ,
208
- responseTypeName .simpleName (),
209
- endpointError .getError ().getName ()))
210
- .addModifiers (Modifier .PUBLIC , Modifier .STATIC , Modifier .FINAL )
211
- .addSuperinterface (responseTypeName )
212
- .superclass (ParameterizedTypeName .get (ClassName .get (BaseEndpointError .class ), parametersClassName ))
213
- .addMethod (errorTypeConstructor (parametersClassName , errorTypesClassName ))
214
- .build ();
215
- errorTypes .add (endpointErrorType );
201
+ errorTypes .add (constructEndpointErrorType (endpointError , packageName , responseTypeName ));
216
202
}
217
203
218
204
// Get type from typespec
@@ -229,6 +215,39 @@ private TypeSpec responseTypeForEndpoint(String packageName, ClassName className
229
215
.build ();
230
216
}
231
217
218
+ private TypeSpec constructEndpointErrorType (
219
+ EndpointError endpointError , String packageName , ClassName responseTypeName ) {
220
+ String errorTypeName = CaseFormat .UPPER_CAMEL .to (
221
+ CaseFormat .UPPER_UNDERSCORE , endpointError .getError ().getName ());
222
+ ClassName errorTypesClassName = ClassName .get (
223
+ endpointError .getError ().getPackage (),
224
+ ErrorGenerationUtils .errorTypesClassName (
225
+ endpointError .getError ().getNamespace ()),
226
+ errorTypeName );
227
+
228
+ TypeSpec .Builder endpointErrorTypeBuilder = TypeSpec .classBuilder (ClassName .get (
229
+ packageName ,
230
+ responseTypeName .simpleName (),
231
+ endpointError .getError ().getName ()))
232
+ .addModifiers (Modifier .PUBLIC , Modifier .STATIC , Modifier .FINAL )
233
+ .addSuperinterface (responseTypeName );
234
+ ClassName parametersClassName ;
235
+ if (errorsAndParameters .hasParameters (endpointError .getError ())) {
236
+ parametersClassName = ClassName .get (
237
+ endpointError .getError ().getPackage (),
238
+ ErrorGenerationUtils .errorTypesClassName (
239
+ endpointError .getError ().getNamespace ()),
240
+ ErrorGenerationUtils .errorParametersClassName (
241
+ endpointError .getError ().getName ()));
242
+ } else {
243
+ parametersClassName = ClassName .get (ConjureErrors .EmptyErrorParameters .class );
244
+ }
245
+ endpointErrorTypeBuilder
246
+ .superclass (ParameterizedTypeName .get (ClassName .get (BaseEndpointError .class ), parametersClassName ))
247
+ .addMethod (errorTypeConstructor (endpointError .getError (), parametersClassName , errorTypesClassName ));
248
+ return endpointErrorTypeBuilder .build ();
249
+ }
250
+
232
251
private TypeSpec createSuccessRecord (
233
252
String packageName , ClassName className , ClassName responseTypeName , EndpointDefinition endpointDef ) {
234
253
ClassName successTypeClassName =
@@ -263,7 +282,8 @@ private TypeSpec createSuccessRecord(
263
282
return successRecordBuilder .build ();
264
283
}
265
284
266
- private MethodSpec errorTypeConstructor (ClassName parametersClassName , ClassName errorTypesClassName ) {
285
+ private MethodSpec errorTypeConstructor (
286
+ ErrorTypeName errorTypeName , ClassName parametersClassName , ClassName errorTypesClassName ) {
267
287
MethodSpec .Builder ctorBuilder = MethodSpec .constructorBuilder ()
268
288
.addAnnotation (JsonCreator .class )
269
289
.addParameter (ParameterSpec .builder (ClassName .get (String .class ), "errorCode" )
@@ -275,16 +295,20 @@ private MethodSpec errorTypeConstructor(ClassName parametersClassName, ClassName
275
295
.addAnnotation (AnnotationSpec .builder (JsonProperty .class )
276
296
.addMember ("value" , "$S" , "errorInstanceId" )
277
297
.build ())
278
- .build ())
279
- // TODO(pm): Only add the parameters if the error has them. Plumb in error definitions.
280
- .addParameter (ParameterSpec .builder (parametersClassName , "parameters" )
281
- .addAnnotation (AnnotationSpec .builder (JsonProperty .class )
282
- .addMember ("value" , "$S" , "parameters" )
283
- .build ())
284
- .build ())
285
- .addStatement (
286
- // TODO(pm): Perhaps these shouldn't be literals but names ($N).
287
- "super(errorCode, $T.name(), errorInstanceId, parameters)" , errorTypesClassName );
298
+ .build ());
299
+ if (errorsAndParameters .hasParameters (errorTypeName )) {
300
+ ctorBuilder .addParameter (ParameterSpec .builder (parametersClassName , "parameters" )
301
+ .addAnnotation (AnnotationSpec .builder (JsonProperty .class )
302
+ .addMember ("value" , "$S" , "parameters" )
303
+ .build ())
304
+ .build ());
305
+ ctorBuilder .addStatement ("super(errorCode, $T.name(), errorInstanceId, parameters)" , errorTypesClassName );
306
+ } else {
307
+ ctorBuilder .addStatement (
308
+ "super(errorCode, $T.name(), errorInstanceId, $T.EMPTY_ERROR_PARAMETERS_INSTANCE)" ,
309
+ errorTypesClassName ,
310
+ ClassName .get (ConjureErrors .class ));
311
+ }
288
312
return ctorBuilder .build ();
289
313
}
290
314
0 commit comments