You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@hyperreal.org on 1999/11/16 19:53:39 UTC

cvs commit: jakarta-tools/ant/src/main/org/apache/tools/ant Ant.java InvocationHelper.java Project.java Target.java Task.java XmlHelper.java

costin      99/11/16 10:53:37

  Modified:    ant/src/main/org/apache/tools/ant InvocationHelper.java
                        Project.java Target.java Task.java XmlHelper.java
  Added:       ant/src/main/org/apache/tools/ant Ant.java
  Log:
  - Added a Ant.java - it does the same thing as Main.java, but
  uses InvocationHelper and XMLHelper instead of ProjectHelper.
  - Added few methods to Project, Task, etc - no change in existing methods.
  ( needed to make them work with XMLHelper)
  
  Ant.java allows you to add new tasks without defining them in properties,
  you can have more than 1 level ( i.e. tasks can have sub-elements), you
  can use body ( will be usefull in Exec ).
  
  ( most of the changes are in different files to keep ant stable )
  
  Revision  Changes    Path
  1.2       +15 -14    jakarta-tools/ant/src/main/org/apache/tools/ant/InvocationHelper.java
  
  Index: InvocationHelper.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tools/ant/src/main/org/apache/tools/ant/InvocationHelper.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- InvocationHelper.java	1999/11/15 23:24:24	1.1
  +++ InvocationHelper.java	1999/11/16 18:53:14	1.2
  @@ -53,7 +53,7 @@
           /** Set a property, using either the setXXX method or a generic setProperty(name, value)
        *  @returns true if success
        */
  -    public static void setProperty( Object o, String name, String value ) throws BuildException {
  +    public static void setProperty( Object o, String name, String value ) {
   	//	System.out.println("Setting Property " + o.getClass() + " " + name + "=" + value);
   	try {
   	    Method setMethod = (Method)getPropertySetter(o, name);
  @@ -69,25 +69,25 @@
   		return; 
   	    }
   	    
  -	    String msg = "Error setting " + name + " in " + o.getClass();
  -	    throw new BuildException(msg);
  +	    //	    String msg = "Error setting " + name + " in " + o.getClass();
  +	    //throw new BuildException(msg);
   	} catch (IllegalAccessException iae) {
   	    String msg = "Error setting value for attrib: " + name;
   	    System.out.println("WARNING " + msg);
   	    iae.printStackTrace();
  -	    throw new BuildException(msg);
  +	    //	    throw new BuildException(msg);
   	} catch (InvocationTargetException ie) {
   	    String msg = "Error setting value for attrib: " +
   		name + " in " + o.getClass().getName();
   	    ie.printStackTrace();
   	    ie.getTargetException().printStackTrace();
  -	    throw new BuildException(msg);		    
  +	    //	    throw new BuildException(msg);		    
   	}
       }
   
       /** Set an object property using setter or setAttribute(name).
        */
  -    public static void setAttribute( Object o, String name, Object v ) throws BuildException {
  +    public static void setAttribute( Object o, String name, Object v ) {
   	//	System.out.println("Set Attribute " + o.getClass() + " " + name + " " + v );
   	try {
   	    Method setMethod = getPropertySetter(o, name);
  @@ -106,26 +106,27 @@
   		setMethod.invoke(o, new Object[] {name, v});
   		return; 
   	    }
  -	    
  -	    String msg = "Error setting " + name + " in " + o.getClass();
  -	    throw new BuildException(msg);
  +
  +	    // Silent 
  +	    //	    String msg = "Error setting " + name + " in " + o.getClass();
  +	    //	    throw new BuildException(msg);
   	} catch (IllegalAccessException iae) {
   	    String msg = "Error setting value for attrib: " +
   		name;
   	    iae.printStackTrace();
  -	    throw new BuildException(msg);
  +	    //	    throw new BuildException(msg);
   	} catch (InvocationTargetException ie) {
   	    String msg = "Error setting value for attrib: " +
   		name + " in " + o.getClass().getName();
   	    ie.printStackTrace();
   	    ie.getTargetException().printStackTrace();
  -	    throw new BuildException(msg);		    
  +	    //	    throw new BuildException(msg);		    
   	}
       }
       
       /** Calls addXXX( v ) then setAttribute( name, v).
        */
  -    public static void addAttribute( Object o, String name, Object v ) throws BuildException {
  +    public static void addAttribute( Object o, String name, Object v ) {
   	try {
   	    Method setMethod = getMethod(o, "add" + capitalize( name ));
   	    if( setMethod!= null ) {
  @@ -144,13 +145,13 @@
   	    String msg = "Error setting value for attrib: " +
   		name;
   	    iae.printStackTrace();
  -	    throw new BuildException(msg);
  +	    //	    throw new BuildException(msg);
   	} catch (InvocationTargetException ie) {
   	    String msg = "Error setting value for attrib: " +
   		name + " in " + o.getClass().getName();
   	    ie.printStackTrace();
   	    ie.getTargetException().printStackTrace();
  -	    throw new BuildException(msg);		    
  +	    //	    throw new BuildException(msg);		    
   	}
       }
   
  
  
  
  1.8       +30 -1     jakarta-tools/ant/src/main/org/apache/tools/ant/Project.java
  
  Index: Project.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tools/ant/src/main/org/apache/tools/ant/Project.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Project.java	1999/10/31 23:14:14	1.7
  +++ Project.java	1999/11/16 18:53:16	1.8
  @@ -102,11 +102,18 @@
       public void setDefaultTarget(String defaultTarget) {
   	this.defaultTarget = defaultTarget;
       }
  -    
  +
  +    // deprecated, use setDefault
       public String getDefaultTarget() {
   	return defaultTarget;
       }
   
  +    // match the attribute name
  +    public void setDefault(String defaultTarget) {
  +	this.defaultTarget = defaultTarget;
  +    }
  +    
  +
       public void setName(String name) {
   	this.name = name;
       }
  @@ -115,6 +122,17 @@
   	return name;
       }
   
  +    // match basedir attribute in xml
  +    public void setBasedir( String baseD ) throws BuildException {
  +	try {
  +	    setBaseDir(new File( new File(baseD).getCanonicalPath()));
  +	} catch (IOException ioe) {
  +	    String msg = "Can't set basedir " + baseDir + " due to " +
  +		ioe.getMessage();
  +	    throw new BuildException(msg);
  +	}
  +    }
  +    
       public void setBaseDir(File baseDir) {
   	this.baseDir = baseDir;
   	String msg = "Project base dir set to: " + baseDir;
  @@ -122,6 +140,11 @@
       }
   
       public File getBaseDir() {
  +	if(baseDir==null) {
  +	    try {
  +		setBasedir(".");
  +	    } catch(BuildException ex) {ex.printStackTrace();}
  +	}
   	return baseDir;
       }
       
  @@ -161,6 +184,12 @@
   	taskClassDefinitions.put(taskName, taskClass);
       }
   
  +    public void addTarget(Target target) {
  +	String msg = " +Target: " + target.getName();
  +	log(msg, MSG_VERBOSE);
  +	targets.put(target.getName(), target);
  +    }
  +    
       public void addTarget(String targetName, Target target) {
   	String msg = " +Target: " + targetName;
   	log(msg, MSG_VERBOSE);
  
  
  
  1.2       +27 -0     jakarta-tools/ant/src/main/org/apache/tools/ant/Target.java
  
  Index: Target.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tools/ant/src/main/org/apache/tools/ant/Target.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Target.java	1999/10/09 00:06:05	1.1
  +++ Target.java	1999/11/16 18:53:17	1.2
  @@ -2,6 +2,7 @@
   
   import java.util.Enumeration;
   import java.util.Vector;
  +import java.util.StringTokenizer;
   
   /**
    *
  @@ -14,7 +15,33 @@
       private String name;
       private Vector dependencies = new Vector();
       private Vector tasks = new Vector();
  +    Project project;
  +    
  +    public void setProject( Project project) {
  +	this.project=project;
  +    }
   
  +    public Project getProject() {
  +	return project;
  +    }
  +
  +    public void setDepends( String depS ) {
  +	if (depS.length() > 0) {
  +	    StringTokenizer tok =
  +		new StringTokenizer(depS, ",", false);
  +	    while (tok.hasMoreTokens()) {
  +		addDependency(tok.nextToken().trim());
  +	    }
  +	}
  +    }
  +    
  +    public void setAttribute(String name, Object value) {
  +	// XXX 
  +	if( value instanceof Task)
  +	    addTask( (Task)value);
  +	
  +    }
  +    
       public void setName(String name) {
   	this.name = name;
       }
  
  
  
  1.4       +12 -0     jakarta-tools/ant/src/main/org/apache/tools/ant/Task.java
  
  Index: Task.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tools/ant/src/main/org/apache/tools/ant/Task.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Task.java	1999/10/15 19:27:44	1.3
  +++ Task.java	1999/11/16 18:53:18	1.4
  @@ -17,6 +17,7 @@
   public abstract class Task {
   
       protected Project project = null;
  +    Target target;
   
       /**
        * Sets the project object of this task. This method is used by
  @@ -31,6 +32,17 @@
   	this.project = project;
       }
   
  +    public void setAttribute( String name, Object v) {
  +	if("target".equals( name ) ) {
  +	    Target t=(Target)v;
  +	    target=t;
  +	    project=t.getProject();
  +	    return;
  +	}
  +	// 	System.out.println("Set Att " +name + " = " + v );
  +	// 	if( v!=null) System.out.println(v.getClass());
  +    }
  +    
       /**
        * Called by the project to let the task do it's work.
        *
  
  
  
  1.2       +5 -3      jakarta-tools/ant/src/main/org/apache/tools/ant/XmlHelper.java
  
  Index: XmlHelper.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tools/ant/src/main/org/apache/tools/ant/XmlHelper.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XmlHelper.java	1999/11/16 00:40:56	1.1
  +++ XmlHelper.java	1999/11/16 18:53:20	1.2
  @@ -97,6 +97,8 @@
       public XmlHelperHandler(Map mapper, Properties props) {
   	tagMapper=mapper;
   	this.props=props;
  +        elemStack = new Object[100]; // depth of the xml doc
  +	tagStack = new String[100]; 
       }
       
       public void setDocumentLocator (Locator locator)
  @@ -107,8 +109,6 @@
   
       public void startDocument () throws SAXException
       {
  -        elemStack = new Object[100]; // depth of the xml doc
  -	tagStack = new String[100]; 
           sp = 0;
       }
   
  @@ -206,7 +206,9 @@
   	throws SAXException
       {
   	String value=new String(buf, offset, len );
  -	//	System.out.println("XXXCH: " + value );
  +	if( (sp > 0) && elemStack[sp]!=null ) {
  +	    InvocationHelper.addAttribute( elemStack[sp], "body", value );
  +	}
   	
       }
   
  
  
  
  1.1                  jakarta-tools/ant/src/main/org/apache/tools/ant/Ant.java
  
  Index: Ant.java
  ===================================================================
  package org.apache.tools.ant;
  
  import java.beans.*;
  import java.io.*;
  import java.io.IOException;
  import java.lang.reflect.*;
  import java.util.Hashtable;
  import java.util.*;
  import com.sun.xml.parser.Resolver;
  import com.sun.xml.tree.XmlDocument;
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  import org.xml.sax.*;
  import org.xml.sax.helpers.*;
  import org.w3c.dom.*;
  import org.apache.tools.ant.*;
  /**
   *
   *
   * @author duncan@x180.com
   * @author costin@dnt.ro
   */
  public class Ant {
      public static final int MSG_ERR = 0;
      public static final int MSG_WARN = 1;
      public static final int MSG_INFO = 2;
      public static final int MSG_VERBOSE = 3;
  
      public int msgOutputLevel = MSG_INFO;
      private Properties definedProps = new Properties();
      public String usage="No usage help";
      public String vopt[] = null;
      Vector targets=new Vector();
  
      static StringBuffer msg;
      static {
  	String lSep = System.getProperty("line.separator");
  	msg = new StringBuffer();
          msg.append("ant [options] [target]").append(lSep);
          msg.append("Options: ").append(lSep);
  	msg.append("  -help                  print this message");
  	msg.append(lSep);
  	msg.append("  -quiet                 be extra quiet");
  	msg.append(lSep);
  	msg.append("  -verbose               be extra verbose");
  	msg.append(lSep);
  	msg.append("  -buildfile <file>      use given buildfile");
  	msg.append(lSep);
          msg.append("  -D<property>=<value>   use value for given property");
  	msg.append(lSep);     
      }
      
      public static void main(String args[] ) {
  	try {
  	    Ant ant=new Ant();
  	    ant.setValidOptions( new String[] { "buildfile" } );
  	    
  	    if( ! ant.processArgs( args ) ) {
  		return;
  	    }
  
  	    Properties props=ant.getProperties();
  
  	    String fname=props.getProperty("buildfile");
  	    if(fname==null) fname=props.getProperty("file", "build.xml");
  	    File f=new File(fname);
  
  	    TagMap mapper=new TagMap( "org.apache.tools.ant.taskdefs");
  	    mapper.addMap( "project", "org.apache.tools.ant.Project");
  	    mapper.addMap( "target", "org.apache.tools.ant.Target");
  
  	    Project project=(Project)XmlHelper.readXml(f, props, mapper, null);
  	    
  	    Enumeration e = props.keys();
  	    while (e.hasMoreElements()) {
  		String arg = (String)e.nextElement();
  		String value = (String)props.get(arg);
  		project.setProperty(arg, value);
  	    }
  
  	    String args1[] = ant.getArgs();
  	    String target = project.getDefaultTarget();
  	    if( args1!=null && args1.length>0 )
  		target=args1[0];
  
  	    project.executeTarget(target);
  
  	} catch(Exception ex ) {
  	    ex.printStackTrace();
  	}
  
      }
  
      // -------------------- Argument processing --------------------
      // XXX move it to a Helper class2
      public void setValidOptions( String vopt[] ) {
  	this.vopt=vopt;
      }
  
      public Properties getProperties() {
  	return definedProps;
      }
  
      public String[] getArgs() {
  	String sa[]=new String[ targets.size() ];
  	for( int i=0; i< sa.length; i++ ) {
  	    sa[i]=(String)targets.elementAt(i);
  	}
  	return sa;
      }
      
      public void printUsage() {
  	System.out.println(usage);
      }
      
      public  boolean processArgs(String[] args) {
  	for (int i = 0; i < args.length; i++) {
  	    String arg = args[i];
              
  	    if (arg.equals("-help") || arg.equals("help")) {
  		printUsage();
  		return false;
  	    } else if (arg.equals("-quiet") || arg.equals("-q") ||
  		       arg.equals("q")) {
  		msgOutputLevel = MSG_WARN;
  	    } else if (arg.equals("-verbose") || arg.equals("-v") ||
  		       arg.equals("v")) {
  		msgOutputLevel = MSG_VERBOSE;
  	    } else if (arg.startsWith("-D")) {
                  arg = arg.substring(2, arg.length());
                  String value = args[++i];
                  definedProps.put(arg, value);
              } else if (arg.startsWith("-")) {
  		String arg1=arg.substring(1);
  		int type=0;
  		if( vopt != null ) {
  		    for( int j=0; j<vopt.length; i++ ) {
  			if( vopt[j].equalsIgnoreCase(arg1) ) {
  			    type=1;
  			    break;
  			}
  		    }
  		    if(type==0) {
  			// we don't have any more args to recognize!
  			String msg = "Unknown arg: " + arg;
  			System.out.println(msg);
  			printUsage();
  			return false;
  		    }
  		}
  		if( i == args.length) {
  		    System.out.println( "Missing argument");
  		    printUsage();
  		    return false;
  		}
  		String v=args[i+1];
  		i++;
  		definedProps.put( arg1, v);
  	    } else {
  		// if it's no other arg, it may be the target
  		targets.addElement( arg );
  	    }
  	}
  	return true;
      }        
  
  }
  
  /** Maps a tag name using a package prefix and a number of static mappings.
   */
  class TagMap   implements Map {
      String defaultPackage;
      Hashtable maps=new Hashtable();
      
      
      public TagMap(String defP) {
  	defaultPackage=defP + ".";
      }
  
      public void addMap( String tname, String jname ) {
  	maps.put( tname, jname );
      }
  
      public Object get( Object key ) {
  	String tname=(String)key;
  	String cName=(String)maps.get(tname);
  	if(cName!=null) return InvocationHelper.getInstance( cName );
  	// default
  	cName= defaultPackage + InvocationHelper.capitalize( tname );
  	return InvocationHelper.getInstance( cName); 
      }
  }
  
  
  

Re: cvs commit: jakarta-tools/ant/src/main/org/apache/tools/ant Ant.java InvocationHelper.java Project.java Target.java Task.java XmlHelper.java

Posted by James Duncan Davidson <ja...@eng.sun.com>.
> Yes, I just don't want to break ant, it is too important to have it running
> to build tomcat :-)

