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
