/*
* Copyright (c) 2007-2009, 2011, 2012, 2016 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.util.om.trace;
import org.eclipse.net4j.util.io.IOUtil;
import java.io.PrintStream;
import java.text.MessageFormat;
/**
* A {@link OMTraceHandler trace handler} that appends {@link OMTraceHandlerEvent trace events}
* to a {@link #getStream() print stream}.
*
* @author Eike Stepper
*/
public class PrintTraceHandler implements OMTraceHandler
{
public static final PrintTraceHandler CONSOLE = new PrintTraceHandler();
private PrintStream stream;
private String pattern;
private boolean shortContext;
public PrintTraceHandler(PrintStream stream)
{
this.stream = stream;
}
protected PrintTraceHandler()
{
this(IOUtil.OUT());
}
/**
* @since 3.2
*/
public PrintStream getStream()
{
return stream;
}
public String getPattern()
{
return pattern;
}
/**
* Pattern arguments:
* <p>
* <ul>
* <li>{0} → String <b>tracerName</b>
* <li>{1} → String <b>tracerShort</b>
* <li>{2} → String <b>contextName</b>
* <li>{3} → String <b>contextShort</b>
* <li>{4} → long <b>timeStamp</b>
* <li>{5} → String <b>message</b>
* <li>{6} → String <b>threadName</b>
* <li>{7} → long <b>threadID</b>
* <li>{8} → int <b>threadPriority</b>
* <li>{9} → Thread.State <b>threadState</b>
* </ul>
*/
public void setPattern(String pattern)
{
this.pattern = pattern;
}
public boolean isShortContext()
{
return shortContext;
}
public void setShortContext(boolean shortContext)
{
this.shortContext = shortContext;
}
public void traced(OMTraceHandlerEvent event)
{
String line = pattern == null ? format(shortContext, event) : format(pattern, event);
stream.println(line);
if (event.getThrowable() != null)
{
IOUtil.print(event.getThrowable(), stream);
}
}
public static String format(boolean shortContext, OMTraceHandlerEvent event)
{
Class<?> context = event.getContext();
String contextName = shortContext ? context.getSimpleName() : context.getName();
return Thread.currentThread().getName() + " [" + contextName + "] " + event.getMessage(); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Pattern arguments:
* <p>
* <ul>
* <li>{0} → String <b>tracerName</b>
* <li>{1} → String <b>tracerShort</b>
* <li>{2} → String <b>contextName</b>
* <li>{3} → String <b>contextShort</b>
* <li>{4} → long <b>timeStamp</b>
* <li>{5} → String <b>message</b>
* <li>{6} → String <b>threadName</b>
* <li>{7} → long <b>threadID</b>
* <li>{8} → int <b>threadPriority</b>
* <li>{9} → Thread.State <b>threadState</b>
* </ul>
*/
public static String format(String pattern, OMTraceHandlerEvent event)
{
final OMTracer tracer = event.getTracer();
final String tracerName = tracer.getFullName();
final String tracerShort = tracer.getName();
final Class<?> context = event.getContext();
final String contextName = context.getName();
final String contextShort = context.getName();
final long timeStamp = event.getTimeStamp();
final String message = event.getMessage();
final Thread thread = Thread.currentThread();
final String threadName = thread.getName();
final long threadID = thread.getId();
final int threadPriority = thread.getPriority();
final Thread.State threadState = thread.getState();
return MessageFormat.format(pattern, tracerName, tracerShort, contextName, contextShort, timeStamp, message, threadName, threadID, threadPriority,
threadState);
}
}