This is why CVS has branches.. :)

But seriously -- From suggestions made here, and the need to massively
document the code -- and that I'm going to do some of it tonight -- by
splitting off the class and duplicating the code, we're going to have an
update mess on our hands... If all we had to do was merge branches, we'd
be better off.

> I tried hard to do all the changes without touching the existing code too
> much ( i.e add methods, but not remove or change ). I want to use the new
> Ant.java for a while and make sure it is ok before touching Main.java....
> ( I need the extra features to do some more tricks in building and exec).
> 
> Can I keep it for 2 weeks ?

I'd rather you not. I would like to make sure that experimentation from
anybody happens on branches and that those branches get merged in when
they are ready.

.duncan



Re: cvs commit: jakarta-tools/ant/src/main/org/apache/tools/ant Ant.java InvocationHelper.java Project.java Target.java Task.java XmlHelper.java

Posted by James Duncan Davidson <ja...@eng.sun.com>.
> Yes, I just don't want to break ant, it is too important to have it running
> to build tomcat :-)

This is why CVX-Mozilla-Status: 0009
But seriously -- From suggestions made here, and the need to massively
document the code -- and that I'm going to do some of it tonight -- by
splitting off the class and duplicating the code, we're going to have an
update mess on our hands... If all we had to do was merge branches, we'd
be better off.

