From 14ad5c3635ea5ff62e250c80e8d347711206626e Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Fri, 3 Jun 2016 14:03:04 +0000 Subject: [PATCH] Merged HEAD (5.2) to 5.2.N (5.2.1) 127535 jkaabimofrad: Merged API-STRIKES-BACK (5.2.0) to HEAD (5.2) 125551 gjames: RA-652: Stack traces not returned, but in the log. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@127645 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../core/exceptions/ErrorResponse.java | 33 ++++++++++++------- .../framework/webscripts/ApiWebScript.java | 26 ++++++++++++--- .../framework/tests/core/ExecutionTests.java | 2 +- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/source/java/org/alfresco/rest/framework/core/exceptions/ErrorResponse.java b/source/java/org/alfresco/rest/framework/core/exceptions/ErrorResponse.java index 2c83a2cfac..ffe297a956 100644 --- a/source/java/org/alfresco/rest/framework/core/exceptions/ErrorResponse.java +++ b/source/java/org/alfresco/rest/framework/core/exceptions/ErrorResponse.java @@ -26,6 +26,7 @@ package org.alfresco.rest.framework.core.exceptions; import java.util.Arrays; +import java.util.Collections; import java.util.Map; /** @@ -35,12 +36,12 @@ import java.util.Map; */ public class ErrorResponse { - private String errorKey; - private int statusCode; - private String briefSummary; - private String stackTrace; - private Map additionalState; - private String descriptionURL; + final private String errorKey; + final private int statusCode; + final private String briefSummary; + final private String stackTrace; + final private Map additionalState; + final private String descriptionURL; public ErrorResponse(String errorKey, int statusCode, String briefSummary, StackTraceElement[] stackTrace, Map additionalState) @@ -50,7 +51,20 @@ public class ErrorResponse this.statusCode = statusCode; this.briefSummary = briefSummary; this.stackTrace = Arrays.toString(stackTrace); - this.additionalState = additionalState; + this.additionalState = additionalState==null?null:Collections.unmodifiableMap(additionalState); + this.descriptionURL = null; + } + + public ErrorResponse(String errorKey, int statusCode, String briefSummary, + String descriptionURL, Map additionalState) + { + super(); + this.errorKey = errorKey; + this.statusCode = statusCode; + this.briefSummary = briefSummary; + this.stackTrace = " "; + this.additionalState = additionalState==null?null:Collections.unmodifiableMap(additionalState); + this.descriptionURL = descriptionURL; } public String getErrorKey() @@ -78,11 +92,6 @@ public class ErrorResponse return this.descriptionURL; } - public void setDescriptionURL(String descriptionURL) - { - this.descriptionURL = descriptionURL; - } - public Map getAdditionalState() { return this.additionalState; diff --git a/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java b/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java index e048af9ebf..fc24939146 100644 --- a/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java +++ b/source/java/org/alfresco/rest/framework/webscripts/ApiWebScript.java @@ -40,8 +40,11 @@ import org.alfresco.rest.framework.jacksonextensions.JacksonHelper.Writer; import org.alfresco.rest.framework.resource.content.ContentInfo; import org.alfresco.rest.framework.resource.content.ContentInfoImpl; import org.alfresco.service.transaction.TransactionService; +import org.alfresco.util.GUID; import org.alfresco.util.TempFileProvider; import org.apache.chemistry.opencmis.server.shared.ThresholdOutputStreamFactory; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.JsonMappingException; @@ -64,6 +67,7 @@ import org.springframework.extensions.webscripts.servlet.WebScriptServletRespons */ public abstract class ApiWebScript extends AbstractWebScript { + private static Log logger = LogFactory.getLog(ApiWebScript.class); protected JacksonHelper jsonHelper; ExceptionResolver defaultResolver = new DefaultExceptionResolver(); ExceptionResolver resolver; @@ -208,15 +212,27 @@ public abstract class ApiWebScript extends AbstractWebScript * @param res web script response * @throws IOException */ - public void renderErrorResponse(final ErrorResponse errorResponse, final WebScriptResponse res) throws IOException { - - errorResponse.setDescriptionURL(DefaultExceptionResolver.ERROR_URL); + public void renderErrorResponse(ErrorResponse errorResponse, final WebScriptResponse res) throws IOException { + + String errorKey = errorResponse.getErrorKey(); + + if (logger.isDebugEnabled()) + { + errorKey = GUID.generate(); + logger.debug(errorKey+" : ApiWebScript : "+errorResponse.getStackTrace()); + } + + final ErrorResponse errorToWrite = new ErrorResponse(errorKey, + errorResponse.getStatusCode(), + errorResponse.getBriefSummary(), + DefaultExceptionResolver.ERROR_URL, + errorResponse.getAdditionalState()); setContentInfoOnResponse(res, DEFAULT_JSON_CONTENT); // Status must be set before the response is written by Jackson (which will by default close and commit the response). // In a r/w txn, web script buffered responses ensure that it doesn't really matter but for r/o txns this is important. - res.setStatus(errorResponse.getStatusCode()); + res.setStatus(errorToWrite.getStatusCode()); jsonHelper.withWriter(res.getOutputStream(), new Writer() { @@ -226,7 +242,7 @@ public abstract class ApiWebScript extends AbstractWebScript throws JsonGenerationException, JsonMappingException, IOException { JSONObject obj = new JSONObject(); - obj.put("error", errorResponse); + obj.put("error", errorToWrite); objectMapper.writeValue(generator, obj); } }); diff --git a/source/test-java/org/alfresco/rest/framework/tests/core/ExecutionTests.java b/source/test-java/org/alfresco/rest/framework/tests/core/ExecutionTests.java index beb0e6b332..9ed8bc5b7a 100644 --- a/source/test-java/org/alfresco/rest/framework/tests/core/ExecutionTests.java +++ b/source/test-java/org/alfresco/rest/framework/tests/core/ExecutionTests.java @@ -321,7 +321,7 @@ public class ExecutionTests extends AbstractContextTest //System.out.println(errorMessage); assertTrue(errorMessage.contains("\"errorKey\":\"framework.exception.ApiDefault\"")); assertTrue(errorMessage.contains("\"statusCode\":500")); - assertTrue(errorMessage.contains("\"stackTrace\":\"[org.alfresco.rest.framework.tests.core.ExecutionTests.testRenderError(")); + assertTrue(errorMessage.contains("\"stackTrace\":\" \"")); assertTrue(errorMessage.contains("\"descriptionURL\":\""+DefaultExceptionResolver.ERROR_URL+"\"")); }