git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271488 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1,126 +0,0 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant; | |||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.io.IOException; | |||||
| import java.io.OutputStream; | |||||
| import java.util.Hashtable; | |||||
| /** | |||||
| * Logs content written by a thread and forwards the buffers onto the project | |||||
| * object which will forward the content to the appropriate task | |||||
| * | |||||
| * @author Conor MacNeill | |||||
| */ | |||||
| public class DemuxOutputStream extends OutputStream | |||||
| { | |||||
| private final static int MAX_SIZE = 1024; | |||||
| private Hashtable buffers = new Hashtable(); | |||||
| // private ByteArrayOutputStream buffer = new ByteArrayOutputStream(); | |||||
| private boolean skip = false; | |||||
| private boolean isErrorStream; | |||||
| private Project project; | |||||
| /** | |||||
| * Creates a new instance of this class. | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param isErrorStream Description of Parameter | |||||
| */ | |||||
| public DemuxOutputStream( Project project, boolean isErrorStream ) | |||||
| { | |||||
| this.project = project; | |||||
| this.isErrorStream = isErrorStream; | |||||
| } | |||||
| /** | |||||
| * Writes all remaining | |||||
| * | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public void close() | |||||
| throws IOException | |||||
| { | |||||
| flush(); | |||||
| } | |||||
| /** | |||||
| * Writes all remaining | |||||
| * | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public void flush() | |||||
| throws IOException | |||||
| { | |||||
| if( getBuffer().size() > 0 ) | |||||
| { | |||||
| processBuffer(); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Write the data to the buffer and flush the buffer, if a line separator is | |||||
| * detected. | |||||
| * | |||||
| * @param cc data to log (byte). | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public void write( int cc ) | |||||
| throws IOException | |||||
| { | |||||
| final byte c = (byte)cc; | |||||
| if( ( c == '\n' ) || ( c == '\r' ) ) | |||||
| { | |||||
| if( !skip ) | |||||
| { | |||||
| processBuffer(); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| ByteArrayOutputStream buffer = getBuffer(); | |||||
| buffer.write( cc ); | |||||
| if( buffer.size() > MAX_SIZE ) | |||||
| { | |||||
| processBuffer(); | |||||
| } | |||||
| } | |||||
| skip = ( c == '\r' ); | |||||
| } | |||||
| /** | |||||
| * Converts the buffer to a string and sends it to <code>processLine</code> | |||||
| */ | |||||
| protected void processBuffer() | |||||
| { | |||||
| String output = getBuffer().toString(); | |||||
| project.demuxOutput( output, isErrorStream ); | |||||
| resetBuffer(); | |||||
| } | |||||
| private ByteArrayOutputStream getBuffer() | |||||
| { | |||||
| Thread current = Thread.currentThread(); | |||||
| ByteArrayOutputStream buffer = (ByteArrayOutputStream)buffers.get( current ); | |||||
| if( buffer == null ) | |||||
| { | |||||
| buffer = new ByteArrayOutputStream(); | |||||
| buffers.put( current, buffer ); | |||||
| } | |||||
| return buffer; | |||||
| } | |||||
| private void resetBuffer() | |||||
| { | |||||
| Thread current = Thread.currentThread(); | |||||
| buffers.remove( current ); | |||||
| } | |||||
| } | |||||
| @@ -1,79 +0,0 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant; | |||||
| import java.util.Enumeration; | |||||
| import java.util.Hashtable; | |||||
| import org.apache.tools.ant.types.FilterSet; | |||||
| /** | |||||
| * Central representation of an Ant project. This class defines a Ant project | |||||
| * with all of it's targets and tasks. It also provides the mechanism to kick | |||||
| * off a build using a particular target name. <p> | |||||
| * | |||||
| * This class also encapsulates methods which allow Files to be refered to using | |||||
| * abstract path names which are translated to native system file paths at | |||||
| * runtime as well as defining various project properties. | |||||
| * | |||||
| * @author duncan@x180.com | |||||
| */ | |||||
| public class Project | |||||
| { | |||||
| private Hashtable properties = new Hashtable(); | |||||
| private FilterSet globalFilterSet = new FilterSet(); | |||||
| /** | |||||
| * Records the latest task on a thread | |||||
| */ | |||||
| private Hashtable threadTasks = new Hashtable(); | |||||
| public FilterSet getGlobalFilterSet() | |||||
| { | |||||
| return globalFilterSet; | |||||
| } | |||||
| /** | |||||
| * get a copy of the property hashtable | |||||
| * | |||||
| * @return the hashtable containing all properties, user included | |||||
| */ | |||||
| public Hashtable getProperties() | |||||
| { | |||||
| Hashtable propertiesCopy = new Hashtable(); | |||||
| Enumeration e = properties.keys(); | |||||
| while( e.hasMoreElements() ) | |||||
| { | |||||
| Object name = e.nextElement(); | |||||
| Object value = properties.get( name ); | |||||
| propertiesCopy.put( name, value ); | |||||
| } | |||||
| return propertiesCopy; | |||||
| } | |||||
| public void demuxOutput( String line, boolean isError ) | |||||
| { | |||||
| Task task = (Task)threadTasks.get( Thread.currentThread() ); | |||||
| if( task == null ) | |||||
| { | |||||
| //fireMessageLogged( this, line, isError ? MSG_ERR : MSG_INFO ); | |||||
| } | |||||
| else | |||||
| { | |||||
| if( isError ) | |||||
| { | |||||
| task.handleErrorOutput( line ); | |||||
| } | |||||
| else | |||||
| { | |||||
| task.handleOutput( line ); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,126 +0,0 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant; | |||||
| import java.io.ByteArrayOutputStream; | |||||
| import java.io.IOException; | |||||
| import java.io.OutputStream; | |||||
| import java.util.Hashtable; | |||||
| /** | |||||
| * Logs content written by a thread and forwards the buffers onto the project | |||||
| * object which will forward the content to the appropriate task | |||||
| * | |||||
| * @author Conor MacNeill | |||||
| */ | |||||
| public class DemuxOutputStream extends OutputStream | |||||
| { | |||||
| private final static int MAX_SIZE = 1024; | |||||
| private Hashtable buffers = new Hashtable(); | |||||
| // private ByteArrayOutputStream buffer = new ByteArrayOutputStream(); | |||||
| private boolean skip = false; | |||||
| private boolean isErrorStream; | |||||
| private Project project; | |||||
| /** | |||||
| * Creates a new instance of this class. | |||||
| * | |||||
| * @param project Description of Parameter | |||||
| * @param isErrorStream Description of Parameter | |||||
| */ | |||||
| public DemuxOutputStream( Project project, boolean isErrorStream ) | |||||
| { | |||||
| this.project = project; | |||||
| this.isErrorStream = isErrorStream; | |||||
| } | |||||
| /** | |||||
| * Writes all remaining | |||||
| * | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public void close() | |||||
| throws IOException | |||||
| { | |||||
| flush(); | |||||
| } | |||||
| /** | |||||
| * Writes all remaining | |||||
| * | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public void flush() | |||||
| throws IOException | |||||
| { | |||||
| if( getBuffer().size() > 0 ) | |||||
| { | |||||
| processBuffer(); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Write the data to the buffer and flush the buffer, if a line separator is | |||||
| * detected. | |||||
| * | |||||
| * @param cc data to log (byte). | |||||
| * @exception IOException Description of Exception | |||||
| */ | |||||
| public void write( int cc ) | |||||
| throws IOException | |||||
| { | |||||
| final byte c = (byte)cc; | |||||
| if( ( c == '\n' ) || ( c == '\r' ) ) | |||||
| { | |||||
| if( !skip ) | |||||
| { | |||||
| processBuffer(); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| ByteArrayOutputStream buffer = getBuffer(); | |||||
| buffer.write( cc ); | |||||
| if( buffer.size() > MAX_SIZE ) | |||||
| { | |||||
| processBuffer(); | |||||
| } | |||||
| } | |||||
| skip = ( c == '\r' ); | |||||
| } | |||||
| /** | |||||
| * Converts the buffer to a string and sends it to <code>processLine</code> | |||||
| */ | |||||
| protected void processBuffer() | |||||
| { | |||||
| String output = getBuffer().toString(); | |||||
| project.demuxOutput( output, isErrorStream ); | |||||
| resetBuffer(); | |||||
| } | |||||
| private ByteArrayOutputStream getBuffer() | |||||
| { | |||||
| Thread current = Thread.currentThread(); | |||||
| ByteArrayOutputStream buffer = (ByteArrayOutputStream)buffers.get( current ); | |||||
| if( buffer == null ) | |||||
| { | |||||
| buffer = new ByteArrayOutputStream(); | |||||
| buffers.put( current, buffer ); | |||||
| } | |||||
| return buffer; | |||||
| } | |||||
| private void resetBuffer() | |||||
| { | |||||
| Thread current = Thread.currentThread(); | |||||
| buffers.remove( current ); | |||||
| } | |||||
| } | |||||
| @@ -1,79 +0,0 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.tools.ant; | |||||
| import java.util.Enumeration; | |||||
| import java.util.Hashtable; | |||||
| import org.apache.tools.ant.types.FilterSet; | |||||
| /** | |||||
| * Central representation of an Ant project. This class defines a Ant project | |||||
| * with all of it's targets and tasks. It also provides the mechanism to kick | |||||
| * off a build using a particular target name. <p> | |||||
| * | |||||
| * This class also encapsulates methods which allow Files to be refered to using | |||||
| * abstract path names which are translated to native system file paths at | |||||
| * runtime as well as defining various project properties. | |||||
| * | |||||
| * @author duncan@x180.com | |||||
| */ | |||||
| public class Project | |||||
| { | |||||
| private Hashtable properties = new Hashtable(); | |||||
| private FilterSet globalFilterSet = new FilterSet(); | |||||
| /** | |||||
| * Records the latest task on a thread | |||||
| */ | |||||
| private Hashtable threadTasks = new Hashtable(); | |||||
| public FilterSet getGlobalFilterSet() | |||||
| { | |||||
| return globalFilterSet; | |||||
| } | |||||
| /** | |||||
| * get a copy of the property hashtable | |||||
| * | |||||
| * @return the hashtable containing all properties, user included | |||||
| */ | |||||
| public Hashtable getProperties() | |||||
| { | |||||
| Hashtable propertiesCopy = new Hashtable(); | |||||
| Enumeration e = properties.keys(); | |||||
| while( e.hasMoreElements() ) | |||||
| { | |||||
| Object name = e.nextElement(); | |||||
| Object value = properties.get( name ); | |||||
| propertiesCopy.put( name, value ); | |||||
| } | |||||
| return propertiesCopy; | |||||
| } | |||||
| public void demuxOutput( String line, boolean isError ) | |||||
| { | |||||
| Task task = (Task)threadTasks.get( Thread.currentThread() ); | |||||
| if( task == null ) | |||||
| { | |||||
| //fireMessageLogged( this, line, isError ? MSG_ERR : MSG_INFO ); | |||||
| } | |||||
| else | |||||
| { | |||||
| if( isError ) | |||||
| { | |||||
| task.handleErrorOutput( line ); | |||||
| } | |||||
| else | |||||
| { | |||||
| task.handleOutput( line ); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||