svn commit: r2182 - in logback/trunk/logback-classic/src: main/java/ch/qos/logback/classic main/java/ch/qos/logback/classic/spi test/java/ch/qos/logback/classic/corpus test/java/ch/qos/logback/classic/corpusTest test/java/ch/qos/logback/classic/net/testObjectBuilders test/java/ch/qos/logback/classic/spi

Author: ceki Date: Thu Mar 5 20:55:12 2009 New Revision: 2182 Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java - copied, changed from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMakerUtil.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/TextFileUtilTest.java - copied, changed from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/FileToWord.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java Removed: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableDataPointUtil.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMakerUtil.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/FileToWord.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEventExtBuilder.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventExt.java Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/CallerData.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java 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/LoggingEventVO.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/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CallerDataTest.java Log: ongoing work on the corpus Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java Thu Mar 5 20:55:12 2009 @@ -12,17 +12,21 @@ public class ClassicConstants { static public final char LOGGER_SEPARATOR = '.'; static public final String USER_MDC_KEY = "user"; - + public static final String LOGBACK_CONTEXT_SELECTOR = "logback.ContextSelector"; public static String JNDI_CONFIGURATION_RESOURCE = "java:comp/env/logback/configuration-resource"; public static String JNDI_CONTEXT_NAME = "java:comp/env/logback/context-name"; - - + /** - * The maximum number of package separators (dots) that abbreviation algorithms - * can handle. Class or logger names with more separators will have their first - * MAX_DOTS parts shortened. + * The maximum number of package separators (dots) that abbreviation + * algorithms can handle. Class or logger names with more separators will have + * their first MAX_DOTS parts shortened. * */ public static final int MAX_DOTS = 16; + + /** + * The default stack data depth computed during caller data extraction. + */ + public static final int DEFAULT_MAX_CALLEDER_DATA_DEPTH = 8; } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java Thu Mar 5 20:55:12 2009 @@ -62,6 +62,8 @@ private final TurboFilterList turboFilterList = new TurboFilterList(); private boolean packagingDataEnabled = true; + private int maxCallerDataDepth = ClassicConstants.DEFAULT_MAX_CALLEDER_DATA_DEPTH; + boolean started = false; public LoggerContext() { @@ -334,5 +336,13 @@ public String toString() { return this.getClass().getName() + "[" + getName() + "]"; } + + public int getMaxCallerDataDepth() { + return maxCallerDataDepth; + } + + public void setMaxCallerDataDepth(int maxCallerDataDepth) { + this.maxCallerDataDepth = maxCallerDataDepth; + } } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/CallerData.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/CallerData.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/CallerData.java Thu Mar 5 20:55:12 2009 @@ -28,21 +28,20 @@ // All logger call's in log4j-over-slf4j use the Category class private static final String LOG4J_CATEGORY = "org.apache.log4j.Category"; - + /** * When caller information is not available this constant is used for the line * number. */ public static final int LINE_NA = -1; - - public static String CALLER_DATA_NA = "?#?:?"+CoreConstants.LINE_SEPARATOR; + public static String CALLER_DATA_NA = "?#?:?" + CoreConstants.LINE_SEPARATOR; /** * This value is returned in case no caller data could be extracted. */ public static CallerData[] EMPTY_CALLER_DATA_ARRAY = new CallerData[0]; - + /** * Caller's line number. */ @@ -64,7 +63,7 @@ String methodName; boolean nativeMethod = false; - + public CallerData(String fileName, String className, String methodName, int lineNumber) { this.fileName = fileName; @@ -82,50 +81,59 @@ } /** - * Extract caller data information as an array based on a Throwable passed as parameter + * Extract caller data information as an array based on a Throwable passed as + * parameter */ - public static CallerData[] extract(Throwable t, String fqnOfInvokingClass) { + public static CallerData[] extract(Throwable t, String fqnOfInvokingClass, + final int maxDepth) { if (t == null) { return null; } StackTraceElement[] steArray = t.getStackTrace(); CallerData[] callerDataArray; - + int found = LINE_NA; for (int i = 0; i < steArray.length; i++) { - if(isDirectlyInvokingClass(steArray[i].getClassName(), fqnOfInvokingClass)) { + if (isDirectlyInvokingClass(steArray[i].getClassName(), + fqnOfInvokingClass)) { // the caller is assumed to be the next stack frame, hence the +1. found = i + 1; } else { - if(found != LINE_NA) { + if (found != LINE_NA) { break; } } } // we failed to extract caller data - if(found == LINE_NA) { + if (found == LINE_NA) { return EMPTY_CALLER_DATA_ARRAY; } - - callerDataArray = new CallerData[steArray.length - found]; - for (int i = found; i < steArray.length; i++) { - callerDataArray[i-found] = new CallerData(steArray[i]); + + int availableDepth = steArray.length - found; + int desiredDepth = maxDepth < (availableDepth) ? maxDepth : availableDepth; + + callerDataArray = new CallerData[desiredDepth]; + for (int i = 0; i < desiredDepth; i++) { + callerDataArray[i] = new CallerData(steArray[found+i]); } return callerDataArray; } - - public static boolean isDirectlyInvokingClass(String currentClass, String fqnOfInvokingClass) { - // the check for org.apachje.log4j.Category class is intended to support log4j-over-slf4j + + public static boolean isDirectlyInvokingClass(String currentClass, + String fqnOfInvokingClass) { + // the check for org.apachje.log4j.Category class is intended to support + // log4j-over-slf4j // it solves http://bugzilla.slf4j.org/show_bug.cgi?id=66 - if(currentClass.equals(fqnOfInvokingClass) || currentClass.equals(LOG4J_CATEGORY)) { + if (currentClass.equals(fqnOfInvokingClass) + || currentClass.equals(LOG4J_CATEGORY)) { return true; } else { return false; } } - + public boolean equals(Object o) { // LogLog.info("equals called"); if (this == o) { @@ -173,8 +181,7 @@ /** * Return the file name of the caller. * - * <p> - * This information is not always available. + * <p> This information is not always available. */ public String getFileName() { return fileName; @@ -183,8 +190,7 @@ /** * Returns the line number of the caller. * - * <p> - * This information is not always available. + * <p> This information is not always available. */ public int getLineNumber() { return lineNumber; Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java Thu Mar 5 20:55:12 2009 @@ -10,23 +10,54 @@ * The core interface in logback-classic. * * @author Ceki Gülcü + * @since 0.9.16 */ public interface ILoggingEvent { public String getThreadName(); + public Level getLevel(); + public String getMessage(); + public Object[] getArgumentArray(); + public String getFormattedMessage(); public String getLoggerName(); + public LoggerContextVO getLoggerContextVO(); public IThrowableProxy getThrowableProxy(); + + /** + * Return {@link CallerData} associated with this event. Note that calling + * this event may trigger the computation of caller data. + * + * @return the CallerData associated with this event. + * + * @see #hasCallerData() + */ public CallerData[] getCallerData(); + + /** + * If this event has caller data, then true is returned. Otherwise the + * returned value is null. + * + * <p>Logback components wishing to use caller data if available without + * causing it to be computed can invoke this method before invoking + * {@link #getCallerData()}. + * + * @return whether this event has caller data + */ + public boolean hasCallerData(); + public Marker getMarker(); + public Map<String, String> getMDCPropertyMap(); + public long getTimeStamp(); + public void prepareForDeferredProcessing(); } 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 Mar 5 20:55:12 2009 @@ -51,10 +51,9 @@ */ private String threadName; - private String loggerName; - private LoggerContextVO loggerContextRemoteView; - + private LoggerContext loggerContext; + private LoggerContextVO loggerContextVO; /** * Level of logging event. @@ -87,7 +86,7 @@ * created. */ private long timeStamp; - + public LoggingEvent() { } @@ -95,15 +94,16 @@ Throwable throwable, Object[] argArray) { this.fqnOfLoggerClass = fqcn; this.loggerName = logger.getName(); - this.loggerContextRemoteView = logger.getLoggerRemoteView().getLoggerContextView(); + this.loggerContext = logger.getLoggerContext(); + this.loggerContextVO = loggerContext.getLoggerContextRemoteView(); this.level = level; - + this.message = message; if (throwable != null) { this.throwableProxy = new ThrowableProxy(throwable); LoggerContext lc = logger.getLoggerContext(); - if(lc.isPackagingDataEnabled()) { + if (lc.isPackagingDataEnabled()) { this.throwableProxy.calculatePackagingData(); } } @@ -118,7 +118,7 @@ .getMDCAdapter(); mdcPropertyMap = logbackMDCAdapter.getPropertyMap(); } - + public void setArgumentArray(Object[] argArray) { if (this.argumentArray != null) { throw new IllegalStateException("argArray has been already set"); @@ -137,11 +137,11 @@ public String getLoggerName() { return loggerName; } - + public void setLoggerName(String loggerName) { this.loggerName = loggerName; } - + public String getThreadName() { if (threadName == null) { threadName = (Thread.currentThread()).getName(); @@ -198,11 +198,11 @@ } public LoggerContextVO getLoggerContextVO() { - return loggerContextRemoteView; + return loggerContextVO; } - public void setLoggerContextRemoteView(LoggerContextVO loggerContextRemoteView) { - this.loggerContextRemoteView = loggerContextRemoteView; + public void setLoggerContextRemoteView(LoggerContextVO loggerContextVO) { + this.loggerContextVO = loggerContextVO; } public String getMessage() { @@ -242,15 +242,17 @@ * caller information. </p> */ public CallerData[] getCallerData() { - // we rely on the fact that fqnOfLoggerClass does not survive - // serialization - if (callerDataArray == null && fqnOfLoggerClass != null) { - callerDataArray = CallerData.extract(new Throwable(), fqnOfLoggerClass); + if (callerDataArray == null) { + callerDataArray = CallerData.extract(new Throwable(), fqnOfLoggerClass, loggerContext.getMaxCallerDataDepth()); } return callerDataArray; } - public void setCallerInformation(CallerData[] callerDataArray) { + public boolean hasCallerData() { + return (callerDataArray != null); + } + + public void setCallerData(CallerData[] callerDataArray) { this.callerDataArray = callerDataArray; } @@ -267,10 +269,9 @@ } public long getContextBirthTime() { - return loggerContextRemoteView.getBirthTime(); + return loggerContextVO.getBirthTime(); } - // computer formatted lazy as suggested in // http://jira.qos.ch/browse/LBCLASSIC-47 public String getFormattedMessage() { Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java Thu Mar 5 20:55:12 2009 @@ -13,6 +13,12 @@ // http://www.riehle.org/computer-science/research/1998/ubilab-tr-1998-10-1.htm... +/** + * A read-only and serializable implementation of {@link ILoggingEvent}. + * + * @author Ceki Gülcü + * @since 0.9.16 + */ public class LoggingEventVO implements ILoggingEvent, Serializable { private static final long serialVersionUID = 6553722650255690312L; @@ -23,7 +29,7 @@ private String threadName; private String loggerName; private LoggerContextVO loggerContextVO; - + private transient Level level; private String message; @@ -39,7 +45,6 @@ private Marker marker; private Map<String, String> mdcPropertyMap; private long timeStamp; - public static LoggingEventVO build(ILoggingEvent le) { LoggingEventVO ledo = new LoggingEventVO(); @@ -51,7 +56,7 @@ ledo.argumentArray = (le.getArgumentArray()); ledo.marker = le.getMarker(); ledo.mdcPropertyMap = le.getMDCPropertyMap(); - ledo.setTimeStamp(le.getTimeStamp()); + ledo.timeStamp = le.getTimeStamp(); ledo.throwableProxy = ThrowableProxyVO.build(le.getThrowableProxy()); return ledo; } @@ -63,11 +68,11 @@ public LoggerContextVO getLoggerContextVO() { return loggerContextVO; } - + public String getLoggerName() { return loggerName; } - + public Level getLevel() { return level; } @@ -102,6 +107,10 @@ return callerDataArray; } + public boolean hasCallerData() { + return callerDataArray != null; + } + public Marker getMarker() { return marker; } @@ -110,10 +119,6 @@ return timeStamp; } - public void setTimeStamp(long timeStamp) { - this.timeStamp = timeStamp; - } - public long getContextBirthTime() { @@ -200,7 +205,6 @@ } else if (!loggerName.equals(other.loggerName)) return false; - if (threadName == null) { if (other.threadName != null) return false; 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 Thu Mar 5 20:55:12 2009 @@ -31,7 +31,10 @@ return ste; } - void setClassPackagingData(ClassPackagingData cpd) { + public void setClassPackagingData(ClassPackagingData cpd) { + if(this.cpd != null) { + throw new IllegalStateException("Packaging data has been already set"); + } this.cpd = cpd; } 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 Thu Mar 5 20:55:12 2009 @@ -104,24 +104,11 @@ for (StackTraceElementProxy step : stackTraceElementProxyArray) { String string = step.toString(); builder.append(string); - extraData(builder, step); + ThrowableProxyUtil.appendPackagingData(builder, step); builder.append(CoreConstants.LINE_SEPARATOR); } System.out.println(builder.toString()); } - protected void extraData(StringBuilder builder, StackTraceElementProxy step) { - 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/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java Thu Mar 5 20:55:12 2009 @@ -20,8 +20,6 @@ */ public class ThrowableProxyUtil { - //static final ThrowableDataPoint[] TEMPLATE_ARRAY = new ThrowableDataPoint[0]; - static public void build(ThrowableProxy nestedTP, Throwable nestedThrowable, ThrowableProxy parentTP) { @@ -68,25 +66,42 @@ return count; } - static String asString(IThrowableProxy tp) { + static public String asString(IThrowableProxy tp) { StringBuilder sb = new StringBuilder(); while (tp != null) { - printFirstLine(sb, tp); printSTEPArray(sb, tp); tp = tp.getCause(); } return sb.toString(); - } + static void appendPackagingData(StringBuilder builder, StackTraceElementProxy step) { + 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(']'); + } + } + } + static public void printSTEPArray(StringBuilder sb, IThrowableProxy tp) { StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray(); int commonFrames = tp.getCommonFrames(); + for (int i = 0; i < stepArray.length - commonFrames; i++) { StackTraceElementProxy step = stepArray[i]; - sb.append(step.toString()).append(CoreConstants.LINE_SEPARATOR); + sb.append(step.toString()); + appendPackagingData(sb, step); + sb.append(CoreConstants.LINE_SEPARATOR); } if (commonFrames > 0) { @@ -96,12 +111,12 @@ } - static public void printFirstLine(StringBuilder sb, IThrowableProxy tp) { + static public void printFirstLine(StringBuilder buf, IThrowableProxy tp) { int commonFrames = tp.getCommonFrames(); if (commonFrames > 0) { - sb.append(CoreConstants.CAUSED_BY); + buf.append(CoreConstants.CAUSED_BY); } - sb.append(tp.getClassName()).append(": ").append(tp.getMessage()); - sb.append(CoreConstants.LINE_SEPARATOR); + buf.append(tp.getClassName()).append(": ").append(tp.getMessage()); + buf.append(CoreConstants.LINE_SEPARATOR); } } Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java Thu Mar 5 20:55:12 2009 @@ -94,7 +94,4 @@ } return tpvo; } - - - } Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java (from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMakerUtil.java) ============================================================================== --- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMakerUtil.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusMaker.java Thu Mar 5 20:55:12 2009 @@ -9,13 +9,24 @@ */ package ch.qos.logback.classic.corpus; +import java.io.IOException; import java.util.List; import java.util.Random; import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.ClassPackagingData; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.classic.spi.LoggerContextVO; +import ch.qos.logback.classic.spi.PubLoggingEventVO; +import ch.qos.logback.classic.spi.StackTraceElementProxy; +import ch.qos.logback.classic.spi.ThrowableProxy; +import ch.qos.logback.classic.spi.ThrowableProxyVO; -public class CorpusMakerUtil { +public class CorpusMaker { + static final int STANDARD_CORPUS_SIZE = 100*1000; + // level distribution is determined by the following table // it corresponds to TRACE 20%, DEBUG 30%, INFO 30%, WARN 10%, // ERROR 10%. See also getRandomLevel() method. @@ -35,15 +46,88 @@ static final int AVERAGE_MESSAGE_WORDS = 8; static final int STD_DEV_FOR_MESSAGE_WORDS = 4; + static final int THREAD_POOL_SIZE = 10; + final Random random; List<String> worldList; + String[] threadNamePool; - CorpusMakerUtil(long seed, List<String> worldList) { + public CorpusMaker(long seed, List<String> worldList) { random = new Random(seed); this.worldList = worldList; + buildThreadNamePool(); + } + + void buildThreadNamePool() { + threadNamePool = new String[THREAD_POOL_SIZE]; + for (int i = 0; i < THREAD_POOL_SIZE; i++) { + threadNamePool[i] = "CorpusMakerThread-" + i; + } + } + + static public ILoggingEvent[] makeStandardCorpus() throws IOException { + List<String> worldList = TextFileUtil + .toWords("src/test/input/corpus/origin_of_species.txt"); + CorpusMaker corpusMaker = new CorpusMaker(10, worldList); + return corpusMaker.make(STANDARD_CORPUS_SIZE); + } + + public ILoggingEvent[] make(int n) { + + LoggerContextVO lcVO = getRandomlyNamedLoggerContextVO(); + + PubLoggingEventVO[] plevoArray = new PubLoggingEventVO[n]; + for (int i = 0; i < n; i++) { + PubLoggingEventVO e = new PubLoggingEventVO(); + plevoArray[i] = e; + e.timeStamp = getRandomLong(); + e.loggerName = getRandomLoggerName(); + e.level = getRandomLevel(); + MessageEntry me = getRandomMessageEntry(); + e.message = me.message; + e.argumentArray = me.argumentArray; + e.loggerContextVO = lcVO; + Throwable t = getRandomThrowable(e.level); + if (t != null) { + e.throwableProxy = ThrowableProxyVO.build(new ThrowableProxy(t)); + pupulateWithPackagingData(e.throwableProxy + .getStackTraceElementProxyArray()); + } + e.threadName = getRandomThreadName(); + } + return plevoArray; + } + + void pupulateWithPackagingData(StackTraceElementProxy[] stepArray) { + int i = 0; + for (StackTraceElementProxy step : stepArray) { + String identifier = "na"; + String version = "na"; + if (i++ % 2 == 0) { + identifier = getRandomJavaIdentifier(); + version = getRandomJavaIdentifier(); + } + ClassPackagingData cpd = new ClassPackagingData(identifier, version); + step.setClassPackagingData(cpd); + } } + LoggerContextVO getRandomlyNamedLoggerContextVO() { + LoggerContext lc = new LoggerContext(); + lc.setName(getRandomJavaIdentifier()); + return new LoggerContextVO(lc); + } + + long getRandomLong() { + return random.nextLong(); + } + + String getRandomThreadName() { + int index = random.nextInt(THREAD_POOL_SIZE); + return threadNamePool[index]; + } + String getRandomWord() { int size = worldList.size(); int randomIndex = random.nextInt(size); @@ -123,14 +207,20 @@ return 3; } + String getRandomJavaIdentifier() { + String w = getRandomWord(); + w = w.replaceAll("\\p{Punct}", ""); + return w; + } + String getRandomLoggerName() { int parts = RandomUtil.gaussianAsPositiveInt(random, AVERAGE_LOGGER_NAME_PARTS, STD_DEV_FOR_LOGGER_NAME_PARTS); StringBuilder sb = new StringBuilder(); for (int i = 1; i < parts; i++) { - sb.append(getRandomWord()).append('.'); + sb.append(getRandomJavaIdentifier()).append('.'); } - sb.append(getRandomWord()); + sb.append(getRandomJavaIdentifier()); return sb.toString(); } Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java Thu Mar 5 20:55:12 2009 @@ -1,17 +1,21 @@ package ch.qos.logback.classic.corpus; import java.io.BufferedReader; +import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class TextFileUtil { - //FileReader fr = new FileReader(filename); - //BufferedReader br = new BufferedReader(fr); + + public static List<String> toWords(String filename) throws IOException { + FileReader fr = new FileReader(filename); + BufferedReader br = new BufferedReader(fr); + return toWords(br); + } public static List<String> toWords(BufferedReader br) throws IOException { - // (\\d+)$ //String regExp = "^(\\d+) "+ msg + " ([\\dabcdef-]+)$"; Copied: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/TextFileUtilTest.java (from r2179, /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/FileToWord.java) ============================================================================== --- /logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/FileToWord.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/TextFileUtilTest.java Thu Mar 5 20:55:12 2009 @@ -11,7 +11,7 @@ import ch.qos.logback.classic.corpus.TextFileUtil; -public class FileToWord { +public class TextFileUtilTest { @Test public void smoke() throws IOException { Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CallerDataTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CallerDataTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/CallerDataTest.java Thu Mar 5 20:55:12 2009 @@ -14,7 +14,7 @@ Throwable t = new Throwable(); StackTraceElement[] steArray = t.getStackTrace(); - CallerData[] cda = CallerData.extract(t, CallerDataTest.class.getName()); + CallerData[] cda = CallerData.extract(t, CallerDataTest.class.getName(), 50); assertNotNull(cda); assertTrue(cda.length > 0); assertEquals(steArray.length - 1, cda.length); @@ -27,7 +27,7 @@ */ @Test public void testDeferredProcessing() { - CallerData[] cda = CallerData.extract(new Throwable(), "com.inexistent.foo"); + CallerData[] cda = CallerData.extract(new Throwable(), "com.inexistent.foo", 10); assertNotNull(cda); assertEquals(0, cda.length); } Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java Thu Mar 5 20:55:12 2009 @@ -0,0 +1,227 @@ +package ch.qos.logback.classic.spi; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.Map; + +import org.slf4j.Marker; +import org.slf4j.helpers.MessageFormatter; + +import ch.qos.logback.classic.Level; + +/** + * A read/write and serializable implementation of {@link ILoggingEvent}. + * + * @author Ceki Gülcü + + */ +public class PubLoggingEventVO implements ILoggingEvent, Serializable { + + + private static final long serialVersionUID = -3385765861078946218L; + + private static final int NULL_ARGUMENT_ARRAY = -1; + private static final String NULL_ARGUMENT_ARRAY_ELEMENT = "NULL_ARGUMENT_ARRAY_ELEMENT"; + + public String threadName; + public String loggerName; + public LoggerContextVO loggerContextVO; + + public transient Level level; + public String message; + + private transient String formattedMessage; + + public Object[] argumentArray; + + public ThrowableProxyVO throwableProxy; + public CallerData[] callerDataArray; + public Marker marker; + public Map<String, String> mdcPropertyMap; + public long timeStamp; + + + + public String getThreadName() { + return threadName; + } + + public LoggerContextVO getLoggerContextVO() { + return loggerContextVO; + } + + public String getLoggerName() { + return loggerName; + } + + public Level getLevel() { + return level; + } + + public String getMessage() { + return message; + } + + public String getFormattedMessage() { + if (formattedMessage != null) { + return formattedMessage; + } + + if (argumentArray != null) { + formattedMessage = MessageFormatter.arrayFormat(message, argumentArray); + } else { + formattedMessage = message; + } + + return formattedMessage; + } + + public Object[] getArgumentArray() { + return argumentArray; + } + + public IThrowableProxy getThrowableProxy() { + return throwableProxy; + } + + public CallerData[] getCallerData() { + return callerDataArray; + } + + public boolean hasCallerData() { + return callerDataArray != null; + } + + public Marker getMarker() { + return marker; + } + + public long getTimeStamp() { + return timeStamp; + } + + + + public long getContextBirthTime() { + return loggerContextVO.getBirthTime(); + } + + public LoggerContextVO getContextLoggerRemoteView() { + return loggerContextVO; + } + + public Map<String, String> getMDCPropertyMap() { + return mdcPropertyMap; + } + + public void prepareForDeferredProcessing() { + } + + private void writeObject(ObjectOutputStream out) throws IOException { + out.defaultWriteObject(); + out.writeInt(level.levelInt); + if (argumentArray != null) { + int len = argumentArray.length; + out.writeInt(len); + for (int i = 0; i < argumentArray.length; i++) { + if (argumentArray[i] != null) { + out.writeObject(argumentArray[i].toString()); + } else { + out.writeObject(NULL_ARGUMENT_ARRAY_ELEMENT); + } + } + } else { + out.writeInt(NULL_ARGUMENT_ARRAY); + } + + } + + private void readObject(ObjectInputStream in) throws IOException, + ClassNotFoundException { + in.defaultReadObject(); + int levelInt = in.readInt(); + level = Level.toLevel(levelInt); + + int argArrayLen = in.readInt(); + if (argArrayLen != NULL_ARGUMENT_ARRAY) { + argumentArray = new String[argArrayLen]; + for (int i = 0; i < argArrayLen; i++) { + Object val = in.readObject(); + if (!NULL_ARGUMENT_ARRAY_ELEMENT.equals(val)) { + argumentArray[i] = val; + } + } + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((message == null) ? 0 : message.hashCode()); + result = prime * result + + ((threadName == null) ? 0 : threadName.hashCode()); + result = prime * result + (int) (timeStamp ^ (timeStamp >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final PubLoggingEventVO other = (PubLoggingEventVO) obj; + if (message == null) { + if (other.message != null) + return false; + } else if (!message.equals(other.message)) + return false; + + if (loggerName == null) { + if (other.loggerName != null) + return false; + } else if (!loggerName.equals(other.loggerName)) + return false; + + if (threadName == null) { + if (other.threadName != null) + return false; + } else if (!threadName.equals(other.threadName)) + return false; + if (timeStamp != other.timeStamp) + return false; + + if (marker == null) { + if (other.marker != null) + return false; + } else if (!marker.equals(other.marker)) + return false; + + if (mdcPropertyMap == null) { + if (other.mdcPropertyMap != null) + return false; + } else if (!mdcPropertyMap.equals(other.mdcPropertyMap)) + return false; + return true; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(timeStamp); + sb.append(" "); + sb.append(level); + sb.append(" ["); + sb.append(threadName); + sb.append("] "); + sb.append(loggerName); + sb.append(" - "); + sb.append(getFormattedMessage()); + return sb.toString(); + } + +}
participants (1)
-
noreply.ceki@qos.ch