From d91a1b5a98e357dfc2cca03645fe0021f04b3211 Mon Sep 17 00:00:00 2001 From: Conor MacNeill Date: Thu, 17 Jul 2003 13:02:57 +0000 Subject: [PATCH] Implement array writes for output processing git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274847 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/tools/ant/DemuxOutputStream.java | 31 ++++++++++++++++++- .../tools/ant/taskdefs/LogOutputStream.java | 31 ++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/main/org/apache/tools/ant/DemuxOutputStream.java b/src/main/org/apache/tools/ant/DemuxOutputStream.java index 6108828dd..131396325 100644 --- a/src/main/org/apache/tools/ant/DemuxOutputStream.java +++ b/src/main/org/apache/tools/ant/DemuxOutputStream.java @@ -89,6 +89,9 @@ public class DemuxOutputStream extends OutputStream { /** Maximum buffer size. */ private static final int MAX_SIZE = 1024; + /** Initial buffer size. */ + private static final int INTIAL_SIZE = 132; + /** Mapping from thread to buffer (Thread to BufferInfo). */ private Hashtable buffers = new Hashtable(); @@ -127,7 +130,7 @@ public class DemuxOutputStream extends OutputStream { BufferInfo bufferInfo = (BufferInfo) buffers.get(current); if (bufferInfo == null) { bufferInfo = new BufferInfo(); - bufferInfo.buffer = new ByteArrayOutputStream(); + bufferInfo.buffer = new ByteArrayOutputStream(INTIAL_SIZE); bufferInfo.crSeen = false; buffers.put(current, bufferInfo); } @@ -239,4 +242,30 @@ public class DemuxOutputStream extends OutputStream { processFlush(bufferInfo.buffer); } } + + public void write(byte b[], int off, int len) throws IOException { + // find the line breaks and pass other chars through in blocks + int offset = off; + int blockStartOffset = offset; + int remaining = len; + BufferInfo bufferInfo = getBufferInfo(); + while (remaining > 0) { + while (remaining > 0 && b[offset] != 0x0a && b[offset] != 0x0d) { + offset++; + remaining--; + } + // either end of buffer or a line separator char + int blockLength = offset - blockStartOffset; + if (blockLength > 0) { + project.log("Sending " + blockLength); + bufferInfo.buffer.write(b, blockStartOffset, blockLength); + } + while(remaining > 0 && (b[offset] == 0x0a || b[offset] == 0x0d)) { + write(b[offset]); + offset++; + remaining--; + } + blockStartOffset = offset; + } + } } diff --git a/src/main/org/apache/tools/ant/taskdefs/LogOutputStream.java b/src/main/org/apache/tools/ant/taskdefs/LogOutputStream.java index ccc7019c9..a389568b9 100644 --- a/src/main/org/apache/tools/ant/taskdefs/LogOutputStream.java +++ b/src/main/org/apache/tools/ant/taskdefs/LogOutputStream.java @@ -73,7 +73,11 @@ import org.apache.tools.ant.Task; */ public class LogOutputStream extends OutputStream { - private ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + /** Initial buffer size. */ + private static final int INTIAL_SIZE = 132; + + private ByteArrayOutputStream buffer + = new ByteArrayOutputStream(INTIAL_SIZE); private boolean skip = false; private Task task; @@ -157,4 +161,29 @@ public class LogOutputStream extends OutputStream { public int getMessageLevel() { return level; } + + public void write(byte b[], int off, int len) throws IOException { + // find the line breaks and pass other chars through in blocks + int offset = off; + int blockStartOffset = offset; + int remaining = len; + while (remaining > 0) { + while (remaining > 0 && b[offset] != 0x0a && b[offset] != 0x0d) { + offset++; + remaining--; + } + // either end of buffer or a line separator char + int blockLength = offset - blockStartOffset; + if (blockLength > 0) { + buffer.write(b, blockStartOffset, blockLength); + } + while(remaining > 0 && (b[offset] == 0x0a || b[offset] == 0x0d)) { + write(b[offset]); + offset++; + remaining--; + } + blockStartOffset = offset; + } + } + }