conor 02/02/25 05:28:58
Modified: proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution
BuildEventSupport.java ComponentManager.java
ExecutionManager.java Frame.java
proposal/mutant/src/java/antcore/org/apache/ant/antcore/modelparser
ProjectHandler.java
proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant
Task.java
proposal/mutant/src/java/cli/org/apache/ant/cli
Commandline.java
proposal/mutant/src/java/common/org/apache/ant/common/antlib
AbstractTask.java AntLibFactory.java
StandardLibFactory.java Task.java
proposal/mutant/src/java/common/org/apache/ant/common/model
Project.java
Added: proposal/mutant/src/java/common/org/apache/ant/common/util
DemuxOutputReceiver.java DemuxOutputStream.java
proposal/mutant/src/java/start/org/apache/tools/ant
Main.java
Log:
IMplement DemuxOutputStreams to capture System.out and System.err usage
Revision Changes Path
1.5 +42 -5
jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/BuildEventSupport.java
Index: BuildEventSupport.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/BuildEventSupport.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -u -r1.4 -r1.5
--- BuildEventSupport.java 20 Feb 2002 13:43:14 -0000 1.4
+++ BuildEventSupport.java 25 Feb 2002 13:28:57 -0000 1.5
@@ -54,12 +54,15 @@
package org.apache.ant.antcore.execution;
import java.util.ArrayList;
import java.util.Iterator;
-
+import java.util.Map;
+import java.util.HashMap;
import java.util.List;
-import org.apache.ant.common.model.ModelElement;
-import org.apache.ant.common.event.BuildListener;
-import org.apache.ant.common.event.BuildEvent;
import org.apache.ant.common.antlib.Task;
+import org.apache.ant.common.event.BuildEvent;
+import org.apache.ant.common.event.BuildListener;
+import org.apache.ant.common.model.ModelElement;
+import org.apache.ant.common.util.DemuxOutputReceiver;
+import org.apache.ant.common.event.MessageLevel;
/**
* BuildEventSupport is used by classes which which to send build events to
@@ -68,13 +71,16 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Conor MacNeill</a>
* @created 15 January 2002
*/
-public class BuildEventSupport {
+public class BuildEventSupport implements DemuxOutputReceiver {
/**
* The listeners attached to the object which contains this support
* object
*/
private List listeners = new ArrayList();
+ /** Records the latest task to be executed on a thread (Thread to Task).
*/
+ private Map threadTasks = new HashMap();
+
/**
* Gets the listeners of the BuildEventSupport
*
@@ -166,6 +172,9 @@
* @param task the task with which the event is associated
*/
public void fireTaskStarted(Task task) {
+ synchronized (this) {
+ threadTasks.put(Thread.currentThread(), task);
+ }
BuildEvent event = new BuildEvent(task, BuildEvent.TASK_STARTED);
for (Iterator i = listeners.iterator(); i.hasNext(); ) {
BuildListener listener = (BuildListener)i.next();
@@ -181,6 +190,11 @@
*/
public void fireTaskFinished(Task task,
Throwable cause) {
+ System.out.flush();
+ System.err.flush();
+ synchronized (this) {
+ threadTasks.remove(Thread.currentThread());
+ }
BuildEvent event = new BuildEvent(task, BuildEvent.TASK_FINISHED,
cause);
for (Iterator i = listeners.iterator(); i.hasNext(); ) {
@@ -202,6 +216,29 @@
for (Iterator i = listeners.iterator(); i.hasNext(); ) {
BuildListener listener = (BuildListener)i.next();
listener.messageLogged(event);
+ }
+ }
+
+ /**
+ * Demultiplexes output so that each task receives the appropriate
+ * messages. If the current thread is not currently executing a task,
+ * the message is logged directly.
+ *
+ * @param line Message to handle. Should not be <code>null</code>.
+ * @param isError Whether the text represents an error (<code>true</code>
+ * ) or information (<code>false</code>).
+ */
+ public void threadOutput(String line, boolean isError) {
+ Task task = (Task)threadTasks.get(Thread.currentThread());
+ if (task == null) {
+ fireMessageLogged(this, line,
+ isError ? MessageLevel.MSG_ERR : MessageLevel.MSG_INFO);
+ } else {
+ if (isError) {
+ task.handleSystemErr(line);
+ } else {
+ task.handleSystemOut(line);
+ }
}
}
}
1.7 +5 -0
jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ComponentManager.java
Index: ComponentManager.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ComponentManager.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -w -u -r1.6 -r1.7
--- ComponentManager.java 20 Feb 2002 13:43:14 -0000 1.6
+++ ComponentManager.java 25 Feb 2002 13:28:57 -0000 1.7
@@ -422,7 +422,12 @@
throws ExecutionException {
ImportInfo definition = getDefinition(componentName);
+ if (definition == null) {
+ throw new ExecutionException("There is no definition of the <"
+ + componentName + "> component");
+ }
String className = definition.getClassName();
+
ComponentLibrary componentLibrary
= definition.getComponentLibrary();
String localName = definition.getLocalName();
1.10 +14 -1
jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionManager.java
Index: ExecutionManager.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/ExecutionManager.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -w -u -r1.9 -r1.10
--- ExecutionManager.java 19 Feb 2002 02:12:21 -0000 1.9
+++ ExecutionManager.java 25 Feb 2002 13:28:57 -0000 1.10
@@ -64,6 +64,7 @@
import org.apache.ant.common.model.Project;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.ExecutionException;
+import org.apache.ant.common.util.DemuxOutputReceiver;
import org.apache.ant.init.InitConfig;
/**
@@ -75,7 +76,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Conor MacNeill</a>
* @created 12 January 2002
*/
-public class ExecutionManager {
+public class ExecutionManager implements DemuxOutputReceiver {
/** The AntLibraries built from Ant's Populated Task Libraries. */
private Map antLibraries = new HashMap();
@@ -210,6 +211,18 @@
if (mainFrame != null) {
mainFrame.removeBuildListener(listener);
}
+ }
+
+ /**
+ * Handle the content from a single thread. This method will be called
+ * by the thread producing the content. The content is broken up into
+ * separate lines
+ *
+ * @param line the content produce by the current thread.
+ * @param isErr true if this content is from the thread's error stream.
+ */
+ public void threadOutput(String line, boolean isErr) {
+ eventSupport.threadOutput(line, isErr);
}
}
1.7 +31 -21
jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Frame.java
Index: Frame.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/execution/Frame.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -w -u -r1.6 -r1.7
--- Frame.java 20 Feb 2002 13:43:14 -0000 1.6
+++ Frame.java 25 Feb 2002 13:28:57 -0000 1.7
@@ -74,6 +74,7 @@
import org.apache.ant.common.service.MagicProperties;
import org.apache.ant.common.util.AntException;
import org.apache.ant.common.util.ConfigException;
+import org.apache.ant.common.util.DemuxOutputReceiver;
import org.apache.ant.common.util.ExecutionException;
import org.apache.ant.common.util.FileUtils;
import org.apache.ant.init.InitConfig;
@@ -86,7 +87,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Conor MacNeill</a>
* @created 14 January 2002
*/
-public class Frame {
+public class Frame implements DemuxOutputReceiver {
/** the base dir of the project */
private File baseDir;
@@ -143,9 +144,7 @@
*/
private ComponentManager componentManager;
- /**
- * The core's execution Service
- */
+ /** The core's execution Service */
private CoreExecService execService;
/**
@@ -166,6 +165,18 @@
}
/**
+ * Replace ${} style constructions in the given value with the string
+ * value of the corresponding data values in the frame
+ *
+ * @param value the string to be scanned for property references.
+ * @return the string with all property references replaced
+ * @exception ExecutionException if any of the properties do not exist
+ */
+ public String replacePropertyRefs(String value) throws
ExecutionException {
+ return dataService.replacePropertyRefs(value);
+ }
+
+ /**
* Sets the Project of the Frame
*
* @param project The new Project value
@@ -190,18 +201,6 @@
}
/**
- * Replace ${} style constructions in the given value with the string
- * value of the corresponding data values in the frame
- *
- * @param value the string to be scanned for property references.
- * @return the string with all property references replaced
- * @exception ExecutionException if any of the properties do not exist
- */
- public String replacePropertyRefs(String value) throws
ExecutionException {
- return dataService.replacePropertyRefs(value);
- }
-
- /**
* Set a value in this frame or any of its imported frames.
*
* @param name the name of the value
@@ -603,7 +602,6 @@
} catch (ConfigException e) {
throw new ExecutionException(e);
}
-
}
/**
@@ -710,6 +708,18 @@
}
/**
+ * Handle the content from a single thread. This method will be called
+ * by the thread producing the content. The content is broken up into
+ * separate lines
+ *
+ * @param line the content produce by the current thread.
+ * @param isErr true if this content is from the thread's error stream.
+ */
+ public void threadOutput(String line, boolean isErr) {
+ eventSupport.threadOutput(line, isErr);
+ }
+
+ /**
* Determine the base directory for each frame in the frame hierarchy
*
* @exception ExecutionException if the base directories cannot be
1.3 +18 -5
jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/modelparser/ProjectHandler.java
Index: ProjectHandler.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/antcore/org/apache/ant/antcore/modelparser/ProjectHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -u -r1.2 -r1.3
--- ProjectHandler.java 18 Feb 2002 12:36:04 -0000 1.2
+++ ProjectHandler.java 25 Feb 2002 13:28:57 -0000 1.3
@@ -76,6 +76,15 @@
/** The default attribute name */
public static final String DEFAULT_ATTR = "default";
+ /** The name of the element used to define references */
+ public static final String REF_ELEMENT = "ant:ref";
+
+ /** The name of the element used to define references */
+ public static final String INCLUDE_ELEMENT = "ant:include";
+
+ /** The name of the element used to define references */
+ public static final String TARGET_ELEMENT = "target";
+
/** The project being parsed. */
private Project project;
@@ -149,7 +158,7 @@
Attributes attributes)
throws SAXParseException {
- if (qualifiedName.equals("ref")) {
+ if (qualifiedName.equals(REF_ELEMENT)) {
RefHandler refHandler = new RefHandler();
refHandler.start(getParseContext(), getXMLReader(), this,
getLocator(), attributes, getElementSource(),
@@ -160,12 +169,12 @@
} catch (ModelException e) {
throw new SAXParseException(e.getMessage(), getLocator(), e);
}
- } else if (qualifiedName.equals("include")) {
+ } else if (qualifiedName.equals(INCLUDE_ELEMENT)) {
IncludeHandler includeHandler = new IncludeHandler(project);
includeHandler.start(getParseContext(), getXMLReader(),
this, getLocator(), attributes, getElementSource(),
qualifiedName);
- } else if (qualifiedName.equals("target")) {
+ } else if (qualifiedName.equals(TARGET_ELEMENT)) {
TargetHandler targetHandler = new TargetHandler();
targetHandler.start(getParseContext(), getXMLReader(),
this, getLocator(), attributes,
@@ -175,13 +184,17 @@
} catch (ModelException e) {
throw new SAXParseException(e.getMessage(), getLocator(), e);
}
- } else {
+ } else if (localName != null) {
// everything else is a task
BuildElementHandler buildElementHandler = new
BuildElementHandler();
buildElementHandler.start(getParseContext(), getXMLReader(),
this, getLocator(), attributes, getElementSource(),
qualifiedName);
project.addTask(buildElementHandler.getBuildElement());
+ } else {
+ // ignore namespaced elements
+ throw new SAXParseException("Only the \"ant\" namespace is "
+ + "currently recognized (" + qualifiedName + ")", getLocator());
}
}
1.6 +25 -0
jakarta-ant/proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Task.java
Index: Task.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/antlibs/ant1compat/org/apache/tools/ant/Task.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -w -u -r1.5 -r1.6
--- Task.java 20 Feb 2002 13:43:15 -0000 1.5
+++ Task.java 25 Feb 2002 13:28:57 -0000 1.6
@@ -165,6 +165,31 @@
}
/**
+ * Handle Output produced by the task. When a task prints to System.out
+ * the container may catch this and redirect the content back to the
+ * task by invoking this method. This method must NOT call System.out,
+ * directly or indirectly.
+ *
+ * @param line The line of content produce by the task
+ */
+ public void handleSystemOut(String line) {
+ handleOutput(line);
+ }
+
+ /**
+ * Handle error information produced by the task. When a task prints to
+ * System.err the container may catch this and redirect the content back
+ * to the task by invoking this method. This method must NOT call
+ * System.err, directly or indirectly.
+ *
+ * @param line The line of error info produce by the task
+ */
+ public void handleSystemErr(String line) {
+ // default behaviout is to log at WARN level
+ handleErrorOutput(line);
+ }
+
+ /**
* Handle output captured for this task
*
* @param line the captured output
1.11 +8 -0
jakarta-ant/proposal/mutant/src/java/cli/org/apache/ant/cli/Commandline.java
Index: Commandline.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/cli/org/apache/ant/cli/Commandline.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -w -u -r1.10 -r1.11
--- Commandline.java 19 Feb 2002 02:12:21 -0000 1.10
+++ Commandline.java 25 Feb 2002 13:28:57 -0000 1.11
@@ -57,6 +57,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
+import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
@@ -75,6 +76,7 @@
import org.apache.ant.common.event.MessageLevel;
import org.apache.ant.common.model.Project;
import org.apache.ant.common.util.ConfigException;
+import org.apache.ant.common.util.DemuxOutputStream;
import org.apache.ant.init.InitConfig;
import org.apache.ant.init.InitUtils;
@@ -298,6 +300,12 @@
// create the execution manager to execute the build
executionManager = new ExecutionManager(initConfig, config);
+ OutputStream demuxOut
+ = new DemuxOutputStream(executionManager, false);
+ OutputStream demuxErr
+ = new DemuxOutputStream(executionManager, true);
+ System.setOut(new PrintStream(demuxOut));
+ System.setErr(new PrintStream(demuxErr));
addBuildListeners(executionManager);
} catch (Throwable e) {
if (logger != null) {
1.4 +26 -0
jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/antlib/AbstractTask.java
Index: AbstractTask.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/antlib/AbstractTask.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -w -u -r1.3 -r1.4
--- AbstractTask.java 20 Feb 2002 13:43:15 -0000 1.3
+++ AbstractTask.java 25 Feb 2002 13:28:57 -0000 1.4
@@ -52,6 +52,7 @@
* <http://www.apache.org/>.
*/
package org.apache.ant.common.antlib;
+import org.apache.ant.common.event.MessageLevel;
/**
* Abstract implementation of the Task interface
@@ -81,5 +82,30 @@
return taskName;
}
+ /**
+ * Handle Output produced by the task. When a task prints to System.out
+ * the container may catch this and redirect the content back to the
+ * task by invoking this method. This method must NOT call System.out,
+ * directly or indirectly.
+ *
+ * @param line The line of content produce by the task
+ */
+ public void handleSystemOut(String line) {
+ // default behaviout is to log at INFO level
+ log(line, MessageLevel.MSG_INFO);
+ }
+
+ /**
+ * Handle error information produced by the task. When a task prints to
+ * System.err the container may catch this and redirect the content back
+ * to the task by invoking this method. This method must NOT call
+ * System.err, directly or indirectly.
+ *
+ * @param line The line of error info produce by the task
+ */
+ public void handleSystemErr(String line) {
+ // default behaviout is to log at WARN level
+ log(line, MessageLevel.MSG_WARN);
+ }
}
1.5 +118 -118
jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/antlib/AntLibFactory.java
Index: AntLibFactory.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/antlib/AntLibFactory.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -u -r1.4 -r1.5
1.5 +135 -135
jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/antlib/StandardLibFactory.java
Index: StandardLibFactory.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/antlib/StandardLibFactory.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -u -r1.4 -r1.5
1.3 +20 -0
jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/antlib/Task.java
Index: Task.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/antlib/Task.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -u -r1.2 -r1.3
--- Task.java 20 Feb 2002 13:43:15 -0000 1.2
+++ Task.java 25 Feb 2002 13:28:58 -0000 1.3
@@ -81,5 +81,25 @@
* @return the taskName value
*/
String getTaskName();
+
+ /**
+ * Handle Output produced by the task. When a task prints to System.out
+ * the container may catch this and redirect the content back to the
+ * task by invoking this method. This method must NOT call System.out,
+ * directly or indirectly.
+ *
+ * @param line The line of content produce by the task
+ */
+ void handleSystemOut(String line);
+
+ /**
+ * Handle error information produced by the task. When a task prints to
+ * System.err the container may catch this and redirect the content back
+ * to the task by invoking this method. This method must NOT call
+ * System.err, directly or indirectly.
+ *
+ * @param line The line of error info produce by the task
+ */
+ void handleSystemErr(String line);
}
1.3 +25 -14
jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/model/Project.java
Index: Project.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/model/Project.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -u -r1.2 -r1.3
--- Project.java 18 Feb 2002 12:36:05 -0000 1.2
+++ Project.java 25 Feb 2002 13:28:58 -0000 1.3
@@ -253,9 +253,16 @@
*
* @param fullTargetName The name of the target relative to this project
* @return the Target object with the given name
+ * @exception ModelException if the given target does not exist in this
+ * project
*/
- public Target getRefTarget(String fullTargetName) {
+ public Target getRefTarget(String fullTargetName) throws ModelException {
Project containingProject = getRefProject(fullTargetName);
+ if (containingProject == null) {
+ throw new ModelException("The target name \"" + fullTargetName
+ + "\" does not exist in this project");
+ }
+
if (containingProject == this) {
return getTarget(fullTargetName);
}
@@ -504,6 +511,7 @@
if (flattenedList.contains(fullTargetName)) {
return;
}
+ try {
String fullProjectName = getFullProjectName(fullTargetName);
Target target = getRefTarget(fullTargetName);
if (target == null) {
@@ -517,6 +525,9 @@
: fullProjectName + REF_DELIMITER + localDependencyName;
flattenDependency(flattenedList, fullDependencyName);
flattenedList.add(fullDependencyName);
+ }
+ } catch (ModelException e) {
+ throw new ConfigException(e);
}
}
}
1.1
jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/util/DemuxOutputReceiver.java
Index: DemuxOutputReceiver.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.ant.common.util;
/**
* A Demux output receiver receives buffered content which has been
* demultiplexed from the output potentially generated by multiple threads
*
* @author <a href="mailto:[EMAIL PROTECTED]">Conor MacNeill</a>
* @created 22 February 2002
*/
public interface DemuxOutputReceiver {
/**
* Handle the content from a single thread. This method will be called
* by the thread producing the content. The content is broken up into
* separate lines
*
* @param line the content produce by the current thread.
* @param isErr true if this content is from the thread's error stream.
*/
void threadOutput(String line, boolean isErr);
}
1.1
jakarta-ant/proposal/mutant/src/java/common/org/apache/ant/common/util/DemuxOutputStream.java
Index: DemuxOutputStream.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.ant.common.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Hashtable;
/**
* Buffers content written per thread and forwards the buffers onto the
* given receiver
*
* @author <a href="mailto:[EMAIL PROTECTED]">Conor MacNeill</a>
* @created 22 February 2002
*/
public class DemuxOutputStream extends OutputStream {
/**
* A data class to store information about a buffer. Such informatio is
* stored on a per-thread basis.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Conor MacNeill</a>
* @created 22 February 2002
*/
private static class BufferInfo {
/** The per-thread output stream */
private ByteArrayOutputStream buffer;
/**
* Whether the next line-terminator should be skipped in terms of
* processing the buffer or not. Used to avoid \r\n invoking
* processBuffer twice.
*/
private boolean skip = false;
}
/** Maximum buffer size */
private static final int MAX_SIZE = 1024;
/** Mapping from thread to buffer (Thread to BufferInfo) */
private Hashtable buffers = new Hashtable();
/** The object which receives the output */
private DemuxOutputReceiver receiver;
/** Whether or not this stream represents an error stream */
private boolean isErrorStream;
/**
* Creates a new instance of this class.
*
* @param isErrorStream true if this is the error string, otherwise a
* normal output stream. This is passed to the project so it knows
* which stream it is receiving.
* @param receiver The receiver to which demux'd content is sent.
*/
public DemuxOutputStream(DemuxOutputReceiver receiver,
boolean isErrorStream) {
this.receiver = receiver;
this.isErrorStream = isErrorStream;
}
/**
* Writes the data to the buffer and flushes the buffer if a line
* separator is detected or if the buffer has reached its maximum size.
*
* @param cc data to log (byte).
* @exception IOException if the data cannot be written to the stream
*/
public void write(int cc) throws IOException {
final byte c = (byte)cc;
BufferInfo bufferInfo = getBufferInfo();
if ((c == '\n') || (c == '\r')) {
if (!bufferInfo.skip) {
processBuffer(bufferInfo.buffer);
}
} else {
bufferInfo.buffer.write(cc);
if (bufferInfo.buffer.size() > MAX_SIZE) {
processBuffer(bufferInfo.buffer);
}
}
bufferInfo.skip = (c == '\r');
}
/**
* Equivalent to calling [EMAIL PROTECTED] #flush flush} on the stream.
*
* @exception IOException if there is a problem closing the stream.
*/
public void close() throws IOException {
flush();
}
/**
* Writes all remaining data in the buffer associated with the current
* thread to the project.
*
* @exception IOException if there is a problem flushing the stream.
*/
public void flush() throws IOException {
BufferInfo bufferInfo = getBufferInfo();
if (bufferInfo.buffer.size() > 0) {
processBuffer(bufferInfo.buffer);
}
}
/**
* Converts the buffer to a string and sends it to [EMAIL PROTECTED]
* Project#demuxOutput(String,boolean) Project.demuxOutput}.
*
* @param buffer the ByteArrayOutputStream used to collect the output
* until a line separator is seen.
*/
protected void processBuffer(ByteArrayOutputStream buffer) {
String output = buffer.toString();
receiver.threadOutput(output, isErrorStream);
resetBufferInfo();
}
/**
* Returns the buffer associated with the current thread.
*
* @return a ByteArrayOutputStream for the current thread to write data
* to
*/
private BufferInfo getBufferInfo() {
Thread current = Thread.currentThread();
BufferInfo bufferInfo = (BufferInfo)buffers.get(current);
if (bufferInfo == null) {
bufferInfo = new BufferInfo();
bufferInfo.buffer = new ByteArrayOutputStream();
bufferInfo.skip = false;
buffers.put(current, bufferInfo);
}
return bufferInfo;
}
/** Resets the buffer for the current thread. */
private void resetBufferInfo() {
Thread current = Thread.currentThread();
buffers.remove(current);
}
}
1.1
jakarta-ant/proposal/mutant/src/java/start/org/apache/tools/ant/Main.java
Index: Main.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant;
/**
* Old Ant1 entry point
*
* @author <a href="mailto:[EMAIL PROTECTED]">Conor MacNeill</a>
*/
public class Main {
/**
* Entry point for starting command line Ant
*
* @param args commandline arguments
*/
public static void main(String[] args) {
org.apache.ant.start.Main.main(args);
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>