blob: d6f7c1ea8ff5cd760f99e33c0c2c997928eb128d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Ericsson AB 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:
* Ericsson AB - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.reviews.r4e.core.utils;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.eclipse.core.runtime.Platform;
// ESCA-JAVA0100:
/**
* This class implements a simple trace facility using Eclipse that can be used to send debugging output to the console
* and/or to file. It supports various levels of tracing
*
* @author Sebastien Dubois
*/
public class Tracer {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
static final int DEFAULT_STACK_TRACE_ELEMENT = 3;
// ------------------------------------------------------------------------
// Member variables
// ------------------------------------------------------------------------
static boolean ERROR = false;
static boolean WARNING = false;
static boolean INFO = false;
static boolean DEBUG = false;
private String fPluginID;
private BufferedWriter fTraceFile;
private SimpleDateFormat fTimeFormat;
private StringBuilder fTraceMessage;
private boolean fLogToConsole;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
public Tracer() {
fTraceFile = null;
fTimeFormat = new SimpleDateFormat("HH:mm:ss:SSS");
fTraceMessage = new StringBuilder();
fLogToConsole = true;
}
// ------------------------------------------------------------------------
// Methods
// ------------------------------------------------------------------------
/**
* Initialize the tracer object
*
* @param aPluginId
* - the calling plugin ID (as a String object)
*/
public void init(String aPluginId) {
String traceKey = null;
fPluginID = aPluginId;
// Initialize tracer members from .options plugin file
traceKey = Platform.getDebugOption(fPluginID + "/error");
if (traceKey != null) {
ERROR = (Boolean.valueOf(traceKey)).booleanValue();
}
traceKey = Platform.getDebugOption(fPluginID + "/warning");
if (traceKey != null) {
WARNING = (Boolean.valueOf(traceKey)).booleanValue();
}
traceKey = Platform.getDebugOption(fPluginID + "/info");
if (traceKey != null) {
INFO = (Boolean.valueOf(traceKey)).booleanValue();
}
traceKey = Platform.getDebugOption(fPluginID + "/debug");
if (traceKey != null) {
DEBUG = (Boolean.valueOf(traceKey)).booleanValue();
}
traceKey = Platform.getDebugOption(fPluginID + "/consoleLog");
if (traceKey != null) {
fLogToConsole = (Boolean.valueOf(traceKey)).booleanValue();
}
traceKey = Platform.getDebugOption(fPluginID + "/logfile");
if (traceKey != null) {
try {
fTraceFile = new BufferedWriter(new FileWriter(traceKey));
} catch (IOException e) {
// ESCA-JAVA0265:
e.printStackTrace();
}
}
}
/**
* Close the trace output logfile (if used)
*/
public void closeLogfile() {
if (fTraceFile == null) {
return;
}
try {
fTraceFile.close();
fTraceFile = null;
} catch (IOException e) {
// ESCA-JAVA0265:
e.printStackTrace();
}
}
/**
* @param newValue
* @return
*/
public static boolean setError(boolean newValue) {
boolean oldValue = ERROR;
ERROR = newValue;
return oldValue;
}
/**
* @param newValue
* @return
*/
public static boolean setDebug(boolean newValue) {
boolean oldValue = DEBUG;
DEBUG = newValue;
return oldValue;
}
/**
* @param newValue
* @return
*/
public static boolean setInfo(boolean newValue) {
boolean oldValue = INFO;
INFO = newValue;
return oldValue;
}
/**
* @param newValue
* @return
*/
public static boolean setWarning(boolean newValue) {
boolean oldValue = WARNING;
WARNING = newValue;
return oldValue;
}
public static boolean isError() {
return ERROR;
}
public static boolean isDebug() {
return DEBUG;
}
public static boolean isInfo() {
return INFO;
}
public static boolean isWarning() {
return WARNING;
}
/**
* Output an error trace
*
* @param aMsg
* - the trace message to output
*/
public void traceError(String aMsg) {
if (ERROR) {
fTraceMessage.setLength(0);
// Timestamp
writeTimestamp(fTraceMessage);
fTraceMessage.append(" E");
writeThread(fTraceMessage);
writeLocation(fTraceMessage);
fTraceMessage.append(aMsg);
outputTrace(fTraceMessage);
}
}
/**
* Output a warning trace
*
* @param aMsg
* - the trace message to output
*/
public void traceWarning(String aMsg) {
if (WARNING) {
fTraceMessage.setLength(0);
// Timestamp
writeTimestamp(fTraceMessage);
fTraceMessage.append(" W");
writeThread(fTraceMessage);
writeLocation(fTraceMessage);
fTraceMessage.append(aMsg);
outputTrace(fTraceMessage);
}
}
/**
* Output an info trace
*
* @param aMsg
* - the trace message to output
*/
public void traceInfo(String aMsg) {
if (INFO) {
fTraceMessage.setLength(0);
// Timestamp
writeTimestamp(fTraceMessage);
fTraceMessage.append(" I");
writeThread(fTraceMessage);
writeLocation(fTraceMessage);
fTraceMessage.append(aMsg);
outputTrace(fTraceMessage);
}
}
/**
* Output a debug trace
*
* @param aMsg
* - the trace message to output
*/
public void traceDebug(String aMsg) {
if (DEBUG) {
fTraceMessage.setLength(0);
// Timestamp
writeTimestamp(fTraceMessage);
fTraceMessage.append(" D");
writeThread(fTraceMessage);
writeLocation(fTraceMessage);
fTraceMessage.append(aMsg);
outputTrace(fTraceMessage);
}
}
/**
* Write timestamp header
*
* @param aSb
* - the StringBuilder object (trace line) to append to
*/
private void writeTimestamp(StringBuilder aSb) {
aSb.append("[" + fTimeFormat.format(new Date()) + "]");
}
/**
* Write thread header
*
* @param aSb
* - the StringBuilder object (trace line) to append to
*/
private static void writeThread(StringBuilder aSb) {
aSb.append(" T=" + Thread.currentThread().getName());
}
/**
* Write location header
*
* @param aSb
* - the StringBuilder object (trace line) to append to
*/
private static void writeLocation(StringBuilder aSb) {
int traceElement = DEFAULT_STACK_TRACE_ELEMENT;
// ESCA-JAVA0067:
final StackTraceElement e[] = Thread.currentThread().getStackTrace();
if (e != null) {
traceElement = traceElement >= e.length ? e.length - 1 : traceElement;
StackTraceElement s = e[traceElement];
if (s != null) {
String simpleClassName = s.getClassName();
String[] clsNameSegs = simpleClassName.split("\\.");
if (clsNameSegs.length > 0) {
simpleClassName = clsNameSegs[clsNameSegs.length - 1];
}
aSb.append(" " + simpleClassName + ":" + s.getLineNumber() + " (" + s.getMethodName() + "): ");
}
}
}
/**
* Write trace to console/file
*
* @param aSb
* - the StringBuilder object (trace line) to output
*/
private void outputTrace(StringBuilder aSb) {
if (fLogToConsole) {
// ESCA-JAVA0266:
System.out.println(aSb);
}
if (fTraceFile != null) {
try {
fTraceFile.write(aSb.toString());
fTraceFile.newLine();
fTraceFile.flush();
} catch (IOException e) {
// ESCA-JAVA0265:
e.printStackTrace();
}
}
}
}