diff --git a/pom.xml b/pom.xml
index 8be6c7c3..3b5a891f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,133 +1,134 @@
-
-
-
-
- 4.0.0
-
-
- org.gridkit.lab
- grid-lab-pom
- 2
-
-
- org.gridkit.jvmtool
- jvmtool-umbrella-pom
- 0.3.4-SNAPSHOT
- ${project.groupId}::${project.artifactId}
- JVM tools, parent project
- pom
-
-
- sjk-core
- mxdump
- gcflow
- sjk
- sjk-lite
- sjk-plus
- hprof-heap
- ygc-bench
-
-
-
-
- The Apache Software License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
- repo
-
-
-
-
-
- alexey.ragozin
- Alexey Ragozin
- alexey.ragozin@gmail.com
-
-
-
-
- scm:git:https://github.com/aragozin/jvm-tools.git
- scm:git:https://github.com/aragozin/jvm-tools.git
- https://github.com/aragozin/jvm-tools
- HEAD
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.0
-
-
- 1.6
-
-
-
- org.apache.maven.plugins
- maven-release-plugin
- 2.4
-
- true
- true
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.14
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 2.9
-
-
- attach-javadoc
-
- jar
-
-
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
- 2.2.1
-
-
- attach-source
-
- jar
-
-
-
-
-
- org.apache.maven.plugins
- maven-resources-plugin
- 2.6
-
- UTF-8
-
-
-
-
-
-
+
+
+
+
+ 4.0.0
+
+
+ org.gridkit.lab
+ grid-lab-pom
+ 2
+
+
+ org.gridkit.jvmtool
+ jvmtool-umbrella-pom
+ 0.3.4-SNAPSHOT
+ ${project.groupId}::${project.artifactId}
+ JVM tools, parent project
+ pom
+
+
+ sjk-stacktrace
+ sjk-core
+ mxdump
+ gcflow
+ sjk
+ sjk-lite
+ sjk-plus
+ hprof-heap
+ ygc-bench
+
+
+
+
+ The Apache Software License, Version 2.0
+ http://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+
+ alexey.ragozin
+ Alexey Ragozin
+ alexey.ragozin@gmail.com
+
+
+
+
+ scm:git:https://github.com/aragozin/jvm-tools.git
+ scm:git:https://github.com/aragozin/jvm-tools.git
+ https://github.com/aragozin/jvm-tools
+ HEAD
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.0
+
+
+ 1.6
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ 2.4
+
+ true
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.14
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 2.9
+
+
+ attach-javadoc
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 2.2.1
+
+
+ attach-source
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ 2.6
+
+ UTF-8
+
+
+
+
+
+
diff --git a/sjk-core/pom.xml b/sjk-core/pom.xml
index 6cc21bc0..ffd820cb 100644
--- a/sjk-core/pom.xml
+++ b/sjk-core/pom.xml
@@ -32,6 +32,11 @@
Core classes for Swiss Java Knife tool
+
+ org.gridkit.jvmtool
+ sjk-stacktrace
+ ${project.version}
+
org.gridkit.lab
jvm-attach-api
diff --git a/sjk-stacktrace/pom.xml b/sjk-stacktrace/pom.xml
new file mode 100644
index 00000000..f02466e8
--- /dev/null
+++ b/sjk-stacktrace/pom.xml
@@ -0,0 +1,61 @@
+
+
+
+
+ 4.0.0
+
+
+ org.gridkit.jvmtool
+ jvmtool-umbrella-pom
+ 0.3.4-SNAPSHOT
+ ../pom.xml
+
+
+ sjk-stacktrace
+ ${project.groupId}::${project.artifactId}
+ Thread dumps: capture and encoding
+
+
+
+ junit
+ junit
+ 4.10
+ test
+
+
+ com.carrotsearch
+ junit-benchmarks
+ 0.7.2
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 1.6
+
+
+
+
+
diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/RotatingStringDictionary.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/RotatingStringDictionary.java
similarity index 100%
rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/RotatingStringDictionary.java
rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/RotatingStringDictionary.java
diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java
similarity index 99%
rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java
rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java
index 8e994881..3bc80165 100644
--- a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java
+++ b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackFrame.java
@@ -162,7 +162,7 @@ else if (index == mn) {
return fileName.charAt(index - mn);
case NO_SOURCE:
try {
- return UNKNOWN_SOURCE.charAt(index - mn);
+ return UNKNOWN_SOURCE.charAt(index - mn);
}
catch ( StringIndexOutOfBoundsException e) {
throw e;
diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceCodec.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceCodec.java
similarity index 100%
rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceCodec.java
rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceCodec.java
diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceReader.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceReader.java
similarity index 100%
rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceReader.java
rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceReader.java
diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceWriter.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceWriter.java
similarity index 100%
rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceWriter.java
rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/StackTraceWriter.java
diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadCounter.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadCounter.java
similarity index 100%
rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadCounter.java
rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadCounter.java
diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java
similarity index 98%
rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java
rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java
index 27b74493..45ad7af4 100644
--- a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java
+++ b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadDumpSampler.java
@@ -266,9 +266,9 @@ private static class GenericMBeanThreadCounter implements CounterCollector {
public GenericMBeanThreadCounter(ThreadMXBean bean, CounterType counter) {
this.slowBean = bean;
try {
- if (bean instanceof com.sun.management.ThreadMXBean) {
- fastBean = (com.sun.management.ThreadMXBean) bean;
- }
+ if (bean instanceof com.sun.management.ThreadMXBean) {
+ fastBean = (com.sun.management.ThreadMXBean) bean;
+ }
}
catch(NoClassDefFoundError e) {
// ignore
diff --git a/sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadSnapshot.java b/sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadSnapshot.java
similarity index 100%
rename from sjk-core/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadSnapshot.java
rename to sjk-stacktrace/src/main/java/org/gridkit/jvmtool/stacktrace/ThreadSnapshot.java
diff --git a/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/GlobHelper.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/GlobHelper.java
new file mode 100644
index 00000000..5d8d4f1e
--- /dev/null
+++ b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/GlobHelper.java
@@ -0,0 +1,81 @@
+package org.gridkit.jvmtool.stacktrace;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Alexey Ragozin (alexey.ragozin@gmail.com)
+ */
+public class GlobHelper {
+
+ /**
+ * GLOB pattern supports *, ** and ? wild cards.
+ * Leading and trailing ** have special meaning, consecutive separator become optional.
+ */
+ public static Pattern translate(String pattern, String separator) {
+ StringBuffer sb = new StringBuffer();
+ String es = escape(separator);
+ // special starter
+ Matcher ss = Pattern.compile("^([*][*][" + es + "]).*").matcher(pattern);
+ if (ss.matches()) {
+ pattern = pattern.substring(ss.group(1).length());
+ // make leading sep optional
+ sb.append("(.*[" + es + "])?");
+ }
+ // special trailer
+ Matcher st = Pattern.compile(".*([" + es + "][*][*])$").matcher(pattern);
+ boolean useSt = false;
+ if (st.matches()) {
+ pattern = pattern.substring(0, st.start(1));
+ useSt = true;
+ }
+
+ for(int i = 0; i != pattern.length(); ++i) {
+ char c = pattern.charAt(i);
+ if (c == '?') {
+ sb.append("[^" + es + "]");
+ }
+ else if (c == '*') {
+ if (i + 1 < pattern.length() && pattern.charAt(i+1) == '*') {
+ i++;
+ // **
+ sb.append(".*");
+ }
+ else {
+ sb.append("[^" + es + "]*");
+ }
+ }
+ else {
+ if (c == '$') {
+ sb.append("\\$");
+ }
+ else if (Character.isJavaIdentifierPart(c) || Character.isWhitespace(c)) {
+ sb.append(c);
+ }
+ else {
+ sb.append('\\').append(c);
+ }
+ }
+ }
+
+ if (useSt) {
+ sb.append("([" + es + "].*)?");
+ }
+
+ return Pattern.compile(sb.toString());
+ }
+
+ private static String escape(String separator) {
+ StringBuffer sb = new StringBuffer();
+ for(int i = 0; i != separator.length(); ++i) {
+ char c = separator.charAt(i);
+ if ("\\[]&-".indexOf(c) >= 0){
+ sb.append('\\').append(c);
+ }
+ else {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+}
diff --git a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java
similarity index 99%
rename from sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java
rename to sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java
index 7396f976..3befd3f8 100644
--- a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java
+++ b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/RegExMicrobenchmark.java
@@ -9,13 +9,14 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.gridkit.jvmtool.GlobHelper;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import com.carrotsearch.junitbenchmarks.BenchmarkRule;
+@Ignore("Benchmark")
public class RegExMicrobenchmark {
private static StackFrame[] FRAMES;
diff --git a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StackFrameTest.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StackFrameTest.java
similarity index 100%
rename from sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StackFrameTest.java
rename to sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StackFrameTest.java
diff --git a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StackTreeCoderTest.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StackTreeCoderTest.java
similarity index 100%
rename from sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StackTreeCoderTest.java
rename to sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StackTreeCoderTest.java
diff --git a/sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StateTraceReaderTest.java b/sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StateTraceReaderTest.java
similarity index 100%
rename from sjk-core/src/test/java/org/gridkit/jvmtool/stacktrace/StateTraceReaderTest.java
rename to sjk-stacktrace/src/test/java/org/gridkit/jvmtool/stacktrace/StateTraceReaderTest.java
diff --git a/sjk-core/src/test/resources/dump_v1.std b/sjk-stacktrace/src/test/resources/dump_v1.std
similarity index 100%
rename from sjk-core/src/test/resources/dump_v1.std
rename to sjk-stacktrace/src/test/resources/dump_v1.std
diff --git a/sjk-core/src/test/resources/dump_v2.std b/sjk-stacktrace/src/test/resources/dump_v2.std
similarity index 100%
rename from sjk-core/src/test/resources/dump_v2.std
rename to sjk-stacktrace/src/test/resources/dump_v2.std
diff --git a/sjk-core/src/test/resources/stack-frame.txt b/sjk-stacktrace/src/test/resources/stack-frame.txt
similarity index 100%
rename from sjk-core/src/test/resources/stack-frame.txt
rename to sjk-stacktrace/src/test/resources/stack-frame.txt