package com.googlecode.jsonrpc4j;
import com.fasterxml.jackson.databind.JsonNode;
import java.lang.reflect.Method;
import java.util.List;
/**
* {@link ErrorResolver} that uses annotations.
*/
public enum AnnotationsErrorResolver implements ErrorResolver {
INSTANCE;
/**
* {@inheritDoc}
*/
@Override
public JsonError resolveError(Throwable thrownException, Method method, List<JsonNode> arguments) {
JsonRpcError resolver = getResolverForException(thrownException, method);
if (notFoundResolver(resolver)) return null;
String message = hasErrorMessage(resolver) ? resolver.message() : thrownException.getMessage();
return new JsonError(resolver.code(), message, new ErrorData(resolver.exception().getName(), message));
}
private JsonRpcError getResolverForException(Throwable thrownException, Method method) {
JsonRpcErrors errors = ReflectionUtil.getAnnotation(method, JsonRpcErrors.class);
if (hasAnnotations(errors)) {
for (JsonRpcError errorDefined : errors.value()) {
if (isExceptionInstanceOfError(thrownException, errorDefined)) {
return errorDefined;
}
}
}
return null;
}
private boolean notFoundResolver(JsonRpcError resolver) {
return resolver == null;
}
private boolean hasErrorMessage(JsonRpcError em) {
// noinspection ConstantConditions
return em.message() != null && em.message().trim().length() > 0;
}
private boolean hasAnnotations(JsonRpcErrors errors) {
return errors != null;
}
private boolean isExceptionInstanceOfError(Throwable target, JsonRpcError em) {
return em.exception().isInstance(target);
}
}