From e2a9429c293ddc55b2a0f771c376b1bf3b00c8ba Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Sat, 4 Feb 2017 12:12:56 +0100 Subject: [PATCH] split locks - changes to Encode interface --- .../encoder/PatternLayoutEncoderTest.java | 11 +- .../logback/core/OutputStreamAppender.java | 53 ++++-- .../qos/logback/core/encoder/EchoEncoder.java | 20 +-- .../ch/qos/logback/core/encoder/Encoder.java | 6 +- .../qos/logback/core/encoder/EncoderBase.java | 9 - .../core/encoder/EventObjectInputStream.java | 156 ------------------ .../core/encoder/LayoutWrappingEncoder.java | 104 ++++-------- .../core/encoder/ObjectStreamEncoder.java | 95 ----------- .../core/appender/ConsoleAppenderTest.java | 7 +- .../core/appender/DummyAppenderTest.java | 1 - .../logback/core/encoder/DummyEncoder.java | 53 +++--- .../qos/logback/core/encoder/NopEncoder.java | 10 +- .../core/encoder/ObjectEncodeDecodeTest.java | 92 ----------- .../qos/logback/core/encoder/PackageTest.java | 2 +- .../core/rolling/SizeBasedRollingTest.java | 2 + .../appenders/CountingConsoleAppender.java | 2 +- .../TrivialLogbackAppender.java | 2 +- 17 files changed, 129 insertions(+), 496 deletions(-) delete mode 100644 logback-core/src/main/java/ch/qos/logback/core/encoder/EventObjectInputStream.java delete mode 100644 logback-core/src/main/java/ch/qos/logback/core/encoder/ObjectStreamEncoder.java delete mode 100644 logback-core/src/test/java/ch/qos/logback/core/encoder/ObjectEncodeDecodeTest.java diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/encoder/PatternLayoutEncoderTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/encoder/PatternLayoutEncoderTest.java index 8a027a7a0..689940bce 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/encoder/PatternLayoutEncoderTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/encoder/PatternLayoutEncoderTest.java @@ -52,7 +52,8 @@ public class PatternLayoutEncoderTest { init(baos); String msg = "hello"; ILoggingEvent event = makeLoggingEvent(msg); - ple.doEncode(event); + byte[] eventBytes = ple.doEncode(event); + baos.write(eventBytes); ple.close(); assertEquals(msg, baos.toString()); } @@ -60,7 +61,8 @@ public class PatternLayoutEncoderTest { void init(ByteArrayOutputStream baos) throws IOException { ple.start(); ((PatternLayout) ple.getLayout()).setOutputPatternAsHeader(false); - ple.init(baos); + byte[] header = ple.init(); + baos.write(header); } @Test @@ -69,9 +71,10 @@ public class PatternLayoutEncoderTest { init(baos); String msg = "\u03b1"; ILoggingEvent event = makeLoggingEvent(msg); - ple.doEncode(event); + byte[] eventBytes = ple.doEncode(event); + baos.write(eventBytes); ple.close(); - assertEquals(msg, new String(baos.toByteArray(), utf8Charset.name())); + assertEquals(msg, new String(baos.toByteArray(), utf8Charset)); } } diff --git a/logback-core/src/main/java/ch/qos/logback/core/OutputStreamAppender.java b/logback-core/src/main/java/ch/qos/logback/core/OutputStreamAppender.java index c45b58ac1..020583a10 100755 --- a/logback-core/src/main/java/ch/qos/logback/core/OutputStreamAppender.java +++ b/logback-core/src/main/java/ch/qos/logback/core/OutputStreamAppender.java @@ -51,11 +51,13 @@ public class OutputStreamAppender extends UnsynchronizedAppenderBase { */ private OutputStream outputStream; + boolean immediateFlush = true; + /** - * The underlying output stream used by this appender. - * - * @return - */ + * The underlying output stream used by this appender. + * + * @return + */ public OutputStream getOutputStream() { return outputStream; } @@ -136,7 +138,8 @@ public class OutputStreamAppender extends UnsynchronizedAppenderBase { void encoderInit() { if (encoder != null && this.outputStream != null) { try { - encoder.init(outputStream); + byte[] header = encoder.init(); + writeBytes(header); } catch (IOException ioe) { this.started = false; addStatus(new ErrorStatus("Failed to initialize encoder for appender named [" + name + "].", this, ioe)); @@ -147,7 +150,8 @@ public class OutputStreamAppender extends UnsynchronizedAppenderBase { void encoderClose() { if (encoder != null && this.outputStream != null) { try { - encoder.close(); + byte[] footer = encoder.close(); + writeBytes(footer); } catch (IOException ioe) { this.started = false; addStatus(new ErrorStatus("Failed to write footer for appender named [" + name + "].", this, ioe)); @@ -184,7 +188,23 @@ public class OutputStreamAppender extends UnsynchronizedAppenderBase { } protected void writeOut(E event) throws IOException { - this.encoder.doEncode(event); + byte[] byteArray = this.encoder.doEncode(event); + writeBytes(byteArray); + } + + void writeBytes(byte[] byteArray) throws IOException { + if(byteArray == null) + return; + + lock.lock(); + try { + this.outputStream.write(byteArray); + if (immediateFlush) { + this.outputStream.flush(); + } + } finally { + lock.unlock(); + } } /** @@ -207,12 +227,11 @@ public class OutputStreamAppender extends UnsynchronizedAppenderBase { // the synchronization prevents the OutputStream from being closed while we // are writing. It also prevents multiple threads from entering the same // converter. Converters assume that they are in a synchronized block. - //lock.lock(); - //try { - writeOut(event); - //} finally { - // lock.unlock(); - //} + // lock.lock(); + + byte[] byteArray = this.encoder.doEncode(event); + writeBytes(byteArray); + } catch (IOException ioe) { // as soon as an exception occurs, move to non-started state // and add a single ErrorStatus to the SM. @@ -229,4 +248,12 @@ public class OutputStreamAppender extends UnsynchronizedAppenderBase { this.encoder = encoder; } + public boolean isImmediateFlush() { + return immediateFlush; + } + + public void setImmediateFlush(boolean immediateFlush) { + this.immediateFlush = immediateFlush; + } + } diff --git a/logback-core/src/main/java/ch/qos/logback/core/encoder/EchoEncoder.java b/logback-core/src/main/java/ch/qos/logback/core/encoder/EchoEncoder.java index f83787563..ef253ad7e 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/encoder/EchoEncoder.java +++ b/logback-core/src/main/java/ch/qos/logback/core/encoder/EchoEncoder.java @@ -14,7 +14,6 @@ package ch.qos.logback.core.encoder; import java.io.IOException; -import java.io.OutputStream; import ch.qos.logback.core.CoreConstants; @@ -23,25 +22,22 @@ public class EchoEncoder extends EncoderBase { String fileHeader; String fileFooter; - public void doEncode(E event) throws IOException { + public byte[] doEncode(E event) throws IOException { String val = event + CoreConstants.LINE_SEPARATOR; - outputStream.write(val.getBytes()); - // necessary if ResilientFileOutputStream is buffered - outputStream.flush(); + return val.getBytes(); } - public void close() throws IOException { + public byte[] close() throws IOException { if (fileFooter == null) { - return; + return null; } - outputStream.write(fileFooter.getBytes()); + return fileFooter.getBytes(); } - public void init(OutputStream os) throws IOException { - super.init(os); + public byte[] init() { if (fileHeader == null) { - return; + return null; } - outputStream.write(fileHeader.getBytes()); + return fileHeader.getBytes(); } } diff --git a/logback-core/src/main/java/ch/qos/logback/core/encoder/Encoder.java b/logback-core/src/main/java/ch/qos/logback/core/encoder/Encoder.java index 7498c77bf..986467e5f 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/encoder/Encoder.java +++ b/logback-core/src/main/java/ch/qos/logback/core/encoder/Encoder.java @@ -45,7 +45,7 @@ public interface Encoder extends ContextAware, LifeCycle { * @param os * @throws IOException */ - void init(OutputStream os) throws IOException; + byte[] init() throws IOException; /** * Encode and write an event to the appropriate {@link OutputStream}. @@ -55,7 +55,7 @@ public interface Encoder extends ContextAware, LifeCycle { * @param event * @throws IOException */ - void doEncode(E event) throws IOException; + byte[] doEncode(E event) throws IOException; /** * This method is called prior to the closing of the underling @@ -64,5 +64,5 @@ public interface Encoder extends ContextAware, LifeCycle { * * @throws IOException */ - void close() throws IOException; + byte[] close() throws IOException; } diff --git a/logback-core/src/main/java/ch/qos/logback/core/encoder/EncoderBase.java b/logback-core/src/main/java/ch/qos/logback/core/encoder/EncoderBase.java index 650eecab2..0daf74f50 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/encoder/EncoderBase.java +++ b/logback-core/src/main/java/ch/qos/logback/core/encoder/EncoderBase.java @@ -13,21 +13,12 @@ */ package ch.qos.logback.core.encoder; -import java.io.IOException; -import java.io.OutputStream; - import ch.qos.logback.core.spi.ContextAwareBase; abstract public class EncoderBase extends ContextAwareBase implements Encoder { protected boolean started; - protected OutputStream outputStream; - - public void init(OutputStream os) throws IOException { - this.outputStream = os; - } - public boolean isStarted() { return started; } diff --git a/logback-core/src/main/java/ch/qos/logback/core/encoder/EventObjectInputStream.java b/logback-core/src/main/java/ch/qos/logback/core/encoder/EventObjectInputStream.java deleted file mode 100644 index 23d1fc218..000000000 --- a/logback-core/src/main/java/ch/qos/logback/core/encoder/EventObjectInputStream.java +++ /dev/null @@ -1,156 +0,0 @@ -/** - * Logback: the reliable, generic, fast and flexible logging framework. - * Copyright (C) 1999-2015, QOS.ch. All rights reserved. - * - * This program and the accompanying materials are dual-licensed under - * either the terms of the Eclipse Public License v1.0 as published by - * the Eclipse Foundation - * - * or (per the licensee's choosing) - * - * under the terms of the GNU Lesser General Public License version 2.1 - * as published by the Free Software Foundation. - */ -package ch.qos.logback.core.encoder; - -import static ch.qos.logback.core.CoreConstants.BYTES_PER_INT; -import static ch.qos.logback.core.encoder.ObjectStreamEncoder.START_PEBBLE; -import static ch.qos.logback.core.encoder.ObjectStreamEncoder.STOP_PEBBLE; - -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.util.ArrayList; -import java.util.List; - -/** - * Restitute the contents of an input stream as java objects. - * - * @author Ceki Gülcü - * - * @param - */ -public class EventObjectInputStream extends InputStream { - - NonClosableInputStream ncis; - List buffer = new ArrayList(); - - int index = 0; - - EventObjectInputStream(InputStream is) throws IOException { - this.ncis = new NonClosableInputStream(is); - } - - @Override - public int read() throws IOException { - throw new UnsupportedOperationException("Only the readEvent method is supported."); - } - - /** - * Returns the number of bytes available - */ - public int available() throws IOException { - return ncis.available(); - } - - public E readEvent() throws IOException { - - E event = getFromBuffer(); - if (event != null) { - return event; - } - - internalReset(); - int count = readHeader(); - if (count == -1) { - return null; - } - readPayload(count); - readFooter(count); - return getFromBuffer(); - } - - private void internalReset() { - index = 0; - buffer.clear(); - } - - E getFromBuffer() { - if (index >= buffer.size()) { - return null; - } - return buffer.get(this.index++); - } - - int readHeader() throws IOException { - byte[] headerBA = new byte[4 * BYTES_PER_INT]; - // System.out.println("available="+ncis.available()); - int bytesRead = ncis.read(headerBA); - if (bytesRead == -1) { - return -1; - } - // System.out.println("**bytesRead="+bytesRead); - - // System.out.println(ByteArrayUtil.toHexString(headerBA)); - - int offset = 0; - int startPebble = ByteArrayUtil.readInt(headerBA, offset); - if (startPebble != START_PEBBLE) { - throw new IllegalStateException("Does not look like data created by ObjectStreamEncoder"); - } - offset += BYTES_PER_INT; - int count = ByteArrayUtil.readInt(headerBA, offset); - offset += BYTES_PER_INT; - int endPointer = ByteArrayUtil.readInt(headerBA, offset); - offset += BYTES_PER_INT; - int checksum = ByteArrayUtil.readInt(headerBA, offset); - if (checksum != (START_PEBBLE ^ count)) { - throw new IllegalStateException("Invalid checksum"); - } - return count; - } - - @SuppressWarnings("unchecked") - E readEvents(ObjectInputStream ois) throws IOException { - E e = null; - try { - e = (E) ois.readObject(); - buffer.add(e); - } catch (ClassNotFoundException e1) { - // FIXME Auto-generated catch block - e1.printStackTrace(); - } - return e; - } - - void readFooter(int count) throws IOException { - byte[] headerBA = new byte[2 * BYTES_PER_INT]; - ncis.read(headerBA); - - int offset = 0; - int stopPebble = ByteArrayUtil.readInt(headerBA, offset); - if (stopPebble != STOP_PEBBLE) { - throw new IllegalStateException("Looks like a corrupt stream"); - } - offset += BYTES_PER_INT; - int checksum = ByteArrayUtil.readInt(headerBA, offset); - if (checksum != (STOP_PEBBLE ^ count)) { - throw new IllegalStateException("Invalid checksum"); - } - } - - void readPayload(int count) throws IOException { - List eventList = new ArrayList(count); - ObjectInputStream ois = new ObjectInputStream(ncis); - for (int i = 0; i < count; i++) { - E e = (E) readEvents(ois); - eventList.add(e); - } - ois.close(); - } - - public void close() throws IOException { - ncis.realClose(); - } - -} diff --git a/logback-core/src/main/java/ch/qos/logback/core/encoder/LayoutWrappingEncoder.java b/logback-core/src/main/java/ch/qos/logback/core/encoder/LayoutWrappingEncoder.java index 8debe4d03..a4b3b91c3 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/encoder/LayoutWrappingEncoder.java +++ b/logback-core/src/main/java/ch/qos/logback/core/encoder/LayoutWrappingEncoder.java @@ -14,14 +14,7 @@ package ch.qos.logback.core.encoder; import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; -import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.Layout; @@ -82,78 +75,51 @@ public class LayoutWrappingEncoder extends EncoderBase { this.charset = charset; } - public void init(OutputStream os) throws IOException { - super.init(os); - writeHeader(); - } - - void writeHeader() throws IOException { - if (layout != null && (outputStream != null)) { - StringBuilder sb = new StringBuilder(); - appendIfNotNull(sb, layout.getFileHeader()); - appendIfNotNull(sb, layout.getPresentationHeader()); - if (sb.length() > 0) { - sb.append(CoreConstants.LINE_SEPARATOR); - // If at least one of file header or presentation header were not - // null, then append a line separator. - // This should be useful in most cases and should not hurt. - outputStream.write(convertToBytes(sb.toString())); - outputStream.flush(); - } + public byte[] init() throws IOException { + return headerBytes(); + } + + byte[] headerBytes() throws IOException { + if (layout == null) + return null; + + StringBuilder sb = new StringBuilder(); + appendIfNotNull(sb, layout.getFileHeader()); + appendIfNotNull(sb, layout.getPresentationHeader()); + if (sb.length() > 0) { + // If at least one of file header or presentation header were not + // null, then append a line separator. + // This should be useful in most cases and should not hurt. + sb.append(CoreConstants.LINE_SEPARATOR); } + return convertToBytes(sb.toString()); } - public void close() throws IOException { - writeFooter(); + public byte[] close() throws IOException { + return footerBytes(); } - void writeFooter() throws IOException { - if (layout != null && outputStream != null) { - StringBuilder sb = new StringBuilder(); - appendIfNotNull(sb, layout.getPresentationFooter()); - appendIfNotNull(sb, layout.getFileFooter()); - if (sb.length() > 0) { - outputStream.write(convertToBytes(sb.toString())); - outputStream.flush(); - } - } + byte[] footerBytes() throws IOException { + if (layout == null) + return null; + + StringBuilder sb = new StringBuilder(); + appendIfNotNull(sb, layout.getPresentationFooter()); + appendIfNotNull(sb, layout.getFileFooter()); + return convertToBytes(sb.toString()); } private byte[] convertToBytes(String s) { if (charset == null) { return s.getBytes(); } else { - try { - return s.getBytes(charset.name()); - } catch (UnsupportedEncodingException e) { - throw new IllegalStateException("An existing charset cannot possibly be unsupported."); - } + return s.getBytes(charset); } } - - ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); - - ReadLock lock1 = rwLock.readLock(); - WriteLock lock2 = rwLock.writeLock(); - - public void doEncode(E event) throws IOException { - //lock1.lock(); - byte[] bytes = null; - //try { - String txt = layout.doLayout(event); - bytes = convertToBytes(txt); - //} finally { - // lock1.unlock(); - //} - - //lock2.lock(); - //try { - outputStream.write(bytes); - if (immediateFlush) - outputStream.flush(); - //} finally { - // lock2.unlock(); - //} + + public byte[] doEncode(E event) throws IOException { + String txt = layout.doLayout(event); + return convertToBytes(txt); } public boolean isStarted() { @@ -166,12 +132,6 @@ public class LayoutWrappingEncoder extends EncoderBase { public void stop() { started = false; - if (outputStream != null) { - try { - outputStream.flush(); - } catch (IOException e) { - } - } } private void appendIfNotNull(StringBuilder sb, String s) { diff --git a/logback-core/src/main/java/ch/qos/logback/core/encoder/ObjectStreamEncoder.java b/logback-core/src/main/java/ch/qos/logback/core/encoder/ObjectStreamEncoder.java deleted file mode 100644 index 905d0cc5c..000000000 --- a/logback-core/src/main/java/ch/qos/logback/core/encoder/ObjectStreamEncoder.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Logback: the reliable, generic, fast and flexible logging framework. - * Copyright (C) 1999-2015, QOS.ch. All rights reserved. - * - * This program and the accompanying materials are dual-licensed under - * either the terms of the Eclipse Public License v1.0 as published by - * the Eclipse Foundation - * - * or (per the licensee's choosing) - * - * under the terms of the GNU Lesser General Public License version 2.1 - * as published by the Free Software Foundation. - */ -package ch.qos.logback.core.encoder; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - -import ch.qos.logback.core.CoreConstants; - -/** - * Write out events as java objects. - * - * @author Ceki Gülcü - * - * @param - */ -public class ObjectStreamEncoder extends EncoderBase { - - static public final int START_PEBBLE = 1853421169; - static public final int STOP_PEBBLE = 640373619; - - private int MAX_BUFFER_SIZE = 100; - - List bufferList = new ArrayList(MAX_BUFFER_SIZE); - - public void doEncode(E event) throws IOException { - bufferList.add(event); - if (bufferList.size() == MAX_BUFFER_SIZE) { - writeBuffer(); - } - } - - void writeHeader(ByteArrayOutputStream baos, int bufferSize) { - ByteArrayUtil.writeInt(baos, START_PEBBLE); - ByteArrayUtil.writeInt(baos, bufferSize); - ByteArrayUtil.writeInt(baos, 0); - ByteArrayUtil.writeInt(baos, START_PEBBLE ^ bufferSize); - } - - void writeFooter(ByteArrayOutputStream baos, int bufferSize) { - ByteArrayUtil.writeInt(baos, STOP_PEBBLE); - ByteArrayUtil.writeInt(baos, STOP_PEBBLE ^ bufferSize); - } - - void writeBuffer() throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(10000); - - int size = bufferList.size(); - writeHeader(baos, size); - ObjectOutputStream oos = new ObjectOutputStream(baos); - for (E e : bufferList) { - oos.writeObject(e); - } - bufferList.clear(); - oos.flush(); - - writeFooter(baos, size); - - byte[] byteArray = baos.toByteArray(); - oos.close(); - writeEndPosition(byteArray); - outputStream.write(byteArray); - - } - - void writeEndPosition(byte[] byteArray) { - int offset = 2 * CoreConstants.BYTES_PER_INT; - ByteArrayUtil.writeInt(byteArray, offset, byteArray.length - offset); - } - - @Override - public void init(OutputStream os) throws IOException { - super.init(os); - bufferList.clear(); - } - - public void close() throws IOException { - writeBuffer(); - } -} diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java index 34b81f92c..f9738126a 100755 --- a/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java +++ b/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java @@ -28,6 +28,7 @@ import org.junit.Test; import java.io.PrintStream; import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -128,12 +129,12 @@ public class ConsoleAppenderTest extends AbstractAppenderTest { public void testUTF16BE() throws UnsupportedEncodingException { ConsoleAppender ca = (ConsoleAppender) getAppender(); DummyEncoder dummyEncoder = new DummyEncoder(); - String encodingName = "UTF-16BE"; - dummyEncoder.setEncodingName(encodingName); + Charset utf16BE = Charset.forName("UTF-16BE"); + dummyEncoder.setCharset(utf16BE); ca.setEncoder(dummyEncoder); ca.start(); ca.doAppend(new Object()); - assertEquals(DummyLayout.DUMMY, new String(tee.toByteArray(), encodingName)); + assertEquals(DummyLayout.DUMMY, new String(tee.toByteArray(), utf16BE)); } @Test diff --git a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java index 9e135a9ce..d4ed60936 100644 --- a/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java +++ b/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java @@ -43,7 +43,6 @@ public class DummyAppenderTest extends AbstractAppenderTest { @Test public void testBasic() throws IOException { Encoder encoder = new DummyEncoder(); - encoder.init(baos); da.setEncoder(encoder); da.start(); da.doAppend(new Object()); diff --git a/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java index 9754657d4..33dbe5e60 100644 --- a/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java +++ b/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java @@ -14,7 +14,7 @@ package ch.qos.logback.core.encoder; import java.io.IOException; -import java.io.OutputStream; +import java.nio.charset.Charset; import ch.qos.logback.core.CoreConstants; @@ -24,14 +24,14 @@ public class DummyEncoder extends EncoderBase { String val = DUMMY; String fileHeader; String fileFooter; - String encodingName; + Charset charset; - public String getEncodingName() { - return encodingName; + public Charset getCharset() { + return charset; } - public void setEncodingName(String encodingName) { - this.encodingName = encodingName; + public void setCharset(Charset charset) { + this.charset = charset; } public DummyEncoder() { @@ -41,50 +41,45 @@ public class DummyEncoder extends EncoderBase { this.val = val; } - public void doEncode(E event) throws IOException { - writeOut(val); + public byte[] doEncode(E event) throws IOException { + return encodeString(val); } - private void appendIfNotNull(StringBuilder sb, String s) { - if (s != null) { - sb.append(s); + byte[] encodeString(String s) { + if (charset == null) { + return s.getBytes(); + } else { + return s.getBytes(charset); } } - void writeOut(String s) throws IOException { - if (encodingName == null) { - outputStream.write(s.getBytes()); - } else { - outputStream.write(s.getBytes(encodingName)); + private void appendIfNotNull(StringBuilder sb, String s) { + if (s != null) { + sb.append(s); } } - void writeHeader() throws IOException { + byte[] header() { StringBuilder sb = new StringBuilder(); appendIfNotNull(sb, fileHeader); if (sb.length() > 0) { - sb.append(CoreConstants.LINE_SEPARATOR); // If at least one of file header or presentation header were not // null, then append a line separator. // This should be useful in most cases and should not hurt. - writeOut(sb.toString()); + sb.append(CoreConstants.LINE_SEPARATOR); } + return encodeString(sb.toString()); } - public void init(OutputStream os) throws IOException { - super.init(os); - writeHeader(); + public byte[] init() { + return header(); } - public void close() throws IOException { + public byte[] close() throws IOException { if (fileFooter == null) { - return; - } - if (encodingName == null) { - outputStream.write(fileFooter.getBytes()); - } else { - outputStream.write(fileFooter.getBytes(encodingName)); + return null; } + return encodeString(fileFooter); } public String getFileHeader() { diff --git a/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java index dbc500867..c5aaae38b 100644 --- a/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java +++ b/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java @@ -14,16 +14,18 @@ package ch.qos.logback.core.encoder; import java.io.IOException; -import java.io.OutputStream; public class NopEncoder extends EncoderBase { - public void close() throws IOException { + public byte[] close() throws IOException { + return null; } - public void doEncode(E event) throws IOException { + public byte[] doEncode(E event) throws IOException { + return null; } - public void init(OutputStream os) throws IOException { + public byte[] init() throws IOException { + return null; } } diff --git a/logback-core/src/test/java/ch/qos/logback/core/encoder/ObjectEncodeDecodeTest.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/ObjectEncodeDecodeTest.java deleted file mode 100644 index 3d2eedb28..000000000 --- a/logback-core/src/test/java/ch/qos/logback/core/encoder/ObjectEncodeDecodeTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Logback: the reliable, generic, fast and flexible logging framework. - * Copyright (C) 1999-2015, QOS.ch. All rights reserved. - * - * This program and the accompanying materials are dual-licensed under - * either the terms of the Eclipse Public License v1.0 as published by - * the Eclipse Foundation - * - * or (per the licensee's choosing) - * - * under the terms of the GNU Lesser General Public License version 2.1 - * as published by the Free Software Foundation. - */ -package ch.qos.logback.core.encoder; - -import static org.junit.Assert.assertEquals; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; - -import ch.qos.logback.core.testUtil.RandomUtil; -import ch.qos.logback.core.util.CoreTestConstants; - -public class ObjectEncodeDecodeTest { - - ObjectStreamEncoder encoder = new ObjectStreamEncoder(); - EventObjectInputStream eventStream; - - int diff = RandomUtil.getPositiveInt(); - protected String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/"; - - @Before - public void setUp() { - File randomOupurDirFile = new File(randomOutputDir); - randomOupurDirFile.mkdirs(); - } - - void encodeList(File file, List list) throws IOException { - FileOutputStream fos = new FileOutputStream(file); - encoder.init(fos); - for (String s : list) { - encoder.doEncode(s); - } - encoder.close(); - fos.close(); - } - - List decodeList(File file) throws IOException { - FileInputStream fis = new FileInputStream(file); - eventStream = new EventObjectInputStream(fis); - List back = new ArrayList(); - String e; - while ((e = eventStream.readEvent()) != null) { - back.add(e); - } - return back; - } - - @Test - public void singleBatch() throws IOException { - File file = new File(randomOutputDir + "x.lbo"); - - List witness = new ArrayList(); - for (int i = 0; i < 10; i++) { - witness.add("hello" + i); - } - encodeList(file, witness); - List back = decodeList(file); - assertEquals(witness, back); - } - - @Test - public void multipleBatches() throws IOException { - File file = new File(randomOutputDir + "m.lbo"); - - List witness = new ArrayList(); - for (int i = 0; i < 100 * 10; i++) { - witness.add("hello" + i); - } - encodeList(file, witness); - List back = decodeList(file); - assertEquals(witness, back); - } - -} diff --git a/logback-core/src/test/java/ch/qos/logback/core/encoder/PackageTest.java b/logback-core/src/test/java/ch/qos/logback/core/encoder/PackageTest.java index 74e20f273..04cf4956f 100644 --- a/logback-core/src/test/java/ch/qos/logback/core/encoder/PackageTest.java +++ b/logback-core/src/test/java/ch/qos/logback/core/encoder/PackageTest.java @@ -17,6 +17,6 @@ import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) -@Suite.SuiteClasses({ ByteArrayUtilTest.class, ObjectEncodeDecodeTest.class }) +@Suite.SuiteClasses({ ByteArrayUtilTest.class}) public class PackageTest { } diff --git a/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java b/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java index 6a4470de8..437c2d8ad 100755 --- a/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java +++ b/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java @@ -22,6 +22,7 @@ import org.junit.Test; import ch.qos.logback.core.encoder.EchoEncoder; import ch.qos.logback.core.util.CoreTestConstants; import ch.qos.logback.core.util.FileSize; +import ch.qos.logback.core.util.StatusPrinter; public class SizeBasedRollingTest extends ScaffoldingForRollingTests { @@ -83,6 +84,7 @@ public class SizeBasedRollingTest extends ScaffoldingForRollingTests { } rfa.stop(); + StatusPrinter.print(context); existenceCheck(expectedFilenameList); reverseSortedContentCheck(randomOutputDir, runLength, prefix); } diff --git a/logback-examples/src/main/java/chapters/appenders/CountingConsoleAppender.java b/logback-examples/src/main/java/chapters/appenders/CountingConsoleAppender.java index d0d30ee03..46fcdccbd 100755 --- a/logback-examples/src/main/java/chapters/appenders/CountingConsoleAppender.java +++ b/logback-examples/src/main/java/chapters/appenders/CountingConsoleAppender.java @@ -42,7 +42,7 @@ public class CountingConsoleAppender extends AppenderBase { } try { - encoder.init(System.out); + encoder.init(); } catch (IOException e) { } super.start(); diff --git a/logback-examples/src/main/java/chapters/migrationFromLog4j/TrivialLogbackAppender.java b/logback-examples/src/main/java/chapters/migrationFromLog4j/TrivialLogbackAppender.java index 95443e473..ab653d8f7 100644 --- a/logback-examples/src/main/java/chapters/migrationFromLog4j/TrivialLogbackAppender.java +++ b/logback-examples/src/main/java/chapters/migrationFromLog4j/TrivialLogbackAppender.java @@ -38,7 +38,7 @@ public class TrivialLogbackAppender extends AppenderBase { return; } try { - encoder.init(System.out); + encoder.init(); } catch (IOException e) { } super.start(); -- GitLab