blob: cc4e41a2d99f35e0612fbfc6095d17b5846f3fa8 [file] [log] [blame]
/*
* 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.
*/
package org.apache.felix.threaddump.internal;
import java.io.PrintWriter;
import java.text.MessageFormat;
import java.util.Date;
/**
*
*/
public final class ThreadWriter
{
public static final short NEW = 0;
public static final short RUNNABLE = 1;
public static final short BLOCKED = 2;
public static final short WAITING = 3;
public static final short TIMED_WAITING = 4;
public static final short TERMINATED = 5;
private static final String DATE = "{0,date,yyyy-MM-dd HH:mm:ss}";
private static final String HEADER = "Full thread dump {0} ({1} {2}):";
// nid is unknown
private static final String THREAD = "\"{0}\" {1}prio={2} tid=0x{3} nid=0x{4} {5,choice,0#new|1#runnable|2#waiting for monitor entry|3#in Object.wait()|4#timed_waiting|5#terminated}";
private static final String THREAD_STATUS = " java.lang.Thread.State: {0,choice,0#NEW|1#RUNNABLE|2#BLOCKED|3#WAITING (on object monitor)|4#TIMED_WAITING|5#TERMINATED}";
private static final String STACKTRACE_ELEMENT = "\tat {0}";
private final PrintWriter writer;
public ThreadWriter(PrintWriter writer)
{
this.writer = writer;
}
/**
* Full thread dump identifier
*/
public void printHeader()
{
println(DATE, new Object[]
{ new Date() });
println(HEADER, getSystemProperties(new String[]
{ "java.vm.name", "java.runtime.version", "java.vm.info" }));
printEmptyLine();
}
public void printThread(String name, boolean isDaemon, long priority, long id, short status)
{
String daemon = isDaemon ? "daemon " : "";
println(THREAD, new Object[]
{ name, daemon, String.valueOf(priority), Long.toHexString(id), Integer.toHexString(-1), // nid
new Short(status) });
println(THREAD_STATUS, new Object[]
{ new Short(status) });
}
public void printStackTrace(StackTraceElement[] stackTrace)
{
if (stackTrace != null)
{
for (int i = 0; i < stackTrace.length; i++)
{
printStackTraceElement(stackTrace[i]);
}
}
}
public void printStackTraceElement(StackTraceElement element)
{
println(STACKTRACE_ELEMENT, new Object[]
{ element });
}
public void printEmptyLine()
{
writer.println();
}
public void println(String message)
{
writer.println(message);
}
public void println(String pattern, Object[] arguments)
{
String result = MessageFormat.format(pattern, arguments);
writer.println(result);
}
private static Object[] getSystemProperties(String[] keys)
{
Object[] values = new Object[keys.length];
for (int i = 0; i < keys.length; i++)
{
values[i] = System.getProperty(keys[i]);
}
return values;
}
}