package de.axone.web.rest; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import de.axone.exception.IllegalNamedArgumentException; public class JsonResponseImpl implements JsonResponse { public static class OK extends JsonResponseImpl { public OK(){ super( Status.OK ); } @JsonIgnore @Override public Error getError(){ return super.getError(); } } public static class ERROR extends JsonResponseImpl { public ERROR(){ super( Status.ERROR ); } } public static class INVALID extends JsonResponseImpl { public INVALID(){ super( Status.INVALID ); } } public static JsonResponse OK(){ return new JsonResponseImpl.OK(); } public static JsonResponse ERROR( int code, String message ){ JsonResponseImpl result = new JsonResponseImpl.ERROR(); result.error = new ErrorImpl( code, message ); return result; } public static JsonResponse ERROR( Throwable t ){ return ERROR( 500, t ); } public static JsonResponse ERROR( int code, Throwable t ){ JsonResponseImpl result = new JsonResponseImpl.ERROR(); result.error = new ErrorImpl( code, t ); return result; } public static JsonResponse INVALID( IllegalNamedArgumentException e ){ JsonResponseImpl result = new JsonResponseImpl.INVALID(); result.messages = new JsonResponse.Message[1]; result.messages[ 0 ] = new MessageImpl( e.getArgumentName(), e.getMessage() ); return result; } JsonResponseImpl(){ } JsonResponseImpl( Status status ){ setStatus( status ); } JsonResponseImpl( Status status, Error error ){ setStatus( status ); setError( error ); } private Status status; private Error error; private Message [] messages; @Override public Status getStatus() { return status; } public void setStatus( Status status ){ this.status = status; } @Override @JsonDeserialize( as=ErrorImpl.class ) public Error getError() { return error; } public void setError( Error error ){ this.error = error; } @Override @JsonDeserialize( contentAs=MessageImpl.class ) public Message[] getMessages() { return messages; } public void setMessages( Message [] messages ){ this.messages = messages; } public static class ErrorImpl implements JsonResponse.Error { private int code; private String message; private StackTraceElement [] stackTrace; public ErrorImpl(){} public ErrorImpl( int code, String message ){ this.code = code; this.message = message; } public ErrorImpl( int code, Throwable t ){ this( code, findTopCause( t ).getMessage() ); this.stackTrace = t.getStackTrace(); } private static Throwable findTopCause( Throwable t ){ while( t.getCause() != null ){ t = t.getCause(); } return t; } @Override public int getCode() { return code; } public void setCode( int code ){ this.code = code; } @Override public String getMessage() { return message; } public void setMessage( String message ){ this.message = message; } @Override public StackTraceElement [] getStackTrace() { return stackTrace; } public void setStackTrace( StackTraceElement [] stackTrace ){ this.stackTrace = stackTrace; } @Override public JsonResponseException throwable(){ return new WrappedThrowable(); } private class WrappedThrowable extends JsonResponseException { private static final long serialVersionUID = -4372453687500907898L; @Override public String getMessage(){ return message; } @Override public StackTraceElement [] getStackTrace(){ return stackTrace; } } } public static class MessageImpl implements Message { private String field, message; public MessageImpl(){} public MessageImpl( String field, String message ){ this.field = field; this.message = message; } @Override public String getField() { return field; } public void setField( String field ){ this.field = field; } @Override public String getMessage() { return message; } public void setMessage( String message ){ this.message = message; } } public static class JsonResponseException extends RuntimeException { /** * */ private static final long serialVersionUID = 8862829876634590375L; public JsonResponseException() { super(); } public JsonResponseException( String message, Throwable cause ) { super( message, cause ); } public JsonResponseException( String message ) { super( message ); } public JsonResponseException( Throwable cause ) { super( cause ); } } }