/******************************************************************************* | |
* 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.frame.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(); | |
} | |
} | |
} | |
} | |