Costin, Web based build will be a nice addition -- cool. Small comment though. Keep in mind that I don't have a complete understanding of all associated code, but at first glance, it appears that AntTag won't work correctly if tag pooling is being used. I think the fix is simple though. Just reset the list of targets and args at tag start time: > 1.1 jakarta-tomcat/proposals/build2/WEB-INF/src/AntTag.java > > Index: AntTag.java > =================================================================== > package tadm; > import java.util.*; > import java.io.*; > import java.net.URL; > import javax.servlet.http.*; > import javax.servlet.*; > > import javax.servlet.jsp.*; > import javax.servlet.jsp.tagext.*; > > import org.apache.tools.ant.*; > > /** > * This tag will run ant tasks > * > */ > public class AntTag extends TagSupport { > > public AntTag() {} > > public int doStartTag() throws JspException { add: args.clear() targets.clear() // or removeAllElements() etc. > try { > pageContext.setAttribute("antProperties", > args); > } catch (Exception ex ) { > ex.printStackTrace(); > } > return EVAL_BODY_INCLUDE; > } > > public int doEndTag() throws JspException { > runTest(); > return EVAL_PAGE; > } > > // -------------------- child tag support -------------------- > Properties args=new Properties(); > Vector targets=new Vector(); > > public void setProperty( String name, String value ) { > System.out.println("Adding property " + name + "=" + value ); > args.put(name, value ); > } > > public String getProperty( String name ) { > System.out.println("Getting property " + name ); > return args.getProperty(name ); > } > > public void addTarget( String n ) { > System.out.println("Adding target " + n ); > targets.addElement( n ); > } > > //-------------------- Properties -------------------- > > /** Set the name of the test.xml, relative to the base dir. > * For example, /WEB-INF/test-tomcat.xml > */ > public void setTestFile( String s ) { > args.put("ant.file", s); > } > > /** Set the target - a subset of tests to be run > */ > public void setTarget( String s ) { > addTarget(s); > } > > public void setDebug( String s ) { > args.put( "debug", s); > } > > // -------------------- Implementation methods -------------------- > > private void runTest() throws JspException { > PrintWriter out=null; > try { > out=pageContext.getResponse().getWriter(); > pageContext.getOut().flush(); > out.flush(); // we need a writer for ant > > Project project=new Project(); > > AntServletLogger log=new AntServletLogger(); > log.setWriter( out ); > project.addBuildListener( log ); > > project.init(); > > Enumeration argsE=args.propertyNames(); > while( argsE.hasMoreElements() ) { > String k=(String)argsE.nextElement(); > String v=args.getProperty( k ); > if( k!=null && v!= null ) > project.setUserProperty( k, v ); > } > > String antFileN=args.getProperty("ant.file"); > if( antFileN==null ) > throw new JspException( "ant.file not specified"); > File antF=new File(antFileN); > ProjectHelper.configureProject( project, > antF ); > > // pre-execution properties > Hashtable antProperties=project.getProperties(); > argsE=antProperties.keys(); > while( argsE.hasMoreElements() ) { > String k=(String)argsE.nextElement(); > String v=(String)antProperties.get( k ); > if( k!=null && v!= null ) > args.put( k, v ); // includes "revision" > } > > if( targets.size()==0 ) { > //targets.addElement("client"); > } > > project.executeTargets( targets ); > > // post-execution properties > antProperties=project.getProperties(); > > argsE=antProperties.keys(); > while( argsE.hasMoreElements() ) { > String k=(String)argsE.nextElement(); > String v=(String)antProperties.get( k ); > if( k!=null && v!= null ) > args.put( k, v ); > } > > } catch( BuildException ex ) { > if( out==null ) out=new PrintWriter(System.out); > ex.printStackTrace(out); > Throwable ex1=ex.getException(); > out.println("Root cause: " ); > if( ex1!=null) > ex1.printStackTrace(out); > out.flush(); > throw new JspException( ex.toString() ); > } catch( IOException ioex ) { > if( out==null ) out=new PrintWriter(System.out); > ioex.printStackTrace(out); > throw new JspException( ioex.toString() ); > } > } > } >