git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270187 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1,171 +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 file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs; | |||||
| import java.util.Enumeration; | |||||
| import java.util.Vector; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.tools.ant.Location; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.TaskContainer; | |||||
| /** | |||||
| * Implements a multi threaded task execution. <p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @author Thomas Christen <a href="mailto:chr@active.ch">chr@active.ch</a> | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill </a> | |||||
| */ | |||||
| public class Parallel extends Task | |||||
| implements TaskContainer | |||||
| { | |||||
| /** | |||||
| * Collection holding the nested tasks | |||||
| */ | |||||
| private Vector nestedTasks = new Vector(); | |||||
| /** | |||||
| * Add a nested task to execute parallel (asynchron). <p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @param nestedTask Nested task to be executed in parallel | |||||
| * @exception TaskException Description of Exception | |||||
| */ | |||||
| public void addTask( Task nestedTask ) | |||||
| throws TaskException | |||||
| { | |||||
| nestedTasks.addElement( nestedTask ); | |||||
| } | |||||
| /** | |||||
| * Block execution until the specified time or for a specified amount of | |||||
| * milliseconds and if defined, execute the wait status. | |||||
| * | |||||
| * @exception TaskException Description of Exception | |||||
| */ | |||||
| public void execute() | |||||
| throws TaskException | |||||
| { | |||||
| TaskThread[] threads = new TaskThread[ nestedTasks.size() ]; | |||||
| int threadNumber = 0; | |||||
| for( Enumeration e = nestedTasks.elements(); e.hasMoreElements(); threadNumber++ ) | |||||
| { | |||||
| Task nestedTask = (Task)e.nextElement(); | |||||
| threads[ threadNumber ] = new TaskThread( threadNumber, nestedTask ); | |||||
| } | |||||
| // now start all threads | |||||
| for( int i = 0; i < threads.length; ++i ) | |||||
| { | |||||
| threads[ i ].start(); | |||||
| } | |||||
| // now join to all the threads | |||||
| for( int i = 0; i < threads.length; ++i ) | |||||
| { | |||||
| try | |||||
| { | |||||
| threads[ i ].join(); | |||||
| } | |||||
| catch( InterruptedException ie ) | |||||
| { | |||||
| // who would interrupt me at a time like this? | |||||
| } | |||||
| } | |||||
| // now did any of the threads throw an exception | |||||
| StringBuffer exceptionMessage = new StringBuffer(); | |||||
| String lSep = System.getProperty( "line.separator" ); | |||||
| int numExceptions = 0; | |||||
| Throwable firstException = null; | |||||
| Location firstLocation = Location.UNKNOWN_LOCATION; | |||||
| ; | |||||
| for( int i = 0; i < threads.length; ++i ) | |||||
| { | |||||
| Throwable t = threads[ i ].getException(); | |||||
| if( t != null ) | |||||
| { | |||||
| numExceptions++; | |||||
| if( firstException == null ) | |||||
| { | |||||
| firstException = t; | |||||
| } | |||||
| /* | |||||
| if( t instanceof TaskException && | |||||
| firstLocation == Location.UNKNOWN_LOCATION ) | |||||
| { | |||||
| firstLocation = ( (TaskException)t ).getLocation(); | |||||
| } | |||||
| */ | |||||
| exceptionMessage.append( lSep ); | |||||
| exceptionMessage.append( t.getMessage() ); | |||||
| } | |||||
| } | |||||
| if( numExceptions == 1 ) | |||||
| { | |||||
| if( firstException instanceof TaskException ) | |||||
| { | |||||
| throw (TaskException)firstException; | |||||
| } | |||||
| else | |||||
| { | |||||
| throw new TaskException( "Error", firstException ); | |||||
| } | |||||
| } | |||||
| else if( numExceptions > 1 ) | |||||
| { | |||||
| throw new TaskException( exceptionMessage.toString() ); | |||||
| } | |||||
| } | |||||
| class TaskThread extends Thread | |||||
| { | |||||
| private Throwable exception; | |||||
| private Task task; | |||||
| private int taskNumber; | |||||
| /** | |||||
| * Construct a new TaskThread<p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @param task the Task to be executed in a seperate thread | |||||
| * @param taskNumber Description of Parameter | |||||
| */ | |||||
| TaskThread( int taskNumber, Task task ) | |||||
| { | |||||
| this.task = task; | |||||
| this.taskNumber = taskNumber; | |||||
| } | |||||
| public Throwable getException() | |||||
| { | |||||
| return exception; | |||||
| } | |||||
| /** | |||||
| * Executes the task within a thread and takes care about Exceptions | |||||
| * raised within the task. | |||||
| */ | |||||
| public void run() | |||||
| { | |||||
| try | |||||
| { | |||||
| task.perform(); | |||||
| } | |||||
| catch( Throwable t ) | |||||
| { | |||||
| exception = t; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,60 +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 file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs; | |||||
| import java.util.Enumeration; | |||||
| import java.util.Vector; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.TaskContainer; | |||||
| /** | |||||
| * Implements a single threaded task execution. <p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @author Thomas Christen <a href="mailto:chr@active.ch">chr@active.ch</a> | |||||
| */ | |||||
| public class Sequential extends Task | |||||
| implements TaskContainer | |||||
| { | |||||
| /** | |||||
| * Optional Vector holding the nested tasks | |||||
| */ | |||||
| private Vector nestedTasks = new Vector(); | |||||
| /** | |||||
| * Add a nested task to Sequential. <p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @param nestedTask Nested task to execute Sequential <p> | |||||
| * | |||||
| * | |||||
| */ | |||||
| public void addTask( Task nestedTask ) | |||||
| { | |||||
| nestedTasks.addElement( nestedTask ); | |||||
| } | |||||
| /** | |||||
| * Execute all nestedTasks. | |||||
| * | |||||
| * @exception TaskException Description of Exception | |||||
| */ | |||||
| public void execute() | |||||
| throws TaskException | |||||
| { | |||||
| for( Enumeration e = nestedTasks.elements(); e.hasMoreElements(); ) | |||||
| { | |||||
| Task nestedTask = (Task)e.nextElement(); | |||||
| nestedTask.perform(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,171 +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 file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs; | |||||
| import java.util.Enumeration; | |||||
| import java.util.Vector; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.tools.ant.Location; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.TaskContainer; | |||||
| /** | |||||
| * Implements a multi threaded task execution. <p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @author Thomas Christen <a href="mailto:chr@active.ch">chr@active.ch</a> | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill </a> | |||||
| */ | |||||
| public class Parallel extends Task | |||||
| implements TaskContainer | |||||
| { | |||||
| /** | |||||
| * Collection holding the nested tasks | |||||
| */ | |||||
| private Vector nestedTasks = new Vector(); | |||||
| /** | |||||
| * Add a nested task to execute parallel (asynchron). <p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @param nestedTask Nested task to be executed in parallel | |||||
| * @exception TaskException Description of Exception | |||||
| */ | |||||
| public void addTask( Task nestedTask ) | |||||
| throws TaskException | |||||
| { | |||||
| nestedTasks.addElement( nestedTask ); | |||||
| } | |||||
| /** | |||||
| * Block execution until the specified time or for a specified amount of | |||||
| * milliseconds and if defined, execute the wait status. | |||||
| * | |||||
| * @exception TaskException Description of Exception | |||||
| */ | |||||
| public void execute() | |||||
| throws TaskException | |||||
| { | |||||
| TaskThread[] threads = new TaskThread[ nestedTasks.size() ]; | |||||
| int threadNumber = 0; | |||||
| for( Enumeration e = nestedTasks.elements(); e.hasMoreElements(); threadNumber++ ) | |||||
| { | |||||
| Task nestedTask = (Task)e.nextElement(); | |||||
| threads[ threadNumber ] = new TaskThread( threadNumber, nestedTask ); | |||||
| } | |||||
| // now start all threads | |||||
| for( int i = 0; i < threads.length; ++i ) | |||||
| { | |||||
| threads[ i ].start(); | |||||
| } | |||||
| // now join to all the threads | |||||
| for( int i = 0; i < threads.length; ++i ) | |||||
| { | |||||
| try | |||||
| { | |||||
| threads[ i ].join(); | |||||
| } | |||||
| catch( InterruptedException ie ) | |||||
| { | |||||
| // who would interrupt me at a time like this? | |||||
| } | |||||
| } | |||||
| // now did any of the threads throw an exception | |||||
| StringBuffer exceptionMessage = new StringBuffer(); | |||||
| String lSep = System.getProperty( "line.separator" ); | |||||
| int numExceptions = 0; | |||||
| Throwable firstException = null; | |||||
| Location firstLocation = Location.UNKNOWN_LOCATION; | |||||
| ; | |||||
| for( int i = 0; i < threads.length; ++i ) | |||||
| { | |||||
| Throwable t = threads[ i ].getException(); | |||||
| if( t != null ) | |||||
| { | |||||
| numExceptions++; | |||||
| if( firstException == null ) | |||||
| { | |||||
| firstException = t; | |||||
| } | |||||
| /* | |||||
| if( t instanceof TaskException && | |||||
| firstLocation == Location.UNKNOWN_LOCATION ) | |||||
| { | |||||
| firstLocation = ( (TaskException)t ).getLocation(); | |||||
| } | |||||
| */ | |||||
| exceptionMessage.append( lSep ); | |||||
| exceptionMessage.append( t.getMessage() ); | |||||
| } | |||||
| } | |||||
| if( numExceptions == 1 ) | |||||
| { | |||||
| if( firstException instanceof TaskException ) | |||||
| { | |||||
| throw (TaskException)firstException; | |||||
| } | |||||
| else | |||||
| { | |||||
| throw new TaskException( "Error", firstException ); | |||||
| } | |||||
| } | |||||
| else if( numExceptions > 1 ) | |||||
| { | |||||
| throw new TaskException( exceptionMessage.toString() ); | |||||
| } | |||||
| } | |||||
| class TaskThread extends Thread | |||||
| { | |||||
| private Throwable exception; | |||||
| private Task task; | |||||
| private int taskNumber; | |||||
| /** | |||||
| * Construct a new TaskThread<p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @param task the Task to be executed in a seperate thread | |||||
| * @param taskNumber Description of Parameter | |||||
| */ | |||||
| TaskThread( int taskNumber, Task task ) | |||||
| { | |||||
| this.task = task; | |||||
| this.taskNumber = taskNumber; | |||||
| } | |||||
| public Throwable getException() | |||||
| { | |||||
| return exception; | |||||
| } | |||||
| /** | |||||
| * Executes the task within a thread and takes care about Exceptions | |||||
| * raised within the task. | |||||
| */ | |||||
| public void run() | |||||
| { | |||||
| try | |||||
| { | |||||
| task.perform(); | |||||
| } | |||||
| catch( Throwable t ) | |||||
| { | |||||
| exception = t; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,60 +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 file. | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs; | |||||
| import java.util.Enumeration; | |||||
| import java.util.Vector; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.TaskContainer; | |||||
| /** | |||||
| * Implements a single threaded task execution. <p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @author Thomas Christen <a href="mailto:chr@active.ch">chr@active.ch</a> | |||||
| */ | |||||
| public class Sequential extends Task | |||||
| implements TaskContainer | |||||
| { | |||||
| /** | |||||
| * Optional Vector holding the nested tasks | |||||
| */ | |||||
| private Vector nestedTasks = new Vector(); | |||||
| /** | |||||
| * Add a nested task to Sequential. <p> | |||||
| * | |||||
| * | |||||
| * | |||||
| * @param nestedTask Nested task to execute Sequential <p> | |||||
| * | |||||
| * | |||||
| */ | |||||
| public void addTask( Task nestedTask ) | |||||
| { | |||||
| nestedTasks.addElement( nestedTask ); | |||||
| } | |||||
| /** | |||||
| * Execute all nestedTasks. | |||||
| * | |||||
| * @exception TaskException Description of Exception | |||||
| */ | |||||
| public void execute() | |||||
| throws TaskException | |||||
| { | |||||
| for( Enumeration e = nestedTasks.elements(); e.hasMoreElements(); ) | |||||
| { | |||||
| Task nestedTask = (Task)e.nextElement(); | |||||
| nestedTask.perform(); | |||||
| } | |||||
| } | |||||
| } | |||||