svn commit: r569 - in logback/trunk: logback-classic/src/main/java/ch/qos/logback/classic/helpers logback-classic/src/main/java/ch/qos/logback/classic/html logback-classic/src/main/java/ch/qos/logback/classic/net logback-core/src/main/java/ch/qos/logback/core logback-core/src/main/java/ch/qos/logback/core/net

Author: ceki Date: Tue Sep 12 22:39:21 2006 New Revision: 569 Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/helpers/CyclicBuffer.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/SMTPAppender.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/Layout.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/LayoutBase.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java Log: ongoing work Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/helpers/CyclicBuffer.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/helpers/CyclicBuffer.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/helpers/CyclicBuffer.java Tue Sep 12 22:39:21 2006 @@ -7,43 +7,41 @@ * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation. */ - + package ch.qos.logback.classic.helpers; import ch.qos.logback.classic.spi.LoggingEvent; - /** - - CyclicBuffer is used by other appenders to hold {@link LoggingEvent - LoggingEvents} for immediate or differed display. - - <p>This buffer gives read access to any element in the buffer not - just the first or last element. - - @author Ceki Gülcü - @since 0.9.0 - + * + * CyclicBuffer is used by other appenders to hold + * {@link LoggingEvent LoggingEvents} for immediate or differed display. + * <p> + * This buffer gives read access to any element in the buffer not just the first + * or last element. + * + * @author Ceki Gülcü */ public class CyclicBuffer { - - LoggingEvent[] ea; - int first; - int last; + + Object[] ea; + int first; + int last; int numElems; int maxSize; /** - Instantiate a new CyclicBuffer of at most <code>maxSize</code> events. - - The <code>maxSize</code> argument must a positive integer. - - @param maxSize The maximum number of elements in the buffer. - */ + * Instantiate a new CyclicBuffer of at most <code>maxSize</code> events. + * + * The <code>maxSize</code> argument must a positive integer. + * + * @param maxSize + * The maximum number of elements in the buffer. + */ public CyclicBuffer(int maxSize) throws IllegalArgumentException { - if(maxSize < 1) { - throw new IllegalArgumentException("The maxSize argument ("+maxSize+ - ") is not a positive integer."); + if (maxSize < 1) { + throw new IllegalArgumentException("The maxSize argument (" + maxSize + + ") is not a positive integer."); } this.maxSize = maxSize; ea = new LoggingEvent[maxSize]; @@ -51,94 +49,86 @@ last = 0; numElems = 0; } - - /** - Add an <code>event</code> as the last event in the buffer. + /** + * Add an <code>event</code> as the last event in the buffer. + * */ - public - void add(LoggingEvent event) { - ea[last] = event; - if(++last == maxSize) + public void add(LoggingEvent event) { + ea[last] = event; + if (++last == maxSize) last = 0; - if(numElems < maxSize) + if (numElems < maxSize) numElems++; - else if(++first == maxSize) + else if (++first == maxSize) first = 0; } - /** - Get the <i>i</i>th oldest event currently in the buffer. If - <em>i</em> is outside the range 0 to the number of elements - currently in the buffer, then <code>null</code> is returned. - - - */ - public - LoggingEvent get(int i) { - if(i < 0 || i >= numElems) + * Get the <i>i</i>th oldest event currently in the buffer. If <em>i</em> + * is outside the range 0 to the number of elements currently in the buffer, + * then <code>null</code> is returned. + */ + public Object get(int i) { + if (i < 0 || i >= numElems) return null; return ea[(first + i) % maxSize]; } - public - int getMaxSize() { + public int getMaxSize() { return maxSize; } + /** - Get the oldest (first) element in the buffer. The oldest element - is removed from the buffer. - */ - public - LoggingEvent get() { - LoggingEvent r = null; - if(numElems > 0) { + * Get the oldest (first) element in the buffer. The oldest element is removed + * from the buffer. + */ + public Object get() { + Object r = null; + if (numElems > 0) { numElems--; r = ea[first]; ea[first] = null; - if(++first == maxSize) - first = 0; - } + if (++first == maxSize) + first = 0; + } return r; } - + /** - Get the number of elements in the buffer. This number is - guaranteed to be in the range 0 to <code>maxSize</code> - (inclusive). - */ - public - int length() { + * Get the number of elements in the buffer. This number is guaranteed to be + * in the range 0 to <code>maxSize</code> (inclusive). + */ + public int length() { return numElems; - } + } /** - Resize the cyclic buffer to <code>newSize</code>. - - @throws IllegalArgumentException if <code>newSize</code> is negative. + * Resize the cyclic buffer to <code>newSize</code>. + * + * @throws IllegalArgumentException + * if <code>newSize</code> is negative. */ - public - void resize(int newSize) { - if(newSize < 0) { - throw new IllegalArgumentException("Negative array size ["+newSize+ - "] not allowed."); + public void resize(int newSize) { + if (newSize < 0) { + throw new IllegalArgumentException("Negative array size [" + newSize + + "] not allowed."); } - if(newSize == numElems) + if (newSize == numElems) return; // nothing to do - - LoggingEvent[] temp = new LoggingEvent[newSize]; + + Object[] temp = new Object[newSize]; int loopLen = newSize < numElems ? newSize : numElems; - - for(int i = 0; i < loopLen; i++) { + + for (int i = 0; i < loopLen; i++) { temp[i] = ea[first]; ea[first] = null; - if(++first == numElems) - first = 0; + if (++first == numElems) + first = 0; } ea = temp; first = 0; 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 Tue Sep 12 22:39:21 2006 @@ -120,6 +120,7 @@ while (c != null) { if (c instanceof ThrowableHandlingConverter) { chainHandlesThrowable = true; + return; } c = c.getNext(); } @@ -147,6 +148,7 @@ /** * Returns the content type output by this layout, i.e "text/html". */ + @Override public String getContentType() { return "text/html"; } @@ -172,8 +174,9 @@ */ public String getHeader() { StringBuffer sbuf = new StringBuffer(); - sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""); - sbuf.append(" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"); + + sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\""); + sbuf.append(" SYSTEM \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"); sbuf.append(LINE_SEP); sbuf.append("<html>"); sbuf.append(LINE_SEP); @@ -217,6 +220,10 @@ sbuf.append("<tr class=\"header\">"); sbuf.append(LINE_SEP); while (c != null) { + if (c instanceof ThrowableHandlingConverter) { + c = c.getNext(); + continue; + } name = computeConverterName(c); if (name == null) { c = c.getNext(); @@ -249,14 +256,6 @@ return sbuf.toString(); } - /** - * The HTML layout handles the throwable contained in logging events. Hence, - * this method return <code>false</code>. - */ - public boolean ignoresThrowable() { - return false; - } - public String doLayout(Object event) { return doLayout((LoggingEvent) event); } @@ -289,8 +288,9 @@ ThrowableHandlingConverter converter = (ThrowableHandlingConverter)c; if (converter.onNewLine(event)) { buf.append("</tr>"); - buf.append("<tr>"); - appendEventToBuffer(buf, c, event); + buf.append("<tr colspan=\"6\">"); + appendThrowableAsHTML(event.getThrowableInformation().getThrowableStrRep(), buf); + //appendEventToBuffer(buf, c, event); if (c.getNext() != null) { //here we assume that when we exist the while loop, //a </tr> tag is added. Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java Tue Sep 12 22:39:21 2006 @@ -13,8 +13,10 @@ import java.io.File; import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.PatternLayout; import ch.qos.logback.classic.helpers.CyclicBuffer; import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.Layout; import ch.qos.logback.core.net.SMTPAppenderBase; import ch.qos.logback.core.rolling.TriggeringPolicy; @@ -35,6 +37,8 @@ */ public class SMTPAppender extends SMTPAppenderBase { + static final String DEFAULT_SUBJECT_PATTERN = "%m"; + private int bufferSize = 512; protected CyclicBuffer cb = new CyclicBuffer(bufferSize); @@ -72,16 +76,8 @@ int len = cb.length(); for (int i = 0; i < len; i++) { // sbuf.append(MimeUtility.encodeText(layout.format(cb.get()))); - LoggingEvent event = cb.get(); + Object event = cb.get(); sbuf.append(layout.doLayout(event)); - // if (layout.ignoresThrowable()) { - // String[] s = event.getThrowableStrRep(); - // if (s != null) { - // for (int j = 0; j < s.length; j++) { - // sbuf.append(s[j]); - // } - // } - // } } } @@ -103,6 +99,17 @@ public int getBufferSize() { return bufferSize; } + + @Override + protected Layout makeSubjectLayout(String subjectStr) { + if(subjectStr == null) { + subjectStr = DEFAULT_SUBJECT_PATTERN; + } + PatternLayout pl = new PatternLayout(); + pl.setPattern(subjectStr); + pl.start(); + return pl; + } } class DefaultEvaluator implements TriggeringPolicy { Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/Layout.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/Layout.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/Layout.java Tue Sep 12 22:39:21 2006 @@ -42,4 +42,11 @@ */ String getFooter(); + /** + * Returns the content type as appropriate for the implementation. + * + * @return + */ + String getContentType(); + } Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/LayoutBase.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/LayoutBase.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/LayoutBase.java Tue Sep 12 22:39:21 2006 @@ -47,6 +47,10 @@ return footer; } + public String getContentType() { + return "text/plain"; + } + public void setHeader(String header) { this.header = header; } Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java Tue Sep 12 22:39:21 2006 @@ -38,11 +38,14 @@ * */ public abstract class SMTPAppenderBase extends AppenderBase { + + protected Layout layout; + protected Layout subjectLayout; private String to; private String from; - private String subject; + private String subjectStr = null; private String smtpHost; protected Message msg; @@ -50,6 +53,17 @@ protected TriggeringPolicy evaluator; /** + * return a layout for the subjet string as appropriate for the + * module. If the subjectStr parameter is null, then a default + * value for subjectStr should be used. + * + * @param subjectStr + * + * @return a layout as appropriate for the module + */ + abstract protected Layout makeSubjectLayout(String subjectStr); + + /** * Start the appender */ public void start() { @@ -70,10 +84,9 @@ } msg.setRecipients(Message.RecipientType.TO, parseAddress(to)); - if (subject != null) { - msg.setSubject(subject); - } - + + subjectLayout = makeSubjectLayout(subjectStr); + started = true; } catch (MessagingException e) { @@ -94,7 +107,7 @@ subAppend(eventObject); if (evaluator.isTriggeringEvent(null, eventObject)) { - sendBuffer(); + sendBuffer(eventObject); } } @@ -158,7 +171,7 @@ /** * Send the contents of the cyclic buffer as an e-mail message. */ - protected void sendBuffer() { + protected void sendBuffer(Object lastEventObject) { // Note: this code already owns the monitor for this // appender. This frees us from needing to synchronize on 'cb'. @@ -166,12 +179,22 @@ MimeBodyPart part = new MimeBodyPart(); StringBuffer sbuf = new StringBuffer(); - String t = layout.getHeader(); + + String header = layout.getHeader(); + if (header != null) { + sbuf.append(header); + } fillBuffer(sbuf); - t = layout.getFooter(); - if (t != null) - sbuf.append(t); - part.setContent(sbuf.toString(), "text/plain"); + String footer = layout.getFooter(); + if (footer != null) { + sbuf.append(footer); + } + + if (subjectLayout != null) { + msg.setSubject(subjectLayout.doLayout(lastEventObject)); + } + + part.setContent(sbuf.toString(), layout.getContentType()); Multipart mp = new MimeMultipart(); mp.addBodyPart(part); @@ -204,9 +227,9 @@ * Returns value of the <b>Subject</b> option. */ public String getSubject() { - return subject; + return subjectStr; } - + /** * The <b>From</b> option takes a string value which should be a e-mail * address of the sender. @@ -220,9 +243,9 @@ * subject of the e-mail message. */ public void setSubject(String subject) { - this.subject = subject; + this.subjectStr = subject; } - + /** * The <b>SMTPHost</b> option takes a string value which should be a the host * name of the SMTP server that will send the e-mail message.
participants (1)
-
noreply.ceki@qos.ch