This sounds excellent. However, since Cactus replaces the execute method, would it not need to add code to call setupJUnitDelegate()
Peter On Fri, Feb 15, 2008 at 10:48 AM, Stefan Bodewig <[EMAIL PROTECTED]> wrote: > Hi all, > > [Petar, it would be good if you subscribed to [EMAIL PROTECTED], it is not > that > high traffic anyway] > > last night I chatted with Petar about the backwards incompatible > change to the JUnit task we introduced in Ant 1.7.0 that broke Cactus. > > Cactus' Ant task extends the JUnit task (and if memory serves me right > is one of the reasons that a bunch of methods in JUnitTask have > protected access in the first place). It used to override execute() > completely and invoke the execute variants that acceps tests or lists > of tests (I don't recall which). > > This doesn't work any longer since execute() performs setup work on > the delegate that decouples Ant from the junit library and the execute > variants rely on this setup. > > On my way home I thought that maybe the easiest solution would be to > have the execute variants check whether the setup has been performed > and if not - simply do it themselves. The appended patch does just > that and I'd like to get some feedback. > > The patch would make deleteClassloader protected so that subclasses > can cleanup themselves, this may not strictly be necessary. > > With this patch in place, Cactus should be able to use Ant without any > modifications, but could benefit from more control over resource > cleanup if it wants to. > > BTW, I'd love to merge whatever solution we agree on to the 1.7 branch > and have it go into 1.7.1. Right now Cactus users are forced to stick > to 1.6.5 and we should change that. > > Of course Petar should make sure that Gump can build Cactus so that he > can hit us if we break it again. 8-) > > Stefan > > Index: src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java > =================================================================== > --- src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java > (revision 627950) > +++ src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java > (working copy) > @@ -162,6 +162,7 @@ > > private boolean splitJunit = false; > private JUnitTaskMirror delegate; > + private ClassLoader mirrorLoader; > > /** A boolean on whether to get the forked path for ant classes */ > private boolean forkedPathChecked = false; > @@ -746,14 +747,10 @@ > } > > /** > - * Runs the testcase. > - * > - * @throws BuildException in case of test failures or errors > - * @since Ant 1.2 > + * Sets up the delegate that will actually run the tests. > */ > - public void execute() throws BuildException { > + protected void setupJUnitDelegate() { > ClassLoader myLoader = JUnitTask.class.getClassLoader(); > - ClassLoader mirrorLoader; > if (splitJunit) { > Path path = new Path(getProject()); > path.add(antRuntimeClasses); > @@ -766,7 +763,17 @@ > mirrorLoader = myLoader; > } > delegate = createMirror(this, mirrorLoader); > + } > > + /** > + * Runs the testcase. > + * > + * @throws BuildException in case of test failures or errors > + * @since Ant 1.2 > + */ > + public void execute() throws BuildException { > + setupJUnitDelegate(); > + > List testLists = new ArrayList(); > > boolean forkPerTest = forkMode.getValue().equals(ForkMode.PER_TEST); > @@ -794,10 +801,6 @@ > } > } finally { > deleteClassLoader(); > - if (mirrorLoader instanceof SplitLoader) { > - ((SplitLoader) mirrorLoader).cleanup(); > - } > - delegate = null; > } > } > > @@ -1262,6 +1265,10 @@ > * @return the results > */ > private TestResultHolder executeInVM(JUnitTest arg) throws > BuildException { > + if (delegate == null) { > + setupJUnitDelegate(); > + } > + > JUnitTest test = (JUnitTest) arg.clone(); > test.setProperties(getProject().getProperties()); > if (dir != null) { > @@ -1514,6 +1521,10 @@ > */ > private void logVmExit(FormatterElement[] feArray, JUnitTest test, > String message, String testCase) { > + if (delegate == null) { > + setupJUnitDelegate(); > + } > + > try { > log("Using System properties " + System.getProperties(), > Project.MSG_VERBOSE); > @@ -1595,11 +1606,16 @@ > * Removes a classloader if needed. > * @since Ant 1.7 > */ > - private void deleteClassLoader() { > + protected void deleteClassLoader() { > if (classLoader != null) { > classLoader.cleanup(); > classLoader = null; > } > + if (mirrorLoader instanceof SplitLoader) { > + ((SplitLoader) mirrorLoader).cleanup(); > + } > + mirrorLoader = null; > + delegate = null; > } > > /** > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]