use of com.palantir.conjure.java.api.errors.ErrorType in project conjure-java by palantir.
the class ErrorGenerator method generateErrorTypesForNamespace.
private static JavaFile generateErrorTypesForNamespace(TypeMapper typeMapper, String conjurePackage, ErrorNamespace namespace, List<ErrorDefinition> errorTypeDefinitions) {
ClassName className = errorTypesClassName(conjurePackage, namespace);
// Generate ErrorType definitions
List<FieldSpec> fieldSpecs = errorTypeDefinitions.stream().map(errorDef -> {
CodeBlock initializer = CodeBlock.of("ErrorType.create(ErrorType.Code.$L, \"$L:$L\")", errorDef.getCode().get(), namespace.get(), errorDef.getErrorName().getName());
FieldSpec.Builder fieldSpecBuilder = FieldSpec.builder(ClassName.get(ErrorType.class), CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, errorDef.getErrorName().getName()), Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer(initializer);
errorDef.getDocs().ifPresent(docs -> fieldSpecBuilder.addJavadoc(docs.get()));
return fieldSpecBuilder.build();
}).collect(Collectors.toList());
// Generate ServiceException factory methods
List<MethodSpec> methodSpecs = errorTypeDefinitions.stream().flatMap(entry -> {
MethodSpec withoutCause = generateExceptionFactory(typeMapper, entry, false);
MethodSpec withCause = generateExceptionFactory(typeMapper, entry, true);
return Stream.of(withoutCause, withCause);
}).collect(Collectors.toList());
// Generate ServiceException factory check methods
List<MethodSpec> checkMethodSpecs = errorTypeDefinitions.stream().map(entry -> {
String exceptionMethodName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, entry.getErrorName().getName());
String methodName = "throwIf" + entry.getErrorName().getName();
String shouldThrowVar = "shouldThrow";
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder(methodName).addModifiers(Modifier.PUBLIC, Modifier.STATIC).addParameter(TypeName.BOOLEAN, shouldThrowVar);
methodBuilder.addJavadoc("Throws a {@link ServiceException} of type $L when {@code $L} is true.\n", entry.getErrorName().getName(), shouldThrowVar);
methodBuilder.addJavadoc("@param $L $L\n", shouldThrowVar, "Cause the method to throw when true");
Streams.concat(entry.getSafeArgs().stream(), entry.getUnsafeArgs().stream()).forEach(arg -> {
methodBuilder.addParameter(typeMapper.getClassName(arg.getType()), arg.getFieldName().get());
methodBuilder.addJavadoc("@param $L $L", arg.getFieldName().get(), StringUtils.appendIfMissing(arg.getDocs().map(Javadoc::render).orElse(""), "\n"));
});
methodBuilder.addCode("if ($L) {", shouldThrowVar);
methodBuilder.addCode("throw $L;", Expressions.localMethodCall(exceptionMethodName, Streams.concat(entry.getSafeArgs().stream(), entry.getUnsafeArgs().stream()).map(arg -> arg.getFieldName().get()).collect(Collectors.toList())));
methodBuilder.addCode("}");
return methodBuilder.build();
}).collect(Collectors.toList());
List<MethodSpec> isRemoteExceptionDefinitions = errorTypeDefinitions.stream().map(entry -> {
String typeName = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, entry.getErrorName().getName());
String methodName = "is" + entry.getErrorName().getName();
return MethodSpec.methodBuilder(methodName).addModifiers(Modifier.PUBLIC, Modifier.STATIC).addParameter(RemoteException.class, REMOTE_EXCEPTION_VAR).returns(TypeName.BOOLEAN).addStatement(Expressions.requireNonNull(REMOTE_EXCEPTION_VAR, "remote exception must not be null")).addStatement("return $N.name().equals($N.getError().errorName())", typeName, REMOTE_EXCEPTION_VAR).addJavadoc("Returns true if the {@link $T} is named $L:$L", RemoteException.class, entry.getNamespace(), entry.getErrorName().getName()).build();
}).collect(Collectors.toList());
TypeSpec.Builder typeBuilder = TypeSpec.classBuilder(className).addMethod(privateConstructor()).addModifiers(Modifier.PUBLIC, Modifier.FINAL).addFields(fieldSpecs).addMethods(methodSpecs).addMethods(checkMethodSpecs).addMethods(isRemoteExceptionDefinitions).addAnnotation(ConjureAnnotations.getConjureGeneratedAnnotation(ErrorGenerator.class));
return JavaFile.builder(conjurePackage, typeBuilder.build()).skipJavaLangImports(true).indent(" ").build();
}
use of com.palantir.conjure.java.api.errors.ErrorType in project conjure-java-runtime-api by palantir.
the class RemoteExceptionAssertTest method testSanity.
@Test
public void testSanity() throws Exception {
ErrorType actualType = ErrorType.FAILED_PRECONDITION;
SerializableError error = SerializableError.forException(new ServiceException(actualType));
Assertions.assertThat(new RemoteException(error, actualType.httpErrorCode())).isGeneratedFromErrorType(actualType);
assertThatThrownBy(() -> Assertions.assertThat(new RemoteException(error, actualType.httpErrorCode() + 1)).isGeneratedFromErrorType(actualType)).isInstanceOf(AssertionError.class).hasMessage("Expected error status to be %s, but found %s", actualType.httpErrorCode(), actualType.httpErrorCode() + 1);
}
use of com.palantir.conjure.java.api.errors.ErrorType in project conjure-java-runtime by palantir.
the class JsonExceptionMapper method toResponseInner.
@Override
public final Response toResponseInner(T exception) {
String errorInstanceId = UUID.randomUUID().toString();
ErrorType errorType = getErrorType(exception);
if (errorType.httpErrorCode() / 100 == 4) /* client error */
{
log.info("Error handling request. {}: {}", SafeArg.of("errorName", errorType.name()), SafeArg.of("errorInstanceId", errorInstanceId), exception);
} else {
log.error("Error handling request. {}: {}", SafeArg.of("errorName", errorType.name()), SafeArg.of("errorInstanceId", errorInstanceId), exception);
}
return createResponse(errorType, errorInstanceId);
}
use of com.palantir.conjure.java.api.errors.ErrorType in project conjure-java-runtime-api by palantir.
the class ServiceExceptionAssertTest method testSanity.
@Test
public void testSanity() {
ErrorType actualType = ErrorType.FAILED_PRECONDITION;
Assertions.assertThat(new ServiceException(actualType, SafeArg.of("a", "b"), UnsafeArg.of("c", "d"))).hasType(actualType).hasArgs(SafeArg.of("a", "b"), UnsafeArg.of("c", "d"));
Assertions.assertThat(new ServiceException(actualType, SafeArg.of("a", "b"), UnsafeArg.of("c", "d"))).hasType(actualType).hasArgs(UnsafeArg.of("c", "d"), // Order doesn't matter
SafeArg.of("a", "b"));
Assertions.assertThat(new ServiceException(actualType)).hasNoArgs();
assertThatThrownBy(() -> Assertions.assertThat(new ServiceException(actualType)).hasType(ErrorType.INTERNAL)).isInstanceOf(AssertionError.class).hasMessage("Expected ErrorType to be %s, but found %s", ErrorType.INTERNAL, actualType);
assertThatThrownBy(() -> Assertions.assertThat(new ServiceException(actualType, SafeArg.of("a", "b"))).hasArgs(SafeArg.of("c", "d"))).isInstanceOf(AssertionError.class).hasMessage("Expected safe args to be {c=d}, but found {a=b}");
assertThatThrownBy(() -> Assertions.assertThat(new ServiceException(actualType, UnsafeArg.of("a", "b"))).hasArgs(UnsafeArg.of("c", "d"))).isInstanceOf(AssertionError.class).hasMessage("Expected unsafe args to be {c=d}, but found {a=b}");
assertThatThrownBy(() -> Assertions.assertThat(new ServiceException(actualType, SafeArg.of("a", "b"))).hasNoArgs()).isInstanceOf(AssertionError.class).hasMessage("Expected no args, but found {a=b}");
assertThatThrownBy(() -> Assertions.assertThat(new ServiceException(actualType, SafeArg.of("a", "b"), UnsafeArg.of("c", "d"))).hasNoArgs()).isInstanceOf(AssertionError.class).hasMessage("Expected no args, but found {a=b, c=d}");
Assertions.assertThat(new ServiceException(actualType, UnsafeArg.of("a", "b"), UnsafeArg.of("c", "d"))).containsArgs(UnsafeArg.of("a", "b"));
// Safety matters
assertThatThrownBy(() -> Assertions.assertThat(new ServiceException(actualType, SafeArg.of("a", "b"), UnsafeArg.of("c", "d"))).containsArgs(UnsafeArg.of("a", "b"))).isInstanceOf(AssertionError.class).hasMessage("Expected unsafe args to contain {a=b}, but found {c=d}");
assertThatThrownBy(() -> Assertions.assertThat(new ServiceException(actualType, SafeArg.of("a", "b"))).containsArgs(SafeArg.of("c", "d"))).isInstanceOf(AssertionError.class).hasMessage("Expected safe args to contain {c=d}, but found {a=b}");
assertThatThrownBy(() -> Assertions.assertThat(new ServiceException(actualType, UnsafeArg.of("a", "b"))).containsArgs(UnsafeArg.of("c", "d"))).isInstanceOf(AssertionError.class).hasMessage("Expected unsafe args to contain {c=d}, but found {a=b}");
}
Aggregations