diff options
author | Thomas Watson | 2010-04-01 21:29:50 +0000 |
---|---|---|
committer | Thomas Watson | 2010-04-01 21:29:50 +0000 |
commit | 45fad02a992a4e0f6e6eae32a7a177b82da74878 (patch) | |
tree | 0b6eeb539c534159817eaed87ea994aa771dd358 | |
parent | 34b7661bb9a91196ef9523005686277d1824a242 (diff) | |
download | rt.equinox.framework-45fad02a992a4e0f6e6eae32a7a177b82da74878.tar.gz rt.equinox.framework-45fad02a992a4e0f6e6eae32a7a177b82da74878.tar.xz rt.equinox.framework-45fad02a992a4e0f6e6eae32a7a177b82da74878.zip |
Bug 267683 - Enhancements to the tracing framework
4 files changed, 253 insertions, 73 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/debugoptions/DebugOptionsTestCase.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/debugoptions/DebugOptionsTestCase.java index 7490c0f69..c3a6b33ac 100644 --- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/debugoptions/DebugOptionsTestCase.java +++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/debugoptions/DebugOptionsTestCase.java @@ -19,6 +19,7 @@ import java.util.Map.Entry; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.tests.harness.CoreTest; +import org.eclipse.osgi.framework.debug.FrameworkDebugOptions; import org.eclipse.osgi.framework.debug.FrameworkDebugTraceEntry; import org.eclipse.osgi.service.debug.*; import org.eclipse.osgi.tests.OSGiTestsActivator; @@ -39,6 +40,7 @@ public class DebugOptionsTestCase extends CoreTest { private final static String TRACE_ELEMENT_DELIMITER_ENCODED = "|"; //$NON-NLS-1$ // this value needs to match EclipseDebugTrace#TRACE_ELEMENT_DELIMITER_ENCODED private final static SimpleDateFormat TRACE_FILE_DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); //$NON-NLS-1$ private final static String LINE_SEPARATOR; + private boolean verboseDebug = true; // default is true static { String s = System.getProperty("line.separator"); //$NON-NLS-1$ LINE_SEPARATOR = s == null ? "\n" : s; //$NON-NLS-1$ @@ -493,6 +495,101 @@ public class DebugOptionsTestCase extends CoreTest { } /** + * Test all DebugTrace.trace*() API when verbose debugging is disabled + */ + public void testVerboseDebugging() { + + // TODO: Convert this back to {@link DebugOptions} once is/setVerbose becomes API + FrameworkDebugOptions fwDebugOptions = (FrameworkDebugOptions) debugOptions; + if (!debugOptions.isDebugEnabled()) { + debugOptions.setDebugEnabled(true); + } + // create a tracing record + final File traceFile = OSGiTestsActivator.getContext().getDataFile(getName() + ".trace"); //$NON-NLS-1$ + TestDebugTrace debugTrace = this.createDebugTrace(traceFile); + TraceEntry[] traceOutput = null; + final String exceptionMessage1 = "An error 1"; //$NON-NLS-1$ + try { + fwDebugOptions.setVerbose(false); + debugTrace.trace("/debug", "testing 1", new Exception(exceptionMessage1)); //$NON-NLS-1$ //$NON-NLS-2$ + fwDebugOptions.setVerbose(true); + debugTrace.trace("/debug", "testing 2"); //$NON-NLS-1$ //$NON-NLS-2$ + fwDebugOptions.setVerbose(false); + debugTrace.trace("/debug", "testing 3"); //$NON-NLS-1$ //$NON-NLS-2$ + debugTrace.traceEntry("/debug"); //$NON-NLS-1$ //$NON-NLS-2$ + debugTrace.traceEntry("/debug", "arg"); //$NON-NLS-1$ //$NON-NLS-2$ + debugTrace.traceEntry("/debug", new String[] {"arg1", "arg2"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + debugTrace.traceExit("/debug"); //$NON-NLS-1$ + debugTrace.traceExit("/debug", "returnValue"); //$NON-NLS-1$ //$NON-NLS-2$ + traceOutput = readTraceFile(traceFile); // Note: this call will also delete the trace file + } catch (InvalidTraceEntry invalidEx) { + fail("Failed 'DebugTrace.trace(option, message)' test as an invalid trace entry was found. Actual Value: '" + invalidEx.getActualValue() + "'.", invalidEx); //$NON-NLS-1$ //$NON-NLS-2$ + } + // make sure all 3 entries exist + assertEquals("Wrong number of trace entries", 8, traceOutput.length); //$NON-NLS-1$ + // validate the trace("/debug", "testing 1", new Exception(exceptionMessage1)) call when verbose tracing is disabled + assertEquals("Thread name is incorrect", Thread.currentThread().getName(), traceOutput[0].getThreadName()); //$NON-NLS-1$ + assertNull("A bundle was found when it should be null", traceOutput[0].getBundleSymbolicName()); //$NON-NLS-1$ + assertNull("A class name was found when it should be null", traceOutput[0].getClassName()); //$NON-NLS-1$ + assertNull("A method name was found when it should be null", traceOutput[0].getMethodName()); //$NON-NLS-1$ + assertTrue("A line number other than -1 was read in", traceOutput[0].getLineNumber() == -1); //$NON-NLS-1$ + assertEquals("trace message is incorrect", "testing 1", traceOutput[0].getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ + final StringBuffer expectedThrowableText1 = new StringBuffer("java.lang.Exception: "); //$NON-NLS-1$ + expectedThrowableText1.append(exceptionMessage1); + expectedThrowableText1.append(DebugOptionsTestCase.LINE_SEPARATOR); + expectedThrowableText1.append(DebugOptionsTestCase.TAB_CHARACTER); + expectedThrowableText1.append("at org.eclipse.osgi.tests.debugoptions.DebugOptionsTestCase.testVerboseDebugging(DebugOptionsTestCase.java:"); //$NON-NLS-1$ + if (!traceOutput[0].getThrowableText().startsWith(expectedThrowableText1.toString())) { + final StringBuffer errorMessage = new StringBuffer("The expected throwable text does not start with the actual throwable text."); //$NON-NLS-1$ + errorMessage.append(DebugOptionsTestCase.LINE_SEPARATOR); + errorMessage.append(DebugOptionsTestCase.LINE_SEPARATOR); + errorMessage.append("Expected"); //$NON-NLS-1$ + errorMessage.append(DebugOptionsTestCase.LINE_SEPARATOR); + errorMessage.append("--------"); //$NON-NLS-1$ + errorMessage.append(DebugOptionsTestCase.LINE_SEPARATOR); + errorMessage.append(expectedThrowableText1.toString()); + errorMessage.append(DebugOptionsTestCase.LINE_SEPARATOR); + errorMessage.append(DebugOptionsTestCase.LINE_SEPARATOR); + errorMessage.append("Actual"); //$NON-NLS-1$ + errorMessage.append(DebugOptionsTestCase.LINE_SEPARATOR); + errorMessage.append("--------"); //$NON-NLS-1$ + errorMessage.append(DebugOptionsTestCase.LINE_SEPARATOR); + errorMessage.append(traceOutput[0].getThrowableText()); + fail(errorMessage.toString()); + } + // validate the trace("/debug", "testing 2") call when verbose tracing is re-enabled + assertEquals("Thread name is incorrect", Thread.currentThread().getName(), traceOutput[1].getThreadName()); //$NON-NLS-1$ + assertEquals("Bundle name is incorrect", getName(), traceOutput[1].getBundleSymbolicName()); //$NON-NLS-1$ + assertEquals("option-path value is incorrect", "/debug", traceOutput[1].getOptionPath()); //$NON-NLS-1$//$NON-NLS-2$ + assertEquals("class name value is incorrect", DebugOptionsTestCase.class.getName(), traceOutput[1].getClassName()); //$NON-NLS-1$ + assertEquals("method name value is incorrect", "testVerboseDebugging", traceOutput[1].getMethodName()); //$NON-NLS-1$ //$NON-NLS-2$ + assertEquals("trace message is incorrect", "testing 2", traceOutput[1].getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ + assertNull("The throwable text was found when it should be null", traceOutput[1].getThrowableText()); + // validate the trace("/debug", "testing 3") call when verbose is disabled + assertEquals("Thread name is incorrect", Thread.currentThread().getName(), traceOutput[2].getThreadName()); //$NON-NLS-1$ + assertNull("A bundle was found when it should be null", traceOutput[2].getBundleSymbolicName()); //$NON-NLS-1$ + assertNull("A class name was found when it should be null", traceOutput[2].getClassName()); //$NON-NLS-1$ + assertNull("A method name was found when it should be null", traceOutput[2].getMethodName()); //$NON-NLS-1$ + assertTrue("A line number other than -1 was read in", traceOutput[2].getLineNumber() == -1); //$NON-NLS-1$ + assertEquals("trace message is incorrect", "testing 3", traceOutput[2].getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ + assertNull("The throwable text was found when it should be null", traceOutput[2].getThrowableText()); + // validate the traceEntry("/debug") call when verbose is disabled + assertEquals("trace message is incorrect", "Entering method org.eclipse.osgi.tests.debugoptions.DebugOptionsTestCase#testVerboseDebugging with no parameters", traceOutput[3].getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ + // validate the traceEntry("/debug", "arg") call when verbose is disabled + assertEquals("trace message is incorrect", "Entering method org.eclipse.osgi.tests.debugoptions.DebugOptionsTestCase#testVerboseDebugging with parameters: (arg)", traceOutput[4].getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ + // validate the traceEntry("/debug", new String[] {"arg1", "arg2"}) call when verbose is disabled + assertEquals("trace message is incorrect", "Entering method org.eclipse.osgi.tests.debugoptions.DebugOptionsTestCase#testVerboseDebugging with parameters: (arg1 arg2)", traceOutput[5].getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ + // validate the traceExit("/debug") call when verbose is disabled + assertEquals("trace message is incorrect", "Exiting method org.eclipse.osgi.tests.debugoptions.DebugOptionsTestCase#testVerboseDebugging with a void return", traceOutput[6].getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ + // validate the traceExit("/debug", "returnValue") call when verbose is disabled + assertEquals("trace message is incorrect", "Exiting method org.eclipse.osgi.tests.debugoptions.DebugOptionsTestCase#testVerboseDebugging with result: returnValue", traceOutput[7].getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ + // make sure the file is deleted + traceFile.delete(); + // reset verbose debugging to the default (true) + fwDebugOptions.setVerbose(true); + } + + /** * test DebugTrace.trace(option, message); */ public void testTraceFile01() { @@ -878,8 +975,9 @@ public class DebugOptionsTestCase extends CoreTest { private TraceEntry[] readTraceFile(File traceFile) throws InvalidTraceEntry { - Reader traceReader = null; + BufferedReader traceReader = null; List traceEntries = new ArrayList(); + this.verboseDebug = true; // default is true try { traceReader = new BufferedReader(new InputStreamReader(new FileInputStream(traceFile), "UTF-8")); //$NON-NLS-1$ TraceEntry entry = null; @@ -900,25 +998,30 @@ public class DebugOptionsTestCase extends CoreTest { return (TraceEntry[]) traceEntries.toArray(new TraceEntry[traceEntries.size()]); } - private TraceEntry readMessage(final Reader traceReader) throws IOException, InvalidTraceEntry { + private TraceEntry readMessage(final BufferedReader traceReader) throws IOException, InvalidTraceEntry { TraceEntry result = null; int input = traceReader.read(); while (input != -1) { char inputChar = (char) input; if (inputChar == '#') { - while ((inputChar != '\n') && (inputChar != '\r')) { - // do nothing - inputChar = (char) traceReader.read(); + String comment = traceReader.readLine(); + if (comment != null) { + comment = comment.trim(); + } + if (comment.startsWith("verbose")) { + int splitIndex = comment.indexOf(':'); + String verboseValue = comment.substring(splitIndex + 1, comment.length()).trim(); + this.verboseDebug = Boolean.valueOf(verboseValue).booleanValue(); } } if (inputChar == DebugOptionsTestCase.TRACE_ELEMENT_DELIMITER.charAt(0)) { - // first entry - thread name + // first entry - thread name (valid if verbose debugging is off) final String threadName = this.readEntry(traceReader); if ((threadName == null) || (threadName.length() == 0)) { throw new InvalidTraceEntry("The thread name in a trace entry is null or empty", threadName); //$NON-NLS-1$ } - // read the next character + // second entry - timestamp (valid if verbose debugging is off) final String date = this.readEntry(traceReader); if ((date == null) || (date.length() == 0)) { throw new InvalidTraceEntry("The timestamp in a trace entry is null or empty", date); //$NON-NLS-1$ @@ -929,35 +1032,42 @@ public class DebugOptionsTestCase extends CoreTest { } catch (ParseException parseEx) { throw new InvalidTraceEntry("The date in a trace entry '" + date + "' could not be parsed.", date); //$NON-NLS-1$ //$NON-NLS-2$ } - // third entry - bundle symbolic name - final String symbolicName = this.readEntry(traceReader); - if ((symbolicName == null) || (symbolicName.length() == 0)) { - throw new InvalidTraceEntry("The bundle symbolic name in a trace entry is null or empty", symbolicName); //$NON-NLS-1$ - } - // fourth entry - option path - final String optionPath = this.readEntry(traceReader); - if ((optionPath == null) || (optionPath.length() == 0)) { - throw new InvalidTraceEntry("The option-path in a trace entry is null or empty", optionPath); //$NON-NLS-1$ - } - // fifth entry - class name - final String className = this.readEntry(traceReader); - if ((className == null) || (className.length() == 0)) { - throw new InvalidTraceEntry("The class name in a trace entry is null or empty", className); //$NON-NLS-1$ - } - // sixth entry - method name - final String methodName = this.readEntry(traceReader); - if ((methodName == null) || (methodName.length() == 0)) { - throw new InvalidTraceEntry("The method name in a trace entry is null or empty", methodName); //$NON-NLS-1$ - } - // seventh entry - line number - final String lineNumberString = this.readEntry(traceReader); - if ((lineNumberString == null) || (lineNumberString.length() == 0)) { - throw new InvalidTraceEntry("The line number in a trace entry is null or empty", lineNumberString); //$NON-NLS-1$ + String symbolicName = null; + String optionPath = null; + String className = null; + String methodName = null; + int lineNumber = -1; + if (this.verboseDebug) { + // third entry - bundle symbolic name + symbolicName = this.readEntry(traceReader); + if ((symbolicName == null) || (symbolicName.length() == 0)) { + throw new InvalidTraceEntry("The bundle symbolic name in a trace entry is null or empty", symbolicName); //$NON-NLS-1$ + } + // fourth entry - option path + optionPath = this.readEntry(traceReader); + if ((optionPath == null) || (optionPath.length() == 0)) { + throw new InvalidTraceEntry("The option-path in a trace entry is null or empty", optionPath); //$NON-NLS-1$ + } + // fifth entry - class name + className = this.readEntry(traceReader); + if ((className == null) || (className.length() == 0)) { + throw new InvalidTraceEntry("The class name in a trace entry is null or empty", className); //$NON-NLS-1$ + } + // sixth entry - method name + methodName = this.readEntry(traceReader); + if ((methodName == null) || (methodName.length() == 0)) { + throw new InvalidTraceEntry("The method name in a trace entry is null or empty", methodName); //$NON-NLS-1$ + } + // seventh entry - line number + final String lineNumberString = this.readEntry(traceReader); + if ((lineNumberString == null) || (lineNumberString.length() == 0)) { + throw new InvalidTraceEntry("The line number in a trace entry is null or empty", lineNumberString); //$NON-NLS-1$ + } + lineNumber = Integer.valueOf(lineNumberString).intValue(); } - final int lineNumber = Integer.valueOf(lineNumberString).intValue(); - // eighth entry - message + // eighth entry - message (valid if verbose debugging is off) final String message = this.readEntry(traceReader); - // read in the next character. if it is \r or \n then the throwable was not supplied + // read in the next character. if it is \r or \n then the throwable was not supplied (valid if verbose debugging is off) traceReader.mark(1); inputChar = (char) traceReader.read(); String throwable = null; diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/EclipseDebugTrace.java b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/EclipseDebugTrace.java index 1d0d5ba0e..b1f89c984 100644 --- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/EclipseDebugTrace.java +++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/EclipseDebugTrace.java @@ -12,10 +12,10 @@ package org.eclipse.osgi.framework.debug; import java.io.*; import java.security.AccessController; +import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.eclipse.osgi.framework.util.SecureAction; -import org.eclipse.osgi.service.debug.DebugOptions; import org.eclipse.osgi.service.debug.DebugTrace; /** @@ -30,16 +30,18 @@ class EclipseDebugTrace implements DebugTrace { /** The trace message for a thread stack dump */ private final static String MESSAGE_THREAD_DUMP = "Thread Stack dump: "; //$NON-NLS-1$ /** The trace message for a method completing with a return value */ - private final static String MESSAGE_EXIT_METHOD_WITH_RESULTS = "Exiting method with result: "; //$NON-NLS-1$ + private final static String MESSAGE_EXIT_METHOD_WITH_RESULTS = "Exiting method {0}with result: "; //$NON-NLS-1$ /** The trace message for a method completing with no return value */ - private final static String MESSAGE_EXIT_METHOD_NO_RESULTS = "Exiting method with a void return"; //$NON-NLS-1$ + private final static String MESSAGE_EXIT_METHOD_NO_RESULTS = "Exiting method {0}with a void return"; //$NON-NLS-1$ /** The trace message for a method starting with a set of arguments */ - private final static String MESSAGE_ENTER_METHOD_WITH_PARAMS = "Entering method with parameters: ("; //$NON-NLS-1$ + private final static String MESSAGE_ENTER_METHOD_WITH_PARAMS = "Entering method {0}with parameters: ("; //$NON-NLS-1$ /** The trace message for a method starting with no arguments */ - private final static String MESSAGE_ENTER_METHOD_NO_PARAMS = "Entering method with no parameters"; //$NON-NLS-1$ - /** The version attribute written to the header of the trace file */ + private final static String MESSAGE_ENTER_METHOD_NO_PARAMS = "Entering method {0}with no parameters"; //$NON-NLS-1$ + /** The version attribute written in the header of a new session */ private final static String TRACE_FILE_VERSION_COMMENT = "version: "; //$NON-NLS-1$ - /** The version value written to the header of the trace file */ + /** The verbose attribute written in the header of a new session */ + private final static String TRACE_FILE_VERBOSE_COMMENT = "verbose: "; //$NON-NLS-1$ + /** The version value written in the header of a new session */ private final static String TRACE_FILE_VERSION = "1.1"; //$NON-NLS-1$ /** The new session identifier to be written whenever a new session starts */ private final static String TRACE_NEW_SESSION = "!SESSION "; //$NON-NLS-1$ @@ -93,7 +95,7 @@ class EclipseDebugTrace implements DebugTrace { /** A flag to determine if the message being written is done to a new file (i.e. should the header information be written) */ static boolean newSession = true; /** DebugOptions are used to determine if the specified bundle symbolic name + option-path has debugging enabled */ - private DebugOptions debugOptions = null; + private FrameworkDebugOptions debugOptions = null; /** * Construct a new EclipseDebugTrace for the specified bundle symbolic name and write messages to the specified @@ -102,7 +104,7 @@ class EclipseDebugTrace implements DebugTrace { * @param bundleSymbolicName The symbolic name of the bundle being traced * @param debugOptions Used to determine if the specified bundle symbolic name + option-path has tracing enabled */ - public EclipseDebugTrace(final String bundleSymbolicName, final DebugOptions debugOptions) { + EclipseDebugTrace(final String bundleSymbolicName, final FrameworkDebugOptions debugOptions) { this(bundleSymbolicName, debugOptions, null); } @@ -115,7 +117,7 @@ class EclipseDebugTrace implements DebugTrace { * @param debugOptions Used to determine if the specified bundle symbolic name + option-path has tracing enabled * @param traceClass The class that the client is using to perform trace API calls */ - public EclipseDebugTrace(final String bundleSymbolicName, final DebugOptions debugOptions, final Class traceClass) { + EclipseDebugTrace(final String bundleSymbolicName, final FrameworkDebugOptions debugOptions, final Class traceClass) { this.traceClass = traceClass != null ? traceClass.getName() : null; this.debugOptions = debugOptions; @@ -171,7 +173,8 @@ class EclipseDebugTrace implements DebugTrace { public void traceEntry(final String optionPath) { if (isDebuggingEnabled(optionPath)) { - final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, EclipseDebugTrace.MESSAGE_ENTER_METHOD_NO_PARAMS, traceClass); + final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, null, traceClass); + setMessage(record, EclipseDebugTrace.MESSAGE_ENTER_METHOD_NO_PARAMS); writeRecord(record); } } @@ -210,7 +213,8 @@ class EclipseDebugTrace implements DebugTrace { } messageBuffer.append(")"); //$NON-NLS-1$ } - final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, messageBuffer.toString(), traceClass); + final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, null, traceClass); + setMessage(record, messageBuffer.toString()); writeRecord(record); } } @@ -222,7 +226,8 @@ class EclipseDebugTrace implements DebugTrace { public void traceExit(final String optionPath) { if (isDebuggingEnabled(optionPath)) { - final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, EclipseDebugTrace.MESSAGE_EXIT_METHOD_NO_RESULTS, traceClass); + final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, null, traceClass); + setMessage(record, EclipseDebugTrace.MESSAGE_EXIT_METHOD_NO_RESULTS); writeRecord(record); } } @@ -240,7 +245,8 @@ class EclipseDebugTrace implements DebugTrace { } else { messageBuffer.append(result.toString()); } - final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, messageBuffer.toString(), traceClass); + final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, null, traceClass); + setMessage(record, messageBuffer.toString()); writeRecord(record); } } @@ -273,6 +279,29 @@ class EclipseDebugTrace implements DebugTrace { } /** + * Set the trace message for the specified record to include class and method information + * if verbose debugging is disabled. + * + * @param record The {@link FrameworkDebugTraceEntry} containing the information to persist to the trace file. + * @param originalMessage The original tracing message + */ + private final void setMessage(final FrameworkDebugTraceEntry record, final String originalMessage) { + + String argument = null; + if (!debugOptions.isVerbose()) { + final StringBuffer classMethodName = new StringBuffer(record.getClassName()); + classMethodName.append("#"); //$NON-NLS-1$ + classMethodName.append(record.getMethodName()); + classMethodName.append(" "); //$NON-NLS-1$ + argument = classMethodName.toString(); + } else { + argument = ""; //$NON-NLS-1$ + } + String newMessage = MessageFormat.format(originalMessage, new Object[] {argument}); + record.setMessage(newMessage); + } + + /** * Utility method to convert an array of StackTraceElement objects to form a String representation of a stack dump * * @param elements @@ -412,6 +441,7 @@ class EclipseDebugTrace implements DebugTrace { traceWriter = openWriter(traceFile); writeComment(traceWriter, "This is a continuation of trace file " + backupFile.getAbsolutePath()); //$NON-NLS-1$ writeComment(traceWriter, EclipseDebugTrace.TRACE_FILE_VERSION_COMMENT + EclipseDebugTrace.TRACE_FILE_VERSION); + writeComment(traceWriter, EclipseDebugTrace.TRACE_FILE_VERBOSE_COMMENT + debugOptions.isVerbose()); writeComment(traceWriter, EclipseDebugTrace.TRACE_FILE_DATE + getFormattedDate(timestamp)); traceWriter.flush(); } catch (IOException ioEx) { @@ -491,6 +521,7 @@ class EclipseDebugTrace implements DebugTrace { writeComment(traceWriter, EclipseDebugTrace.TRACE_NEW_SESSION + this.getFormattedDate(timestamp)); writeComment(traceWriter, EclipseDebugTrace.TRACE_FILE_VERSION_COMMENT + EclipseDebugTrace.TRACE_FILE_VERSION); + writeComment(traceWriter, EclipseDebugTrace.TRACE_FILE_VERBOSE_COMMENT + debugOptions.isVerbose()); writeComment(traceWriter, "The following option strings are specified for this debug session:"); //$NON-NLS-1$ final String[] allOptions = FrameworkDebugOptions.getDefault().getAllOptions(); for (int i = 0; i < allOptions.length; i++) { @@ -509,8 +540,7 @@ class EclipseDebugTrace implements DebugTrace { */ private void writeMessage(final Writer traceWriter, final FrameworkDebugTraceEntry entry) throws IOException { - // format the trace entry - StringBuffer message = new StringBuffer(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); + final StringBuffer message = new StringBuffer(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); message.append(" "); //$NON-NLS-1$ message.append(encodeText(entry.getThreadName())); message.append(" "); //$NON-NLS-1$ @@ -520,27 +550,33 @@ class EclipseDebugTrace implements DebugTrace { message.append(" "); //$NON-NLS-1$ message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); message.append(" "); //$NON-NLS-1$ - message.append(entry.getBundleSymbolicName()); - message.append(" "); //$NON-NLS-1$ - message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); - message.append(" "); //$NON-NLS-1$ - message.append(encodeText(entry.getOptionPath())); - message.append(" "); //$NON-NLS-1$ - message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); - message.append(" "); //$NON-NLS-1$ - message.append(entry.getClassName()); - message.append(" "); //$NON-NLS-1$ - message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); - message.append(" "); //$NON-NLS-1$ - message.append(entry.getMethodName()); - message.append(" "); //$NON-NLS-1$ - message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); - message.append(" "); //$NON-NLS-1$ - message.append(entry.getLineNumber()); - message.append(" "); //$NON-NLS-1$ - message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); - message.append(" "); //$NON-NLS-1$ - message.append(encodeText(entry.getMessage())); + if (!debugOptions.isVerbose()) { + // format the trace entry for quiet tracing: only the thread name, timestamp, trace message, and exception (if necessary) + message.append(encodeText(entry.getMessage())); + } else { + // format the trace entry for verbose tracing + message.append(entry.getBundleSymbolicName()); + message.append(" "); //$NON-NLS-1$ + message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); + message.append(" "); //$NON-NLS-1$ + message.append(encodeText(entry.getOptionPath())); + message.append(" "); //$NON-NLS-1$ + message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); + message.append(" "); //$NON-NLS-1$ + message.append(entry.getClassName()); + message.append(" "); //$NON-NLS-1$ + message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); + message.append(" "); //$NON-NLS-1$ + message.append(entry.getMethodName()); + message.append(" "); //$NON-NLS-1$ + message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); + message.append(" "); //$NON-NLS-1$ + message.append(entry.getLineNumber()); + message.append(" "); //$NON-NLS-1$ + message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); + message.append(" "); //$NON-NLS-1$ + message.append(encodeText(entry.getMessage())); + } if (entry.getThrowable() != null) { message.append(" "); //$NON-NLS-1$ message.append(EclipseDebugTrace.TRACE_ELEMENT_DELIMITER); diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugOptions.java b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugOptions.java index 020022dc8..445ad49f8 100644 --- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugOptions.java +++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugOptions.java @@ -31,6 +31,7 @@ import org.osgi.util.tracker.ServiceTrackerCustomizer; public class FrameworkDebugOptions implements DebugOptions, ServiceTrackerCustomizer { private static final String OSGI_DEBUG = "osgi.debug"; //$NON-NLS-1$ + private static final String OSGI_DEBUG_VERBOSE = "osgi.debug.verbose"; //$NON-NLS-1$ public static final String PROP_TRACEFILE = "osgi.tracefile"; //$NON-NLS-1$ /** monitor used to lock the options maps */ private final Object lock = new Object(); @@ -46,6 +47,8 @@ public class FrameworkDebugOptions implements DebugOptions, ServiceTrackerCustom protected final static Map debugTraceCache = new HashMap(); /** The File object to store messages. This value may be null. */ protected File outFile = null; + /** Is verbose debugging enabled? Changing this value causes a new tracing session to start. */ + protected boolean verboseDebug = true; private volatile BundleContext context; private volatile ServiceTracker listenerTracker; @@ -53,6 +56,8 @@ public class FrameworkDebugOptions implements DebugOptions, ServiceTrackerCustom * Internal constructor to create a <code>FrameworkDebugOptions</code> singleton object. */ private FrameworkDebugOptions() { + // check if verbose debugging was set during initialization. This needs to be set even if debugging is disabled + this.verboseDebug = Boolean.valueOf(FrameworkProperties.getProperty(OSGI_DEBUG_VERBOSE, Boolean.TRUE.toString())).booleanValue(); // if no debug option was specified, don't even bother to try. // Must ensure that the options slot is null as this is the signal to the // platform that debugging is not enabled. @@ -433,6 +438,26 @@ public class FrameworkDebugOptions implements DebugOptions, ServiceTrackerCustom EclipseDebugTrace.newSession = true; } + /* + * (non-Javadoc) + * @see org.eclipse.osgi.service.debug.DebugOptions#getVerbose() + */ + boolean isVerbose() { + + return this.verboseDebug; + } + + /* + * (non-Javadoc) + * @see org.eclipse.osgi.service.debug.DebugOptions#setVerbose(boolean) + */ + public synchronized void setVerbose(final boolean verbose) { + + this.verboseDebug = verbose; + // the verbose flag changed so start a new session + EclipseDebugTrace.newSession = true; + } + /** * Notifies the trace listener for the specified bundle that its option-path has changed. * @param bundleSymbolicName The bundle of the owning trace listener to notify. diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugTraceEntry.java b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugTraceEntry.java index 4538324c0..0fca678b9 100644 --- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugTraceEntry.java +++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugTraceEntry.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 IBM Corporation and others. + * Copyright (c) 2009, 2010 IBM Corporation 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 @@ -56,7 +56,7 @@ public class FrameworkDebugTraceEntry { /** * The trace message */ - private final String message; + private String message; /** * The trace exception @@ -264,4 +264,13 @@ public class FrameworkDebugTraceEntry { return lineNumber; } + + /** + * + * @param newMessage + */ + void setMessage(final String newMessage) { + + message = newMessage; + } }
\ No newline at end of file |