Jelajahi Sumber

fix #2695 use error_code

Shinsuke Sugaya 2 tahun lalu
induk
melakukan
b4b47d6b01

+ 42 - 4
src/main/java/org/codelibs/fess/mylasta/direction/sponsor/FessApiFailureHook.java

@@ -15,11 +15,21 @@
  */
 package org.codelibs.fess.mylasta.direction.sponsor;
 
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.UUID;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.codelibs.core.lang.StringUtil;
+import org.codelibs.fess.Constants;
 import org.codelibs.fess.app.web.api.ApiResult;
 import org.codelibs.fess.app.web.api.ApiResult.ApiErrorResponse;
 import org.codelibs.fess.app.web.api.ApiResult.Status;
+import org.codelibs.fess.util.ComponentUtil;
 import org.dbflute.optional.OptionalThing;
 import org.lastaflute.web.api.ApiFailureHook;
 import org.lastaflute.web.api.ApiFailureResource;
@@ -32,6 +42,8 @@ import org.lastaflute.web.response.JsonResponse;
  */
 public class FessApiFailureHook implements ApiFailureHook { // #change_it for handling API failure
 
+    private static final Logger logger = LogManager.getLogger(FessApiFailureHook.class);
+
     // ===================================================================================
     //                                                                          Definition
     //                                                                          ==========
@@ -82,10 +94,36 @@ public class FessApiFailureHook implements ApiFailureHook { // #change_it for ha
         if (!resource.getMessageList().isEmpty()) {
             return resource.getMessageList().stream().collect(Collectors.joining(" "));
         }
-        if (cause != null) {
-            return cause.getMessage();
+
+        if (cause == null) {
+            return "Unknown error";
         }
-        return "Unknown error";
-    }
 
+        final Supplier<String> stacktraceString = () -> {
+            final StringBuilder sb = new StringBuilder();
+            if (StringUtil.isBlank(cause.getMessage())) {
+                sb.append(cause.getClass().getName());
+            } else {
+                sb.append(cause.getMessage());
+            }
+            try (final StringWriter sw = new StringWriter(); final PrintWriter pw = new PrintWriter(sw)) {
+                cause.printStackTrace(pw);
+                pw.flush();
+                sb.append(" [ ").append(sw.toString()).append(" ]");
+            } catch (final IOException ignore) {}
+            return sb.toString();
+        };
+
+        if (Constants.TRUE.equalsIgnoreCase(ComponentUtil.getFessConfig().getApiJsonResponseExceptionIncluded())) {
+            return stacktraceString.get();
+        }
+
+        final String errorCode = UUID.randomUUID().toString();
+        if (logger.isDebugEnabled()) {
+            logger.debug("[{}] {}", errorCode, stacktraceString.get().replace("\n", "\\n"));
+        } else {
+            logger.warn("[{}] {}", errorCode, cause.getMessage());
+        }
+        return "error_code:" + errorCode;
+    }
 }