/*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.dev.util;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.ArrayList;
import java.util.regex.Pattern;
/**
* A tool that removes uninteresting lines from stack traces.
*/
public class ThreadDumpCleaner {
private static final String[] PATTERN = {
"\"Concurrent Mark-Sweep GC Thread\".*\n",
"\"Exception Catcher Thread\".*\n",
"JNI global references:.*\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\n",
"\".*?\".*\n\n",
"\\$\\$YJP\\$\\$",
"\"(Attach|Service|VM|GC|DestroyJavaVM|Signal|AWT|AppKit|C2 |Low Mem|" +
"process reaper|YJPAgent-).*?\"(?s).*?\n\n",
" Locked ownable synchronizers:(?s).*?\n\n",
"\".*?\".*?\n java.lang.Thread.State: (TIMED_)?WAITING(?s).*?\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\t" +
"at sun.nio.ch.KQueueArrayWrapper.kevent0(?s).*?\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\t" +
"at java.io.FileInputStream.readBytes(?s).*?\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\t" +
"at sun.nio.ch.ServerSocketChannelImpl.accept(?s).*?\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\t" +
"at java.net.DualStackPlainSocketImpl.accept0(?s).*\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\t" +
"at sun.nio.ch.EPollArrayWrapper.epollWait(?s).*?\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\t" +
"at java.lang.Object.wait(?s).*?\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\t" +
"at java.net.PlainSocketImpl.socketAccept(?s).*?\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\t" +
"at java.net.SocketInputStream.socketRead0(?s).*?\n\n",
"\".*?\".*?\n java.lang.Thread.State:.*\n\t" +
"at sun.nio.ch.WindowsSelectorImpl\\$SubSelector.poll0(?s).*?\n\n",
};
private ArrayList<Pattern> patterns = new ArrayList<Pattern>();
{
for (String s : PATTERN) {
patterns.add(Pattern.compile(s));
}
}
/**
* Run the tool.
*
* @param args the command line arguments
*/
public static void main(String... args) throws IOException {
String inFile = null, outFile = null;
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-in")) {
inFile = args[++i];
} else if (args[i].equals("-out")) {
outFile = args[++i];
}
}
if (args.length == 0) {
outFile = "-";
}
if (outFile == null) {
outFile = inFile + ".clean.txt";
}
PrintWriter writer;
if ("-".equals(outFile)) {
writer = new PrintWriter(System.out);
} else {
writer = new PrintWriter(new BufferedWriter(new FileWriter(outFile)));
}
Reader r;
if (inFile != null) {
r = new FileReader(inFile);
} else {
r = new InputStreamReader(System.in);
}
new ThreadDumpCleaner().run(
new LineNumberReader(new BufferedReader(r)),
writer);
writer.close();
r.close();
}
private void run(LineNumberReader reader, PrintWriter writer) throws IOException {
StringBuilder buff = new StringBuilder();
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
buff.append(line).append('\n');
if (line.trim().length() == 0) {
writer.print(filter(buff.toString()));
buff = new StringBuilder();
}
}
writer.println(filter(buff.toString()));
}
private String filter(String s) {
for (Pattern p : patterns) {
s = p.matcher(s).replaceAll("");
}
return s;
}
}