Ver Fonte

fix #551 : Add stack traces to message in json response

yfujita há 9 anos atrás
pai
commit
8b90e941a6
1 ficheiros alterados com 41 adições e 23 exclusões
  1. 41 23
      src/main/java/org/codelibs/fess/api/json/JsonApiManager.java

+ 41 - 23
src/main/java/org/codelibs/fess/api/json/JsonApiManager.java

@@ -16,6 +16,8 @@
 package org.codelibs.fess.api.json;
 
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.net.URLDecoder;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -112,22 +114,19 @@ public class JsonApiManager extends BaseApiManager {
     protected void processPingRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
         final FessEsClient fessEsClient = ComponentUtil.getElasticsearchClient();
         int status;
-        String errMsg = null;
+        Exception err = null;
         try {
             final PingResponse pingResponse = fessEsClient.ping();
             status = pingResponse.getStatus();
         } catch (final Exception e) {
             status = 9;
-            errMsg = e.getMessage();
-            if (errMsg == null) {
-                errMsg = e.getClass().getName();
-            }
+            err = e;
             if (logger.isDebugEnabled()) {
                 logger.debug("Failed to process a ping request.", e);
             }
         }
 
-        writeJsonResponse(status, null, errMsg);
+        writeJsonResponse(status, null, err);
     }
 
     protected void processSearchRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
@@ -135,7 +134,7 @@ public class JsonApiManager extends BaseApiManager {
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
 
         int status = 0;
-        String errMsg = StringUtil.EMPTY;
+        Exception err = null;
         String query = null;
         final StringBuilder buf = new StringBuilder(1000); // TODO replace response stream
         request.setAttribute(Constants.SEARCH_LOG_ACCESS_TYPE, Constants.SEARCH_LOG_ACCESS_TYPE_JSON);
@@ -262,16 +261,13 @@ public class JsonApiManager extends BaseApiManager {
             }
         } catch (final Exception e) {
             status = 1;
-            errMsg = e.getMessage();
-            if (errMsg == null) {
-                errMsg = e.getClass().getName();
-            }
+            err = e;
             if (logger.isDebugEnabled()) {
                 logger.debug("Failed to process a search request.", e);
             }
         }
 
-        writeJsonResponse(status, buf.toString(), errMsg);
+        writeJsonResponse(status, buf.toString(), err);
 
     }
 
@@ -288,7 +284,7 @@ public class JsonApiManager extends BaseApiManager {
         final LabelTypeHelper labelTypeHelper = ComponentUtil.getLabelTypeHelper();
 
         int status = 0;
-        String errMsg = StringUtil.EMPTY;
+        Exception err = null;
         final StringBuilder buf = new StringBuilder(255); // TODO replace response stream
         try {
             final List<Map<String, String>> labelTypeItems = labelTypeHelper.getLabelTypeItemList();
@@ -314,13 +310,13 @@ public class JsonApiManager extends BaseApiManager {
             }
         } catch (final Exception e) {
             status = 1;
-            errMsg = e.getMessage();
+            err = e;
             if (logger.isDebugEnabled()) {
                 logger.debug("Failed to process a label request.", e);
             }
         }
 
-        writeJsonResponse(status, buf.toString(), errMsg);
+        writeJsonResponse(status, buf.toString(), err);
 
     }
 
@@ -338,7 +334,7 @@ public class JsonApiManager extends BaseApiManager {
         final PopularWordHelper popularWordHelper = ComponentUtil.getPopularWordHelper();
 
         int status = 0;
-        String errMsg = StringUtil.EMPTY;
+        Exception err = null;
         final StringBuilder buf = new StringBuilder(255); // TODO replace response stream
         try {
             final List<String> popularWordList = popularWordHelper.getWordList(seed, tags, null, fields, excludes);
@@ -360,13 +356,13 @@ public class JsonApiManager extends BaseApiManager {
             } else {
                 status = 1;
             }
-            errMsg = e.getMessage();
+            err = e;
             if (logger.isDebugEnabled()) {
                 logger.debug("Failed to process a popularWord request.", e);
             }
         }
 
-        writeJsonResponse(status, buf.toString(), errMsg);
+        writeJsonResponse(status, buf.toString(), err);
 
     }
 
@@ -433,7 +429,7 @@ public class JsonApiManager extends BaseApiManager {
                             builder.setRefresh(true);
                         });
 
-                        writeJsonResponse(0, "\"result\":\"ok\"", null);
+                        writeJsonResponse(0, "\"result\":\"ok\"", (String) null);
 
                     }).orElse(() -> {
                         throw new WebApiException(6, "Not found: " + docId);
@@ -446,7 +442,7 @@ public class JsonApiManager extends BaseApiManager {
             } else {
                 status = 1;
             }
-            writeJsonResponse(status, null, e.getMessage());
+            writeJsonResponse(status, null, e);
             if (logger.isDebugEnabled()) {
                 logger.debug("Failed to process a favorite request.", e);
             }
@@ -467,7 +463,7 @@ public class JsonApiManager extends BaseApiManager {
 
         int status = 0;
         String body = null;
-        String errMsg = null;
+        Exception err = null;
 
         try {
             final String queryId = request.getParameter("queryId");
@@ -523,16 +519,38 @@ public class JsonApiManager extends BaseApiManager {
             } else {
                 status = 1;
             }
-            errMsg = e.getMessage();
+
+            err = e;
             if (logger.isDebugEnabled()) {
                 logger.debug("Failed to process a favorites request.", e);
             }
         }
 
-        writeJsonResponse(status, body, errMsg);
+        writeJsonResponse(status, body, err);
 
     }
 
+    public static void writeJsonResponse(final int status, final String body, final Throwable t) {
+        if (t == null) {
+            writeJsonResponse(status, body, (String) null);
+            return;
+        }
+
+        final StringBuilder sb = new StringBuilder();
+        if (StringUtil.isBlank(t.getMessage())) {
+            sb.append(t.getClass().getName());
+        } else {
+            sb.append(t.getMessage());
+        }
+        final StringWriter sw = new StringWriter();
+        t.printStackTrace(new PrintWriter(sw));
+        sb.append(" [ ").append(sw.toString()).append(" ]");
+        try {
+            sw.close();
+        } catch (IOException ignore) {}
+        writeJsonResponse(status, body, sb.toString());
+    }
+
     public static void writeJsonResponse(final int status, final String body, final String errMsg) {
         final String callback = LaRequestUtil.getRequest().getParameter("callback");
         final boolean isJsonp = StringUtil.isNotBlank(callback);