logback-dev
Threads by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 9940 discussions
Author: ceki
Date: Mon Sep 8 20:08:59 2008
New Revision: 1799
Modified:
logback/trunk/logback-classic/pom.xml
Log:
avoid tests being executed twice
Modified: logback/trunk/logback-classic/pom.xml
==============================================================================
--- logback/trunk/logback-classic/pom.xml (original)
+++ logback/trunk/logback-classic/pom.xml Mon Sep 8 20:08:59 2008
@@ -151,7 +151,7 @@
<reportFormat>plain</reportFormat>
<trimStackTrace>false</trimStackTrace>
<excludes>
- <exclude>**/AllTest.java</exclude>
+ <exclude>**/AllClassicTest.java</exclude>
<exclude>**/PackageTest.java</exclude>
<exclude>**/TestConstants.java</exclude>
<exclude>**/SerializationPerfsTest.java</exclude>
1
0
svn commit: r1798 - in logback/trunk/logback-classic/src: main/java/ch/qos/logback/classic/spi test/java/ch/qos/logback/classic test/java/ch/qos/logback/classic/html test/java/ch/qos/logback/classic/pattern test/java/ch/qos/logback/classic/spi
by noreply.ceki@qos.ch 08 Sep '08
by noreply.ceki@qos.ch 08 Sep '08
08 Sep '08
Author: ceki
Date: Mon Sep 8 20:02:17 2008
New Revision: 1798
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingDataCalculator.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TestConstants.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicCPDCTest.java
Log:
- fine tuning tests so that they pass with BEA JRockit
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingDataCalculator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingDataCalculator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingDataCalculator.java Mon Sep 8 20:02:17 2008
@@ -46,12 +46,12 @@
void populateFrames(StackTraceElementProxy[] stepArray) {
// in the initial part of this method we populate package informnation for
// common stack frames
- Throwable t = new Throwable("local stack reference");
- StackTraceElement[] localteSTEArray = t.getStackTrace();
- int commonFrames = STEUtil.findNumberOfCommonFrames(localteSTEArray,
+ final Throwable t = new Throwable("local stack reference");
+ final StackTraceElement[] localteSTEArray = t.getStackTrace();
+ final int commonFrames = STEUtil.findNumberOfCommonFrames(localteSTEArray,
stepArray);
- int localFirstCommon = localteSTEArray.length - commonFrames;
- int stepFirstCommon = stepArray.length - commonFrames;
+ final int localFirstCommon = localteSTEArray.length - commonFrames;
+ final int stepFirstCommon = stepArray.length - commonFrames;
ClassLoader lastExactClassLoader = null;
ClassLoader firsExactClassLoader = null;
@@ -79,8 +79,8 @@
populateUncommonFrames(commonFrames, stepArray, firsExactClassLoader);
}
- int findSTEStartIndex(ThrowableDataPoint[] tdpArray, int from) {
- int len = tdpArray.length;
+ int findSTEStartIndex(final ThrowableDataPoint[] tdpArray, final int from) {
+ final int len = tdpArray.length;
if (from < 0 || from >= len) {
return -1;
}
@@ -92,7 +92,7 @@
return -1;
}
- private StackTraceElementProxy[] getSTEPArray(ThrowableDataPoint[] tdpArray, int from) {
+ private StackTraceElementProxy[] getSTEPArray(final ThrowableDataPoint[] tdpArray, final int from) {
List<StackTraceElementProxy> stepList = new LinkedList<StackTraceElementProxy>();
int len = tdpArray.length;
if (from < 0 || from >= len) {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TestConstants.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TestConstants.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TestConstants.java Mon Sep 8 20:02:17 2008
@@ -12,7 +12,7 @@
public class TestConstants {
final static public String ISO_REGEX = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}";
- final static public String MAIN_REGEX = "\\[[mM]ain(\\sThread)?\\]";
-
+ final static public String NAKED_MAIN_REGEX = "[mM]ain(\\sThread)?";
+ final static public String MAIN_REGEX = "\\["+NAKED_MAIN_REGEX+"\\]";
final static public String JORAN_ONPUT_PREFIX = "src/test/input/joran";
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java Mon Sep 8 20:02:17 2008
@@ -19,6 +19,7 @@
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.TestConstants;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.classic.spi.ThrowableDataPoint;
import ch.qos.logback.classic.spi.ThrowableProxy;
@@ -130,7 +131,8 @@
}
{
Element tdElement = (Element) trElement.elements().get(1);
- assertEquals("main", tdElement.getText());
+ String regex = TestConstants.NAKED_MAIN_REGEX;
+ assertTrue(tdElement.getText().toString().matches(regex));
}
{
Element tdElement = (Element) trElement.elements().get(2);
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java Mon Sep 8 20:02:17 2008
@@ -20,6 +20,7 @@
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.TestConstants;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.CoreGlobal;
import ch.qos.logback.core.net.SyslogConstants;
@@ -73,7 +74,7 @@
StringBuffer buf = new StringBuffer();
converter.write(buf, le);
// the number below should be the line number of the previous line
- assertEquals("74", buf.toString());
+ assertEquals("75", buf.toString());
}
}
@@ -97,7 +98,8 @@
DynamicConverter<LoggingEvent> converter = new ThreadConverter();
StringBuffer buf = new StringBuffer();
converter.write(buf, le);
- assertEquals("main", buf.toString());
+ String regex = TestConstants.NAKED_MAIN_REGEX;
+ assertTrue(buf.toString().matches(regex));
}
public void testMessage() {
@@ -264,9 +266,11 @@
{
DynamicConverter<LoggingEvent> converter = new RelativeTimeConverter();
StringBuffer buf0 = new StringBuffer();
- converter.write(buf0, makeLoggingEvent(null));
StringBuffer buf1 = new StringBuffer();
- converter.write(buf1, makeLoggingEvent(null));
+ LoggingEvent e0 = makeLoggingEvent(null);
+ LoggingEvent e1 = makeLoggingEvent(null);
+ converter.write(buf0, e0);
+ converter.write(buf1, e1);
assertEquals(buf0.toString(), buf1.toString());
int rt0 = Integer.parseInt(buf0.toString());
if (rt0 < 50) {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicCPDCTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicCPDCTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicCPDCTest.java Mon Sep 8 20:02:17 2008
@@ -60,7 +60,6 @@
} catch (Throwable e) {
ThrowableProxy tp = new ThrowableProxy(e);
if (withClassPackagingCalculation) {
- tp.getClassPackagingDataCalculator();
ClassPackagingDataCalculator cpdc = tp
.getClassPackagingDataCalculator();
ThrowableDataPoint[] tdpArray = tp.getThrowableDataPointArray();
@@ -79,7 +78,7 @@
@Test
public void perfTest() {
- int len = 500;
+ int len = 1000;
loop(len, false);
loop(len, true);
@@ -89,7 +88,7 @@
double d1 = loop(len, true);
System.out.println("with packaging info " + d1 + " microseconds");
assertTrue("computing class packaging data (" + d1
- + ") should have been less than six times the time it takes to process an exception" + (d0 * 6),
+ + ") should have been less than six times the time it takes to process an exception " + (d0 * 6),
d0 * 6 > d1);
}
}
1
0
svn commit: r1797 - in logback/trunk/logback-core/src/test: java/ch/qos/logback/core/layout java/ch/qos/logback/core/rolling witness/rolling
by noreply.ceki@qos.ch 08 Sep '08
by noreply.ceki@qos.ch 08 Sep '08
08 Sep '08
Author: ceki
Date: Mon Sep 8 19:53:33 2008
New Revision: 1797
Modified:
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/layout/DummyLayout.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java
logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.0
logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.1
logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.l
logback/trunk/logback-core/src/test/witness/rolling/sbr-test3.0.gz
logback/trunk/logback-core/src/test/witness/rolling/sbr-test3.1.gz
logback/trunk/logback-core/src/test/witness/rolling/sbr-test3.l
Log:
SizeBasedRolling test now passes
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/layout/DummyLayout.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/layout/DummyLayout.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/layout/DummyLayout.java Mon Sep 8 19:53:33 2008
@@ -14,9 +14,18 @@
public class DummyLayout<E> extends LayoutBase<E> {
public static final String DUMMY = "dummy"+LINE_SEP;
+ String val = DUMMY;
+
+ public DummyLayout() {
+ }
+
+ public DummyLayout(String val) {
+ this.val = val;
+ }
public String doLayout(E event) {
- return DUMMY;
+ return val;
}
+
}
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java Mon Sep 8 19:53:33 2008
@@ -1,5 +1,6 @@
package ch.qos.logback.core.rolling;
+import junit.framework.JUnit4TestAdapter;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
@@ -9,7 +10,7 @@
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTestSuite(RenamingTest.class);
- suite.addTestSuite(SizeBasedRollingTest.class);
+ suite.addTest(new JUnit4TestAdapter(SizeBasedRollingTest.class));
suite.addTestSuite(TimeBasedRollingTest.class);
suite.addTest(ch.qos.logback.core.rolling.helper.PackageTest.suite());
return suite;
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java Mon Sep 8 19:53:33 2008
@@ -16,11 +16,15 @@
package ch.qos.logback.core.rolling;
+import static org.junit.Assert.*;
+
import java.io.File;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+
import ch.qos.logback.core.Context;
import ch.qos.logback.core.ContextBase;
import ch.qos.logback.core.Layout;
@@ -36,12 +40,10 @@
* @author Sébastien Pennec
*
*/
-public class SizeBasedRollingTest extends TestCase {
+public class SizeBasedRollingTest {
- public SizeBasedRollingTest(String name) {
- super(name);
- }
+ @Before
public void setUp() {
{
File target = new File(Constants.OUTPUT_DIR_PREFIX
@@ -56,6 +58,7 @@
}
}
+ @After
public void tearDown() {
}
@@ -63,6 +66,7 @@
* Test whether FixedWindowRollingPolicy throws an exception when the
* ActiveFileName is not set.
*/
+ @Test
public void test1() throws Exception {
// We purposefully use the \n as the line separator.
// This makes the regression test system independent.
@@ -95,10 +99,11 @@
/**
* Test basic rolling functionality.
*/
+ @Test
public void test2() throws Exception {
Context context = new ContextBase();
- DummyLayout<Object> layout = new DummyLayout<Object>();
+ DummyLayout<Object> layout = new DummyLayout<Object>("0123456789");
RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
rfa.setName("ROLLING");
rfa.setLayout(layout);
@@ -170,9 +175,10 @@
/**
* Same as testBasic but also with GZ compression.
*/
+ @Test
public void test3() throws Exception {
Context context = new ContextBase();
- DummyLayout<Object> layout = new DummyLayout<Object>();
+ DummyLayout<Object> layout = new DummyLayout<Object>("0123456789");
RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
rfa.setLayout(layout);
rfa.setContext(context);
@@ -206,7 +212,7 @@
// }
// }
- for (int i = 0; i < 45; i++) {
+ for (int i = 0; i < 25; i++) {
Thread.sleep(10);
rfa.doAppend("hello");
}
@@ -221,13 +227,13 @@
if (!isWindows()) {
assertTrue(Compare.compare(
- "Constants.TEST_DIR_PREFIXoutput/sbr-test3.log",
+ Constants.OUTPUT_DIR_PREFIX+"sbr-test3.log",
Constants.TEST_DIR_PREFIX + "witness/rolling/sbr-test3.l"));
assertTrue(Compare.gzCompare(
- "Constants.TEST_DIR_PREFIXoutput/sbr-test3.0.gz",
+ Constants.OUTPUT_DIR_PREFIX+"sbr-test3.0.gz",
Constants.TEST_DIR_PREFIX + "witness/rolling/sbr-test3.0.gz"));
assertTrue(Compare.gzCompare(
- "Constants.TEST_DIR_PREFIXoutput/sbr-test3.1.gz",
+ Constants.OUTPUT_DIR_PREFIX+"sbr-test3.1.gz",
Constants.TEST_DIR_PREFIX + "witness/rolling/sbr-test3.1.gz"));
}
@@ -237,10 +243,4 @@
boolean isWindows() {
return System.getProperty("os.name").indexOf("Windows") != -1;
}
-
- public static Test suite() {
- TestSuite suite = new TestSuite();
- suite.addTestSuite(SizeBasedRollingTest.class);
- return suite;
- }
}
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java Mon Sep 8 19:53:33 2008
@@ -242,7 +242,7 @@
tbrp.setCurrentTime(addTime(tbrp.getCurrentTime(), 500));
}
- tbrp.future.get(1000, TimeUnit.MILLISECONDS);
+ tbrp.future.get(2000, TimeUnit.MILLISECONDS);
for (int i = 0; i < 2; i++) {
assertTrue(Compare.gzCompare(filenames[i], Constants.TEST_DIR_PREFIX
Modified: logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.0
==============================================================================
--- logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.0 (original)
+++ logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.0 Mon Sep 8 19:53:33 2008
@@ -1,15 +1 @@
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
+0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
\ No newline at end of file
Modified: logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.1
==============================================================================
--- logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.1 (original)
+++ logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.1 Mon Sep 8 19:53:33 2008
@@ -1,15 +1 @@
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
+0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
\ No newline at end of file
Modified: logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.l
==============================================================================
--- logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.l (original)
+++ logback/trunk/logback-core/src/test/witness/rolling/sbr-test2.l Mon Sep 8 19:53:33 2008
@@ -1,15 +1 @@
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
-dummy
+01234567890123456789012345678901234567890123456789
\ No newline at end of file
Modified: logback/trunk/logback-core/src/test/witness/rolling/sbr-test3.0.gz
==============================================================================
Binary files. No diff available.
Modified: logback/trunk/logback-core/src/test/witness/rolling/sbr-test3.1.gz
==============================================================================
Binary files. No diff available.
Modified: logback/trunk/logback-core/src/test/witness/rolling/sbr-test3.l
==============================================================================
--- logback/trunk/logback-core/src/test/witness/rolling/sbr-test3.l (original)
+++ logback/trunk/logback-core/src/test/witness/rolling/sbr-test3.l Mon Sep 8 19:53:33 2008
@@ -1,5 +1 @@
-dummy
-dummy
-dummy
-dummy
-dummy
+01234567890123456789012345678901234567890123456789
\ No newline at end of file
1
0
svn commit: r1796 - logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic
by noreply.ceki@qos.ch 08 Sep '08
by noreply.ceki@qos.ch 08 Sep '08
08 Sep '08
Author: ceki
Date: Mon Sep 8 18:58:38 2008
New Revision: 1796
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TestConstants.java
Log:
- adjustments for BEA Jrockit
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java Mon Sep 8 18:58:38 2008
@@ -24,7 +24,7 @@
import ch.qos.logback.core.Context;
import ch.qos.logback.core.pattern.PatternLayoutBase;
import ch.qos.logback.core.pattern.parser.AbstractPatternLayoutBaseTest;
-
+import static ch.qos.logback.classic.TestConstants.*;
public class PatternLayoutTest extends AbstractPatternLayoutBaseTest {
@@ -64,7 +64,8 @@
pl.start();
String val = pl.doLayout(getEventObject());
// 2006-02-01 22:38:06,212 INFO [main] c.q.l.pattern.ConverterTest - Some message
- String regex = TestConstants.ISO_REGEX+" INFO \\[main] c.q.l.c.pattern.ConverterTest - Some message\\s*";
+ String regex = ISO_REGEX+" INFO "+MAIN_REGEX+" c.q.l.c.pattern.ConverterTest - Some message\\s*";
+
assertTrue(val.matches(regex));
}
@@ -86,8 +87,7 @@
pl.start();
String val = pl.doLayout(getEventObject());
// 2008-03-18 21:55:54,250 [main] c.q.l.c.pattern.ConverterTest - Some message
- String regex = TestConstants.ISO_REGEX+" \\[main] c.q.l.c.p.ConverterTest - Some message\\s*";
- System.out.println(val);
+ String regex = ISO_REGEX+" "+MAIN_REGEX+" c.q.l.c.p.ConverterTest - Some message\\s*";
assertTrue(val.matches(regex));
}
@@ -123,7 +123,7 @@
pl.start();
String val = pl.doLayout(getEventObject());
// 2006-02-01 22:38:06,212 INFO [main] c.q.l.pattern.ConverterTest - Some message
- String regex = TestConstants.ISO_REGEX+" INFO \\[main] c.q.l.c.pattern.ConverterTest - Some message\\s*";
+ String regex = TestConstants.ISO_REGEX+" INFO "+MAIN_REGEX+" c.q.l.c.pattern.ConverterTest - Some message\\s*";
assertTrue(val.matches(regex));
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TestConstants.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TestConstants.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/TestConstants.java Mon Sep 8 18:58:38 2008
@@ -12,6 +12,7 @@
public class TestConstants {
final static public String ISO_REGEX = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}";
-
+ final static public String MAIN_REGEX = "\\[[mM]ain(\\sThread)?\\]";
+
final static public String JORAN_ONPUT_PREFIX = "src/test/input/joran";
}
1
0
Author: ceki
Date: Mon Sep 8 17:42:48 2008
New Revision: 1795
Added:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingData.java
- copied, changed from r1794, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfo.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingDataCalculator.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicCPDCTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CPDCSpecial.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LocalFirstClassLoader.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/CPDCSpecialImpl.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/TeztHelper.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/SystemInfo.java
Removed:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfo.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfoCalculator.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageInfoTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageVersionCalculatorTest.java
Modified:
logback/trunk/logback-classic/pom.xml
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ThrowableProxyConverterTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java
Log:
LBGENERAL-23
This code attempts to guarantee that the extracted class packaging information
is extracting using the *exact* same classloader was used to load a given class
in the stack frame.
Associated test cases.
Modified: logback/trunk/logback-classic/pom.xml
==============================================================================
--- logback/trunk/logback-classic/pom.xml (original)
+++ logback/trunk/logback-classic/pom.xml Mon Sep 8 17:42:48 2008
@@ -114,7 +114,6 @@
<scope>test</scope>
</dependency>
-
</dependencies>
<build>
@@ -159,9 +158,9 @@
</excludes>
</configuration>
</plugin>
-
</plugins>
+
</build>
</project>
\ No newline at end of file
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java Mon Sep 8 17:42:48 2008
@@ -9,7 +9,7 @@
*/
package ch.qos.logback.classic.pattern;
-import ch.qos.logback.classic.spi.PackageInfo;
+import ch.qos.logback.classic.spi.ClassPackagingData;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.classic.spi.ThrowableDataPoint;
@@ -20,9 +20,9 @@
protected void extraData(StringBuilder builder, ThrowableDataPoint tdp) {
StackTraceElementProxy step = tdp.getStackTraceElementProxy();
if(step != null) {
- PackageInfo pi = step.getPackageInfo();
+ ClassPackagingData pi = step.getClassPackagingData();
if(pi != null) {
- builder.append(" [").append(pi.getJarName()).append(':').append(pi.getVersion()).append(']');
+ builder.append(" [").append(pi.getCodeLocation()).append(':').append(pi.getVersion()).append(']');
}
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java Mon Sep 8 17:42:48 2008
@@ -14,7 +14,7 @@
import org.slf4j.Marker;
-import ch.qos.logback.classic.spi.PackageInfo;
+import ch.qos.logback.classic.spi.ClassPackagingData;
/**
*
@@ -22,7 +22,7 @@
*/
public class Util {
- static Map<String, PackageInfo> cache = new HashMap<String, PackageInfo>();
+ static Map<String, ClassPackagingData> cache = new HashMap<String, ClassPackagingData>();
static public boolean match(Marker marker, Marker[] markerArray) {
if (markerArray == null) {
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingData.java (from r1794, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfo.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfo.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingData.java Mon Sep 8 17:42:48 2008
@@ -11,24 +11,36 @@
import java.io.Serializable;
-public class PackageInfo implements Serializable {
+public class ClassPackagingData implements Serializable {
private static final long serialVersionUID = 637783570208674312L;
- String jarName;
- String version;
+ final String codeLocation;
+ final String version;
+ private final boolean exact;
- public PackageInfo(String jarName, String version) {
- this.jarName = jarName;
+ public ClassPackagingData(String codeLocation, String version) {
+ this.codeLocation = codeLocation;
this.version = version;
+ this.exact = true;
}
- public String getJarName() {
- return jarName;
+ public ClassPackagingData(String classLocation, String version, boolean exact) {
+ this.codeLocation = classLocation;
+ this.version = version;
+ this.exact = exact;
+ }
+
+ public String getCodeLocation() {
+ return codeLocation;
}
public String getVersion() {
return version;
}
+
+ public boolean isExact() {
+ return exact;
+ }
}
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingDataCalculator.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingDataCalculator.java Mon Sep 8 17:42:48 2008
@@ -0,0 +1,245 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.classic.spi;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+import sun.reflect.Reflection;
+import ch.qos.logback.classic.spi.ThrowableDataPoint.ThrowableDataPointType;
+
+/**
+ *
+ * Given a classname locate associated PackageInfo (jar name, version name).
+ *
+ * @author James Strachan
+ * @Ceki Gülcü
+ */
+public class ClassPackagingDataCalculator {
+
+ final static StackTraceElementProxy[] STEP_ARRAY_TEMPLATE = new StackTraceElementProxy[0];
+
+ HashMap<String, ClassPackagingData> cache = new HashMap<String, ClassPackagingData>();
+
+ public ClassPackagingDataCalculator() {
+ }
+
+ public void calculate(ThrowableDataPoint[] tdpArray) {
+ int steStart = 0;
+ StackTraceElementProxy[] stepArray = new StackTraceElementProxy[0];
+ do {
+ steStart = findSTEStartIndex(tdpArray, steStart+stepArray.length);
+ stepArray = getSTEPArray(tdpArray, steStart);
+ populateFrames(stepArray);
+ } while(steStart != -1);
+ }
+
+ void populateFrames(StackTraceElementProxy[] stepArray) {
+ // in the initial part of this method we populate package informnation for
+ // common stack frames
+ Throwable t = new Throwable("local stack reference");
+ StackTraceElement[] localteSTEArray = t.getStackTrace();
+ int commonFrames = STEUtil.findNumberOfCommonFrames(localteSTEArray,
+ stepArray);
+ int localFirstCommon = localteSTEArray.length - commonFrames;
+ int stepFirstCommon = stepArray.length - commonFrames;
+
+ ClassLoader lastExactClassLoader = null;
+ ClassLoader firsExactClassLoader = null;
+
+ int missfireCount = 0;
+ for (int i = 0; i < commonFrames; i++) {
+ Class callerClass = Reflection.getCallerClass(localFirstCommon + i
+ - missfireCount + 1);
+ StackTraceElementProxy step = stepArray[stepFirstCommon + i];
+ String stepClassname = step.ste.getClassName();
+
+ if (stepClassname.equals(callerClass.getName())) {
+ lastExactClassLoader = callerClass.getClassLoader();
+ if(firsExactClassLoader == null) {
+ firsExactClassLoader = callerClass.getClassLoader();
+ }
+ ClassPackagingData pi = calculateByExactType(callerClass);
+ step.setPackageInfo(pi);
+ } else {
+ missfireCount++;
+ ClassPackagingData pi = computeBySTEP(step, lastExactClassLoader);
+ step.setPackageInfo(pi);
+ }
+ }
+ populateUncommonFrames(commonFrames, stepArray, firsExactClassLoader);
+ }
+
+ int findSTEStartIndex(ThrowableDataPoint[] tdpArray, int from) {
+ int len = tdpArray.length;
+ if (from < 0 || from >= len) {
+ return -1;
+ }
+ for (int i = from; i < len; i++) {
+ if (tdpArray[i].type == ThrowableDataPointType.STEP) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ private StackTraceElementProxy[] getSTEPArray(ThrowableDataPoint[] tdpArray, int from) {
+ List<StackTraceElementProxy> stepList = new LinkedList<StackTraceElementProxy>();
+ int len = tdpArray.length;
+ if (from < 0 || from >= len) {
+ return stepList.toArray(STEP_ARRAY_TEMPLATE);
+ }
+ for (int i = from; i < len; i++) {
+ final ThrowableDataPoint tdp = tdpArray[i];
+
+ if (tdp.type == ThrowableDataPointType.STEP) {
+ stepList.add(tdp.getStackTraceElementProxy());
+ } else {
+ break;
+ }
+ }
+ return stepList.toArray(STEP_ARRAY_TEMPLATE);
+ }
+
+ void populateUncommonFrames(int commonFrames, StackTraceElementProxy[] stepArray, ClassLoader firstExactClassLoader) {
+ int uncommonFrames = stepArray.length-commonFrames;
+ for (int i = 0; i < uncommonFrames; i++) {
+ StackTraceElementProxy step = stepArray[i];
+ ClassPackagingData pi = computeBySTEP(step, firstExactClassLoader);
+ step.setPackageInfo(pi);
+ }
+ }
+
+ private ClassPackagingData calculateByExactType(Class type) {
+ String className = type.getName();
+ ClassPackagingData cpd = cache.get(className);
+ if (cpd != null) {
+ return cpd;
+ }
+ String version = getImplementationVersion(type);
+ String codeLocation = getCodeLocation(type);
+ cpd = new ClassPackagingData(codeLocation, version);
+ cache.put(className, cpd);
+ return cpd;
+ }
+
+ private ClassPackagingData computeBySTEP(StackTraceElementProxy step, ClassLoader lastExactClassLoader) {
+ String className = step.ste.getClassName();
+ ClassPackagingData cpd = cache.get(className);
+ if (cpd != null) {
+ return cpd;
+ }
+ Class type = bestEffortLoadClass(lastExactClassLoader, className);
+ String version = getImplementationVersion(type);
+ String codeLocation = getCodeLocation(type);
+ cpd = new ClassPackagingData(codeLocation, version, false);
+ cache.put(className, cpd);
+ return cpd;
+ }
+
+
+ String getImplementationVersion(Class type) {
+ Package aPackage = type.getPackage();
+ if (aPackage != null) {
+ String v = aPackage.getImplementationVersion();
+ if (v == null) {
+ return "na";
+ } else {
+ return v;
+ }
+ }
+ return "na";
+
+ }
+
+ String getCodeLocation(Class type) {
+ try {
+ if (type != null) {
+ // file:/C:/java/maven-2.0.8/repo/com/icegreen/greenmail/1.3/greenmail-1.3.jar
+ URL resource = type.getProtectionDomain().getCodeSource().getLocation();
+ if (resource != null) {
+ String locationStr = resource.toString();
+ // now lets remove all but the file name
+ String result = getCodeLocation(locationStr, '/');
+ if(result != null) {
+ return result;
+ }
+ return getCodeLocation(locationStr, '\\');
+ }
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ return "na";
+ }
+
+
+ private String getCodeLocation(String locationStr, char separator) {
+ int idx = locationStr.lastIndexOf(separator);
+ if(isFolder(idx, locationStr)) {
+ idx = locationStr.lastIndexOf(separator, idx-1);
+ return locationStr.substring(idx+1);
+ } else if (idx > 0) {
+ return locationStr.substring(idx + 1);
+ }
+ return null;
+ }
+
+ private boolean isFolder(int idx, String text) {
+ return (idx != -1 && idx+1 == text.length());
+ }
+
+ private Class loadClass(ClassLoader cl, String className) {
+ if(cl == null) {
+ return null;
+ }
+ try {
+ return cl.loadClass(className);
+ } catch (ClassNotFoundException e1) {
+ return null;
+ } catch(Exception e) {
+ e.printStackTrace(); // this is unexpected
+ return null;
+ }
+
+ }
+
+ /**
+ *
+ * @param lastGuaranteedClassLoader may be null
+ * @param className
+ * @return
+ */
+ private Class bestEffortLoadClass(ClassLoader lastGuaranteedClassLoader, String className) {
+ Class result = loadClass(lastGuaranteedClassLoader, className);
+ if(result != null) {
+ return result;
+ }
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ if(tccl != lastGuaranteedClassLoader) {
+ result = loadClass(tccl, className);
+ }
+ if(result != null) {
+ return result;
+ }
+
+ try {
+ return Class.forName(className);
+ } catch (ClassNotFoundException e1) {
+ return null;
+ } catch(Exception e) {
+ e.printStackTrace(); // this is unexpected
+ return null;
+ }
+ }
+
+}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java Mon Sep 8 17:42:48 2008
@@ -10,7 +10,7 @@
final StackTraceElement ste;
private String steAsString;
- private PackageInfo pi;
+ private ClassPackagingData cpd;
StackTraceElementProxy(StackTraceElement ste) {
if(ste == null) {
@@ -26,12 +26,12 @@
return steAsString;
}
- void setPackageInfo(PackageInfo pi) {
- this.pi = pi;
+ void setPackageInfo(ClassPackagingData cpd) {
+ this.cpd = cpd;
}
- public PackageInfo getPackageInfo() {
- return pi;
+ public ClassPackagingData getClassPackagingData() {
+ return cpd;
}
@Override
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java Mon Sep 8 17:42:48 2008
@@ -11,32 +11,32 @@
import java.util.Arrays;
+import ch.qos.logback.core.CoreGlobal;
public class ThrowableProxy implements java.io.Serializable {
private static final long serialVersionUID = 6307784764626694851L;
private ThrowableDataPoint[] tdpArray;
private transient final Throwable throwable;
- private transient PackageInfoCalculator packageInfoCalculator;
+ private transient ClassPackagingDataCalculator classPackagingDataCalculator;
public ThrowableProxy(Throwable throwable) {
this.throwable = throwable;
- this.tdpArray = ThrowableToDataPointArray.convert(throwable);
+ this.tdpArray = ThrowableToDataPointArray.convert(throwable);
}
public Throwable getThrowable() {
return throwable;
}
-
-
- public PackageInfoCalculator getPackageInfoCalculator() {
- // if original instance (non-deserialized), and packageInfoCalculator
+
+ public ClassPackagingDataCalculator getClassPackagingDataCalculator() {
+ // if original instance (non-deserialized), and classPackagingDataCalculator
// is not already initialized, then create an instance
- // here we assume that (throwable == null) for deserialized instances
- if(throwable != null && packageInfoCalculator == null) {
- packageInfoCalculator = new PackageInfoCalculator();
+ // here we assume that (throwable == null) for deserialized instances
+ if (throwable != null && classPackagingDataCalculator == null) {
+ classPackagingDataCalculator = new ClassPackagingDataCalculator();
}
- return packageInfoCalculator;
+ return classPackagingDataCalculator;
}
/**
@@ -67,5 +67,31 @@
return false;
return true;
}
-
+
+ public void fullDump() {
+ StringBuilder builder = new StringBuilder();
+ for (ThrowableDataPoint tdp : getThrowableDataPointArray()) {
+ String string = tdp.toString();
+ builder.append(string);
+ extraData(builder, tdp);
+ builder.append(CoreGlobal.LINE_SEPARATOR);
+ }
+ System.out.println(builder.toString());
+ }
+
+ protected void extraData(StringBuilder builder, ThrowableDataPoint tdp) {
+ StackTraceElementProxy step = tdp.getStackTraceElementProxy();
+ if (step != null) {
+ ClassPackagingData cpd = step.getClassPackagingData();
+ if (cpd != null) {
+ if(!cpd.isExact()){
+ builder.append(" ~[") ;
+ } else {
+ builder.append(" [") ;
+ }
+ builder.append(cpd.getCodeLocation()).append(':').append(
+ cpd.getVersion()).append(']');
+ }
+ }
+ }
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ThrowableProxyConverterTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ThrowableProxyConverterTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ThrowableProxyConverterTest.java Mon Sep 8 17:42:48 2008
@@ -12,6 +12,7 @@
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.classic.util.TeztHelper;
public class ThrowableProxyConverterTest {
@@ -45,7 +46,7 @@
@Test
public void nested() {
- Throwable t = makeNestedException(1);
+ Throwable t = TeztHelper.makeNestedException(1);
verify(t);
}
@@ -59,11 +60,5 @@
assertEquals(sw.toString(), result);
}
- Throwable makeNestedException(int level) {
- if (level == 0) {
- return new Exception("nesting level=" + level);
- }
- Throwable cause = makeNestedException(level - 1);
- return new Exception("nesting level =" + level, cause);
- }
+
}
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicCPDCTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicCPDCTest.java Mon Sep 8 17:42:48 2008
@@ -0,0 +1,95 @@
+package ch.qos.logback.classic.spi;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.classic.util.TeztHelper;
+import ch.qos.logback.core.util.SystemInfo;
+
+public class BasicCPDCTest {
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ public void verify(ThrowableDataPoint[] tdpArray) {
+ for (ThrowableDataPoint tdp : tdpArray) {
+ StackTraceElementProxy step = tdp.getStackTraceElementProxy();
+ if (step != null) {
+ assertNotNull(step.getClassPackagingData());
+ }
+ }
+ }
+
+ @Test public void otherJD() {
+ System.out.println(SystemInfo.getJavaVendor());
+ }
+
+ @Test
+ public void smoke() throws Exception {
+ Throwable t = new Throwable("x");
+ ThrowableProxy tp = new ThrowableProxy(t);
+ ClassPackagingDataCalculator cpdc = tp.getClassPackagingDataCalculator();
+ ThrowableDataPoint[] tdpArray = tp.getThrowableDataPointArray();
+ cpdc.calculate(tdpArray);
+ verify(tdpArray);
+ }
+
+ @Test
+ public void nested() throws Exception {
+ Throwable t = TeztHelper.makeNestedException(3);
+ ThrowableProxy tp = new ThrowableProxy(t);
+ ClassPackagingDataCalculator cpdc = tp.getClassPackagingDataCalculator();
+ ThrowableDataPoint[] tdpArray = tp.getThrowableDataPointArray();
+ cpdc.calculate(tdpArray);
+ verify(tdpArray);
+ }
+
+ public void doCalculateClassPackagingData(
+ boolean withClassPackagingCalculation) {
+ try {
+ throw new Exception("testing");
+ } catch (Throwable e) {
+ ThrowableProxy tp = new ThrowableProxy(e);
+ if (withClassPackagingCalculation) {
+ tp.getClassPackagingDataCalculator();
+ ClassPackagingDataCalculator cpdc = tp
+ .getClassPackagingDataCalculator();
+ ThrowableDataPoint[] tdpArray = tp.getThrowableDataPointArray();
+ cpdc.calculate(tdpArray);
+ }
+ }
+ }
+
+ double loop(int len, boolean withClassPackagingCalculation) {
+ long start = System.nanoTime();
+ for (int i = 0; i < len; i++) {
+ doCalculateClassPackagingData(withClassPackagingCalculation);
+ }
+ return (1.0 * System.nanoTime() - start) / len / 1000;
+ }
+
+ @Test
+ public void perfTest() {
+ int len = 500;
+ loop(len, false);
+ loop(len, true);
+
+ double d0 = loop(len, false);
+ System.out.println("without packaging info " + d0 + " microseconds");
+
+ double d1 = loop(len, true);
+ System.out.println("with packaging info " + d1 + " microseconds");
+ assertTrue("computing class packaging data (" + d1
+ + ") should have been less than six times the time it takes to process an exception" + (d0 * 6),
+ d0 * 6 > d1);
+ }
+}
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CPDCSpecial.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CPDCSpecial.java Mon Sep 8 17:42:48 2008
@@ -0,0 +1,11 @@
+package ch.qos.logback.classic.spi;
+
+public interface CPDCSpecial {
+
+ public abstract void doTest();
+
+ public abstract Throwable getThrowable();
+
+ public abstract ThrowableProxy getThrowableProxy();
+
+}
\ No newline at end of file
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LocalFirstClassLoader.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LocalFirstClassLoader.java Mon Sep 8 17:42:48 2008
@@ -0,0 +1,66 @@
+package ch.qos.logback.classic.spi;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+
+/**
+ * An almost trivial no fuss implementation of a class loader following the
+ * child-first delegation model.
+ *
+ * @author Ceki G�lc�
+ */
+public class LocalFirstClassLoader extends URLClassLoader {
+
+ public LocalFirstClassLoader(URL[] urls) {
+ super(urls);
+ }
+
+ public LocalFirstClassLoader(URL[] urls, ClassLoader parent) {
+ super(urls, parent);
+ }
+
+ public void addURL(URL url) {
+ super.addURL(url);
+ }
+
+ public Class<?> loadClass(String name) throws ClassNotFoundException {
+ return loadClass(name, false);
+ }
+
+ /**
+ * We override the parent-first behavior established by java.lang.Classloader.
+ *
+ * The implementation is surprisingly straightforward.
+ */
+ protected Class<?> loadClass(String name, boolean resolve)
+ throws ClassNotFoundException {
+
+ // First, check if the class has already been loaded
+ Class c = findLoadedClass(name);
+
+ // if not loaded, search the local (child) resources
+ if (c == null) {
+ try {
+ c = findClass(name);
+ } catch (ClassNotFoundException cnfe) {
+ // ignore
+ }
+ }
+
+ // if we could not find it, delegate to parent
+ // Note that we don't attempt to catch any ClassNotFoundException
+ if (c == null) {
+ if (getParent() != null) {
+ c = getParent().loadClass(name);
+ } else {
+ c = getSystemClassLoader().loadClass(name);
+ }
+ }
+
+ if (resolve) {
+ resolveClass(c);
+ }
+
+ return c;
+ }
+}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java Mon Sep 8 17:42:48 2008
@@ -24,6 +24,7 @@
suite.addTest(new JUnit4TestAdapter (LoggerComparatorTest.class));
suite.addTest(new JUnit4TestAdapter (LoggingEventSerializationTest.class));
suite.addTest(new JUnit4TestAdapter(ch.qos.logback.classic.spi.ThrowableToDataPointTest.class));
+ suite.addTest(new JUnit4TestAdapter(ch.qos.logback.classic.spi.BasicCPDCTest.class));
return suite;
}
}
\ No newline at end of file
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/CPDCSpecialImpl.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/CPDCSpecialImpl.java Mon Sep 8 17:42:48 2008
@@ -0,0 +1,31 @@
+package ch.qos.logback.classic.spi.special;
+
+import ch.qos.logback.classic.spi.CPDCSpecial;
+import ch.qos.logback.classic.spi.ClassPackagingDataCalculator;
+import ch.qos.logback.classic.spi.ThrowableProxy;
+
+
+public class CPDCSpecialImpl implements CPDCSpecial {
+
+
+ Throwable throwable;
+ ThrowableProxy throwableProxy;
+
+ public void doTest() {
+ nesting();
+ }
+
+ private void nesting() {
+ throwable = new Throwable("x");
+ throwableProxy = new ThrowableProxy(throwable);
+ ClassPackagingDataCalculator cpdc = new ClassPackagingDataCalculator();
+ cpdc.calculate(throwableProxy.getThrowableDataPointArray());
+ }
+
+ public Throwable getThrowable() {
+ return throwable;
+ }
+ public ThrowableProxy getThrowableProxy() {
+ return throwableProxy;
+ }
+}
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/TeztHelper.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/util/TeztHelper.java Mon Sep 8 17:42:48 2008
@@ -0,0 +1,13 @@
+package ch.qos.logback.classic.util;
+
+public class TeztHelper {
+
+
+ static public Throwable makeNestedException(int level) {
+ if (level == 0) {
+ return new Exception("nesting level=" + level);
+ }
+ Throwable cause = makeNestedException(level - 1);
+ return new Exception("nesting level =" + level, cause);
+ }
+}
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/SystemInfo.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/SystemInfo.java Mon Sep 8 17:42:48 2008
@@ -0,0 +1,9 @@
+package ch.qos.logback.core.util;
+
+public class SystemInfo {
+
+
+ public static String getJavaVendor() {
+ return OptionHelper.getSystemProperty("java.vendor", null);
+ }
+}
1
0
Author: ceki
Date: Fri Sep 5 19:14:47 2008
New Revision: 1794
Added:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java
- copied, changed from r1793, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfo.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfoCalculator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PlatformInfo.java
- copied, changed from r1772, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/helpers/PlatformInfo.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/STEUtil.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPoint.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableToDataPointArray.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverterTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ThrowableProxyConverterTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageInfoTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageVersionCalculatorTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableToDataPointTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/PackageTest.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/ThrowableToStringArrayTest.java
Removed:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/helpers/PlatformInfo.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/UtilTest.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/PackageInfo.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/StackTraceElementProxy.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableDataPoint.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToDataPointArray.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/ThrowableToDataPointTest.java
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/PatternLayout.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/LRUCacheTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/AllCoreTest.java
Log:
LBGENERAL-23
Working on the reliability of the extracted package information which is actually quite a difficult problem.
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/PatternLayout.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/PatternLayout.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/PatternLayout.java Fri Sep 5 19:14:47 2008
@@ -28,7 +28,7 @@
import ch.qos.logback.classic.pattern.NopThrowableInformationConverter;
import ch.qos.logback.classic.pattern.RelativeTimeConverter;
import ch.qos.logback.classic.pattern.ThreadConverter;
-import ch.qos.logback.classic.pattern.ThrowableInformationConverter;
+import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.CoreGlobal;
import ch.qos.logback.core.pattern.PatternLayoutBase;
@@ -90,10 +90,10 @@
defaultConverterMap.put("mdc", MDCConverter.class.getName());
defaultConverterMap
- .put("ex", ThrowableInformationConverter.class.getName());
- defaultConverterMap.put("exception", ThrowableInformationConverter.class
+ .put("ex", ThrowableProxyConverter.class.getName());
+ defaultConverterMap.put("exception", ThrowableProxyConverter.class
.getName());
- defaultConverterMap.put("throwable", ThrowableInformationConverter.class
+ defaultConverterMap.put("throwable", ThrowableProxyConverter.class
.getName());
defaultConverterMap.put("nopex", NopThrowableInformationConverter.class
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java Fri Sep 5 19:14:47 2008
@@ -21,8 +21,8 @@
import ch.qos.logback.classic.spi.CallerData;
import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.classic.spi.ThrowableDataPoint;
import ch.qos.logback.core.db.DBAppenderBase;
-import ch.qos.logback.core.helpers.ThrowableDataPoint;
/**
* The DBAppender inserts logging events into three database tables in a format
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java Fri Sep 5 19:14:47 2008
@@ -11,7 +11,7 @@
package ch.qos.logback.classic.db;
import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.core.helpers.ThrowableDataPoint;
+import ch.qos.logback.classic.spi.ThrowableDataPoint;
/**
* @author Ceki Gülcü
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java Fri Sep 5 19:14:47 2008
@@ -3,8 +3,8 @@
import static ch.qos.logback.core.Layout.LINE_SEP;
import ch.qos.logback.classic.helpers.Transform;
import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.classic.spi.ThrowableDataPoint;
import ch.qos.logback.classic.spi.ThrowableProxy;
-import ch.qos.logback.core.helpers.ThrowableDataPoint;
import ch.qos.logback.core.html.IThrowableRenderer;
public class DefaultThrowableRenderer implements IThrowableRenderer {
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java Fri Sep 5 19:14:47 2008
@@ -10,7 +10,6 @@
package ch.qos.logback.classic.joran;
-import ch.qos.logback.classic.helpers.PlatformInfo;
import ch.qos.logback.classic.joran.action.ConfigurationAction;
import ch.qos.logback.classic.joran.action.ConsolePluginAction;
import ch.qos.logback.classic.joran.action.EvaluatorAction;
@@ -19,6 +18,7 @@
import ch.qos.logback.classic.joran.action.LevelAction;
import ch.qos.logback.classic.joran.action.LoggerAction;
import ch.qos.logback.classic.joran.action.RootLoggerAction;
+import ch.qos.logback.classic.spi.PlatformInfo;
import ch.qos.logback.core.joran.JoranConfiguratorBase;
import ch.qos.logback.core.joran.action.AppenderRefAction;
import ch.qos.logback.core.joran.action.IncludeAction;
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java Fri Sep 5 19:14:47 2008
@@ -14,9 +14,9 @@
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.pattern.SyslogStartConverter;
import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.classic.spi.ThrowableDataPoint;
import ch.qos.logback.classic.util.LevelToSyslogSeverity;
import ch.qos.logback.core.Layout;
-import ch.qos.logback.core.helpers.ThrowableDataPoint;
import ch.qos.logback.core.net.SyslogAppenderBase;
import ch.qos.logback.core.net.SyslogWriter;
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java Fri Sep 5 19:14:47 2008
@@ -30,7 +30,7 @@
public void process(Converter<LoggingEvent> head) {
if (!chainHandlesThrowable(head)) {
Converter<LoggingEvent> tail = ConverterUtil.findTail(head);
- Converter<LoggingEvent> exConverter = new ThrowableInformationConverter();
+ Converter<LoggingEvent> exConverter = new ThrowableProxyConverter();
if (tail == null) {
head = exConverter;
} else {
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,29 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.classic.pattern;
+
+import ch.qos.logback.classic.spi.PackageInfo;
+import ch.qos.logback.classic.spi.StackTraceElementProxy;
+import ch.qos.logback.classic.spi.ThrowableDataPoint;
+
+
+public class ExtendedThrowableProxyConverter extends ThrowableProxyConverter {
+
+ @Override
+ protected void extraData(StringBuilder builder, ThrowableDataPoint tdp) {
+ StackTraceElementProxy step = tdp.getStackTraceElementProxy();
+ if(step != null) {
+ PackageInfo pi = step.getPackageInfo();
+ if(pi != null) {
+ builder.append(" [").append(pi.getJarName()).append(':').append(pi.getVersion()).append(']');
+ }
+ }
+ }
+}
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java (from r1793, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java Fri Sep 5 19:14:47 2008
@@ -14,20 +14,20 @@
import java.util.Map;
import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.classic.spi.ThrowableDataPoint;
import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.CoreGlobal;
import ch.qos.logback.core.boolex.EvaluationException;
import ch.qos.logback.core.boolex.EventEvaluator;
-import ch.qos.logback.core.helpers.ThrowableDataPoint;
import ch.qos.logback.core.status.ErrorStatus;
/**
- * Add a stack trace i case the event contains a Throwable.
+ * Add a stack trace in case the event contains a Throwable.
*
* @author Ceki Gülcü
*/
-public class ThrowableInformationConverter extends ThrowableHandlingConverter {
+public class ThrowableProxyConverter extends ThrowableHandlingConverter {
int lengthOption;
List<EventEvaluator> evaluatorList = null;
@@ -85,8 +85,12 @@
super.stop();
}
+ protected void extraData(StringBuilder builder, ThrowableDataPoint tdp) {
+ // nop
+ }
+
public String convert(LoggingEvent event) {
- StringBuffer buf = new StringBuffer(32);
+ StringBuilder buf = new StringBuilder(32);
ThrowableProxy information = event.getThrowableProxy();
@@ -133,15 +137,9 @@
buf.append(tdpArray[0]).append(CoreGlobal.LINE_SEPARATOR);
for (int i = 1; i < length; i++) {
String string = tdpArray[i].toString();
-
- if (string.startsWith(CoreGlobal.CAUSED_BY)) {
- // nothing
- } else if (Character.isDigit(string.charAt(0))) {
- buf.append("\t... ");
- } else {
- buf.append("\tat ");
- }
- buf.append(string).append(CoreGlobal.LINE_SEPARATOR);
+ buf.append(string);
+ extraData(buf, tdpArray[i]); // allow other data to be appended
+ buf.append(CoreGlobal.LINE_SEPARATOR);
}
return buf.toString();
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java Fri Sep 5 19:14:47 2008
@@ -9,17 +9,15 @@
*/
package ch.qos.logback.classic.pattern;
-import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Marker;
-import ch.qos.logback.core.helpers.PackageInfo;
+import ch.qos.logback.classic.spi.PackageInfo;
/**
*
- * @author James Strachan
* @author Ceki Gulcu
*/
public class Util {
@@ -44,123 +42,5 @@
return false;
}
- static String getVersion(String className) {
- String packageName = getPackageName(className);
- Package aPackage = Package.getPackage(packageName);
- if (aPackage != null) {
- String v = aPackage.getImplementationVersion();
- if (v == null) {
- return "na";
- } else {
- return v;
- }
- }
- return "na";
- }
-
- static public PackageInfo getPackageInfo(String className) {
- PackageInfo pi = cache.get(className);
- if(pi != null) {
- return pi;
- }
- String version = getVersion(className);
- String jarname = getJarNameOfClass(className);
- pi = new PackageInfo(jarname, version);
- //cache.put(className, pi);
- return pi;
- }
-
- static String getPackageName(String className) {
- int j = className.lastIndexOf('.');
- return className.substring(0, j);
- }
-
- /**
- * Uses the context class path or the current global class loader to deduce
- * the file that the given class name comes from
- */
- static String getJarNameOfClass0(String className) {
- try {
- Class type = findClass(className);
- if (type != null) {
- URL resource = type.getClassLoader().getResource(
- type.getName().replace('.', '/') + ".class");
-
-
- // "jar:file:/C:/java/../repo/groupId/artifact/1.3/artifact-1.3.jar!/com/some/package/Some.class
- if (resource != null) {
- String text = resource.toString();
- int idx = text.lastIndexOf('!');
- if (idx > 0) {
- text = text.substring(0, idx);
- // now lets remove all but the file name
- idx = text.lastIndexOf('/');
- if (idx > 0) {
- text = text.substring(idx + 1);
- }
- idx = text.lastIndexOf('\\');
- if (idx > 0) {
- text = text.substring(idx + 1);
- }
- return text;
- }
- }
- }
- } catch (Exception e) {
- // ignore
- }
- return "na";
- }
-
- static String getJarNameOfClass1(String className) {
- try {
- Class type = findClass(className);
- if (type != null) {
-
-
- // file:/C:/java/maven-2.0.8/repo/com/icegreen/greenmail/1.3/greenmail-1.3.jar
- URL resource = type.getProtectionDomain().getCodeSource().getLocation();
- if (resource != null) {
- String text = resource.toString();
- // now lets remove all but the file name
- int idx = text.lastIndexOf('/');
- if (idx > 0) {
- text = text.substring(idx + 1);
- }
- idx = text.lastIndexOf('\\');
- if (idx > 0) {
- text = text.substring(idx + 1);
- }
- return text;
- }
- }
- } catch (Exception e) {
- // ignore
- }
- return "na";
- }
-
-
-
- static String getJarNameOfClass(String className) {
- return getJarNameOfClass1(className);
- }
-
- static private Class findClass(String className) {
- try {
- return Thread.currentThread().getContextClassLoader()
- .loadClass(className);
- } catch (ClassNotFoundException e) {
- try {
- return Class.forName(className);
- } catch (ClassNotFoundException e1) {
- try {
- return Util.class.getClassLoader().loadClass(className);
- } catch (ClassNotFoundException e2) {
- return null;
- }
- }
- }
- }
-
+
}
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfo.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfo.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,34 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.classic.spi;
+
+import java.io.Serializable;
+
+public class PackageInfo implements Serializable {
+
+ private static final long serialVersionUID = 637783570208674312L;
+
+ String jarName;
+ String version;
+
+ public PackageInfo(String jarName, String version) {
+ this.jarName = jarName;
+ this.version = version;
+ }
+
+ public String getJarName() {
+ return jarName;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+}
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfoCalculator.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackageInfoCalculator.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,197 @@
+package ch.qos.logback.classic.spi;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+import sun.reflect.Reflection;
+
+import ch.qos.logback.classic.spi.ThrowableDataPoint.ThrowableDataPointType;
+
+
+
+/**
+ *
+ * Given a classname locate associated PackageInfo (jar name, version name).
+ *
+ * @author James Strachan
+ * @Ceki Gülcü
+ */
+public class PackageInfoCalculator {
+
+ final static StackTraceElementProxy[] STEP_ARRAY_TEMPLATE = new StackTraceElementProxy[0];
+
+ HashMap<String, PackageInfo> cache = new HashMap<String, PackageInfo>();
+
+
+ PackageInfoCalculator() {
+
+ }
+
+ public void computePackageInfo(ThrowableDataPoint[] tdpArray) {
+
+ int steStart= findSTEStartIndex(tdpArray, 0);
+ StackTraceElementProxy[] stepArray = getSTEPArray(tdpArray, steStart);
+ populateWithPackageInfo(stepArray);
+
+ }
+
+ void populateWithPackageInfo(StackTraceElementProxy[] stepArray) {
+ Throwable t = new Throwable("local");
+ //t.printStackTrace();
+ StackTraceElement[] localteSTEArray = t.getStackTrace();
+ int commonFrames = STEUtil.findNumberOfCommonFrames(localteSTEArray, stepArray);
+
+ int localFirstCommon = localteSTEArray.length-commonFrames;
+ int stepFirstCommon = stepArray.length-commonFrames;
+
+ //System.out.println("commonFr4ames="+commonFrames);
+
+ int missfireCount = 0;
+ for(int i = 0; i < commonFrames; i++) {
+ Class callerClass = Reflection.getCallerClass(localFirstCommon+i-missfireCount+1);
+ StackTraceElementProxy step = stepArray[stepFirstCommon+i];
+ String stepClassname = step.ste.getClassName();
+ //System.out.println("step.class = "+stepClassname);
+
+ if(!stepClassname.equals(callerClass.getName())) {
+ missfireCount++;
+ PackageInfo pi = compute(step);
+ step.setPackageInfo(pi);
+ } else {
+ PackageInfo pi = computeByType(callerClass);
+ step.setPackageInfo(pi);
+ }
+ }
+
+ populateX(commonFrames, stepArray);
+
+ }
+
+ int findSTEStartIndex(ThrowableDataPoint[] tdpArray, int from) {
+ int len = tdpArray.length;
+ if(from < 0 || from >= len) {
+ return -1;
+ }
+ for(int i = from; i < len; i++) {
+ if(tdpArray[i].type == ThrowableDataPointType.STEP) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ void populateX(int commonFrames, StackTraceElementProxy[] stepArray) {
+ for(int i = 0; i < commonFrames; i++) {
+ StackTraceElementProxy step = stepArray[i];
+ PackageInfo pi = compute(step);
+ step.setPackageInfo(pi);
+ }
+ }
+
+ StackTraceElementProxy[] getSTEPArray(ThrowableDataPoint[] tdpArray, int from) {
+ List<StackTraceElementProxy> stepList = new LinkedList<StackTraceElementProxy>();
+ int len = tdpArray.length;
+ if(from < 0 || from >= len) {
+ return stepList.toArray(STEP_ARRAY_TEMPLATE);
+ }
+ for(int i = from; i < len; i++) {
+ final ThrowableDataPoint tdp = tdpArray[i];
+
+ if(tdp.type == ThrowableDataPointType.STEP) {
+ stepList.add(tdp.getStackTraceElementProxy());
+ } else {
+ break;
+ }
+ }
+ return stepList.toArray(STEP_ARRAY_TEMPLATE);
+ }
+
+ private PackageInfo computeByType(Class type) {
+ String className = type.getName();
+ PackageInfo pi = cache.get(className);
+ if (pi != null) {
+ return pi;
+ }
+ String version = getVersion(className);
+ String jarname = getJarNameOfClass(type);
+ pi = new PackageInfo(jarname, version);
+ cache.put(className, pi);
+ return pi;
+ }
+
+ private PackageInfo compute(StackTraceElementProxy step) {
+ String className = step.ste.getClassName();
+ PackageInfo pi = cache.get(className);
+ if (pi != null) {
+ return pi;
+ }
+ String version = getVersion(className);
+ Class type = bestEffortFindClass(className);
+ String jarname = getJarNameOfClass(type);
+ pi = new PackageInfo(jarname, version);
+ cache.put(className, pi);
+ return pi;
+ }
+
+ String getVersion(String className) {
+ String packageName = getPackageName(className);
+ Package aPackage = Package.getPackage(packageName);
+ if (aPackage != null) {
+ String v = aPackage.getImplementationVersion();
+ if (v == null) {
+ return "na";
+ } else {
+ return v;
+ }
+ }
+ return "na";
+ }
+
+ static String getPackageName(String className) {
+ int j = className.lastIndexOf('.');
+ return className.substring(0, j);
+ }
+
+ String getJarNameOfClass(Class type) {
+ try {
+ if (type != null) {
+
+ // file:/C:/java/maven-2.0.8/repo/com/icegreen/greenmail/1.3/greenmail-1.3.jar
+ URL resource = type.getProtectionDomain().getCodeSource().getLocation();
+ if (resource != null) {
+ String text = resource.toString();
+ // now lets remove all but the file name
+ int idx = text.lastIndexOf('/');
+ if (idx > 0) {
+ text = text.substring(idx + 1);
+ }
+ idx = text.lastIndexOf('\\');
+ if (idx > 0) {
+ text = text.substring(idx + 1);
+ }
+ return text;
+ }
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ return "na";
+ }
+
+
+ private Class bestEffortFindClass(String className) {
+ try {
+ return Thread.currentThread().getContextClassLoader()
+ .loadClass(className);
+ } catch (ClassNotFoundException e) {
+ try {
+ return Class.forName(className);
+ } catch (ClassNotFoundException e1) {
+ return null;
+ }
+ }
+ }
+
+}
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PlatformInfo.java (from r1772, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/helpers/PlatformInfo.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/helpers/PlatformInfo.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PlatformInfo.java Fri Sep 5 19:14:47 2008
@@ -1,4 +1,4 @@
-package ch.qos.logback.classic.helpers;
+package ch.qos.logback.classic.spi;
/**
* This class provides information about the runtime platform.
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/STEUtil.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/STEUtil.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,48 @@
+package ch.qos.logback.classic.spi;
+
+public class STEUtil {
+
+
+ static int findNumberOfCommonFrames(StackTraceElement[] steArray,
+ StackTraceElement[] otherSTEArray) {
+ if (otherSTEArray == null) {
+ return 0;
+ }
+
+ int steIndex = steArray.length - 1;
+ int parentIndex = otherSTEArray.length - 1;
+ int count = 0;
+ while (steIndex >= 0 && parentIndex >= 0) {
+ if (steArray[steIndex].equals(otherSTEArray[parentIndex])) {
+ count++;
+ } else {
+ break;
+ }
+ steIndex--;
+ parentIndex--;
+ }
+ return count;
+ }
+
+
+ static int findNumberOfCommonFrames(StackTraceElement[] steArray,
+ StackTraceElementProxy[] otherSTEPArray) {
+ if (otherSTEPArray == null) {
+ return 0;
+ }
+
+ int steIndex = steArray.length - 1;
+ int parentIndex = otherSTEPArray.length - 1;
+ int count = 0;
+ while (steIndex >= 0 && parentIndex >= 0) {
+ if (steArray[steIndex].equals(otherSTEPArray[parentIndex].ste)) {
+ count++;
+ } else {
+ break;
+ }
+ steIndex--;
+ parentIndex--;
+ }
+ return count;
+ }
+}
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,59 @@
+package ch.qos.logback.classic.spi;
+
+import java.io.Serializable;
+
+
+
+public class StackTraceElementProxy implements Serializable {
+
+ private static final long serialVersionUID = -4832130320500439038L;
+
+ final StackTraceElement ste;
+ private String steAsString;
+ private PackageInfo pi;
+
+ StackTraceElementProxy(StackTraceElement ste) {
+ if(ste == null) {
+ throw new IllegalArgumentException("ste cannot be null");
+ }
+ this.ste = ste;
+ }
+
+ public String getSTEAsString() {
+ if(steAsString == null) {
+ steAsString = "\tat "+ste.toString();
+ }
+ return steAsString;
+ }
+
+ void setPackageInfo(PackageInfo pi) {
+ this.pi = pi;
+ }
+
+ public PackageInfo getPackageInfo() {
+ return pi;
+ }
+
+ @Override
+ public int hashCode() {
+ return ste.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final StackTraceElementProxy other = (StackTraceElementProxy) obj;
+ return ste.equals(other.ste);
+ }
+
+ @Override
+ public String toString() {
+ return getSTEAsString();
+ }
+
+}
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPoint.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPoint.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,100 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.classic.spi;
+
+import java.io.Serializable;
+
+
+
+/**
+ * A container for either raw strings or StackTraceElementProxy instances.
+ *
+ * @author Ceki Gülcü
+ *
+ */
+public class ThrowableDataPoint implements Serializable {
+
+ private static final long serialVersionUID = -2891376879381358469L;
+
+ public enum ThrowableDataPointType {
+ RAW, STEP;
+ }
+
+ String rawString;
+ StackTraceElementProxy step;
+ final ThrowableDataPointType type;
+
+ public ThrowableDataPoint(String rawString) {
+ this.rawString = rawString;
+ this.type = ThrowableDataPointType.RAW;
+ }
+
+ public ThrowableDataPoint(StackTraceElement ste) {
+ this.step = new StackTraceElementProxy(ste);
+ this.type = ThrowableDataPointType.STEP;
+ }
+
+ public ThrowableDataPointType getType() {
+ return type;
+ }
+
+ public StackTraceElementProxy getStackTraceElementProxy() {
+ return step;
+ }
+
+ @Override
+ public String toString() {
+ switch (type) {
+ case RAW:
+ return rawString;
+ case STEP:
+ return step.getSTEAsString();
+ }
+ throw new IllegalStateException("Unreachable code");
+ }
+
+ @Override
+ public int hashCode() {
+ switch (type) {
+ case RAW:
+ return rawString.hashCode();
+ case STEP:
+ return step.hashCode();
+ }
+ throw new IllegalStateException("Unreachable code");
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final ThrowableDataPoint other = (ThrowableDataPoint) obj;
+
+ switch (type) {
+ case RAW:
+ if (rawString == null) {
+ if (other.rawString != null)
+ return false;
+ else
+ return true;
+ } else {
+ return rawString.equals(other.rawString);
+ }
+ case STEP:
+ return step.equals(other.step);
+ }
+ throw new IllegalStateException("Unreachable code");
+ }
+
+}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java Fri Sep 5 19:14:47 2008
@@ -11,25 +11,34 @@
import java.util.Arrays;
-import ch.qos.logback.core.Layout;
-import ch.qos.logback.core.helpers.ThrowableDataPoint;
-import ch.qos.logback.core.helpers.ThrowableToDataPointArray;
public class ThrowableProxy implements java.io.Serializable {
private static final long serialVersionUID = 6307784764626694851L;
private ThrowableDataPoint[] tdpArray;
private transient final Throwable throwable;
+ private transient PackageInfoCalculator packageInfoCalculator;
public ThrowableProxy(Throwable throwable) {
this.throwable = throwable;
- tdpArray = ThrowableToDataPointArray.convert(throwable);
+ this.tdpArray = ThrowableToDataPointArray.convert(throwable);
}
public Throwable getThrowable() {
return throwable;
}
+
+ public PackageInfoCalculator getPackageInfoCalculator() {
+ // if original instance (non-deserialized), and packageInfoCalculator
+ // is not already initialized, then create an instance
+ // here we assume that (throwable == null) for deserialized instances
+ if(throwable != null && packageInfoCalculator == null) {
+ packageInfoCalculator = new PackageInfoCalculator();
+ }
+ return packageInfoCalculator;
+ }
+
/**
* The data point representation of the throwable proxy.
*/
Added: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableToDataPointArray.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableToDataPointArray.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,72 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+
+package ch.qos.logback.classic.spi;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import ch.qos.logback.core.CoreGlobal;
+
+/**
+ * Convert a throwable into an array of ThrowableDataPoint objects.
+ *
+ *
+ * @author Ceki Gülcü
+ */
+public class ThrowableToDataPointArray {
+
+ static final ThrowableDataPoint[] TEMPLATE_ARRAY = new ThrowableDataPoint[0];
+
+
+ static public ThrowableDataPoint[] convert(Throwable t) {
+ List<ThrowableDataPoint> tdpList = new LinkedList<ThrowableDataPoint>();
+ extract(tdpList, t, null);
+ return tdpList.toArray(TEMPLATE_ARRAY);
+ }
+
+ static private void extract(List<ThrowableDataPoint> tdpList, Throwable t,
+ StackTraceElement[] parentSTE) {
+ StackTraceElement[] ste = t.getStackTrace();
+ final int numberOfcommonFrames = STEUtil.findNumberOfCommonFrames(ste, parentSTE);
+
+ tdpList.add(firstLineToDataPoint(t, parentSTE));
+ for (int i = 0; i < (ste.length - numberOfcommonFrames); i++) {
+ tdpList.add(new ThrowableDataPoint(ste[i]));
+ }
+
+ if (numberOfcommonFrames != 0) {
+ tdpList.add(new ThrowableDataPoint("\t... "+numberOfcommonFrames
+ + " common frames omitted"));
+ }
+
+ Throwable cause = t.getCause();
+ if (cause != null) {
+ extract(tdpList, cause, ste);
+ }
+ }
+
+ private static ThrowableDataPoint firstLineToDataPoint(Throwable t,
+ StackTraceElement[] parentSTE) {
+ String prefix = "";
+ if (parentSTE != null) {
+ prefix = CoreGlobal.CAUSED_BY;
+ }
+
+ String result = prefix + t.getClass().getName();
+ if (t.getMessage() != null) {
+ result += ": " + t.getMessage();
+ }
+ return new ThrowableDataPoint(result);
+ }
+
+
+
+}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java Fri Sep 5 19:14:47 2008
@@ -20,7 +20,6 @@
suite.addTest(ch.qos.logback.classic.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.control.PackageTest.suite());
-
suite.addTest(ch.qos.logback.classic.joran.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.boolex.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.selector.PackageTest.suite());
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java Fri Sep 5 19:14:47 2008
@@ -20,9 +20,9 @@
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.classic.spi.ThrowableDataPoint;
import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.CoreGlobal;
-import ch.qos.logback.core.helpers.ThrowableDataPoint;
import ch.qos.logback.core.read.ListAppender;
public class HTMLLayoutTest {
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java Fri Sep 5 19:14:47 2008
@@ -116,14 +116,14 @@
public void testException() {
{
- DynamicConverter<LoggingEvent> converter = new ThrowableInformationConverter();
+ DynamicConverter<LoggingEvent> converter = new ThrowableProxyConverter();
StringBuffer buf = new StringBuffer();
converter.write(buf, le);
// System.out.println(buf);
}
{
- DynamicConverter<LoggingEvent> converter = new ThrowableInformationConverter();
+ DynamicConverter<LoggingEvent> converter = new ThrowableProxyConverter();
this.optionList.add("3");
converter.setOptionList(this.optionList);
StringBuffer buf = new StringBuffer();
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverterTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverterTest.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,71 @@
+package ch.qos.logback.classic.pattern;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.LoggingEvent;
+
+public class ExtendedThrowableProxyConverterTest {
+
+ LoggerContext lc = new LoggerContext();
+ ExtendedThrowableProxyConverter etpc = new ExtendedThrowableProxyConverter();
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+
+ @Before
+ public void setUp() throws Exception {
+ etpc.setContext(lc);
+ etpc.start();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ private LoggingEvent createLoggingEvent(Throwable t) {
+ LoggingEvent le = new LoggingEvent(this.getClass().getName(), lc
+ .getLogger(LoggerContext.ROOT_NAME), Level.DEBUG, "test message", t,
+ null);
+ return le;
+ }
+
+ @Test
+ public void smoke() {
+ Exception t = new Exception("smoke");
+ verify(t);
+ }
+
+ @Test
+ @Ignore
+ public void nested() {
+ Throwable t = makeNestedException(1);
+ verify(t);
+ }
+
+ void verify(Throwable t) {
+ t.printStackTrace(pw);
+
+ LoggingEvent le = createLoggingEvent(t);
+ String result = etpc.convert(le);
+ result = result.replace("common frames omitted", "more");
+ result = result.replaceAll(" \\[.*\\]", "");
+ assertEquals(sw.toString(), result);
+ }
+
+ Throwable makeNestedException(int level) {
+ if (level == 0) {
+ return new Exception("nesting level=" + level);
+ }
+ Throwable cause = makeNestedException(level - 1);
+ return new Exception("nesting level =" + level, cause);
+ }
+}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/LRUCacheTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/LRUCacheTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/LRUCacheTest.java Fri Sep 5 19:14:47 2008
@@ -11,6 +11,7 @@
import ch.qos.logback.classic.pattern.lru.Event;
import ch.qos.logback.classic.pattern.lru.T_LRUCache;
+@Ignore
public class LRUCacheTest {
@Test
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ThrowableProxyConverterTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ThrowableProxyConverterTest.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,69 @@
+package ch.qos.logback.classic.pattern;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.spi.LoggingEvent;
+
+public class ThrowableProxyConverterTest {
+
+ LoggerContext lc = new LoggerContext();
+ ThrowableProxyConverter tpc = new ThrowableProxyConverter();
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+
+ @Before
+ public void setUp() throws Exception {
+ tpc.setContext(lc);
+ tpc.start();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ private LoggingEvent createLoggingEvent(Throwable t) {
+ LoggingEvent le = new LoggingEvent(this.getClass().getName(), lc
+ .getLogger(LoggerContext.ROOT_NAME), Level.DEBUG, "test message", t,
+ null);
+ return le;
+ }
+
+ @Test
+ public void smoke() {
+ Exception t = new Exception("smoke");
+ verify(t);
+ }
+
+ @Test
+ public void nested() {
+ Throwable t = makeNestedException(1);
+ verify(t);
+ }
+
+ void verify(Throwable t) {
+ t.printStackTrace(pw);
+
+ LoggingEvent le = createLoggingEvent(t);
+ String result = tpc.convert(le);
+ System.out.println(result);
+ result = result.replace("common frames omitted", "more");
+ assertEquals(sw.toString(), result);
+ }
+
+ Throwable makeNestedException(int level) {
+ if (level == 0) {
+ return new Exception("nesting level=" + level);
+ }
+ Throwable cause = makeNestedException(level - 1);
+ return new Exception("nesting level =" + level, cause);
+ }
+}
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageInfoTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageInfoTest.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,85 @@
+package ch.qos.logback.classic.spi;
+
+import java.util.Random;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.icegreen.greenmail.util.GreenMail;
+import com.icegreen.greenmail.util.ServerSetup;
+
+public class PackageInfoTest {
+
+ int diff = 1024 + new Random().nextInt(10000);
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void withGreenMail() {
+ try {
+ ServerSetup serverSetup = new ServerSetup(-1, "localhost",
+ ServerSetup.PROTOCOL_SMTP);
+ GreenMail greenMail = new GreenMail((ServerSetup) null);
+ // greenMail.start();
+ } catch (Throwable e) {
+ // e.printStackTrace();
+ StackTraceElement[] stea = e.getStackTrace();
+ PackageInfoCalculator pic = new PackageInfoCalculator();
+
+ ThrowableDataPoint[] tdpa = ThrowableToDataPointArray.convert(e);
+ pic.computePackageInfo(tdpa);
+
+
+ //for (ThrowableDataPoint ste : stea) {
+///
+ // }
+ }
+ }
+
+ public void doPerf(boolean withPI) {
+ try {
+ ServerSetup serverSetup = new ServerSetup(-1, "localhost",
+ ServerSetup.PROTOCOL_SMTP);
+ GreenMail greenMail = new GreenMail((ServerSetup) null);
+ // greenMail.start();
+ } catch (Throwable e) {
+ StackTraceElement[] stea = e.getStackTrace();
+
+ if (withPI) {
+ PackageInfoCalculator pic = new PackageInfoCalculator();
+ for (StackTraceElement ste : stea) {
+ String className = ste.getClassName();
+ //PackageInfo pi = pic.compute(className);
+ }
+ }
+ }
+ }
+
+ double loop(int len, boolean withPI) {
+ long start = System.nanoTime();
+ for (int i = 0; i < len; i++) {
+ doPerf(withPI);
+ }
+ return (1.0*System.nanoTime() - start)/len/1000;
+ }
+
+ @Test
+ public void perfTest() {
+ int len = 10000;
+ loop(len, false);
+ loop(len, true);
+
+ double d0 = loop(len, false);
+ System.out.println("without package info " + d0+" microseconds");
+
+ double d1 = loop(len, true);
+ System.out.println("with package info " + d1 +" microseconds");
+ }
+}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java Fri Sep 5 19:14:47 2008
@@ -23,6 +23,7 @@
suite.addTestSuite(CallerDataTest.class);
suite.addTest(new JUnit4TestAdapter (LoggerComparatorTest.class));
suite.addTest(new JUnit4TestAdapter (LoggingEventSerializationTest.class));
+ suite.addTest(new JUnit4TestAdapter(ch.qos.logback.classic.spi.ThrowableToDataPointTest.class));
return suite;
}
}
\ No newline at end of file
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageVersionCalculatorTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageVersionCalculatorTest.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,47 @@
+package ch.qos.logback.classic.spi;
+
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.core.CoreGlobal;
+
+public class PackageVersionCalculatorTest {
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void test() throws Exception {
+ Throwable t = new Throwable("x");
+ //t.printStackTrace();
+ ThrowableProxy tp = new ThrowableProxy(t);
+ PackageInfoCalculator pic = new PackageInfoCalculator();
+ pic.computePackageInfo(tp.getThrowableDataPointArray());
+ StringBuilder builder = new StringBuilder();
+ for(ThrowableDataPoint tdp: tp.getThrowableDataPointArray()) {
+ String string = tdp.toString();
+ builder.append(string);
+ extraData(builder, tdp);
+ builder.append(CoreGlobal.LINE_SEPARATOR);
+ }
+ System.out.println(builder.toString());
+ }
+
+ protected void extraData(StringBuilder builder, ThrowableDataPoint tdp) {
+ StackTraceElementProxy step = tdp.getStackTraceElementProxy();
+ if(step != null) {
+ PackageInfo pi = step.getPackageInfo();
+ if(pi != null) {
+ builder.append(" [").append(pi.getJarName()).append(':').append(pi.getVersion()).append(']');
+ }
+ }
+ }
+
+}
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableToDataPointTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableToDataPointTest.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,83 @@
+package ch.qos.logback.classic.spi;
+
+import static org.junit.Assert.*;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.classic.spi.ThrowableDataPoint;
+import ch.qos.logback.classic.spi.ThrowableToDataPointArray;
+import ch.qos.logback.core.Layout;
+
+public class ThrowableToDataPointTest {
+
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ public void verify(Throwable t) {
+ t.printStackTrace(pw);
+
+ ThrowableDataPoint[] tdpArray = ThrowableToDataPointArray.convert(t);
+ StringBuilder sb = new StringBuilder();
+ for (ThrowableDataPoint tdp : tdpArray) {
+ sb.append(tdp.toString());
+ sb.append(Layout.LINE_SEP);
+ }
+ String expected = sw.toString();
+ String result = sb.toString().replace("common frames omitted", "more");
+
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void smoke() {
+ Exception e = new Exception("smoke");
+ verify(e);
+ }
+
+ @Test
+ public void nested() {
+ Exception w = null;
+ try {
+ someMethod();
+ } catch (Exception e) {
+ w = new Exception("wrapping", e);
+ }
+ verify(w);
+ }
+
+ @Test
+ public void multiNested() {
+ Exception w = null;
+ try {
+ someOtherMethod();
+ } catch (Exception e) {
+ w = new Exception("wrapping", e);
+ }
+ verify(w);
+ }
+
+ void someMethod() throws Exception {
+ throw new Exception("someMethod");
+ }
+
+ void someOtherMethod() throws Exception {
+ try {
+ someMethod();
+ } catch (Exception e) {
+ throw new Exception("someOtherMethod", e);
+ }
+ }
+}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java Fri Sep 5 19:14:47 2008
@@ -9,49 +9,43 @@
*/
package ch.qos.logback.core.helpers;
-import ch.qos.logback.core.CoreGlobal;
+import java.util.LinkedList;
+import java.util.List;
+import ch.qos.logback.core.CoreGlobal;
public class ThrowableToStringArray {
- public static String[] extractStringRep(Throwable t, StackTraceElement[] parentSTE) {
- String[] result;
+ public static String[] convert(Throwable t) {
+ List<String> strList = new LinkedList<String>();
+ extract(strList, t, null);
+ return strList.toArray(new String[0]);
+
+ }
+
+ private static void extract(List<String> strList, Throwable t,
+ StackTraceElement[] parentSTE) {
StackTraceElement[] ste = t.getStackTrace();
final int numberOfcommonFrames = findNumberOfCommonFrames(ste, parentSTE);
- final String[] firstArray;
- if (numberOfcommonFrames == 0) {
- firstArray = new String[ste.length + 1];
- } else {
- firstArray = new String[ste.length - numberOfcommonFrames + 2];
- }
-
- firstArray[0] = formatFirstLine(t, parentSTE);
+ strList.add(formatFirstLine(t, parentSTE));
for (int i = 0; i < (ste.length - numberOfcommonFrames); i++) {
- firstArray[i + 1] = ste[i].toString();
+ strList.add("\tat "+ste[i].toString());
}
if (numberOfcommonFrames != 0) {
- firstArray[firstArray.length - 1] = numberOfcommonFrames
- + " common frames omitted";
+ strList.add("\t... "+numberOfcommonFrames + " common frames omitted");
}
Throwable cause = t.getCause();
if (cause != null) {
- final String[] causeArray = ThrowableToStringArray.extractStringRep(cause, ste);
- String[] tmp = new String[firstArray.length + causeArray.length];
- System.arraycopy(firstArray, 0, tmp, 0, firstArray.length);
- System
- .arraycopy(causeArray, 0, tmp, firstArray.length, causeArray.length);
- result = tmp;
- } else {
- result = firstArray;
+ ThrowableToStringArray.extract(strList, cause, ste);
}
- return result;
}
-
- private static String formatFirstLine(Throwable t, StackTraceElement[] parentSTE) {
+
+ private static String formatFirstLine(Throwable t,
+ StackTraceElement[] parentSTE) {
String prefix = "";
if (parentSTE != null) {
prefix = CoreGlobal.CAUSED_BY;
@@ -63,7 +57,7 @@
}
return result;
}
-
+
private static int findNumberOfCommonFrames(StackTraceElement[] ste,
StackTraceElement[] parentSTE) {
if (parentSTE == null) {
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java Fri Sep 5 19:14:47 2008
@@ -91,7 +91,7 @@
}
private static void appendThrowable(StringBuilder sb, Throwable t) {
- String[] stringRep = ThrowableToStringArray.extractStringRep(t, null);
+ String[] stringRep = ThrowableToStringArray.convert(t);
for (String s : stringRep) {
if (s.startsWith(CoreGlobal.CAUSED_BY)) {
Modified: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/AllCoreTest.java
==============================================================================
--- logback/trunk/logback-core/src/test/java/ch/qos/logback/core/AllCoreTest.java (original)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/AllCoreTest.java Fri Sep 5 19:14:47 2008
@@ -18,6 +18,7 @@
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(ch.qos.logback.core.util.PackageTest.suite());
+ suite.addTest(ch.qos.logback.core.helpers.PackageTest.suite());
suite.addTest(ch.qos.logback.core.pattern.PackageTest.suite());
suite.addTest(ch.qos.logback.core.joran.PackageTest.suite());
suite.addTest(ch.qos.logback.core.appender.PackageTest.suite());
Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/PackageTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/PackageTest.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,15 @@
+package ch.qos.logback.core.helpers;
+
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class PackageTest extends TestCase {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite();
+ suite.addTest(new JUnit4TestAdapter(ch.qos.logback.core.helpers.ThrowableToStringArrayTest.class));
+ return suite;
+ }
+}
Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/ThrowableToStringArrayTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/ThrowableToStringArrayTest.java Fri Sep 5 19:14:47 2008
@@ -0,0 +1,80 @@
+package ch.qos.logback.core.helpers;
+
+import static org.junit.Assert.*;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.core.Layout;
+
+public class ThrowableToStringArrayTest {
+
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ public void verify(Throwable t) {
+ t.printStackTrace(pw);
+
+ String[] sa = ThrowableToStringArray.convert(t);
+ StringBuilder sb = new StringBuilder();
+ for (String tdp : sa) {
+ sb.append(tdp.toString());
+ sb.append(Layout.LINE_SEP);
+ }
+ String expected = sw.toString();
+ String result = sb.toString().replace("common frames omitted", "more");
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void smoke() {
+ Exception e = new Exception("smoke");
+ verify(e);
+ }
+
+ @Test
+ public void nested() {
+ Exception w = null;
+ try {
+ someMethod();
+ } catch (Exception e) {
+ w = new Exception("wrapping", e);
+ }
+ verify(w);
+ }
+
+ @Test
+ public void multiNested() {
+ Exception w = null;
+ try {
+ someOtherMethod();
+ } catch (Exception e) {
+ w = new Exception("wrapping", e);
+ }
+ verify(w);
+ }
+
+ void someMethod() throws Exception {
+ throw new Exception("someMethod");
+ }
+
+ void someOtherMethod() throws Exception {
+ try {
+ someMethod();
+ } catch (Exception e) {
+ throw new Exception("someOtherMethod", e);
+ }
+ }
+}
1
0
[JIRA] Created: (LBCLASSIC-58) Print Logback own erros to System.out if debug is enabled?
by Anton Tagunov (JIRA) 04 Sep '08
by Anton Tagunov (JIRA) 04 Sep '08
04 Sep '08
Print Logback own erros to System.out if debug is enabled?
----------------------------------------------------------
Key: LBCLASSIC-58
URL: http://jira.qos.ch/browse/LBCLASSIC-58
Project: logback-classic
Issue Type: Improvement
Reporter: Anton Tagunov
Assignee: Logback dev list
Priority: Minor
Hello Ceki, when debug is enabled lots of messages to to System.out anyway.
Do you think it would be a good idea to also print messages going to StatusManager to System.out?
Apparently there is huge demand for this feature.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
5
13
[JIRA] Created: (LBSITE-18) Conflicting information on logback.xml searching
by Rick Beton (JIRA) 04 Sep '08
by Rick Beton (JIRA) 04 Sep '08
04 Sep '08
Conflicting information on logback.xml searching
------------------------------------------------
Key: LBSITE-18
URL: http://jira.qos.ch/browse/LBSITE-18
Project: logback-site
Issue Type: Bug
Components: Documentation
Environment: n/a
Reporter: Rick Beton
Assignee: Logback dev list
Priority: Minor
http://logback.qos.ch/manual/joran.html states that logback.test.xml is first on the search list, followed by logback.xml.
http://logback.qos.ch/faq.html#auto_config states the reverse order. I think this is incorrect.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
2
1
Author: ceki
Date: Thu Sep 4 11:47:56 2008
New Revision: 1793
Added:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java
- copied, changed from r1790, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableInformation.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java
- copied, changed from r1772, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllTest.java
Removed:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableInformation.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllTest.java
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MarkerConverterTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/PackageInfo.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/StackTraceElementProxy.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableDataPoint.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToDataPointArray.java
Log:
LBGENERAL-23
Reworking Throwable to string conversion. Instead of simply converting StackTraceElement
(STE) array into just strings, we convert them to a little more sophisticated objects,
namely ThrowableDataPoints which support PackageInformation.
All tests pass.
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java Thu Sep 4 11:47:56 2008
@@ -102,8 +102,8 @@
values[i++] = new Long(loggingEvent.getTimeStamp());
values[i++] = loggingEvent.getMarker();
values[i++] = loggingEvent.getMDCPropertyMap();
- if (loggingEvent.getThrowableInformation() != null) {
- values[i++] = loggingEvent.getThrowableInformation().getThrowable();
+ if (loggingEvent.getThrowableProxy() != null) {
+ values[i++] = loggingEvent.getThrowableProxy().getThrowable();
} else {
values[i++] = null;
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java Thu Sep 4 11:47:56 2008
@@ -22,6 +22,7 @@
import ch.qos.logback.classic.spi.CallerData;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.db.DBAppenderBase;
+import ch.qos.logback.core.helpers.ThrowableDataPoint;
/**
* The DBAppender inserts logging events into three database tables in a format
@@ -90,8 +91,8 @@
Map<String, String> mergedMap = mergePropertyMaps(event);
insertProperties(mergedMap, connection, eventId);
- if (event.getThrowableInformation() != null) {
- insertThrowable(event.getThrowableInformation().getThrowableStrRep(), connection, eventId);
+ if (event.getThrowableProxy() != null) {
+ insertThrowable(event.getThrowableProxy().getThrowableDataPointArray(), connection, eventId);
}
}
@@ -176,16 +177,16 @@
}
}
- protected void insertThrowable(String[] strRep, Connection connection,
+ protected void insertThrowable(ThrowableDataPoint[] tdpArray, Connection connection,
int eventId) throws SQLException {
PreparedStatement insertExceptionStatement = connection
.prepareStatement(insertExceptionSQL);
- for (short i = 0; i < strRep.length; i++) {
+ for (short i = 0; i < tdpArray.length; i++) {
insertExceptionStatement.setInt(1, eventId);
insertExceptionStatement.setShort(2, i);
- insertExceptionStatement.setString(3, strRep[i]);
+ insertExceptionStatement.setString(3, tdpArray[i].toString());
if (cnxSupportsBatchUpdates) {
insertExceptionStatement.addBatch();
} else {
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java Thu Sep 4 11:47:56 2008
@@ -11,6 +11,7 @@
package ch.qos.logback.classic.db;
import ch.qos.logback.classic.spi.LoggingEvent;
+import ch.qos.logback.core.helpers.ThrowableDataPoint;
/**
* @author Ceki Gülcü
@@ -37,9 +38,9 @@
if (mdcPropSize > 0 || contextPropSize > 0) {
mask = PROPERTIES_EXIST;
}
- if (event.getThrowableInformation() != null) {
- String[] strRep = event.getThrowableInformation().getThrowableStrRep();
- if (strRep != null) {
+ if (event.getThrowableProxy() != null) {
+ ThrowableDataPoint[] tdpArray = event.getThrowableProxy().getThrowableDataPointArray();
+ if (tdpArray != null) {
mask |= EXCEPTION_EXISTS;
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java Thu Sep 4 11:47:56 2008
@@ -3,7 +3,8 @@
import static ch.qos.logback.core.Layout.LINE_SEP;
import ch.qos.logback.classic.helpers.Transform;
import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.classic.spi.ThrowableInformation;
+import ch.qos.logback.classic.spi.ThrowableProxy;
+import ch.qos.logback.core.helpers.ThrowableDataPoint;
import ch.qos.logback.core.html.IThrowableRenderer;
public class DefaultThrowableRenderer implements IThrowableRenderer {
@@ -20,18 +21,18 @@
this.throwable = t;
}
- public void render(StringBuilder sbuf, String[] s) {
- if (s != null) {
- int len = s.length;
+ public void render(StringBuilder sbuf, ThrowableDataPoint[] tdpArray) {
+ if (tdpArray != null) {
+ int len = tdpArray.length;
if (len == 0) {
return;
}
sbuf.append("<tr><td class=\"Exception\" colspan=\"6\">");
- sbuf.append(Transform.escapeTags(s[0]));
+ sbuf.append(Transform.escapeTags(tdpArray[0].toString()));
sbuf.append(LINE_SEP);
for (int i = 1; i < len; i++) {
sbuf.append(TRACE_PREFIX);
- sbuf.append(Transform.escapeTags(s[i]));
+ sbuf.append(Transform.escapeTags(tdpArray[i].toString()));
sbuf.append(LINE_SEP);
}
sbuf.append("</td></tr>");
@@ -40,9 +41,9 @@
public void render(StringBuilder sbuf, Object eventObject) {
LoggingEvent event = (LoggingEvent)eventObject;
- ThrowableInformation ti = event.getThrowableInformation();
- if (ti != null) {
- render(sbuf, ti.getThrowableStrRep());
+ ThrowableProxy tp = event.getThrowableProxy();
+ if (tp != null) {
+ render(sbuf, tp.getThrowableDataPointArray());
}
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java Thu Sep 4 11:47:56 2008
@@ -83,7 +83,7 @@
buf.append("</tr>");
buf.append(LINE_SEP);
- if (event.getThrowableInformation() != null) {
+ if (event.getThrowableProxy() != null) {
throwableRenderer.render(buf, event);
}
return buf.toString();
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java Thu Sep 4 11:47:56 2008
@@ -16,6 +16,7 @@
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.classic.util.LevelToSyslogSeverity;
import ch.qos.logback.core.Layout;
+import ch.qos.logback.core.helpers.ThrowableDataPoint;
import ch.qos.logback.core.net.SyslogAppenderBase;
import ch.qos.logback.core.net.SyslogWriter;
@@ -77,11 +78,11 @@
String prefix = prefixLayout.doLayout(event);
- if (event.getThrowableInformation() != null) {
- String[] strRep = event.getThrowableInformation().getThrowableStrRep();
+ if (event.getThrowableProxy() != null) {
+ ThrowableDataPoint[] strRep = event.getThrowableProxy().getThrowableDataPointArray();
try {
- for (String line : strRep) {
- sw.write(prefix + line);
+ for (ThrowableDataPoint line : strRep) {
+ sw.write(prefix + line.toString());
sw.flush();
}
} catch (IOException e) {
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java Thu Sep 4 11:47:56 2008
@@ -14,11 +14,12 @@
import java.util.Map;
import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.classic.spi.ThrowableInformation;
+import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.CoreGlobal;
import ch.qos.logback.core.boolex.EvaluationException;
import ch.qos.logback.core.boolex.EventEvaluator;
+import ch.qos.logback.core.helpers.ThrowableDataPoint;
import ch.qos.logback.core.status.ErrorStatus;
/**
@@ -87,15 +88,15 @@
public String convert(LoggingEvent event) {
StringBuffer buf = new StringBuffer(32);
- ThrowableInformation information = event.getThrowableInformation();
+ ThrowableProxy information = event.getThrowableProxy();
if (information == null) {
return CoreGlobal.EMPTY_STRING;
}
- String[] stringRep = information.getThrowableStrRep();
+ ThrowableDataPoint[] tdpArray = information.getThrowableDataPointArray();
- int length = (lengthOption > stringRep.length) ? stringRep.length
+ int length = (lengthOption > tdpArray.length) ? tdpArray.length
: lengthOption;
// an evaluator match will cause stack printing to be skipped
@@ -129,9 +130,9 @@
}
}
- buf.append(stringRep[0]).append(CoreGlobal.LINE_SEPARATOR);
+ buf.append(tdpArray[0]).append(CoreGlobal.LINE_SEPARATOR);
for (int i = 1; i < length; i++) {
- String string = stringRep[i];
+ String string = tdpArray[i].toString();
if (string.startsWith(CoreGlobal.CAUSED_BY)) {
// nothing
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java Thu Sep 4 11:47:56 2008
@@ -82,7 +82,7 @@
private transient Object[] argumentArray;
- private ThrowableInformation throwableInfo;
+ private ThrowableProxy throwableProxy;
private CallerData[] callerDataArray;
private LoggerRemoteView loggerRemoteView;
@@ -108,7 +108,7 @@
this.message = message;
if (throwable != null) {
- this.throwableInfo = new ThrowableInformation(throwable);
+ this.throwableProxy = new ThrowableProxy(throwable);
}
// bug 85 (we previously failed to set this.argumentArray)
@@ -166,19 +166,19 @@
* Returns the throwable information contained within this event. May be
* <code>null</code> if there is no such information.
*/
- public ThrowableInformation getThrowableInformation() {
- return throwableInfo;
+ public ThrowableProxy getThrowableProxy() {
+ return throwableProxy;
}
/**
* Set this event's throwable information.
*/
- public void setThrowableInformation(ThrowableInformation ti) {
- if (throwableInfo != null) {
+ public void setThrowableProxy(ThrowableProxy tp) {
+ if (throwableProxy != null) {
throw new IllegalStateException(
- "ThrowableInformation has been already set.");
+ "ThrowableProxy has been already set.");
} else {
- throwableInfo = ti;
+ throwableProxy = tp;
}
}
Copied: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java (from r1790, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableInformation.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableInformation.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java Thu Sep 4 11:47:56 2008
@@ -11,17 +11,19 @@
import java.util.Arrays;
-import ch.qos.logback.core.helpers.ThrowableToStringArray;
+import ch.qos.logback.core.Layout;
+import ch.qos.logback.core.helpers.ThrowableDataPoint;
+import ch.qos.logback.core.helpers.ThrowableToDataPointArray;
-public class ThrowableInformation implements java.io.Serializable {
+public class ThrowableProxy implements java.io.Serializable {
private static final long serialVersionUID = 6307784764626694851L;
- private String[] sa;
+ private ThrowableDataPoint[] tdpArray;
private transient final Throwable throwable;
- public ThrowableInformation(Throwable throwable) {
+ public ThrowableProxy(Throwable throwable) {
this.throwable = throwable;
- sa = ThrowableToStringArray.extractStringRep(throwable, null);
+ tdpArray = ThrowableToDataPointArray.convert(throwable);
}
public Throwable getThrowable() {
@@ -29,18 +31,17 @@
}
/**
- * The string representation of the throwable that this object
- * represents.
+ * The data point representation of the throwable proxy.
*/
- public String[] getThrowableStrRep() {
- return sa;
+ public ThrowableDataPoint[] getThrowableDataPointArray() {
+ return tdpArray;
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
- result = PRIME * result + Arrays.hashCode(sa);
+ result = PRIME * result + Arrays.hashCode(tdpArray);
return result;
}
@@ -52,11 +53,10 @@
return false;
if (getClass() != obj.getClass())
return false;
- final ThrowableInformation other = (ThrowableInformation) obj;
- if (!Arrays.equals(sa, other.sa))
+ final ThrowableProxy other = (ThrowableProxy) obj;
+ if (!Arrays.equals(tdpArray, other.tdpArray))
return false;
return true;
}
-
}
Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java (from r1772, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllTest.java)
==============================================================================
--- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java Thu Sep 4 11:47:56 2008
@@ -13,7 +13,7 @@
import junit.framework.TestCase;
import junit.framework.TestSuite;
-public class AllTest extends TestCase {
+public class AllClassicTest extends TestCase {
public static Test suite() {
TestSuite suite = new TestSuite();
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderTest.java Thu Sep 4 11:47:56 2008
@@ -88,7 +88,7 @@
rs = stmt.executeQuery("SELECT * FROM logging_event_exception where event_id = 0");
int i = 0;
while (rs.next()) {
- assertEquals(event.getThrowableInformation().getThrowableStrRep()[i], rs.getString(3));
+ assertEquals(event.getThrowableProxy().getThrowableDataPointArray()[i].toString(), rs.getString(3));
i++;
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java Thu Sep 4 11:47:56 2008
@@ -12,6 +12,7 @@
import org.dom4j.io.SAXReader;
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.xml.sax.EntityResolver;
@@ -19,8 +20,9 @@
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.classic.spi.ThrowableInformation;
+import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.CoreGlobal;
+import ch.qos.logback.core.helpers.ThrowableDataPoint;
import ch.qos.logback.core.read.ListAppender;
public class HTMLLayoutTest {
@@ -86,7 +88,7 @@
@Test
public void testAppendThrowable() throws Exception {
StringBuilder buf = new StringBuilder();
- String[] strArray = { "test1", "test2" };
+ ThrowableDataPoint[] strArray = { new ThrowableDataPoint("test1"), new ThrowableDataPoint("test2") };
DefaultThrowableRenderer renderer = (DefaultThrowableRenderer) layout
.getThrowableRenderer();
renderer.render(buf, strArray);
@@ -141,7 +143,7 @@
public void layoutWithException() throws Exception {
layout.setPattern("%level %thread %msg %ex");
LoggingEvent le = createLoggingEvent();
- le.setThrowableInformation(new ThrowableInformation(new Exception(
+ le.setThrowableProxy(new ThrowableProxy(new Exception(
"test Exception")));
String result = layout.doLayout(le);
@@ -166,6 +168,7 @@
}
@Test
+ @Ignore
public void rawLimit() throws Exception {
StringBuilder sb = new StringBuilder();
String header = layout.getFileHeader();
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MarkerConverterTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MarkerConverterTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MarkerConverterTest.java Thu Sep 4 11:47:56 2008
@@ -2,8 +2,9 @@
import junit.framework.TestCase;
+import org.slf4j.IMarkerFactory;
import org.slf4j.Marker;
-import org.slf4j.MarkerFactory;
+import org.slf4j.helpers.BasicMarkerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
@@ -12,8 +13,9 @@
public class MarkerConverterTest extends TestCase {
LoggerContext lc;
- Marker marker;
MarkerConverter converter;
+ // use a different facotry for each test so that they are independent
+ IMarkerFactory markerFactory = new BasicMarkerFactory();
public void setUp() throws Exception {
lc = new LoggerContext();
@@ -28,39 +30,38 @@
}
public void testWithNullMarker() {
- marker = null;
- String result = converter.convert(createLoggingEvent());
+ String result = converter.convert(createLoggingEvent(null));
assertEquals("", result);
}
public void testWithMarker() {
String name = "test";
- marker = MarkerFactory.getMarker(name);
- String result = converter.convert(createLoggingEvent());
+ Marker marker = markerFactory.getMarker(name);
+ String result = converter.convert(createLoggingEvent(marker));
assertEquals(name, result);
}
public void testWithOneChildMarker() {
- marker = MarkerFactory.getMarker("test");
- marker.add(MarkerFactory.getMarker("child"));
+ Marker marker = markerFactory.getMarker("test");
+ marker.add(markerFactory.getMarker("child"));
- String result = converter.convert(createLoggingEvent());
+ String result = converter.convert(createLoggingEvent(marker));
assertEquals("test [ child ]", result);
}
public void testWithSeveralChildMarker() {
- marker = MarkerFactory.getMarker("testParent");
- marker.add(MarkerFactory.getMarker("child1"));
- marker.add(MarkerFactory.getMarker("child2"));
- marker.add(MarkerFactory.getMarker("child3"));
+ Marker marker = markerFactory.getMarker("testParent");
+ marker.add(markerFactory.getMarker("child1"));
+ marker.add(markerFactory.getMarker("child2"));
+ marker.add(markerFactory.getMarker("child3"));
- String result = converter.convert(createLoggingEvent());
+ String result = converter.convert(createLoggingEvent(marker));
assertEquals("testParent [ child1, child2, child3 ]", result);
}
- private LoggingEvent createLoggingEvent() {
+ private LoggingEvent createLoggingEvent(Marker marker) {
LoggingEvent le = new LoggingEvent(this.getClass().getName(), lc.getLogger(LoggerContext.ROOT_NAME),
Level.DEBUG, "test message", null, null);
le.setMarker(marker);
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java Thu Sep 4 11:47:56 2008
@@ -82,7 +82,7 @@
private Logger logger;
- private ThrowableInformation throwableInfo;
+ private ThrowableProxy throwableInfo;
private CallerData[] callerDataArray;
@@ -105,7 +105,7 @@
this.message = message;
if (throwable != null) {
- this.throwableInfo = new ThrowableInformation(throwable);
+ this.throwableInfo = new ThrowableProxy(throwable);
}
if (argArray != null) {
@@ -148,14 +148,14 @@
* Returns the throwable information contained within this event. May be
* <code>null</code> if there is no such information.
*/
- public ThrowableInformation getThrowableInformation() {
+ public ThrowableProxy getThrowableInformation() {
return throwableInfo;
}
/**
* Set this event's throwable information.
*/
- public void setThrowableInformation(ThrowableInformation ti) {
+ public void setThrowableInformation(ThrowableProxy ti) {
if (throwableInfo != null) {
throw new IllegalStateException(
"ThrowableInformation has been already set.");
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java Thu Sep 4 11:47:56 2008
@@ -126,8 +126,8 @@
public void xThrowable() throws Exception {
LoggingEvent event = createLoggingEvent();
Throwable throwable = new Throwable("just testing");
- ThrowableInformation th = new ThrowableInformation(throwable);
- event.setThrowableInformation(th);
+ ThrowableProxy tp = new ThrowableProxy(throwable);
+ event.setThrowableProxy(tp);
LoggingEvent remoteEvent = writeAndRead(event);
checkForEquality(event, remoteEvent);
@@ -168,8 +168,11 @@
assertEquals(original.getFormattedMessage(), afterSerialization
.getFormattedMessage());
assertEquals(original.getMessage(), afterSerialization.getMessage());
- assertEquals(original.getThrowableInformation(), afterSerialization
- .getThrowableInformation());
+
+ System.out.println();
+
+ assertEquals(original.getThrowableProxy(), afterSerialization
+ .getThrowableProxy());
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java Thu Sep 4 11:47:56 2008
@@ -22,6 +22,7 @@
suite.addTestSuite(ContextListenerTest.class);
suite.addTestSuite(CallerDataTest.class);
suite.addTest(new JUnit4TestAdapter (LoggerComparatorTest.class));
+ suite.addTest(new JUnit4TestAdapter (LoggingEventSerializationTest.class));
return suite;
}
}
\ No newline at end of file
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/PackageInfo.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/PackageInfo.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/PackageInfo.java Thu Sep 4 11:47:56 2008
@@ -9,7 +9,11 @@
*/
package ch.qos.logback.core.helpers;
-public class PackageInfo {
+import java.io.Serializable;
+
+public class PackageInfo implements Serializable {
+
+ private static final long serialVersionUID = 637783570208674312L;
String jarName;
String version;
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/StackTraceElementProxy.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/StackTraceElementProxy.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/StackTraceElementProxy.java Thu Sep 4 11:47:56 2008
@@ -1,12 +1,19 @@
package ch.qos.logback.core.helpers;
-public class StackTraceElementProxy {
+import java.io.Serializable;
+
+public class StackTraceElementProxy implements Serializable {
+
+ private static final long serialVersionUID = -4832130320500439038L;
final StackTraceElement ste;
private String steAsString;
private PackageInfo pi;
StackTraceElementProxy(StackTraceElement ste) {
+ if(ste == null) {
+ throw new IllegalArgumentException("ste cannot be null");
+ }
this.ste = ste;
}
@@ -21,5 +28,27 @@
// compute pi from ste
return pi;
}
+
+ @Override
+ public int hashCode() {
+ return ste.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final StackTraceElementProxy other = (StackTraceElementProxy) obj;
+ return ste.equals(other.ste);
+ }
+
+ @Override
+ public String toString() {
+ return getSTEAsString();
+ }
}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableDataPoint.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableDataPoint.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableDataPoint.java Thu Sep 4 11:47:56 2008
@@ -9,7 +9,17 @@
*/
package ch.qos.logback.core.helpers;
-public class ThrowableDataPoint {
+import java.io.Serializable;
+
+/**
+ * A container for either raw strings or StackTraceElementProxy instances.
+ *
+ * @author Ceki Gülcü
+ *
+ */
+public class ThrowableDataPoint implements Serializable {
+
+ private static final long serialVersionUID = -2891376879381358469L;
enum ThrowableDataPointType {
RAW, STEP;
@@ -19,12 +29,12 @@
StackTraceElementProxy step;
final ThrowableDataPointType type;
- ThrowableDataPoint(String rawString) {
+ public ThrowableDataPoint(String rawString) {
this.rawString = rawString;
this.type = ThrowableDataPointType.RAW;
}
- ThrowableDataPoint(StackTraceElement ste) {
+ public ThrowableDataPoint(StackTraceElement ste) {
this.step = new StackTraceElementProxy(ste);
this.type = ThrowableDataPointType.STEP;
}
@@ -32,12 +42,51 @@
public ThrowableDataPointType getType() {
return type;
}
-
+
@Override
public String toString() {
- switch(type) {
- case RAW: return rawString;
- case STEP: return step.getSTEAsString();
+ switch (type) {
+ case RAW:
+ return rawString;
+ case STEP:
+ return step.getSTEAsString();
+ }
+ throw new IllegalStateException("Unreachable code");
+ }
+
+ @Override
+ public int hashCode() {
+ switch (type) {
+ case RAW:
+ return rawString.hashCode();
+ case STEP:
+ return step.hashCode();
+ }
+ throw new IllegalStateException("Unreachable code");
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ final ThrowableDataPoint other = (ThrowableDataPoint) obj;
+
+ switch (type) {
+ case RAW:
+ if (rawString == null) {
+ if (other.rawString != null)
+ return false;
+ else
+ return true;
+ } else {
+ return rawString.equals(other.rawString);
+ }
+ case STEP:
+ return step.equals(other.step);
}
throw new IllegalStateException("Unreachable code");
}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToDataPointArray.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToDataPointArray.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToDataPointArray.java Thu Sep 4 11:47:56 2008
@@ -15,6 +15,12 @@
import ch.qos.logback.core.CoreGlobal;
+/**
+ * Convert a throwable into an array of ThrowableDataPoint objects.
+ *
+ *
+ * @author Ceki Gülcü
+ */
public class ThrowableToDataPointArray {
static final ThrowableDataPoint[] TEMPLATE_ARRAY = new ThrowableDataPoint[0];
@@ -35,9 +41,6 @@
tdpList.add(new ThrowableDataPoint(ste[i]));
}
- // buf.append("\tat ");
-
-
if (numberOfcommonFrames != 0) {
tdpList.add(new ThrowableDataPoint("\t... "+numberOfcommonFrames
+ " common frames omitted"));
1
0
03 Sep '08
Author: ceki
Date: Wed Sep 3 22:28:08 2008
New Revision: 1792
Added:
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/PackageInfo.java
- copied, changed from r1790, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/PackageInfo.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/StackTraceElementProxy.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableDataPoint.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToDataPointArray.java
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/
logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/ThrowableToDataPointTest.java
Removed:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/PackageInfo.java
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LRUCache.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/LRUCacheTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/Simulator.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/UtilTest.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/lru/T_LRUCache.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java
Log:
LBGENERAL-23
Reworking Throwable to string conversion. Instead of simply converting StackTraceElement
(STE) array into just strings, we convert them to a little more sophisticated objects,
namely ThrowableDataPoints which support PackageInformation.
This is ongoing work, unit test may not pass.
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LRUCache.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LRUCache.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LRUCache.java Wed Sep 3 22:28:08 2008
@@ -40,6 +40,8 @@
}
List<K> keyList() {
- return new ArrayList<K>(keySet());
+ ArrayList<K> al = new ArrayList<K>();
+ al.addAll(keySet());
+ return al;
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableInformationConverter.java Wed Sep 3 22:28:08 2008
@@ -98,6 +98,7 @@
int length = (lengthOption > stringRep.length) ? stringRep.length
: lengthOption;
+ // an evaluator match will cause stack printing to be skipped
if (evaluatorList != null) {
boolean printStack = true;
for (int i = 0; i < evaluatorList.size(); i++) {
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java Wed Sep 3 22:28:08 2008
@@ -15,6 +15,8 @@
import org.slf4j.Marker;
+import ch.qos.logback.core.helpers.PackageInfo;
+
/**
*
* @author James Strachan
@@ -77,12 +79,14 @@
* Uses the context class path or the current global class loader to deduce
* the file that the given class name comes from
*/
- static String getJarNameOfClass(String className) {
+ static String getJarNameOfClass0(String className) {
try {
Class type = findClass(className);
if (type != null) {
URL resource = type.getClassLoader().getResource(
type.getName().replace('.', '/') + ".class");
+
+
// "jar:file:/C:/java/../repo/groupId/artifact/1.3/artifact-1.3.jar!/com/some/package/Some.class
if (resource != null) {
String text = resource.toString();
@@ -107,7 +111,41 @@
}
return "na";
}
-
+
+ static String getJarNameOfClass1(String className) {
+ try {
+ Class type = findClass(className);
+ if (type != null) {
+
+
+ // file:/C:/java/maven-2.0.8/repo/com/icegreen/greenmail/1.3/greenmail-1.3.jar
+ URL resource = type.getProtectionDomain().getCodeSource().getLocation();
+ if (resource != null) {
+ String text = resource.toString();
+ // now lets remove all but the file name
+ int idx = text.lastIndexOf('/');
+ if (idx > 0) {
+ text = text.substring(idx + 1);
+ }
+ idx = text.lastIndexOf('\\');
+ if (idx > 0) {
+ text = text.substring(idx + 1);
+ }
+ return text;
+ }
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ return "na";
+ }
+
+
+
+ static String getJarNameOfClass(String className) {
+ return getJarNameOfClass1(className);
+ }
+
static private Class findClass(String className) {
try {
return Thread.currentThread().getContextClassLoader()
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/LRUCacheTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/LRUCacheTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/LRUCacheTest.java Wed Sep 3 22:28:08 2008
@@ -5,8 +5,6 @@
import java.util.LinkedList;
import java.util.List;
-import org.junit.After;
-import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -15,17 +13,9 @@
public class LRUCacheTest {
- @Before
- public void setUp() throws Exception {
- }
-
- @After
- public void tearDown() throws Exception {
-
- }
-
@Test
public void smoke() {
+
LRUCache<String, String> cache = new LRUCache<String, String>(2);
cache.put("a", "a");
cache.put("b", "b");
@@ -38,34 +28,84 @@
@Test
public void typicalScenarioTest() {
- int simulationLen = 1000 * 20;
- int cacheSize = 500;
- int worldSize = 10000;
+ int simulationLen = 1000 * 10;
+ int cacheSize = 100;
+ int worldSize = 1000;
doScenario(simulationLen, cacheSize, worldSize);
}
@Test
public void scenarioCoverageTest() {
- int simulationLen = 1000 * 20;
- int[] cacheSizes = new int[] {1,5,10,100,1000,5000,10000};
- int[] worldSizes = new int[] {1,10,100,1000,20000};
+ int simulationLen = 1000 * 10;
+
+ int[] cacheSizes = new int[] { 1, 10, 100};
+ // tests with large worldSizes are slow because with a large
+ // world size the probability of a cache miss is high.
+ int[] worldSizes = new int[] { 1, 10, 100 };
+
for (int i = 0; i < cacheSizes.length; i++) {
for (int j = 0; j < worldSizes.length; j++) {
- System.out.println("cacheSize="+cacheSizes[i]+", worldSize="+worldSizes[j]);
doScenario(simulationLen, cacheSizes[i], worldSizes[j]);
}
}
}
- void doScenario(int simulationLen, int chacheSize, int worldSize) {
- int cacheSize = 500;
+ void doScenario(int simulationLen, int cacheSize, int worldSize) {
int get2PutRatio = 10;
-
- Simulator simulator = new Simulator(worldSize, get2PutRatio);
+ Simulator simulator = new Simulator(worldSize, get2PutRatio, false);
List<Event> scenario = simulator.generateScenario(simulationLen);
LRUCache<String, String> lruCache = new LRUCache<String, String>(cacheSize);
T_LRUCache<String> tlruCache = new T_LRUCache<String>(cacheSize);
+ long start = System.nanoTime();
simulator.simulate(scenario, lruCache, tlruCache);
- assertEquals(tlruCache.ketList(), lruCache.keyList());
+ //assertEquals(tlruCache.keyList(), lruCache.keyList());
+ long end = System.nanoTime();
+ System.out.println("cacheSize=" + cacheSize + ", worldSize=" + worldSize
+ + ", elapsed time=" + ((end - start) / (1000 * 1000)) + " in millis");
+ }
+
+
+
+ @Test
+ @Ignore // slow test that is known to pass
+ public void multiThreadedScenario() throws InterruptedException {
+ int cacheSize = 100;
+ int worldSize = cacheSize*2;
+ LRUCache<String, String> lruCache = new LRUCache<String, String>(cacheSize);
+ T_LRUCache<String> tlruCache = new T_LRUCache<String>(cacheSize);
+ SimulatorRunnable[] simulatorArray = new SimulatorRunnable[5];
+ for(int i = 0; i < simulatorArray.length; i++) {
+ simulatorArray[i] = new SimulatorRunnable(lruCache, tlruCache, worldSize);
+ }
+ for(int i = 0; i < simulatorArray.length; i++) {
+ simulatorArray[i].start();
+ }
+ for(int i = 0; i < simulatorArray.length; i++) {
+ simulatorArray[i].join();
+ }
+ assertEquals(tlruCache.keyList(), lruCache.keyList());
+ }
+
+ private class SimulatorRunnable extends Thread {
+
+ LRUCache<String, String> lruCache;
+ T_LRUCache<String> tlruCache;
+ int worldSize;
+
+ SimulatorRunnable(LRUCache<String, String> lruCache, T_LRUCache<String> tlruCache, int worldSize) {
+ this.lruCache = lruCache;
+ this.tlruCache = tlruCache;
+ this.worldSize = worldSize;
+ }
+
+ public void run() {
+ int get2PutRatio = 10;
+ int simulationLen = 1000*50;
+ Simulator simulator = new Simulator(worldSize, get2PutRatio, true);
+ List<Event> scenario = simulator.generateScenario(simulationLen);
+ simulator.simulate(scenario, lruCache, tlruCache);
+ System.out.println("done");
+ }
}
+
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/Simulator.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/Simulator.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/Simulator.java Wed Sep 3 22:28:08 2008
@@ -11,28 +11,29 @@
public class Simulator {
-
Random random;
-
+
int worldSize;
int get2PutRatio;
-
- public Simulator(int worldSize, int get2PutRatio) {
+ boolean multiThreaded;
+
+ public Simulator(int worldSize, int get2PutRatio, boolean multiThreaded) {
this.worldSize = worldSize;
this.get2PutRatio = get2PutRatio;
long seed = System.nanoTime();
- System.out.println("seed is "+seed);
+ // System.out.println("seed is "+seed);
random = new Random(seed);
+ this.multiThreaded = multiThreaded;
}
-
+
public List<Event> generateScenario(int len) {
List<Event> scenario = new ArrayList<Event>();
-
- for(int i = 0; i < len; i++) {
-
+
+ for (int i = 0; i < len; i++) {
+
int r = random.nextInt(get2PutRatio);
boolean put = false;
- if(r == 0) {
+ if (r == 0) {
put = true;
}
r = random.nextInt(worldSize);
@@ -41,30 +42,40 @@
}
return scenario;
}
-
- public void simulate(List<Event> scenario, LRUCache<String, String> lruCache, T_LRUCache<String> tlruCache) {
- for(Event<String> e: scenario) {
- if(e.put) {
+
+ public void simulate(List<Event> scenario, LRUCache<String, String> lruCache,
+ T_LRUCache<String> tlruCache) {
+ for (Event<String> e : scenario) {
+ if (e.put) {
lruCache.put(e.k, e.k);
tlruCache.put(e.k);
} else {
+ @SuppressWarnings("unused")
String r0 = lruCache.get(e.k);
+ @SuppressWarnings("unused")
String r1 = tlruCache.get(e.k);
- if(r0 != null) {
- assertEquals(r0, e.k);
+ if (!multiThreaded) {
+ // if the simulation is used in a multi-threaded
+ // context, then the state of lruCache may be different than
+ // that of tlruCache. In single threaded mode, they should
+ // return the same values all the time
+ if (r0 != null) {
+ assertEquals(r0, e.k);
+ }
+ assertEquals(r0, r1);
}
- assertEquals(r0, r1);
}
}
}
-
-// void compareAndDumpIfDifferent(LRUCache<String, String> lruCache, T_LRUCache<String> tlruCache) {
-// lruCache.dump();
-// tlruCache.dump();
-// if(!lruCache.keyList().equals(tlruCache.ketList())) {
-// lruCache.dump();
-// tlruCache.dump();
-// throw new AssertionFailedError("s");
-// }
-// }
+
+ // void compareAndDumpIfDifferent(LRUCache<String, String> lruCache,
+ // T_LRUCache<String> tlruCache) {
+ // lruCache.dump();
+ // tlruCache.dump();
+ // if(!lruCache.keyList().equals(tlruCache.ketList())) {
+ // lruCache.dump();
+ // tlruCache.dump();
+ // throw new AssertionFailedError("s");
+ // }
+ // }
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/UtilTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/UtilTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/UtilTest.java Wed Sep 3 22:28:08 2008
@@ -4,9 +4,10 @@
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
+import ch.qos.logback.core.helpers.PackageInfo;
+
import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.ServerSetup;
@@ -37,7 +38,7 @@
PackageInfo pi = Util.getPackageInfo(className);
System.out.println(" at " + className + "." + ste.getMethodName()
+ "(" + ste.getFileName() + ":" + ste.getLineNumber() + ") ["
- + pi.jarName + ":" + pi.version + "]");
+ + pi.getJarName() + ":" + pi.getVersion() + "]");
}
}
}
@@ -68,17 +69,16 @@
}
@Test
- @Ignore
public void perfTest() {
int len = 1000;
loop(len, false);
double d0 = loop(len, false);
- System.out.println("false " + d0);
+ System.out.println("ve=false " + d0);
loop(len, true);
double d1 = loop(len, true);
- System.out.println("false " + d1);
+ System.out.println("ve=true " + d1);
}
}
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/lru/T_LRUCache.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/lru/T_LRUCache.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/pattern/lru/T_LRUCache.java Wed Sep 3 22:28:08 2008
@@ -31,7 +31,7 @@
}
@SuppressWarnings("unchecked")
- public void put(K k) {
+ synchronized public void put(K k) {
sequenceNumber++;
T_Entry<K> te = getEntry(k);
if (te != null) {
@@ -47,7 +47,7 @@
}
@SuppressWarnings("unchecked")
- public K get(K k) {
+ synchronized public K get(K k) {
T_Entry<K> te = getEntry(k);
if (te == null) {
return null;
@@ -58,7 +58,7 @@
}
}
- public List<K> ketList() {
+ synchronized public List<K> keyList() {
List<K> keyList = new ArrayList<K>();
for (T_Entry<K> e : cacheList) {
keyList.add(e.k);
@@ -86,3 +86,4 @@
}
}
+
Copied: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/PackageInfo.java (from r1790, /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/PackageInfo.java)
==============================================================================
--- /logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/pattern/PackageInfo.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/PackageInfo.java Wed Sep 3 22:28:08 2008
@@ -1,13 +1,29 @@
-package ch.qos.logback.classic.pattern;
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.core.helpers;
public class PackageInfo {
-
String jarName;
String version;
- PackageInfo(String jarName, String version) {
+ public PackageInfo(String jarName, String version) {
this.jarName = jarName;
this.version = version;
}
+
+ public String getJarName() {
+ return jarName;
+ }
+
+ public String getVersion() {
+ return version;
+ }
}
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/StackTraceElementProxy.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/StackTraceElementProxy.java Wed Sep 3 22:28:08 2008
@@ -0,0 +1,25 @@
+package ch.qos.logback.core.helpers;
+
+public class StackTraceElementProxy {
+
+ final StackTraceElement ste;
+ private String steAsString;
+ private PackageInfo pi;
+
+ StackTraceElementProxy(StackTraceElement ste) {
+ this.ste = ste;
+ }
+
+ public String getSTEAsString() {
+ if(steAsString == null) {
+ steAsString = "\tat "+ste.toString();
+ }
+ return steAsString;
+ }
+
+ public PackageInfo getPI() {
+ // compute pi from ste
+ return pi;
+ }
+
+}
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableDataPoint.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableDataPoint.java Wed Sep 3 22:28:08 2008
@@ -0,0 +1,45 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package ch.qos.logback.core.helpers;
+
+public class ThrowableDataPoint {
+
+ enum ThrowableDataPointType {
+ RAW, STEP;
+ }
+
+ String rawString;
+ StackTraceElementProxy step;
+ final ThrowableDataPointType type;
+
+ ThrowableDataPoint(String rawString) {
+ this.rawString = rawString;
+ this.type = ThrowableDataPointType.RAW;
+ }
+
+ ThrowableDataPoint(StackTraceElement ste) {
+ this.step = new StackTraceElementProxy(ste);
+ this.type = ThrowableDataPointType.STEP;
+ }
+
+ public ThrowableDataPointType getType() {
+ return type;
+ }
+
+ @Override
+ public String toString() {
+ switch(type) {
+ case RAW: return rawString;
+ case STEP: return step.getSTEAsString();
+ }
+ throw new IllegalStateException("Unreachable code");
+ }
+
+}
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToDataPointArray.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToDataPointArray.java Wed Sep 3 22:28:08 2008
@@ -0,0 +1,87 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+
+package ch.qos.logback.core.helpers;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import ch.qos.logback.core.CoreGlobal;
+
+public class ThrowableToDataPointArray {
+
+ static final ThrowableDataPoint[] TEMPLATE_ARRAY = new ThrowableDataPoint[0];
+
+ public static ThrowableDataPoint[] convert(Throwable t) {
+ List<ThrowableDataPoint> tdpList = new LinkedList<ThrowableDataPoint>();
+ extract(tdpList, t, null);
+ return tdpList.toArray(TEMPLATE_ARRAY);
+ }
+
+ private static void extract(List<ThrowableDataPoint> tdpList, Throwable t,
+ StackTraceElement[] parentSTE) {
+ StackTraceElement[] ste = t.getStackTrace();
+ final int numberOfcommonFrames = findNumberOfCommonFrames(ste, parentSTE);
+
+ tdpList.add(firstLineToDataPoint(t, parentSTE));
+ for (int i = 0; i < (ste.length - numberOfcommonFrames); i++) {
+ tdpList.add(new ThrowableDataPoint(ste[i]));
+ }
+
+ // buf.append("\tat ");
+
+
+ if (numberOfcommonFrames != 0) {
+ tdpList.add(new ThrowableDataPoint("\t... "+numberOfcommonFrames
+ + " common frames omitted"));
+ }
+
+ Throwable cause = t.getCause();
+ if (cause != null) {
+ extract(tdpList, cause, ste);
+ }
+ }
+
+ private static ThrowableDataPoint firstLineToDataPoint(Throwable t,
+ StackTraceElement[] parentSTE) {
+ String prefix = "";
+ if (parentSTE != null) {
+ prefix = CoreGlobal.CAUSED_BY;
+ }
+
+ String result = prefix + t.getClass().getName();
+ if (t.getMessage() != null) {
+ result += ": " + t.getMessage();
+ }
+ return new ThrowableDataPoint(result);
+ }
+
+ private static int findNumberOfCommonFrames(StackTraceElement[] ste,
+ StackTraceElement[] parentSTE) {
+ if (parentSTE == null) {
+ return 0;
+ }
+
+ int steIndex = ste.length - 1;
+ int parentIndex = parentSTE.length - 1;
+ int count = 0;
+ while (steIndex >= 0 && parentIndex >= 0) {
+ if (ste[steIndex].equals(parentSTE[parentIndex])) {
+ count++;
+ } else {
+ break;
+ }
+ steIndex--;
+ parentIndex--;
+ }
+ return count;
+ }
+
+}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java Wed Sep 3 22:28:08 2008
@@ -18,31 +18,22 @@
String[] result;
StackTraceElement[] ste = t.getStackTrace();
- final int commonFrames = findCommonFrames(ste, parentSTE);
+ final int numberOfcommonFrames = findNumberOfCommonFrames(ste, parentSTE);
final String[] firstArray;
- if (commonFrames == 0) {
+ if (numberOfcommonFrames == 0) {
firstArray = new String[ste.length + 1];
} else {
- firstArray = new String[ste.length - commonFrames + 2];
+ firstArray = new String[ste.length - numberOfcommonFrames + 2];
}
- String prefix = "";
- if (parentSTE != null) {
- prefix = CoreGlobal.CAUSED_BY;
- }
-
- firstArray[0] = prefix + t.getClass().getName();
- if (t.getMessage() != null) {
- firstArray[0] += ": " + t.getMessage();
- }
-
- for (int i = 0; i < (ste.length - commonFrames); i++) {
+ firstArray[0] = formatFirstLine(t, parentSTE);
+ for (int i = 0; i < (ste.length - numberOfcommonFrames); i++) {
firstArray[i + 1] = ste[i].toString();
}
- if (commonFrames != 0) {
- firstArray[firstArray.length - 1] = commonFrames
+ if (numberOfcommonFrames != 0) {
+ firstArray[firstArray.length - 1] = numberOfcommonFrames
+ " common frames omitted";
}
@@ -60,7 +51,20 @@
return result;
}
- private static int findCommonFrames(StackTraceElement[] ste,
+ private static String formatFirstLine(Throwable t, StackTraceElement[] parentSTE) {
+ String prefix = "";
+ if (parentSTE != null) {
+ prefix = CoreGlobal.CAUSED_BY;
+ }
+
+ String result = prefix + t.getClass().getName();
+ if (t.getMessage() != null) {
+ result += ": " + t.getMessage();
+ }
+ return result;
+ }
+
+ private static int findNumberOfCommonFrames(StackTraceElement[] ste,
StackTraceElement[] parentSTE) {
if (parentSTE == null) {
return 0;
Added: logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/ThrowableToDataPointTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/test/java/ch/qos/logback/core/helpers/ThrowableToDataPointTest.java Wed Sep 3 22:28:08 2008
@@ -0,0 +1,81 @@
+package ch.qos.logback.core.helpers;
+
+import static org.junit.Assert.*;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import ch.qos.logback.core.Layout;
+
+public class ThrowableToDataPointTest {
+
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+
+ @Before
+ public void setUp() throws Exception {
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ public void verify(Throwable t) {
+ t.printStackTrace(pw);
+
+ ThrowableDataPoint[] tdpArray = ThrowableToDataPointArray.convert(t);
+ StringBuilder sb = new StringBuilder();
+ for (ThrowableDataPoint tdp : tdpArray) {
+ sb.append(tdp.toString());
+ sb.append(Layout.LINE_SEP);
+ }
+ String expected = sw.toString();
+ String result = sb.toString().replace("common frames omitted", "more");
+
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void smoke() {
+ Exception e = new Exception("smoke");
+ verify(e);
+ }
+
+ @Test
+ public void nested() {
+ Exception w = null;
+ try {
+ someMethod();
+ } catch (Exception e) {
+ w = new Exception("wrapping", e);
+ }
+ verify(w);
+ }
+
+ @Test
+ public void multiNested() {
+ Exception w = null;
+ try {
+ someOtherMethod();
+ } catch (Exception e) {
+ w = new Exception("wrapping", e);
+ }
+ verify(w);
+ }
+
+ void someMethod() throws Exception {
+ throw new Exception("someMethod");
+ }
+
+ void someOtherMethod() throws Exception {
+ try {
+ someMethod();
+ } catch (Exception e) {
+ throw new Exception("someOtherMethod", e);
+ }
+ }
+}
1
0