Moves c.g.gwt.logging to common StackTraceDeobfuscator.

Change-Id: I44bee6a3abdf550831f6f9263a8c6e3c807ca063
Review-Link: https://gwt-review.googlesource.com/#/c/2300/

Review by: skybrian@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@11577 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/logging/server/RemoteLoggingServiceImpl.java b/user/src/com/google/gwt/logging/server/RemoteLoggingServiceImpl.java
index ac85b0a..15cc374 100644
--- a/user/src/com/google/gwt/logging/server/RemoteLoggingServiceImpl.java
+++ b/user/src/com/google/gwt/logging/server/RemoteLoggingServiceImpl.java
@@ -16,6 +16,7 @@
 
 package com.google.gwt.logging.server;
 
+import com.google.gwt.core.server.impl.StackTraceDeobfuscator;
 import com.google.gwt.logging.server.RemoteLoggingServiceUtil.RemoteLoggingException;
 import com.google.gwt.logging.shared.RemoteLoggingService;
 import com.google.gwt.user.server.rpc.RemoteServiceServlet;
@@ -27,16 +28,14 @@
 /**
  * Server side code for the remote log handler.
  */
-public class RemoteLoggingServiceImpl extends RemoteServiceServlet implements
-    RemoteLoggingService {
-  // No deobfuscator by default
-  private static StackTraceDeobfuscator deobfuscator = null;
+public class RemoteLoggingServiceImpl extends RemoteServiceServlet implements RemoteLoggingService {
 
-  private static Logger logger =
-    Logger.getLogger(RemoteServiceServlet.class.getName());
-  
-  private static String loggerNameOverride = null;
-  
+  private static Logger logger = Logger.getLogger(RemoteServiceServlet.class.getName());
+
+  // No deobfuscator by default
+  private StackTraceDeobfuscator deobfuscator = null;
+  private String loggerNameOverride = null;
+
   /**
    * Logs a Log Record which has been serialized using GWT RPC on the server.
    * @return either an error message, or null if logging is successful.
@@ -67,13 +66,8 @@
    * By default, this service does not do any deobfuscation. In order to do
    * server side deobfuscation, you must copy the symbolMaps files to a
    * directory visible to the server and set the directory using this method.
-   * @param symbolMapsDir
    */
   public void setSymbolMapsDirectory(String symbolMapsDir) {
-    if (deobfuscator == null) {
-      deobfuscator = new StackTraceDeobfuscator(symbolMapsDir);
-    } else {
-      deobfuscator.setSymbolMapsDirectory(symbolMapsDir);
-    }
+    deobfuscator = StackTraceDeobfuscator.fromFileSystem(symbolMapsDir);
   }
 }
diff --git a/user/src/com/google/gwt/logging/server/RemoteLoggingServiceUtil.java b/user/src/com/google/gwt/logging/server/RemoteLoggingServiceUtil.java
index 2b0b6dc..940cc95 100644
--- a/user/src/com/google/gwt/logging/server/RemoteLoggingServiceUtil.java
+++ b/user/src/com/google/gwt/logging/server/RemoteLoggingServiceUtil.java
@@ -16,6 +16,8 @@
 
 package com.google.gwt.logging.server;
 
+import com.google.gwt.core.server.impl.StackTraceDeobfuscator;
+
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 
@@ -53,7 +55,7 @@
       StackTraceDeobfuscator deobfuscator, String loggerNameOverride) throws
       RemoteLoggingException {
     if (deobfuscator != null) {
-      lr = deobfuscator.deobfuscateLogRecord(lr, strongName);
+      lr = deobfuscateLogRecord(deobfuscator, lr, strongName);
     }
     String loggerName = loggerNameOverride == null ? lr.getLoggerName() :
       loggerNameOverride;
@@ -61,13 +63,19 @@
     logger.log(lr);
   }
 
