Repository: storm
Updated Branches:
  refs/heads/master d304dd585 -> 70d8ba9d5


STORM-2716: Fix logviewer on Windows, and make storm-webapp tests pass on 
Windows. Get rid of various constants that were duplicating File.separator and 
File.pathSeparator.


Project: http://git-wip-us.apache.org/repos/asf/storm/repo
Commit: http://git-wip-us.apache.org/repos/asf/storm/commit/370a6318
Tree: http://git-wip-us.apache.org/repos/asf/storm/tree/370a6318
Diff: http://git-wip-us.apache.org/repos/asf/storm/diff/370a6318

Branch: refs/heads/master
Commit: 370a631857a2b510a1d4de2870ded09598394aa9
Parents: cbe1e37
Author: Stig Rohde Døssing <[email protected]>
Authored: Sun Aug 20 18:59:12 2017 +0200
Committer: Stig Rohde Døssing <[email protected]>
Committed: Sat Oct 7 22:25:57 2017 +0200

----------------------------------------------------------------------
 .gitattributes                                  |  2 +
 .../src/jvm/org/apache/storm/utils/Utils.java   |  1 -
 storm-core/src/clj/org/apache/storm/ui/core.clj | 10 +--
 .../jvm/org/apache/storm/utils/WebAppUtils.java |  8 +-
 .../storm/daemon/supervisor/BasicContainer.java | 16 ++--
 .../apache/storm/localizer/AsyncLocalizer.java  |  4 +-
 .../org/apache/storm/utils/ServerUtils.java     |  8 +-
 storm-webapp/pom.xml                            |  2 +-
 .../handler/LogviewerLogSearchHandler.java      | 68 ++++++--------
 .../handler/LogviewerProfileHandler.java        |  8 +-
 .../logviewer/utils/LogFileDownloader.java      |  2 +-
 .../daemon/logviewer/utils/WorkerLogs.java      |  6 +-
 .../org/apache/storm/daemon/utils/PathUtil.java | 39 ++++++++
 .../apache/storm/daemon/utils/UrlBuilder.java   | 16 +++-
 .../handler/LogviewerLogSearchHandlerTest.java  | 95 ++++++++++++--------
 storm-webapp/src/test/resources/log4j2.xml      | 32 +++++++
 16 files changed, 203 insertions(+), 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/.gitattributes