> I tried hard to do all the changes without touching the existing code too
> much ( i.e add methods, but not remove or change ). I want to use the new
> Ant.java for a while and make sure it is ok before touching Main.java....
> ( I need the extra features to do some more tricks in building and exec).
> 
> Can I keep it for 2 weeks ?

I'd rather you not. I would like to make sure that experimentation from
anybody happens on branches and that those branches get merged in when
they are ready.

.duncan



Re: cvs commit: jakarta-tools/ant/src/main/org/apache/tools/ant Ant.java InvocationHelper.java Project.java Target.java Task.java XmlHelper.java

Posted by co...@eng.sun.com.
James Duncan Davidson wrote:

> >   - Added a Ant.java - it does the same thing as Main.java, but
> >   uses InvocationHelper and XMLHelper instead of ProjectHelper.
> >   - Added few methods to Project, Task, etc - no change in existing methods.
> >   ( needed to make them work with XMLHelper)
>
> -1 on Ant.java -- we should keep the primary command line entry point at
> Main.java. That way we can sanely add other entry points (like
> GuiMain.java, etc.)

Yes, I just don't want to break ant, it is too important to have it running
to build tomcat :-)

I tried hard to do all the changes without touching the existing code too
much ( i.e add methods, but not remove or change ). I want to use the new
Ant.java for a while and make sure it is ok before touching Main.java....
( I need the extra features to do some more tricks in building and exec).

Can I keep it for 2 weeks ?

Costin



Re: cvs commit: jakarta-tools/ant/src/main/org/apache/tools/ant Ant.java InvocationHelper.java Project.java Target.java Task.java XmlHelper.java

Posted by James Duncan Davidson <ja...@eng.sun.com>.
>   - Added a Ant.java - it does the same thing as Main.java, but
>   uses InvocationHelper and XMLHelper instead of ProjectHelper.
>   - Added few methods to Project, Task, etc - no change in existing methods.
>   ( needed to make them work with XMLHelper)

-1 on Ant.java -- we should keep the primary command line entry point at
Main.java. That way we can sanely add other entry points (like
GuiMain.java, etc.)

.duncan