diff --git a/src/main/org/apache/tools/ant/Project.java b/src/main/org/apache/tools/ant/Project.java index c406e7b0e..0a8d07c4d 100644 --- a/src/main/org/apache/tools/ant/Project.java +++ b/src/main/org/apache/tools/ant/Project.java @@ -324,18 +324,12 @@ public class Project { * be notified of build events for this project. * * @param listener The listener to add to the list. - * Must not be null. + * Ignored if null. */ public synchronized void addBuildListener(BuildListener listener) { - // If the listeners already has this listener, do nothing - if (listeners.contains(listener)) { - return; + if (!(listener == null || listeners.contains(listener))) { + listeners.add(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; } /** @@ -346,11 +340,7 @@ public class Project { * Should not be null. */ public synchronized void removeBuildListener(BuildListener 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; + listeners.remove(listener); } /** @@ -1847,7 +1837,7 @@ public class Project { * Send a "build started" event * to the build listeners for this project. */ - public void fireBuildStarted() { + public synchronized void fireBuildStarted() { BuildEvent event = new BuildEvent(this); Iterator iter = listeners.iterator(); while (iter.hasNext()) { @@ -1863,7 +1853,7 @@ public class Project { * failure. May be null, indicating * a successful build. */ - public void fireBuildFinished(Throwable exception) { + public synchronized void fireBuildFinished(Throwable exception) { BuildEvent event = new BuildEvent(this); event.setException(exception); Iterator iter = listeners.iterator(); @@ -1879,7 +1869,7 @@ public class Project { * * @since Ant 1.6.2 */ - public void fireSubBuildStarted() { + public synchronized void fireSubBuildStarted() { BuildEvent event = new BuildEvent(this); Iterator iter = listeners.iterator(); while (iter.hasNext()) { @@ -1899,7 +1889,7 @@ public class Project { * * @since Ant 1.6.2 */ - public void fireSubBuildFinished(Throwable exception) { + public synchronized void fireSubBuildFinished(Throwable exception) { BuildEvent event = new BuildEvent(this); event.setException(exception); Iterator iter = listeners.iterator(); @@ -1918,7 +1908,7 @@ public class Project { * @param target The target which is starting to build. * Must not be null. */ - protected void fireTargetStarted(Target target) { + protected synchronized void fireTargetStarted(Target target) { BuildEvent event = new BuildEvent(target); Iterator iter = listeners.iterator(); while (iter.hasNext()) { @@ -1937,7 +1927,8 @@ public class Project { * failure. May be null, indicating * a successful build. */ - protected void fireTargetFinished(Target target, Throwable exception) { + protected synchronized void fireTargetFinished(Target target, + Throwable exception) { BuildEvent event = new BuildEvent(target); event.setException(exception); Iterator iter = listeners.iterator(); @@ -1954,7 +1945,7 @@ public class Project { * @param task The target which is starting to execute. * Must not be null. */ - protected void fireTaskStarted(Task task) { + protected synchronized void fireTaskStarted(Task task) { // register this as the current task on the current thread. registerThreadTask(Thread.currentThread(), task); BuildEvent event = new BuildEvent(task); @@ -1975,7 +1966,7 @@ public class Project { * failure. May be null, indicating * a successful build. */ - protected void fireTaskFinished(Task task, Throwable exception) { + protected synchronized void fireTaskFinished(Task task, Throwable exception) { registerThreadTask(Thread.currentThread(), null); System.out.flush(); System.err.flush(); @@ -1999,8 +1990,9 @@ public class Project { * @param message The message to send. Should not be null. * @param priority The priority of the message. */ - private void fireMessageLoggedEvent(BuildEvent event, String message, - int priority) { + private synchronized void fireMessageLoggedEvent(BuildEvent event, + String message, + int priority) { if (message.endsWith(StringUtils.LINE_SEP)) { int endIndex = message.length() - StringUtils.LINE_SEP.length(); @@ -2047,8 +2039,8 @@ public class Project { * @param message The message to send. Should not be null. * @param priority The priority of the message. */ - protected void fireMessageLogged(Project project, String message, - int priority) { + protected synchronized void fireMessageLogged(Project project, String message, + int priority) { BuildEvent event = new BuildEvent(project); fireMessageLoggedEvent(event, message, priority); } @@ -2062,8 +2054,8 @@ public class Project { * @param message The message to send. Should not be null. * @param priority The priority of the message. */ - protected void fireMessageLogged(Target target, String message, - int priority) { + protected synchronized void fireMessageLogged(Target target, String message, + int priority) { BuildEvent event = new BuildEvent(target); fireMessageLoggedEvent(event, message, priority); } @@ -2077,7 +2069,8 @@ public class Project { * @param message The message to send. Should not be null. * @param priority The priority of the message. */ - protected void fireMessageLogged(Task task, String message, int priority) { + protected synchronized void fireMessageLogged(Task task, String message, + int priority) { BuildEvent event = new BuildEvent(task); fireMessageLoggedEvent(event, message, priority); }