aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LeadPipeInputStream.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LeadPipeInputStream.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LeadPipeInputStream.java161
1 files changed, 161 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LeadPipeInputStream.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LeadPipeInputStream.java
new file mode 100644
index 00000000..00819128
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/LeadPipeInputStream.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.tools.ant.util;
+
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.Task;
+
+/**
+ * Special <code>PipedInputStream</code> that will not die
+ * when the writing <code>Thread</code> is no longer alive.
+ * @since Ant 1.6.2
+ */
+public class LeadPipeInputStream extends PipedInputStream {
+ private static final int BYTE_MASK = 0xFF;
+ private ProjectComponent managingPc;
+
+ /**
+ * Construct a new <code>LeadPipeInputStream</code>.
+ */
+ public LeadPipeInputStream() {
+ super();
+ }
+
+ /**
+ * Construct a new <code>LeadPipeInputStream</code>
+ * with the specified buffer size.
+ * @param size the size of the circular buffer.
+ */
+ public LeadPipeInputStream(int size) {
+ super();
+ setBufferSize(size);
+ }
+
+ /**
+ * Construct a new <code>LeadPipeInputStream</code> to pull
+ * from the specified <code>PipedOutputStream</code>.
+ * @param src the <code>PipedOutputStream</code> source.
+ * @throws IOException if unable to construct the stream.
+ */
+ public LeadPipeInputStream(PipedOutputStream src) throws IOException {
+ super(src);
+ }
+
+ /**
+ * Construct a new <code>LeadPipeInputStream</code> to pull
+ * from the specified <code>PipedOutputStream</code>, using a
+ * circular buffer of the specified size.
+ * @param src the <code>PipedOutputStream</code> source.
+ * @param size the size of the circular buffer.
+ * @throws IOException if there is an error.
+ */
+ public LeadPipeInputStream(PipedOutputStream src, int size) throws IOException {
+ super(src);
+ setBufferSize(size);
+ }
+
+ //inherit doc
+ /**
+ * Read a byte from the stream.
+ * @return the byte (0 to 255) or -1 if there are no more.
+ * @throws IOException if there is an error.
+ */
+ public synchronized int read() throws IOException {
+ int result = -1;
+ try {
+ result = super.read();
+ } catch (IOException eyeOhEx) {
+ String msg = eyeOhEx.getMessage();
+ if ("write end dead".equalsIgnoreCase(msg)
+ || "pipe broken".equalsIgnoreCase(msg)) {
+ if (super.in > 0 && super.out < super.buffer.length
+ && super.out > super.in) {
+ result = super.buffer[super.out++] & BYTE_MASK;
+ }
+ } else {
+ log("error at LeadPipeInputStream.read(): " + msg,
+ Project.MSG_INFO);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Set the size of the buffer.
+ * @param size the new buffer size. Ignored if &lt;= current size.
+ */
+ public synchronized void setBufferSize(int size) {
+ if (size > buffer.length) {
+ byte[] newBuffer = new byte[size];
+ if (in >= 0) {
+ if (in > out) {
+ System.arraycopy(buffer, out, newBuffer, out, in - out);
+ } else {
+ int outlen = buffer.length - out;
+ System.arraycopy(buffer, out, newBuffer, 0, outlen);
+ System.arraycopy(buffer, 0, newBuffer, outlen, in);
+ in += outlen;
+ out = 0;
+ }
+ }
+ buffer = newBuffer;
+ }
+ }
+
+ /**
+ * Set a managing <code>Task</code> for
+ * this <code>LeadPipeInputStream</code>.
+ * @param task the managing <code>Task</code>.
+ */
+ public void setManagingTask(Task task) {
+ setManagingComponent(task);
+ }
+
+ /**
+ * Set a managing <code>ProjectComponent</code> for
+ * this <code>LeadPipeInputStream</code>.
+ * @param pc the managing <code>ProjectComponent</code>.
+ */
+ public void setManagingComponent(ProjectComponent pc) {
+ this.managingPc = pc;
+ }
+
+ /**
+ * Log a message with the specified logging level.
+ * @param message the <code>String</code> message.
+ * @param loglevel the <code>int</code> logging level.
+ */
+ public void log(String message, int loglevel) {
+ if (managingPc != null) {
+ managingPc.log(message, loglevel);
+ } else {
+ if (loglevel > Project.MSG_WARN) {
+ System.out.println(message);
+ } else {
+ System.err.println(message);
+ }
+ }
+ }
+}
+