+  public static LogRecord deobfuscateLogRecord(
+      StackTraceDeobfuscator deobfuscator, LogRecord lr, String strongName) {
+    if (lr.getThrown() != null && strongName != null) {
+      deobfuscator.deobfuscateStackTrace(lr.getThrown(), strongName);
+    }
+    return lr;
+  }
+
   public static void logOnServer(String serializedLogRecordJson,
       String strongName, StackTraceDeobfuscator deobfuscator,
       String loggerNameOverride) throws RemoteLoggingException {
-    LogRecord lr;
     try {
-      lr = JsonLogRecordServerUtil.logRecordFromJson(
-          serializedLogRecordJson);
+      LogRecord lr = JsonLogRecordServerUtil.logRecordFromJson(serializedLogRecordJson);
       logOnServer(lr, strongName, deobfuscator, loggerNameOverride);
     } catch (Exception e) {
       // We don't want to import the JsonException, which will require the json
diff --git a/user/src/com/google/web/bindery/requestfactory/server/Logging.java b/user/src/com/google/web/bindery/requestfactory/server/Logging.java
index 73c6f54..485fb04 100644
--- a/user/src/com/google/web/bindery/requestfactory/server/Logging.java
+++ b/user/src/com/google/web/bindery/requestfactory/server/Logging.java
@@ -16,9 +16,9 @@
 
 package com.google.web.bindery.requestfactory.server;
 
+import com.google.gwt.core.server.impl.StackTraceDeobfuscator;
 import com.google.gwt.logging.server.RemoteLoggingServiceUtil;
 import com.google.gwt.logging.server.RemoteLoggingServiceUtil.RemoteLoggingException;
-import com.google.gwt.logging.server.StackTraceDeobfuscator;
 import com.google.gwt.user.client.rpc.RpcRequestBuilder;
 
 import javax.servlet.http.HttpServletRequest;
@@ -30,7 +30,7 @@
  */
 public class Logging {
 
-  private static StackTraceDeobfuscator deobfuscator = new StackTraceDeobfuscator("");
+  private static StackTraceDeobfuscator deobfuscator;
 
   /**
    * Logs a message.
@@ -60,7 +60,7 @@
    * @param dir a directory, specified as a String
    */
   public static void setSymbolMapsDirectory(String dir) {
-    deobfuscator.setSymbolMapsDirectory(dir);
+    deobfuscator = StackTraceDeobfuscator.fromFileSystem(dir);
   }
 
   private String id = "";
diff --git a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java
index 8991ffa..c047bb3 100644
--- a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java
@@ -17,8 +17,8 @@
 package com.google.gwt.user.client.rpc;
 
 import com.google.gwt.core.client.GWT;
-import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.core.client.impl.SourceMapProperty;
+import com.google.gwt.junit.client.GWTTestCase;
 
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
@@ -123,7 +123,6 @@
     service.echoLogRecord(expectedLogRecord, new AsyncCallback<LogRecord>() {
       public void onFailure(Throwable caught) {
         TestSetValidator.rethrowException(caught);
-        fail(caught.getMessage());
       }
 
       public void onSuccess(LogRecord result) {
@@ -151,7 +150,6 @@
           service.deobfuscateLogRecord(createLogRealRecord(e), new AsyncCallback<LogRecord>() {
 
             public void onFailure(Throwable caught) {
-              assertTrue(false);
               TestSetValidator.rethrowException(caught);
             }
 
diff --git a/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java b/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java
index 691139a..f08ac46 100644
--- a/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java
+++ b/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java
@@ -16,17 +16,14 @@
 
 package com.google.gwt.user.server.rpc;
 
-import static com.google.gwt.user.client.rpc.RpcRequestBuilder.MODULE_BASE_HEADER;
-
+import com.google.gwt.core.server.impl.StackTraceDeobfuscator;
 import com.google.gwt.junit.linker.JUnitSymbolMapsLinker;
-import com.google.gwt.logging.server.StackTraceDeobfuscator;
+import com.google.gwt.logging.server.RemoteLoggingServiceUtil;
 import com.google.gwt.user.client.rpc.LoggingRPCTest;
 import com.google.gwt.user.client.rpc.LoggingRPCTestService;
 import com.google.gwt.user.client.rpc.RpcRequestBuilder;
 
 import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.logging.LogRecord;
@@ -41,43 +38,13 @@
     LoggingRPCTestService {
 
   @Override
-  public LogRecord deobfuscateLogRecord(LogRecord value)
-      throws LoggingRPCTestServiceException {
+  public LogRecord deobfuscateLogRecord(LogRecord value) {
     // don't deobfuscate DevMode, there's no symbol map
     if ("HostedMode".equals(getPermutationStrongName())) {
       return value;
     }
 
-    StackTraceDeobfuscator deobf = new StackTraceDeobfuscator(getSymbolMapsDir()) {
-      @Override
-      protected InputStream getSourceMapInputStream(String permutationStrongName,
-          int fragmentNumber)
-          throws IOException {
-        if (symbolMapsDirectory.exists()) {
-          return super.getSourceMapInputStream(permutationStrongName,
-              fragmentNumber);
-        } else {
-          return getServletContext().getResourceAsStream(
-              getModule() + File.separatorChar + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR
-                  + permutationStrongName
-                  + "_sourceMap" + fragmentNumber + ".json");
-        }
-      }
-
-      @Override
-      protected InputStream getSymbolMapInputStream(String permutationStrongName)
-          throws IOException {
-        if (symbolMapsDirectory.exists()) {
-          return super.getSymbolMapInputStream(permutationStrongName);
-        } else {
-          String name =
-              getModule() + File.separatorChar + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR
-                  + permutationStrongName
-                  + ".symbolMap";
-          return getServletContext().getResourceAsStream(name);
-        }
-      }
-    };
+    StackTraceDeobfuscator deobf = StackTraceDeobfuscator.fromUrl(getSymbolMapUrl());
 
     HttpServletRequest threadLocalRequest = getThreadLocalRequest();
     String strongName = null;
@@ -85,11 +52,21 @@
       // can be null during tests
       strongName = threadLocalRequest.getHeader(RpcRequestBuilder.STRONG_NAME_HEADER);
     }
-    LogRecord newRecord = deobf.deobfuscateLogRecord(value, strongName);
+    LogRecord newRecord = RemoteLoggingServiceUtil.deobfuscateLogRecord(deobf, value, strongName);
     Logger.getLogger(value.getLoggerName()).log(newRecord);
     return newRecord;
   }
 
+  private URL getSymbolMapUrl() {
+    File symbolMapsDirectory = new File("war/" + getJunitSymbolMapsPath());
+    try {
+      return symbolMapsDirectory.exists() ? symbolMapsDirectory.toURI().toURL()
+          : getServletContext().getResource(getJunitSymbolMapsPath());
+    } catch (MalformedURLException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
   public LogRecord echoLogRecord(LogRecord value) throws LoggingRPCTestServiceException {
     /*
      * Don't check the stack trace on the server side, because the expected
@@ -104,33 +81,7 @@
     return value;
   }
 
-  private String getModule() {
-    try {
-      String header = getThreadLocalRequest().getHeader(MODULE_BASE_HEADER);
-      if (header == null) {
-        return null;
-      }
-      String path = new URL(header).getPath();
-      String contextPath = getThreadLocalRequest().getContextPath();
-      if (!path.startsWith(contextPath)) {
-        return null;
-      }
-      path = path.substring(contextPath.length());
-      if (path.endsWith("/")) {
-        path = path.substring(0, path.length() - 1);
-      }
-      return path;
-    } catch (MalformedURLException e) {
-      return null;
-    }
-  }
-
-  private String getSymbolMapsDir() {
-    String path = getModule();
-    if (path == null) {
-      return null;
-    }
-    return "war" + File.separatorChar + getModule() + File.separatorChar
-        + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR;
+  private String getJunitSymbolMapsPath() {
+    return getRequestModuleBasePath() + "/" + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR;
   }
 }