bodewig 2004/06/28 00:47:06
Modified: . Tag: ANT_16_BRANCH TODO
docs/manual Tag: ANT_16_BRANCH develop.html
src/main/org/apache/tools/ant Tag: ANT_16_BRANCH
AntClassLoader.java Project.java
src/main/org/apache/tools/ant/taskdefs Tag: ANT_16_BRANCH
Ant.java Recorder.java RecorderEntry.java
Added: src/main/org/apache/tools/ant Tag: ANT_16_BRANCH
SubBuildListener.java
Log:
Merge fix for 8689 from HEAD
Revision Changes Path
No revision
No revision
1.3.2.24 +0 -2 ant/Attic/TODO
Index: TODO
===================================================================
RCS file: /home/cvs/ant/Attic/TODO,v
retrieving revision 1.3.2.23
retrieving revision 1.3.2.24
diff -u -r1.3.2.23 -r1.3.2.24
--- TODO 25 Jun 2004 13:50:16 -0000 1.3.2.23
+++ TODO 28 Jun 2004 07:47:05 -0000 1.3.2.24
@@ -7,8 +7,6 @@
* Fix or at least document support for tomcat 5.0 jsp
-* review claimed AntClassLoader memory leak [Stefan]
-
* AntClassLoader parent loader [Start thread, Peter]
* delete - do not follow symlinks [Peter, may be dropped for 1.6.2]
No revision
No revision
1.13.2.6 +16 -0 ant/docs/manual/develop.html
Index: develop.html
===================================================================
RCS file: /home/cvs/ant/docs/manual/develop.html,v
retrieving revision 1.13.2.5
retrieving revision 1.13.2.6
diff -u -r1.13.2.5 -r1.13.2.6
--- develop.html 23 Jun 2004 06:38:12 -0000 1.13.2.5
+++ develop.html 28 Jun 2004 07:47:05 -0000 1.13.2.6
@@ -435,6 +435,22 @@
<li>Message logged</li>
</ul>
+<p>If the build file invokes another build file via <a
+href="CoreTasks/ant.html"><ant></a> or <a
+href="CoreTasks/subant.html"><subant></a> or uses <a
+href="CoreTasks/antcall.html"><antcall></a>, you are creating a
+new Ant "project" that will send target and task level events of its
+own but never sends build started/finished events. Ant 1.6.2
+introduces an extension of the BuildListener interface named
+SubBuildListener that will receive two new events for</p>
+<ul>
+<li>SubBuild started</li>
+<li>SubBuild finished</li>
+</ul>
+<p>If you are interested in those events, all you need to do is to
+implement the new interface instead of BuildListener (and register the
+listener, of course).</p>
+
<p>
If you wish to attach a listener from the command line you may use the
<code>-listener</code> option. For example:</p>
No revision
No revision
1.76.2.7 +26 -1 ant/src/main/org/apache/tools/ant/AntClassLoader.java
Index: AntClassLoader.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/AntClassLoader.java,v
retrieving revision 1.76.2.6
retrieving revision 1.76.2.7
diff -u -r1.76.2.6 -r1.76.2.7
--- AntClassLoader.java 20 Apr 2004 13:25:15 -0000 1.76.2.6
+++ AntClassLoader.java 28 Jun 2004 07:47:05 -0000 1.76.2.7
@@ -44,7 +44,7 @@
* class will then use this loader rather than the system class loader.
*
*/
-public class AntClassLoader extends ClassLoader implements BuildListener {
+public class AntClassLoader extends ClassLoader implements SubBuildListener {
private static final FileUtils fileUtils = FileUtils.newFileUtils();
@@ -1217,6 +1217,31 @@
*/
public void buildFinished(BuildEvent event) {
cleanup();
+ }
+
+ /**
+ * Cleans up any resources held by this classloader at the end of
+ * a subbuild if it has been created for the subbuild's project
+ * instance.
+ *
+ * @param event the buildFinished event
+ *
+ * @since Ant 1.6.2
+ */
+ public void subBuildFinished(BuildEvent event) {
+ if (event.getProject() == project) {
+ cleanup();
+ }
+ }
+
+ /**
+ * Empty implementation to satisfy the BuildListener interface.
+ *
+ * @param event the buildStarted event
+ *
+ * @since Ant 1.6.2
+ */
+ public void subBuildStarted(BuildEvent event) {
}
/**
1.154.2.10 +38 -1 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.154.2.9
retrieving revision 1.154.2.10
diff -u -r1.154.2.9 -r1.154.2.10
--- Project.java 20 Apr 2004 22:47:46 -0000 1.154.2.9
+++ Project.java 28 Jun 2004 07:47:05 -0000 1.154.2.10
@@ -1797,6 +1797,43 @@
}
}
+ /**
+ * Sends a "subbuild started" event to the build listeners for
+ * this project.
+ *
+ * @since Ant 1.6.2
+ */
+ public void fireSubBuildStarted() {
+ BuildEvent event = new BuildEvent(this);
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ Object listener = iter.next();
+ if (listener instanceof SubBuildListener) {
+ ((SubBuildListener) listener).subBuildStarted(event);
+ }
+ }
+ }
+
+ /**
+ * Sends a "subbuild finished" event to the build listeners for
+ * this project.
+ * @param exception an exception indicating a reason for a build
+ * failure. May be <code>null</code>, indicating
+ * a successful build.
+ *
+ * @since Ant 1.6.2
+ */
+ public void fireSubBuildFinished(Throwable exception) {
+ BuildEvent event = new BuildEvent(this);
+ event.setException(exception);
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ Object listener = iter.next();
+ if (listener instanceof SubBuildListener) {
+ ((SubBuildListener) listener).subBuildFinished(event);
+ }
+ }
+ }
/**
* Sends a "target started" event to the build listeners for this
project.
No revision
Index: Project.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Project.java,v
retrieving revision 1.154.2.9
retrieving revision 1.154.2.10
diff -u -r1.154.2.9 -r1.154.2.10
--- Project.java 20 Apr 2004 22:47:46 -0000 1.154.2.9
+++ Project.java 28 Jun 2004 07:47:05 -0000 1.154.2.10
@@ -1797,6 +1797,43 @@
}
}
+ /**
+ * Sends a "subbuild started" event to the build listeners for
+ * this project.
+ *
+ * @since Ant 1.6.2
+ */
+ public void fireSubBuildStarted() {
+ BuildEvent event = new BuildEvent(this);
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ Object listener = iter.next();
+ if (listener instanceof SubBuildListener) {
+ ((SubBuildListener) listener).subBuildStarted(event);
+ }
+ }
+ }
+
+ /**
+ * Sends a "subbuild finished" event to the build listeners for
+ * this project.
+ * @param exception an exception indicating a reason for a build
+ * failure. May be <code>null</code>, indicating
+ * a successful build.
+ *
+ * @since Ant 1.6.2
+ */
+ public void fireSubBuildFinished(Throwable exception) {
+ BuildEvent event = new BuildEvent(this);
+ event.setException(exception);
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ Object listener = iter.next();
+ if (listener instanceof SubBuildListener) {
+ ((SubBuildListener) listener).subBuildFinished(event);
+ }
+ }
+ }
/**
* Sends a "target started" event to the build listeners for this
project.
No revision
Index: Project.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Project.java,v
retrieving revision 1.154.2.9
retrieving revision 1.154.2.10
diff -u -r1.154.2.9 -r1.154.2.10
--- Project.java 20 Apr 2004 22:47:46 -0000 1.154.2.9
+++ Project.java 28 Jun 2004 07:47:05 -0000 1.154.2.10
@@ -1797,6 +1797,43 @@
}
}
+ /**
+ * Sends a "subbuild started" event to the build listeners for
+ * this project.
+ *
+ * @since Ant 1.6.2
+ */
+ public void fireSubBuildStarted() {
+ BuildEvent event = new BuildEvent(this);
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ Object listener = iter.next();
+ if (listener instanceof SubBuildListener) {
+ ((SubBuildListener) listener).subBuildStarted(event);
+ }
+ }
+ }
+
+ /**
+ * Sends a "subbuild finished" event to the build listeners for
+ * this project.
+ * @param exception an exception indicating a reason for a build
+ * failure. May be <code>null</code>, indicating
+ * a successful build.
+ *
+ * @since Ant 1.6.2
+ */
+ public void fireSubBuildFinished(Throwable exception) {
+ BuildEvent event = new BuildEvent(this);
+ event.setException(exception);
+ Iterator iter = listeners.iterator();
+ while (iter.hasNext()) {
+ Object listener = iter.next();
+ if (listener instanceof SubBuildListener) {
+ ((SubBuildListener) listener).subBuildFinished(event);
+ }
+ }
+ }
/**
* Sends a "target started" event to the build listeners for this
project.
1.1.2.1 +0 -0 ant/src/main/org/apache/tools/ant/SubBuildListener.java
Index: SubBuildListener.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/SubBuildListener.java,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -r1.1 -r1.1.2.1
No revision
No revision
1.92.2.8 +18 -7 ant/src/main/org/apache/tools/ant/taskdefs/Ant.java
Index: Ant.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Ant.java,v
retrieving revision 1.92.2.7
retrieving revision 1.92.2.8
diff -u -r1.92.2.7 -r1.92.2.8
--- Ant.java 8 Apr 2004 14:59:52 -0000 1.92.2.7
+++ Ant.java 28 Jun 2004 07:47:06 -0000 1.92.2.8
@@ -24,6 +24,7 @@
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.Vector;
import java.util.Set;
import java.util.HashSet;
@@ -148,10 +149,9 @@
private void initializeProject() {
newProject.setInputHandler(getProject().getInputHandler());
- Vector listeners = getProject().getBuildListeners();
- final int count = listeners.size();
- for (int i = 0; i < count; i++) {
- newProject.addBuildListener((BuildListener)
listeners.elementAt(i));
+ Iterator iter = getBuildListeners();
+ while (iter.hasNext()) {
+ newProject.addBuildListener((BuildListener) iter.next());
}
if (output != null) {
@@ -379,14 +379,18 @@
addReferences();
if (target != null && !"".equals(target)) {
+ Throwable t = null;
try {
log("Entering " + antFile + "...", Project.MSG_VERBOSE);
+ newProject.fireSubBuildStarted();
newProject.executeTarget(target);
} catch (BuildException ex) {
- throw ProjectHelper.addLocationToBuildException(
- ex, getLocation());
- } finally {
+ t = ProjectHelper
+ .addLocationToBuildException(ex, getLocation());
+ throw (BuildException) t;
+ } finally {
log("Exiting " + antFile + ".", Project.MSG_VERBOSE);
+ newProject.fireSubBuildFinished(t);
}
}
} finally {
@@ -645,6 +649,13 @@
*/
public void addPropertyset(PropertySet ps) {
propertySets.addElement(ps);
+ }
+
+ /**
+ * @since Ant 1.6.2
+ */
+ private Iterator getBuildListeners() {
+ return getProject().getBuildListeners().iterator();
}
/**
1.16.2.5 +1 -1 ant/src/main/org/apache/tools/ant/taskdefs/Recorder.java
Index: Recorder.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Recorder.java,v
retrieving revision 1.16.2.4
retrieving revision 1.16.2.5
diff -u -r1.16.2.4 -r1.16.2.5
--- Recorder.java 9 Mar 2004 17:01:34 -0000 1.16.2.4
+++ Recorder.java 28 Jun 2004 07:47:06 -0000 1.16.2.5
@@ -211,7 +211,7 @@
throw new BuildException("Problems creating a recorder
entry",
ioe);
}
- proj.addBuildListener(entry);
+ entry.setProject(proj);
recorderEntries.put(name, entry);
} else {
entry = (RecorderEntry) o;
1.11.2.6 +56 -3
ant/src/main/org/apache/tools/ant/taskdefs/RecorderEntry.java
Index: RecorderEntry.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/RecorderEntry.java,v
retrieving revision 1.11.2.5
retrieving revision 1.11.2.6
diff -u -r1.11.2.5 -r1.11.2.6
--- RecorderEntry.java 9 Mar 2004 17:01:34 -0000 1.11.2.5
+++ RecorderEntry.java 28 Jun 2004 07:47:06 -0000 1.11.2.6
@@ -21,6 +21,7 @@
import org.apache.tools.ant.BuildLogger;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.Project;
+import org.apache.tools.ant.SubBuildListener;
import org.apache.tools.ant.util.StringUtils;
/**
@@ -30,7 +31,7 @@
* @version 0.5
* @since Ant 1.4
*/
-public class RecorderEntry implements BuildLogger {
+public class RecorderEntry implements BuildLogger, SubBuildListener {
//////////////////////////////////////////////////////////////////////
// ATTRIBUTES
@@ -47,6 +48,8 @@
private long targetStartTime = 0L;
/** Strip task banners if true. */
private boolean emacsMode = false;
+ /** project instance the recorder is associated with */
+ private Project project;
//////////////////////////////////////////////////////////////////////
// CONSTRUCTORS / INITIALIZERS
@@ -99,8 +102,32 @@
+ StringUtils.LINE_SEP);
error.printStackTrace(out);
}
- out.flush();
- out.close();
+ cleanup();
+ }
+
+ /**
+ * Cleans up any resources held by this recorder entry at the end
+ * of a subbuild if it has been created for the subbuild's project
+ * instance.
+ *
+ * @param event the buildFinished event
+ *
+ * @since Ant 1.6.2
+ */
+ public void subBuildFinished(BuildEvent event) {
+ if (event.getProject() == project) {
+ cleanup();
+ }
+ }
+
+ /**
+ * Empty implementation to satisfy the BuildListener interface.
+ *
+ * @param event the buildStarted event
+ *
+ * @since Ant 1.6.2
+ */
+ public void subBuildStarted(BuildEvent event) {
}
@@ -207,6 +234,32 @@
+ (seconds % 60 == 1 ? "" : "s");
}
+ }
+
+ /**
+ * Set the project associated with this recorder entry.
+ *
+ * @param project the project instance
+ *
+ * @since 1.6.2
+ */
+ public void setProject(Project project) {
+ this.project = project;
+ if (project != null) {
+ project.addBuildListener(this);
+ }
+ }
+
+ /**
+ * @since 1.6.2
+ */
+ public void cleanup() {
+ out.flush();
+ out.close();
+ if (project != null) {
+ project.removeBuildListener(this);
+ }
+ project = null;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]