You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2011/10/18 20:38:26 UTC
svn commit: r1185785 - in
/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer:
JsonApplication.java RuntimeExceptionMapper.java
Author: danhaywood
Date: Tue Oct 18 18:38:26 2011
New Revision: 1185785
URL: http://svn.apache.org/viewvc?rev=1185785&view=rev
Log:
ISIS-109: added an exception mapper for arbitrary (unexpected) runtime exceptions
Added:
incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/RuntimeExceptionMapper.java
Modified:
incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java
Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java?rev=1185785&r1=1185784&r2=1185785&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java Tue Oct 18 18:38:26 2011
@@ -36,6 +36,7 @@ public class JsonApplication extends Abs
addClass(CapabilitiesResourceServerside.class);
addSingleton(new JsonApplicationExceptionMapper());
+ addSingleton(new RuntimeExceptionMapper());
// TODO: doesn't get injected
// addSingleton(new TypedReprBuilderFactoryRegistry());
Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/RuntimeExceptionMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/RuntimeExceptionMapper.java?rev=1185785&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/RuntimeExceptionMapper.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/RuntimeExceptionMapper.java Tue Oct 18 18:38:26 2011
@@ -0,0 +1,80 @@
+package org.apache.isis.viewer.json.viewer;
+
+import java.util.List;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.isis.viewer.json.applib.RestfulMediaType;
+import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.json.applib.util.JsonMapper;
+
+import com.google.common.collect.Lists;
+
+@Provider
+public class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {
+
+ @Override
+ public Response toResponse(RuntimeException ex) {
+ ResponseBuilder builder =
+ Response.status(HttpStatusCode.INTERNAL_SERVER_ERROR.getJaxrsStatusType())
+ .type(RestfulMediaType.APPLICATION_JSON_ERROR)
+ .entity(jsonFor(ex));
+ return builder.build();
+ }
+
+
+ private static class ExceptionPojo {
+
+ public static ExceptionPojo create(Exception ex) {
+ return new ExceptionPojo(ex);
+ }
+
+ private static String format(StackTraceElement stackTraceElement) {
+ return stackTraceElement.toString();
+ }
+
+ private final String message;
+ private final List<String> stackTrace = Lists.newArrayList();
+ private ExceptionPojo causedBy;
+
+ public ExceptionPojo(Throwable ex) {
+ this.message = ex.getMessage();
+ StackTraceElement[] stackTraceElements = ex.getStackTrace();
+ for (StackTraceElement stackTraceElement : stackTraceElements) {
+ this.stackTrace.add(format(stackTraceElement));
+ }
+ Throwable cause = ex.getCause();
+ if(cause != null && cause != ex) {
+ this.causedBy = new ExceptionPojo(cause);
+ }
+ }
+
+ @SuppressWarnings("unused")
+ public String getMessage() {
+ return message;
+ }
+
+ @SuppressWarnings("unused")
+ public List<String> getStackTrace() {
+ return stackTrace;
+ }
+
+ @SuppressWarnings("unused")
+ public ExceptionPojo getCausedBy() {
+ return causedBy;
+ }
+ }
+
+ static String jsonFor(Exception ex) {
+ try {
+ return JsonMapper.instance().write(ExceptionPojo.create(ex));
+ } catch (Exception e) {
+ // fallback
+ return "{ \"exception\": \"" + ExceptionUtils.getFullStackTrace(ex) + "\" }";
+ }
+ }
+}