----------------------------------------------------------------------
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..c2dc683
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Some storm-webapp logviewer tests require input files to have LF line 
endings due to byte counting.
+storm-webapp/src/test/resources/*.log.test text eol=lf
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-client/src/jvm/org/apache/storm/utils/Utils.java
----------------------------------------------------------------------
diff --git a/storm-client/src/jvm/org/apache/storm/utils/Utils.java 
b/storm-client/src/jvm/org/apache/storm/utils/Utils.java
index b1f3ca7..0a38f61 100644
--- a/storm-client/src/jvm/org/apache/storm/utils/Utils.java
+++ b/storm-client/src/jvm/org/apache/storm/utils/Utils.java
@@ -106,7 +106,6 @@ public class Utils {
     public static final Logger LOG = LoggerFactory.getLogger(Utils.class);
     public static final String DEFAULT_STREAM_ID = "default";
     private static final Set<Class> defaultAllowedExceptions = new HashSet<>();
-    public static final String FILE_PATH_SEPARATOR = 
System.getProperty("file.separator");
     private static final List<String> LOCALHOST_ADDRESSES = 
Lists.newArrayList("localhost", "127.0.0.1", "0:0:0:0:0:0:0:1");
 
     private static ThreadLocal<TSerializer> threadSer = new 
ThreadLocal<TSerializer>();

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-core/src/clj/org/apache/storm/ui/core.clj
----------------------------------------------------------------------
diff --git a/storm-core/src/clj/org/apache/storm/ui/core.clj 
b/storm-core/src/clj/org/apache/storm/ui/core.clj
index 1d2ea85..75419d4 100644
--- a/storm-core/src/clj/org/apache/storm/ui/core.clj
+++ b/storm-core/src/clj/org/apache/storm/ui/core.clj
@@ -374,12 +374,12 @@
   (let [tplg-main-class (if (not-nil? tplg-config) (trim (tplg-config 
"topologyMainClass")))
         tplg-main-class-args (if (not-nil? tplg-config) (tplg-config 
"topologyMainClassArgs"))
         storm-home (System/getProperty "storm.home")
-        storm-conf-dir (str storm-home WebAppUtils/FILE_PATH_SEPARATOR "conf")
+        storm-conf-dir (str storm-home File/separator "conf")
         storm-log-dir (if (not-nil? (*STORM-CONF* "storm.log.dir")) 
(*STORM-CONF* "storm.log.dir")
-                                                                    (str 
storm-home WebAppUtils/FILE_PATH_SEPARATOR "logs"))
-        storm-libs (str storm-home WebAppUtils/FILE_PATH_SEPARATOR "lib" 
WebAppUtils/FILE_PATH_SEPARATOR "*")
-        java-cmd (str (System/getProperty "java.home") 
WebAppUtils/FILE_PATH_SEPARATOR "bin" WebAppUtils/FILE_PATH_SEPARATOR "java")
-        storm-cmd (str storm-home WebAppUtils/FILE_PATH_SEPARATOR "bin" 
WebAppUtils/FILE_PATH_SEPARATOR "storm")
+                                                                    (str 
storm-home File/separator "logs"))
+        storm-libs (str storm-home File/separator "lib" File/separator "*")
+        java-cmd (str (System/getProperty "java.home") File/separator "bin" 
File/separator "java")
+        storm-cmd (str storm-home File/separator "bin" File/separator "storm")
         tplg-cmd-response (apply sh
                             (flatten
                               [storm-cmd "jar" tplg-jar-file tplg-main-class

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-core/src/jvm/org/apache/storm/utils/WebAppUtils.java
----------------------------------------------------------------------
diff --git a/storm-core/src/jvm/org/apache/storm/utils/WebAppUtils.java 
b/storm-core/src/jvm/org/apache/storm/utils/WebAppUtils.java
index db8537e..1b2c09f 100644
--- a/storm-core/src/jvm/org/apache/storm/utils/WebAppUtils.java
+++ b/storm-core/src/jvm/org/apache/storm/utils/WebAppUtils.java
@@ -18,14 +18,14 @@
 
 package org.apache.storm.utils;
 
-public class WebAppUtils {
-    public static final String FILE_PATH_SEPARATOR = 
System.getProperty("file.separator");
+import java.io.File;
 
+public class WebAppUtils {
     public static String eventLogsFilename(String stormId, String port) {
-        return stormId + FILE_PATH_SEPARATOR + port + FILE_PATH_SEPARATOR + 
"events.log";
+        return stormId + File.separator + port + File.separator + "events.log";
     }
 
     public static String logsFilename(String stormId, String port) {
-        return stormId + FILE_PATH_SEPARATOR + port + FILE_PATH_SEPARATOR + 
"worker.log";
+        return stormId + File.separator + port + File.separator + "worker.log";
     }
 }

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-server/src/main/java/org/apache/storm/daemon/supervisor/BasicContainer.java
----------------------------------------------------------------------
diff --git 
a/storm-server/src/main/java/org/apache/storm/daemon/supervisor/BasicContainer.java
 
b/storm-server/src/main/java/org/apache/storm/daemon/supervisor/BasicContainer.java
index 6458b2b..1e25e50 100644
--- 
a/storm-server/src/main/java/org/apache/storm/daemon/supervisor/BasicContainer.java
+++ 
b/storm-server/src/main/java/org/apache/storm/daemon/supervisor/BasicContainer.java
@@ -66,7 +66,7 @@ public class BasicContainer extends Container {
     private static final Logger LOG = 
LoggerFactory.getLogger(BasicContainer.class);
     private static final FilenameFilter jarFilter = (dir, name) -> 
name.endsWith(".jar");
     private static final Joiner CPJ = 
-            Joiner.on(ServerUtils.CLASS_PATH_SEPARATOR).skipNulls();
+            Joiner.on(File.pathSeparator).skipNulls();
     
     protected final LocalState _localState;
     protected final String _profileCmd;
@@ -156,7 +156,7 @@ public class BasicContainer extends Container {
         }
 
         if (profileCmd == null) {
-            profileCmd = _stormHome + Utils.FILE_PATH_SEPARATOR + "bin" + 
Utils.FILE_PATH_SEPARATOR
+            profileCmd = _stormHome + File.separator + "bin" + File.separator
                     + conf.get(DaemonConfig.WORKER_PROFILER_COMMAND);
         }
         _profileCmd = profileCmd;
@@ -350,10 +350,10 @@ public class BasicContainer extends Container {
      * @return the java.library.path/LD_LIBRARY_PATH to use so native 
libraries load correctly.
      */
     protected String javaLibraryPath(String stormRoot, Map<String, Object> 
conf) {
-        String resourceRoot = stormRoot + Utils.FILE_PATH_SEPARATOR + 
ServerConfigUtils.RESOURCES_SUBDIR;
+        String resourceRoot = stormRoot + File.separator + 
ServerConfigUtils.RESOURCES_SUBDIR;
         String os = System.getProperty("os.name").replaceAll("\\s+", "_");
         String arch = System.getProperty("os.arch");
-        String archResourceRoot = resourceRoot + Utils.FILE_PATH_SEPARATOR + 
os + "-" + arch;
+        String archResourceRoot = resourceRoot + File.separator + os + "-" + 
arch;
         String ret = CPJ.join(archResourceRoot, resourceRoot,
                 conf.get(DaemonConfig.JAVA_LIBRARY_PATH));
         return ret;
@@ -514,16 +514,16 @@ public class BasicContainer extends Container {
 
         if (StringUtils.isNotBlank(log4jConfigurationDir)) {
             if (!ServerUtils.isAbsolutePath(log4jConfigurationDir)) {
-                log4jConfigurationDir = _stormHome + Utils.FILE_PATH_SEPARATOR 
+ log4jConfigurationDir;
+                log4jConfigurationDir = _stormHome + File.separator + 
log4jConfigurationDir;
             }
         } else {
-            log4jConfigurationDir = _stormHome + Utils.FILE_PATH_SEPARATOR + 
"log4j2";
+            log4jConfigurationDir = _stormHome + File.separator + "log4j2";
         }
  
         if (ServerUtils.IS_ON_WINDOWS && 
!log4jConfigurationDir.startsWith("file:")) {
             log4jConfigurationDir = "file:///" + log4jConfigurationDir;
         }
-        return log4jConfigurationDir + Utils.FILE_PATH_SEPARATOR + 
"worker.xml";
+        return log4jConfigurationDir + File.separator + "worker.xml";
     }
     
     private static class TopologyMetaData {
@@ -692,7 +692,7 @@ public class BasicContainer extends Container {
         String ret = null;
         String javaHome = System.getenv().get("JAVA_HOME");
         if (StringUtils.isNotBlank(javaHome)) {
-            ret = javaHome + Utils.FILE_PATH_SEPARATOR + "bin" + 
Utils.FILE_PATH_SEPARATOR + cmd;
+            ret = javaHome + File.separator + "bin" + File.separator + cmd;
         } else {
             ret = cmd;
         }

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-server/src/main/java/org/apache/storm/localizer/AsyncLocalizer.java
----------------------------------------------------------------------
diff --git 
a/storm-server/src/main/java/org/apache/storm/localizer/AsyncLocalizer.java 
b/storm-server/src/main/java/org/apache/storm/localizer/AsyncLocalizer.java
index 913820c..043de8a 100644
--- a/storm-server/src/main/java/org/apache/storm/localizer/AsyncLocalizer.java
+++ b/storm-server/src/main/java/org/apache/storm/localizer/AsyncLocalizer.java
@@ -318,7 +318,7 @@ public class AsyncLocalizer implements AutoCloseable {
                     }
                 }
                 boolean deleteAll = true;
-                String tmproot = ServerConfigUtils.supervisorTmpDir(conf) + 
Utils.FILE_PATH_SEPARATOR + Utils.uuid();
+                String tmproot = ServerConfigUtils.supervisorTmpDir(conf) + 
File.separator + Utils.uuid();
                 File tr = new File(tmproot);
                 try {
                     downloadBaseBlobs(tr);
@@ -379,7 +379,7 @@ public class AsyncLocalizer implements AutoCloseable {
             String resourcesJar = resourcesJar();
             URL url = 
classloader.getResource(ServerConfigUtils.RESOURCES_SUBDIR);
 
-            String targetDir = tmproot + Utils.FILE_PATH_SEPARATOR;
+            String targetDir = tmproot + File.separator;
             if (resourcesJar != null) {
                 LOG.info("Extracting resources from jar at {} to {}", 
resourcesJar, targetDir);
                 ServerUtils.extractDirFromJar(resourcesJar, 
ServerConfigUtils.RESOURCES_SUBDIR, new File(targetDir));

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-server/src/main/java/org/apache/storm/utils/ServerUtils.java
----------------------------------------------------------------------
diff --git a/storm-server/src/main/java/org/apache/storm/utils/ServerUtils.java 
b/storm-server/src/main/java/org/apache/storm/utils/ServerUtils.java
index f781d2e..9f2b95b 100644
--- a/storm-server/src/main/java/org/apache/storm/utils/ServerUtils.java
+++ b/storm-server/src/main/java/org/apache/storm/utils/ServerUtils.java
@@ -67,10 +67,8 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.zip.GZIPInputStream;
@@ -80,8 +78,6 @@ import java.util.zip.ZipFile;
 public class ServerUtils {
     public static final Logger LOG = 
LoggerFactory.getLogger(ServerUtils.class);
 
-    public static final String FILE_PATH_SEPARATOR = 
System.getProperty("file.separator");
-    public static final String CLASS_PATH_SEPARATOR = 
System.getProperty("path.separator");
     public static final boolean IS_ON_WINDOWS = 
"Windows_NT".equals(System.getenv("OS"));
     public static final String CURRENT_BLOB_SUFFIX_ID = "current";
 
@@ -282,11 +278,11 @@ public class ServerUtils {
     }
 
     public static String containerFilePath (String dir) {
-        return dir + FILE_PATH_SEPARATOR + "launch_container.sh";
+        return dir + File.separator + "launch_container.sh";
     }
 
     public static String scriptFilePath (String dir) {
-        return dir + FILE_PATH_SEPARATOR + "storm-worker-script.sh";
+        return dir + File.separator + "storm-worker-script.sh";
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-webapp/pom.xml
----------------------------------------------------------------------
diff --git a/storm-webapp/pom.xml b/storm-webapp/pom.xml
index fcc9d1a..7c2bcf2 100644
--- a/storm-webapp/pom.xml
+++ b/storm-webapp/pom.xml
@@ -143,7 +143,7 @@
                 <artifactId>maven-checkstyle-plugin</artifactId>
                 <!--Note - the version would be inherited-->
                 <configuration>
-                    <maxAllowedViolations>8</maxAllowedViolations>
+                    <maxAllowedViolations>7</maxAllowedViolations>
                 </configuration>
             </plugin>
             <plugin>

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandler.java
----------------------------------------------------------------------
diff --git 
a/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandler.java
 
b/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandler.java
index ffa1bc9..24265ac 100644
--- 
a/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandler.java
+++ 
b/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandler.java
@@ -23,7 +23,7 @@ import static 
org.apache.storm.daemon.utils.ListFunctionalSupport.drop;
 import static org.apache.storm.daemon.utils.ListFunctionalSupport.first;
 import static org.apache.storm.daemon.utils.ListFunctionalSupport.last;
 import static org.apache.storm.daemon.utils.ListFunctionalSupport.rest;
-import static org.apache.storm.daemon.utils.ListFunctionalSupport.takeLast;
+import static 
org.apache.storm.daemon.utils.PathUtil.truncatePathToLastElements;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -31,12 +31,14 @@ import com.google.common.annotations.VisibleForTesting;
 
 import java.io.BufferedInputStream;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -173,7 +175,7 @@ public class LogviewerLogSearchHandler {
                                               Boolean searchArchived, String 
callback, String origin) {
         String rootDir = logRoot;
         Object returnValue;
-        File topologyDir = new File(rootDir + Utils.FILE_PATH_SEPARATOR + 
topologyId);
+        File topologyDir = new File(rootDir, topologyId);
         if (StringUtils.isEmpty(search) || !topologyDir.exists()) {
             returnValue = new ArrayList<>();
         } else {
@@ -216,8 +218,8 @@ public class LogviewerLogSearchHandler {
                 if (!containsPort) {
                     returnValue = new ArrayList<>();
                 } else {
-                    File portDir = new File(rootDir + 
Utils.FILE_PATH_SEPARATOR + topologyId
-                            + Utils.FILE_PATH_SEPARATOR + port);
+                    File portDir = new File(rootDir + File.separator + 
topologyId
+                            + File.separator + port);
 
                     if (!portDir.exists() || logsForPort(user, 
portDir).isEmpty()) {
                         returnValue = new ArrayList<>();
@@ -266,23 +268,15 @@ public class LogviewerLogSearchHandler {
             if (StringUtils.isEmpty(searchString)) {
                 throw new IllegalArgumentException("Precondition fails: search 
string should not be empty.");
             }
-            if (searchString.getBytes("UTF-8").length > GREP_MAX_SEARCH_SIZE) {
+            if (searchString.getBytes(StandardCharsets.UTF_8).length > 
GREP_MAX_SEARCH_SIZE) {
                 throw new IllegalArgumentException("Precondition fails: the 
length of search string should be less than "
-                        + GREP_MAX_SEARCH_SIZE);
+                    + GREP_MAX_SEARCH_SIZE);
             }
 
             boolean isZipFile = file.getName().endsWith(".gz");
-
-            InputStream gzippedInputStream = null;
-            try {
-                FileInputStream fis = new FileInputStream(file);
-                if (isZipFile) {
-                    gzippedInputStream = new GZIPInputStream(fis);
-                } else {
-                    gzippedInputStream = fis;
-                }
-
-                BufferedInputStream stream = new 
BufferedInputStream(gzippedInputStream);
+            try (InputStream fis = Files.newInputStream(file.toPath());
+                InputStream gzippedInputStream = isZipFile ? new 
GZIPInputStream(fis) : fis;
+                BufferedInputStream stream = new 
BufferedInputStream(gzippedInputStream)) {
 
                 int fileLength;
                 if (isZipFile) {
@@ -293,7 +287,7 @@ public class LogviewerLogSearchHandler {
 
                 ByteBuffer buf = ByteBuffer.allocate(GREP_BUF_SIZE);
                 final byte[] bufArray = buf.array();
-                final byte[] searchBytes = searchString.getBytes("UTF-8");
+                final byte[] searchBytes = 
searchString.getBytes(StandardCharsets.UTF_8);
                 numMatches = numMatches != null ? numMatches : 10;
                 startByteOffset = startByteOffset != null ? startByteOffset : 
0;
 
@@ -322,7 +316,7 @@ public class LogviewerLogSearchHandler {
                 Map<String, Object> ret = new HashMap<>();
                 while (true) {
                     SubstringSearchResult searchRet = 
bufferSubstringSearch(isDaemon, file, fileLength, byteOffset, initBufOffset,
-                            stream, startByteOffset, totalBytesRead, buf, 
searchBytes, initialMatches, numMatches, beforeBytes);
+                        stream, startByteOffset, totalBytesRead, buf, 
searchBytes, initialMatches, numMatches, beforeBytes);
 
                     List<Map<String, Object>> matches = searchRet.getMatches();
                     Integer newByteOffset = searchRet.getNewByteOffset();
@@ -357,10 +351,6 @@ public class LogviewerLogSearchHandler {
                     }
                 }
                 return ret;
-            } finally {
-                if (gzippedInputStream != null) {
-                    gzippedInputStream.close();
-                }
             }
         } catch (IOException e) {
             throw new RuntimeException(e);
@@ -418,13 +408,13 @@ public class LogviewerLogSearchHandler {
             final List<Map<String, Object>> newMatches = new 
ArrayList<>(matches);
             Map<String, Object> currentFileMatch = new HashMap<>(theseMatches);
             currentFileMatch.put("fileName", fileName);
-            List<String> splitPath;
+            Path firstLogAbsPath;
             try {
-                splitPath = 
Arrays.asList(firstLog.getCanonicalPath().split(Utils.FILE_PATH_SEPARATOR));
+                firstLogAbsPath = firstLog.getCanonicalFile().toPath();
             } catch (IOException e) {
                 throw new RuntimeException(e);
             }
-            currentFileMatch.put("port", first(takeLast(splitPath, 2)));
+            currentFileMatch.put("port", 
truncatePathToLastElements(firstLogAbsPath, 2).getName(0));
             newMatches.add(currentFileMatch);
 
             int newCount = matchCount + 
((List<?>)theseMatches.get("matches")).size();
@@ -483,7 +473,7 @@ public class LogviewerLogSearchHandler {
 
                 bufOffset = offset + needle.length;
                 matches.add(mkMatchData(needle, haystack, offset, fileOffset,
-                        file.getCanonicalPath(), isDaemon, beforeArg, 
afterArg));
+                        file.getCanonicalFile().toPath(), isDaemon, beforeArg, 
afterArg));
             } else {
                 int beforeStrToOffset = Math.min(haystack.limit(), 
GREP_MAX_SEARCH_SIZE);
                 int beforeStrFromOffset = Math.max(0, beforeStrToOffset - 
GREP_CONTEXT_SIZE);
@@ -521,14 +511,14 @@ public class LogviewerLogSearchHandler {
     }
 
 
-    private Map<String, Object> mkMatchData(byte[] needle, ByteBuffer 
haystack, int haystackOffset, int fileOffset, String fname,
+    private Map<String, Object> mkMatchData(byte[] needle, ByteBuffer 
haystack, int haystackOffset, int fileOffset, Path canonicalPath,
                                             boolean isDaemon, byte[] 
beforeBytes, byte[] afterBytes)
             throws UnsupportedEncodingException, UnknownHostException {
         String url;
         if (isDaemon) {
-            url = urlToMatchCenteredInLogPageDaemonFile(needle, fname, 
fileOffset, logviewerPort);
+            url = urlToMatchCenteredInLogPageDaemonFile(needle, canonicalPath, 
fileOffset, logviewerPort);
         } else {
-            url = urlToMatchCenteredInLogPage(needle, fname, fileOffset, 
logviewerPort);
+            url = urlToMatchCenteredInLogPage(needle, canonicalPath, 
fileOffset, logviewerPort);
         }
 
         byte[] haystackBytes = haystack.array();
@@ -661,15 +651,14 @@ public class LogviewerLogSearchHandler {
         }
         return ret;
     }
-
+    
     @VisibleForTesting
-    String urlToMatchCenteredInLogPage(byte[] needle, String fname, int 
offset, Integer port) throws UnknownHostException {
+    String urlToMatchCenteredInLogPage(byte[] needle, Path canonicalPath, int 
offset, Integer port) throws UnknownHostException {
         final String host = Utils.hostname();
-        String splittedFileName = String.join(Utils.FILE_PATH_SEPARATOR,
-                
takeLast(Arrays.asList(fname.split(Utils.FILE_PATH_SEPARATOR)), 3));
+        final Path truncatedFilePath = 
truncatePathToLastElements(canonicalPath, 3);
 
         Map<String, Object> parameters = new HashMap<>();
-        parameters.put("file", splittedFileName);
+        parameters.put("file", truncatedFilePath.toString());
         parameters.put("start", Math.max(0, offset - 
(LogviewerConstant.DEFAULT_BYTES_PER_PAGE / 2) - (needle.length / -2)));
         parameters.put("length", LogviewerConstant.DEFAULT_BYTES_PER_PAGE);
 
@@ -677,13 +666,12 @@ public class LogviewerLogSearchHandler {
     }
 
     @VisibleForTesting
-    String urlToMatchCenteredInLogPageDaemonFile(byte[] needle, String fname, 
int offset, Integer port) throws UnknownHostException {
+    String urlToMatchCenteredInLogPageDaemonFile(byte[] needle, Path 
canonicalPath, int offset, Integer port) throws UnknownHostException {
         final String host = Utils.hostname();
-        String splittedFileName = String.join(Utils.FILE_PATH_SEPARATOR,
-                
takeLast(Arrays.asList(fname.split(Utils.FILE_PATH_SEPARATOR)), 1));
+        final Path truncatedFilePath = 
truncatePathToLastElements(canonicalPath, 1);
 
         Map<String, Object> parameters = new HashMap<>();
-        parameters.put("file", splittedFileName);
+        parameters.put("file", truncatedFilePath.toString());
         parameters.put("start", Math.max(0, offset - 
(LogviewerConstant.DEFAULT_BYTES_PER_PAGE / 2) - (needle.length / -2)));
         parameters.put("length", LogviewerConstant.DEFAULT_BYTES_PER_PAGE);
 

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerProfileHandler.java
----------------------------------------------------------------------
diff --git 
a/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerProfileHandler.java
 
b/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerProfileHandler.java
index d7487e7..b685937 100644
--- 
a/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerProfileHandler.java
+++ 
b/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/handler/LogviewerProfileHandler.java
@@ -68,10 +68,10 @@ public class LogviewerProfileHandler {
      */
     public Response listDumpFiles(String topologyId, String hostPort, String 
user) throws IOException {
         String portStr = hostPort.split(":")[1];
-        File dir = new File(String.join(ServerUtils.FILE_PATH_SEPARATOR, 
logRoot, topologyId, portStr));
+        File dir = new File(String.join(File.separator, logRoot, topologyId, 
portStr));
 
         if (dir.exists()) {
-            String workerFileRelativePath = 
String.join(ServerUtils.FILE_PATH_SEPARATOR, topologyId, portStr, 
WORKER_LOG_FILENAME);
+            String workerFileRelativePath = String.join(File.separator, 
topologyId, portStr, WORKER_LOG_FILENAME);
             if (resourceAuthorizer.isUserAllowedToAccessFile(user, 
workerFileRelativePath)) {
                 String content = buildDumpFileListPage(topologyId, hostPort, 
dir);
                 return 
LogviewerResponseBuilder.buildSuccessHtmlResponse(content);
@@ -95,11 +95,11 @@ public class LogviewerProfileHandler {
      */
     public Response downloadDumpFile(String topologyId, String hostPort, 
String fileName, String user) throws IOException {
         String portStr = hostPort.split(":")[1];
-        File dir = new File(String.join(ServerUtils.FILE_PATH_SEPARATOR, 
logRoot, topologyId, portStr));
+        File dir = new File(String.join(File.separator, logRoot, topologyId, 
portStr));
         File file = new File(dir, fileName);
 
         if (dir.exists() && file.exists()) {
-            String workerFileRelativePath = 
String.join(ServerUtils.FILE_PATH_SEPARATOR, topologyId, portStr, 
WORKER_LOG_FILENAME);
+            String workerFileRelativePath = String.join(File.separator, 
topologyId, portStr, WORKER_LOG_FILENAME);
             if (resourceAuthorizer.isUserAllowedToAccessFile(user, 
workerFileRelativePath)) {
                 return LogviewerResponseBuilder.buildDownloadFile(file);
             } else {

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/LogFileDownloader.java
----------------------------------------------------------------------
diff --git 
a/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/LogFileDownloader.java
 
b/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/LogFileDownloader.java
index 3984f03..7cef549 100644
--- 
a/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/LogFileDownloader.java
+++ 
b/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/LogFileDownloader.java
@@ -43,7 +43,7 @@ public class LogFileDownloader {
     }
 
     /**
-     * Checks authorization for the log file and download
+     * Checks authorization for the log file and download.
      *
      * @param fileName file to download
      * @param user username

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/WorkerLogs.java
----------------------------------------------------------------------
diff --git 
a/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/WorkerLogs.java
 
b/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/WorkerLogs.java
index eba6404..eda2478 100644
--- 
a/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/WorkerLogs.java
+++ 
b/storm-webapp/src/main/java/org/apache/storm/daemon/logviewer/utils/WorkerLogs.java
@@ -42,6 +42,7 @@ import java.util.stream.Stream;
 
 import org.apache.storm.daemon.supervisor.ClientSupervisorUtils;
 import org.apache.storm.daemon.supervisor.SupervisorUtils;
+import org.apache.storm.daemon.utils.PathUtil;
 import org.apache.storm.utils.ObjectReader;
 import org.apache.storm.utils.Time;
 import org.apache.storm.utils.Utils;
@@ -207,10 +208,7 @@ public class WorkerLogs {
      */
     public static String getTopologyPortWorkerLog(File file) {
         try {
-            String[] splitted = 
file.getCanonicalPath().split(Utils.FILE_PATH_SEPARATOR);
-            List<String> split = takeLast(Arrays.asList(splitted), 3);
-
-            return String.join(Utils.FILE_PATH_SEPARATOR, split);
+            return 
PathUtil.truncatePathToLastElements(file.getCanonicalFile().toPath(), 
3).toString();
         } catch (IOException e) {
             throw new RuntimeException(e);
         }

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-webapp/src/main/java/org/apache/storm/daemon/utils/PathUtil.java
----------------------------------------------------------------------
diff --git 
a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/PathUtil.java 
b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/PathUtil.java
new file mode 100644
index 0000000..0aed50f
--- /dev/null
+++ b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/PathUtil.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2017 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.storm.daemon.utils;
+
+import java.nio.file.Path;
+
+/**
+ * Utility functions to make Path manipulation slightly less verbose.
+ */
+public class PathUtil {
+
+    /**
+     * Truncates path to the last numElements.
+     * @param path The path to truncate.
+     * @param numElements The number of elements to preserve at the end of the 
path.
+     * @return The truncated path.
+     */
+    public static Path truncatePathToLastElements(Path path, int numElements) {
+        if (path.getNameCount() <= numElements) {
+            return path;
+        }
+        return path.subpath(path.getNameCount() - numElements, 
path.getNameCount());
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-webapp/src/main/java/org/apache/storm/daemon/utils/UrlBuilder.java
----------------------------------------------------------------------
diff --git 
a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/UrlBuilder.java 
b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/UrlBuilder.java
index cea6dcc..0ad6d64 100644
--- a/storm-webapp/src/main/java/org/apache/storm/daemon/utils/UrlBuilder.java
+++ b/storm-webapp/src/main/java/org/apache/storm/daemon/utils/UrlBuilder.java
@@ -20,13 +20,16 @@ package org.apache.storm.daemon.utils;
 
 import static java.util.stream.Collectors.joining;
 
+import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
 
 /**
  * Convenient utility class to build the URL.
  */
 public class UrlBuilder {
+
     private UrlBuilder() {
     }
 
@@ -44,8 +47,17 @@ public class UrlBuilder {
             sb.append("?");
 
             String queryParam = parameters.entrySet().stream()
-                    .map(entry -> URLEncoder.encode(entry.getKey()) + "=" + 
URLEncoder.encode(entry.getValue().toString()))
-                    .collect(joining("&"));
+                .map(entry -> {
+                    try {
+                        return URLEncoder.encode(entry.getKey(), 
StandardCharsets.UTF_8.name())
+                            + "="
+                            + URLEncoder.encode(entry.getValue().toString(), 
StandardCharsets.UTF_8.name());
+                    } catch (UnsupportedEncodingException e) {
+                        //This can't happen, UTF-8 is always available
+                        throw new RuntimeException(e);
+                    }
+                })
+                .collect(joining("&"));
             sb.append(queryParam);
         }
         return sb.toString();

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java
----------------------------------------------------------------------
diff --git 
a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java
 
b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java
index c7f927b..10e422d 100644
--- 
a/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java
+++ 
b/storm-webapp/src/test/java/org/apache/storm/daemon/logviewer/handler/LogviewerLogSearchHandlerTest.java
@@ -35,7 +35,9 @@ import static 
org.mockito.internal.verification.VerificationModeFactory.times;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URLEncoder;
 import java.net.UnknownHostException;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.attribute.FileAttribute;
 import java.util.ArrayList;
@@ -65,10 +67,10 @@ import org.mockito.ArgumentCaptor;
 public class LogviewerLogSearchHandlerTest {
 
     public static class SearchViaRestApi {
-        private String pattern = "needle";
-        private String expectedHost = "dev.null.invalid";
-        private Integer expectedPort = 8888;
-        private String logviewerUrlPrefix = "http://"; + expectedHost + ":" + 
expectedPort;
+        private final String pattern = "needle";
+        private final String expectedHost = "dev.null.invalid";
+        private final Integer expectedPort = 8888;
+        private final String logviewerUrlPrefix = "http://"; + expectedHost + 
":" + expectedPort;
 
         /*
          When we click a link to the logviewer, we expect the match line to
@@ -76,7 +78,7 @@ public class LogviewerLogSearchHandlerTest {
          the default page length from the offset at which we found the
          match.
          */
-        private Function<Integer, Integer> expOffsetFn = arg -> 
(LogviewerConstant.DEFAULT_BYTES_PER_PAGE / 2 - arg);
+        private final Function<Integer, Integer> expOffsetFn = arg -> 
(LogviewerConstant.DEFAULT_BYTES_PER_PAGE / 2 - arg);
 
         @Test(expected = RuntimeException.class)
         public void testSearchViaRestApiThrowsIfBogusFileIsGiven() throws 
InvalidRequestException {
@@ -96,7 +98,7 @@ public class LogviewerLogSearchHandlerTest {
 
                 when(mockedUtil.hostname()).thenReturn(expectedHost);
 
-                String actualUrl = handler.urlToMatchCenteredInLogPage(new 
byte[42], expectedFname, 27526, 8888);
+                String actualUrl = handler.urlToMatchCenteredInLogPage(new 
byte[42], new File(expectedFname).toPath(), 27526, 8888);
 
                 assertEquals("http://"; + expectedHost + ":" + expectedPort + 
"/api/v1/log?file=" + expectedFname
                         + "&start=1947&length=" + 
LogviewerConstant.DEFAULT_BYTES_PER_PAGE, actualUrl);
@@ -117,7 +119,7 @@ public class LogviewerLogSearchHandlerTest {
 
                 when(mockedUtil.hostname()).thenReturn(expectedHost);
 
-                String actualUrl = 
handler.urlToMatchCenteredInLogPageDaemonFile(new byte[42], expectedFname, 
27526, 8888);
+                String actualUrl = 
handler.urlToMatchCenteredInLogPageDaemonFile(new byte[42], new 
File(expectedFname).toPath(), 27526, 8888);
 
                 assertEquals("http://"; + expectedHost + ":" + expectedPort + 
"/api/v1/daemonlog?file=" + expectedFname
                         + "&start=1947&length=" + 
LogviewerConstant.DEFAULT_BYTES_PER_PAGE, actualUrl);
@@ -128,7 +130,7 @@ public class LogviewerLogSearchHandlerTest {
 
         @SuppressWarnings("checkstyle:LineLength")
         @Test
-        public void testReturnsCorrectBeforeAndAfterContext() throws 
InvalidRequestException, UnknownHostException {
+        public void testReturnsCorrectBeforeAndAfterContext() throws Exception 
{
             Utils prevUtils = null;
             try {
                 Utils mockedUtil = mock(Utils.class);
@@ -149,27 +151,31 @@ public class LogviewerLogSearchHandlerTest {
                 matches.add(buildMatchData(0, "",
                         " 
needle000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000needle
 ",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() 
+"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                         ));
 
                 matches.add(buildMatchData(7, "needle ",
                         
"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000needle
 needle\n",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                         ));
 
                 matches.add(buildMatchData(127,
                         "needle 
needle000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
                         " needle\n",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                         ));
 
                 matches.add(buildMatchData(134,
                         " 
needle000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000needle
 ",
                         "\n",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                         ));
 
                 expected.put("matches", matches);
@@ -184,7 +190,7 @@ public class LogviewerLogSearchHandlerTest {
         }
 
         @Test
-        public void testAreallySmallLogFile() throws InvalidRequestException, 
UnknownHostException {
+        public void testAreallySmallLogFile() throws Exception {
             Utils prevUtils = null;
             try {
                 Utils mockedUtil = mock(Utils.class);
@@ -205,14 +211,15 @@ public class LogviewerLogSearchHandlerTest {
                 matches.add(buildMatchData(7, "000000 ",
                         " 000000\n",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 expected.put("matches", matches);
 
                 LogviewerLogSearchHandler handler = 
getSearchHandlerWithPort(expectedPort);
                 Map<String, Object> searchResult = 
handler.substringSearch(file, pattern);
-
+                
                 assertEquals(expected, searchResult);
             } finally {
                 Utils.setInstance(prevUtils);
@@ -256,7 +263,7 @@ public class LogviewerLogSearchHandlerTest {
         }
 
         @Test
-        public void testNoOffsetReturnedWhenFileEndsOnBufferOffset() throws 
InvalidRequestException, UnknownHostException {
+        public void testNoOffsetReturnedWhenFileEndsOnBufferOffset() throws 
Exception {
             Utils prevUtils = null;
             try {
                 Utils mockedUtil = mock(Utils.class);
@@ -278,7 +285,8 @@ public class LogviewerLogSearchHandlerTest {
                         Seq.range(0, 128).map(x -> ".").collect(joining()),
                         "",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 expected.put("matches", matches);
@@ -296,7 +304,7 @@ public class LogviewerLogSearchHandlerTest {
 
         @SuppressWarnings("checkstyle:LineLength")
         @Test
-        public void testNextByteOffsetsAreCorrectForEachMatch() throws 
UnknownHostException, InvalidRequestException {
+        public void testNextByteOffsetsAreCorrectForEachMatch() throws 
Exception {
             Utils prevUtils = null;
             try {
                 Utils mockedUtil = mock(Utils.class);
@@ -343,49 +351,56 @@ public class LogviewerLogSearchHandlerTest {
                         "Test ",
                         " is near the beginning of the file.\nThis file 
assumes a buffer size of 2048 bytes, a max search string size of 1024 bytes, 
and a",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 matches.add(buildMatchData(2036,
                         "ng 146\npadding 147\npadding 148\npadding 
149\npadding 150\npadding 151\npadding 152\npadding 153\nNear the end of a 1024 
byte block, a ",
                         ".\nA needle that straddles a 1024 byte boundary 
should also be detected.\n\npadding 157\npadding 158\npadding 159\npadding 
160\npadding",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 matches.add(buildMatchData(2046,
                         "ding 147\npadding 148\npadding 149\npadding 
150\npadding 151\npadding 152\npadding 153\nNear the end of a 1024 byte block, 
a needle.\nA ",
                         " that straddles a 1024 byte boundary should also be 
detected.\n\npadding 157\npadding 158\npadding 159\npadding 160\npadding 
161\npaddi",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 matches.add(buildMatchData(3072,
                         "adding 226\npadding 227\npadding 228\npadding 
229\npadding 230\npadding 231\npadding 232\npadding 233\npadding 234\npadding 
235\n\n\nHere a ",
                         " occurs just after a 1024 byte boundary.  It should 
have the correct context.\n\nText with two adjoining matches: 
needleneedle\n\npa",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 matches.add(buildMatchData(3190,
                         "\n\n\nHere a needle occurs just after a 1024 byte 
boundary.  It should have the correct context.\n\nText with two adjoining 
matches: ",
                         "needle\n\npadding 243\npadding 244\npadding 
245\npadding 246\npadding 247\npadding 248\npadding 249\npadding 250\npadding 
251\npadding 252\n",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 matches.add(buildMatchData(3196,
                         "e a needle occurs just after a 1024 byte boundary.  
It should have the correct context.\n\nText with two adjoining matches: needle",
                         "\n\npadding 243\npadding 244\npadding 245\npadding 
246\npadding 247\npadding 248\npadding 249\npadding 250\npadding 251\npadding 
252\npaddin",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 matches.add(buildMatchData(6246,
                         
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n\nHere are 
four non-ascii 1-byte UTF-8 characters: αβγδε\n\n",
                         "\n\nHere are four printable 2-byte UTF-8 characters: 
¡¢£¤¥\n\nneedle\n\n\n\nHere are four printable 3-byte UTF-8 characters: 
ऄअ",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 expected.put("matches", matches);
@@ -400,7 +415,7 @@ public class LogviewerLogSearchHandlerTest {
 
         @SuppressWarnings("checkstyle:LineLength")
         @Test
-        public void testCorrectMatchOffsetIsReturnedWhenSkippingBytes() throws 
InvalidRequestException, UnknownHostException {
+        public void testCorrectMatchOffsetIsReturnedWhenSkippingBytes() throws 
Exception {
             Utils prevUtils = null;
             try {
                 Utils mockedUtil = mock(Utils.class);
@@ -425,7 +440,8 @@ public class LogviewerLogSearchHandlerTest {
                         
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n\nHere are 
four non-ascii 1-byte UTF-8 characters: αβγδε\n\n",
                         "\n\nHere are four printable 2-byte UTF-8 characters: 
¡¢£¤¥\n\nneedle\n\n\n\nHere are four printable 3-byte UTF-8 characters: 
ऄअ",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 expected.put("matches", matches);
@@ -441,7 +457,7 @@ public class LogviewerLogSearchHandlerTest {
 
         @SuppressWarnings("checkstyle:LineLength")
         @Test
-        public void testAnotherPatterns1() throws UnknownHostException, 
InvalidRequestException {
+        public void testAnotherPatterns1() throws Exception {
             Utils prevUtils = null;
             try {
                 Utils mockedUtil = mock(Utils.class);
@@ -465,15 +481,17 @@ public class LogviewerLogSearchHandlerTest {
                 matches.add(buildMatchData(4075,
                         "\n\nThe following match of 1024 bytes completely 
fills half the byte buffer.  It is a search substring of the maximum 
size......\n\n",
                         "\nThe following max-size match straddles a 1024 byte 
buffer.\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
-                        pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                    pattern,
+                    "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                    + "&start=0&length=51200"
                 ));
 
                 matches.add(buildMatchData(5159,
                         
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nThe 
following max-size match straddles a 1024 byte buffer.\n",
                         "\n\nHere are four non-ascii 1-byte UTF-8 characters: 
αβγδε\n\nneedle\n\nHere are four printable 2-byte UTF-8 characters: 
¡¢£¤",
-                        pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                    pattern,
+                    "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                    + "&start=0&length=51200"
                 ));
 
                 expected.put("matches", matches);
@@ -489,7 +507,7 @@ public class LogviewerLogSearchHandlerTest {
 
         @SuppressWarnings("checkstyle:LineLength")
         @Test
-        public void testAnotherPatterns2() throws UnknownHostException, 
InvalidRequestException {
+        public void testAnotherPatterns2() throws Exception {
             Utils prevUtils = null;
             try {
                 Utils mockedUtil = mock(Utils.class);
@@ -513,7 +531,8 @@ public class LogviewerLogSearchHandlerTest {
                         "padding 372\npadding 373\npadding 374\npadding 
375\n\nThe following tests multibyte UTF-8 Characters straddling the byte 
boundary:   ",
                         "\n\nneedle",
                         pattern,
-                        "/api/v1/log?file=test%2Fresources%2F" + 
file.getName() + "&start=0&length=51200"
+                        "/api/v1/log?file=test" + encodedFileSeparator() + 
"resources" + encodedFileSeparator() + file.getName()
+                            + "&start=0&length=51200"
                 ));
 
                 expected.put("matches", matches);
@@ -567,6 +586,10 @@ public class LogviewerLogSearchHandlerTest {
             match.put("logviewerURL", logviewerUrlPrefix + logviewerUrlPath);
             return match;
         }
+        
+        private String encodedFileSeparator() throws Exception {
+            return URLEncoder.encode(File.separator, 
StandardCharsets.UTF_8.name());
+        }
     }
 
     public static class FindNMatchesTest {
@@ -590,8 +613,8 @@ public class LogviewerLogSearchHandlerTest {
             assertEquals(2, matches1.size());
             assertEquals(4, ((List) matches1.get(0).get("matches")).size());
             assertEquals(4, ((List) matches1.get(1).get("matches")).size());
-            
assertEquals("test/resources/logviewer-search-context-tests.log.test", 
matches1.get(0).get("fileName"));
-            
assertEquals("test/resources/logviewer-search-context-tests.log.gz", 
matches1.get(1).get("fileName"));
+            assertEquals(String.join(File.separator, "test", "resources", 
"logviewer-search-context-tests.log.test"), matches1.get(0).get("fileName"));
+            assertEquals(String.join(File.separator, "test", "resources", 
"logviewer-search-context-tests.log.gz"), matches1.get(1).get("fileName"));
 
             assertEquals(2, ((List) matches2.get(0).get("matches")).size());
             assertEquals(4, ((List) matches2.get(1).get("matches")).size());

http://git-wip-us.apache.org/repos/asf/storm/blob/370a6318/storm-webapp/src/test/resources/log4j2.xml
----------------------------------------------------------------------
diff --git a/storm-webapp/src/test/resources/log4j2.xml 
b/storm-webapp/src/test/resources/log4j2.xml
new file mode 100755
index 0000000..2edc0f0
--- /dev/null
+++ b/storm-webapp/src/test/resources/log4j2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} 
- %msg%n" charset="UTF-8"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="WARN">
+            <AppenderRef ref="Console"/>
+        </Root>
+        <Logger name="org.apache.storm.daemon.logviewer" level="INFO" 
additivity="false">
+            <AppenderRef ref="Console"/>
+        </Logger>
+    </Loggers>
+</Configuration>
\ No newline at end of file

Reply via email to