bodewig 2003/08/25 01:28:27 Modified: src/main/org/apache/tools/ant Project.java Log: Switch BuildListener management from "copy on each event" to "copy on add/remove". Suggested by: Sylvain Wallez <sylvain dot wallez at anyware dash tech dot com> Revision Changes Path 1.150 +35 -33 ant/src/main/org/apache/tools/ant/Project.java Index: Project.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Project.java,v retrieving revision 1.149 retrieving revision 1.150 diff -u -r1.149 -r1.150 --- Project.java 24 Jul 2003 14:05:49 -0000 1.149 +++ Project.java 25 Aug 2003 08:28:27 -0000 1.150 @@ -62,6 +62,7 @@ import java.lang.reflect.Modifier; import java.util.Enumeration; import java.util.Hashtable; +import java.util.Iterator; import java.util.Properties; import java.util.Stack; import java.util.Vector; @@ -371,8 +372,12 @@ * @param listener The listener to add to the list. * Must not be <code>null</code>. */ - public void addBuildListener(BuildListener listener) { - listeners.addElement(listener); + public synchronized void addBuildListener(BuildListener listener) { + // create a new Vector to avoid ConcurrentModificationExc when + // the listeners get added/removed while we are in fire + Vector newListeners = getBuildListeners(); + newListeners.addElement(listener); + listeners = newListeners; } /** @@ -383,11 +388,15 @@ * Should not be <code>null</code>. */ public void removeBuildListener(BuildListener listener) { - listeners.removeElement(listener); + // create a new Vector to avoid ConcurrentModificationExc when + // the listeners get added/removed while we are in fire + Vector newListeners = getBuildListeners(); + newListeners.removeElement(listener); + listeners = newListeners; } /** - * Returns a list of build listeners for the project. + * Returns a copy of the list of build listeners for the project. * * @return a list of build listeners for the project */ @@ -1800,10 +1809,9 @@ */ public void fireBuildStarted() { BuildEvent event = new BuildEvent(this); - Vector listeners = getBuildListeners(); - int size = listeners.size(); - for (int i = 0; i < size; i++) { - BuildListener listener = (BuildListener) listeners.elementAt(i); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + BuildListener listener = (BuildListener) iter.next(); listener.buildStarted(event); } } @@ -1817,10 +1825,9 @@ public void fireBuildFinished(Throwable exception) { BuildEvent event = new BuildEvent(this); event.setException(exception); - Vector listeners = getBuildListeners(); - int size = listeners.size(); - for (int i = 0; i < size; i++) { - BuildListener listener = (BuildListener) listeners.elementAt(i); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + BuildListener listener = (BuildListener) iter.next(); listener.buildFinished(event); } } @@ -1834,10 +1841,9 @@ */ protected void fireTargetStarted(Target target) { BuildEvent event = new BuildEvent(target); - Vector listeners = getBuildListeners(); - int size = listeners.size(); - for (int i = 0; i < size; i++) { - BuildListener listener = (BuildListener) listeners.elementAt(i); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + BuildListener listener = (BuildListener) iter.next(); listener.targetStarted(event); } } @@ -1855,10 +1861,9 @@ protected void fireTargetFinished(Target target, Throwable exception) { BuildEvent event = new BuildEvent(target); event.setException(exception); - Vector listeners = getBuildListeners(); - int size = listeners.size(); - for (int i = 0; i < size; i++) { - BuildListener listener = (BuildListener) listeners.elementAt(i); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + BuildListener listener = (BuildListener) iter.next(); listener.targetFinished(event); } } @@ -1873,10 +1878,9 @@ // register this as the current task on the current thread. registerThreadTask(Thread.currentThread(), task); BuildEvent event = new BuildEvent(task); - Vector listeners = getBuildListeners(); - int size = listeners.size(); - for (int i = 0; i < size; i++) { - BuildListener listener = (BuildListener) listeners.elementAt(i); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + BuildListener listener = (BuildListener) iter.next(); listener.taskStarted(event); } } @@ -1897,10 +1901,9 @@ System.err.flush(); BuildEvent event = new BuildEvent(task); event.setException(exception); - Vector listeners = getBuildListeners(); - int size = listeners.size(); - for (int i = 0; i < size; i++) { - BuildListener listener = (BuildListener) listeners.elementAt(i); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + BuildListener listener = (BuildListener) iter.next(); listener.taskFinished(event); } } @@ -1924,7 +1927,6 @@ } else { event.setMessage(message, priority); } - Vector listeners = getBuildListeners(); synchronized (this) { if (loggingMessage) { throw new BuildException("Listener attempted to access " @@ -1933,9 +1935,9 @@ } try { loggingMessage = true; - int size = listeners.size(); - for (int i = 0; i < size; i++) { - BuildListener listener = (BuildListener) listeners.elementAt(i); + Iterator iter = listeners.iterator(); + while (iter.hasNext()) { + BuildListener listener = (BuildListener) iter.next(); listener.messageLogged(event); } } finally {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]