You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by eh...@apache.org on 2002/03/02 23:20:44 UTC

cvs commit: jakarta-ant/proposal/sandbox/antlib/src/main/org/apache/tools/ant Project.java RoleAdapter.java SymbolTable.java TaskAdapter.java

ehatcher    02/03/02 14:20:44

  Modified:    proposal/sandbox/antlib/src/main/org/apache/tools/ant
                        Project.java RoleAdapter.java SymbolTable.java
                        TaskAdapter.java
  Log:
  for Jose Alberto
  
  Revision  Changes    Path
  1.3       +119 -140  jakarta-ant/proposal/sandbox/antlib/src/main/org/apache/tools/ant/Project.java
  
  Index: Project.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/antlib/src/main/org/apache/tools/ant/Project.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Project.java	18 Feb 2002 08:55:16 -0000	1.2
  +++ Project.java	2 Mar 2002 22:20:43 -0000	1.3
  @@ -63,15 +63,12 @@
   import java.util.Enumeration;
   import java.util.Stack;
   import java.lang.reflect.Modifier;
  -import java.lang.reflect.Method;
  -import java.lang.reflect.InvocationTargetException;
   
   
   import org.apache.tools.ant.types.DataTypeAdapterTask; 
   import org.apache.tools.ant.types.FilterSet; 
   import org.apache.tools.ant.types.FilterSetCollection; 
   import org.apache.tools.ant.util.FileUtils; 
  -import org.apache.tools.ant.types.Path;
   
   /**
    * Central representation of an Ant project. This class defines a
  @@ -171,26 +168,30 @@
           fileUtils = FileUtils.newFileUtils();
   	symbols = new SymbolTable();
   	symbols.setProject(this);
  -	loadDefinitions();
       }
       
       /**
        * create a new ant project that inherits from caler project
        * @param p the calling project
        */
  -    private Project(Project p) {
  +    public Project(Project p) {
           fileUtils = FileUtils.newFileUtils();
  -	symbols = new SymbolTable(p.getSymbols());
  +	symbols = new SymbolTable(p);
   	symbols.setProject(this);
       }
       
       /**
  -     * Loads the core definitions into the Root project.
  +     * Initialise the project.
  +     *
  +     * This involves setting the default task definitions and loading the
  +     * system properties.
        */
  -    private void loadDefinitions() {
  -	// Initialize symbol table just in case
  -	symbols.addRole(TASK_ROLE, TaskContainer.class, TaskAdapter.class);
  -	symbols.addRole(DATATYPE_ROLE, TaskContainer.class, 
  +    public void init() throws BuildException {
  +        setJavaVersionProperty();
  +        
  +	// Initialize simbol table just in case
  +	symbols.addRole("task", TaskContainer.class, TaskAdapter.class);
  +	symbols.addRole("datatype", TaskContainer.class, 
   			DataTypeAdapterTask.class);
   
           String defs = "/org/apache/tools/ant/taskdefs/defaults.properties";
  @@ -250,23 +251,7 @@
           } catch (IOException ioe) {
               throw new BuildException("Can't load default datatype list");
           }
  -    }
  -
  -    /**
  -     * Creates a subproject of the current project.
  -     */
  -    public Project createSubProject() {
  -	return new Project(this);
  -    }
   
  -    /**
  -     * Initialise the project.
  -     *
  -     * This involves setting the default task definitions and loading the
  -     * system properties.
  -     */
  -    public void init() throws BuildException {
  -        setJavaVersionProperty();
           setSystemProperties();
       }
   
  @@ -293,7 +278,7 @@
       /**
        * Get the symbols associated with this project.
        */
  -    private SymbolTable getSymbols() { // Package protected on purpose
  +    public SymbolTable getSymbols() {
   	return symbols;
       }
   
  @@ -622,20 +607,6 @@
           log("Detected OS: " + System.getProperty("os.name"), MSG_VERBOSE);
       }
   
  -    /**
  -     * turn all the system properties into ant properties.
  -     * user properties still override these values
  -     */
  -    public void setSystemProperties() {
  -        Properties systemP = System.getProperties();
  -        Enumeration e = systemP.keys();
  -        while (e.hasMoreElements()) {
  -            Object name = e.nextElement();
  -            String value = systemP.get(name).toString();
  -            this.setPropertyInternal(name.toString(), value);
  -        }
  -    }
  -
       public ClassLoader addToLoader(String loader, Path path) {
   	return symbols.addToLoader(loader, path);
       }
  @@ -677,6 +648,20 @@
       }
       
       /**
  +     * turn all the system properties into ant properties.
  +     * user properties still override these values
  +     */
  +    public void setSystemProperties() {
  +        Properties systemP = System.getProperties();
  +        Enumeration e = systemP.keys();
  +        while (e.hasMoreElements()) {
  +            Object name = e.nextElement();
  +            String value = systemP.get(name).toString();
  +            this.setPropertyInternal(name.toString(), value);
  +        }
  +    }
  +
  +    /**
        * add a new task definition, complain if there is an overwrite attempt
        * @param taskName name of the task
        * @param taskClass full task classname
  @@ -685,14 +670,21 @@
        */
       public void addTaskDefinition(String taskName, Class taskClass) 
   	throws BuildException {
  -	addDefinitionOnRole(TASK_ROLE, taskName, taskClass);
  +	Class old = symbols.add("task", taskName, taskClass);
  +        if (null != old && !old.equals(taskClass)) {
  +	    invalidateCreatedTasks(taskName);
  +        }
  +
  +        String msg = 
  +	    " +User task: " + taskName + "     " + taskClass.getName();
  +        log(msg, MSG_DEBUG);
  +        checkTaskClass(taskClass); 
       }
   
       /**
        * Checks a class, whether it is suitable for serving as ant task.
        * @throws BuildException and logs as Project.MSG_ERR for
        * conditions, that will cause the task execution to fail.
  -     * @deprecated this is done now when added to SymbolTable
        */
       public void checkTaskClass(final Class taskClass) throws BuildException {
           if( !Task.class.isAssignableFrom(taskClass) ) {
  @@ -704,7 +696,7 @@
        * get the current task definition hashtable
        */
       public Hashtable getTaskDefinitions() {
  -        return symbols.getDefinitions(TASK_ROLE);
  +        return symbols.getTaskDefinitions();
       }
   
       /**
  @@ -713,14 +705,18 @@
        * @param typeClass full datatype classname     
        */
       public void addDataTypeDefinition(String typeName, Class typeClass) {
  -	addDefinitionOnRole(DATATYPE_ROLE, typeName, typeClass);
  +	symbols.add("datatype", typeName, typeClass);
  +
  +        String msg = 
  +	    " +User datatype: " + typeName + "     " + typeClass.getName();
  +        log(msg, MSG_DEBUG);
       }
   
       /**
        * get the current task definition hashtable
        */
       public Hashtable getDataTypeDefinitions() {
  -        return symbols.getDefinitions(DATATYPE_ROLE);
  +        return symbols.getDataTypeDefinitions();
       }
   
       /**
  @@ -748,7 +744,7 @@
        * in the project.
        * @see Project#addOrReplaceTarget to replace existing Targets.
        */
  -    public void addTarget(String targetName, Target target)
  +     public void addTarget(String targetName, Target target)
            throws BuildException {
            if (targets.get(targetName) != null) {
                throw new BuildException("Duplicate target: `"+targetName+"'");
  @@ -785,95 +781,45 @@
       }
   
       /**
  -     * Create a new element instance on a Role
  -     * @param role name of the role to use
  -     * @param type name of the element to create
  -     * @return null if element unknown on this role
  -     */
  -    public Object createForRole(String role, String type) {
  -	SymbolTable.Factory f = symbols.get(role, type);
  -	if (f == null) return null;
  -
  -	try {
  -	    Object o = f.create(this);
  -	    // Do special book keeping for ProjectComponents
  -	    if ( o instanceof ProjectComponent ) {
  -		((ProjectComponent)o).setProject(this);
  -		if (o instanceof Task) {
  -		    Task task = (Task) o;
  -		    task.setTaskType(type);
  -		    
  -		    // set default value, can be changed by the user
  -		    task.setTaskName(type);
  -		    addCreatedTask(type, task);
  -		}
  -	    }
  -            String msg = "   +" + role + ": " + type;
  -            log (msg, MSG_DEBUG);
  -	    return o;
  -	}
  -	catch (Throwable t) {
  -            String msg = "Could not create " + role + " of type: "
  -                 + type + " due to " + t;
  -            throw new BuildException(msg, t);
  -	}
  -    }
  -
  -    /**
  -     *
  -     */
  -    public Object createInRole(Object container, String type) {
  -	Class clz = container.getClass();
  -	String roles[] = symbols.findRoles(clz);
  -	Object theOne = null;
  -	Method add = null;
  -
  -	for(int i = 0; i < roles.length; i++) {
  -	    Object o = createForRole(roles[i], type);
  -	    if (o != null) {
  -		if (theOne != null) {
  -		    String msg = "Element " + type +
  -			" is ambiguous for container " + clz.getName();
  -		    if (theOne instanceof RoleAdapter) 
  -			theOne = ((RoleAdapter)theOne).getProxy();
  -		    if (o instanceof RoleAdapter) 
  -			o = ((RoleAdapter)o).getProxy();
  -		    
  -		    log(msg, MSG_ERR);
  -		    log("cannot distinguish between " + 
  -			theOne.getClass().getName() + 
  -			" and " + o.getClass().getName(), MSG_ERR);
  -		    throw new BuildException(msg);
  -		}
  -		theOne = o;
  -		add = symbols.getRole(roles[i]).getInterfaceMethod();
  -	    }
  -	}
  -	if (theOne != null) {
  -	    try {
  -		add.invoke(container, new Object[]{theOne});
  -	    }
  -	    catch(InvocationTargetException ite) {
  -		if (ite.getTargetException() instanceof BuildException) {
  -		    throw (BuildException)ite.getTargetException();
  -		}
  -		throw new BuildException(ite.getTargetException());
  -	    }
  -	    catch(Exception e) {
  -		throw new BuildException(e);
  -	    }
  -	}
  -	return theOne;
  -    }
  -
  -    /**
        * create a new task instance
        * @param taskType name of the task
        * @throws BuildException when task creation goes bad
        * @return null if the task name is unknown
        */
       public Task createTask(String taskType) throws BuildException {
  -	return (Task) createForRole(TASK_ROLE, taskType);
  +        Class c = symbols.get("task", taskType);
  +
  +        if (c == null) {
  +            return null;
  +        }
  +        
  +        try {
  +            Object o = c.newInstance();
  +            Task task = null;
  +            if( o instanceof Task ) {
  +               task=(Task)o;
  +            } else {
  +                // "Generic" Bean - use the setter pattern
  +                // and an Adapter
  +                TaskAdapter taskA=new TaskAdapter();
  +                taskA.setProxy( o );
  +                task=taskA;
  +            }
  +            task.setProject(this);
  +            task.setTaskType(taskType);
  +
  +            // set default value, can be changed by the user
  +            task.setTaskName(taskType);
  +
  +            String msg = "   +Task: " + taskType;
  +            log (msg, MSG_DEBUG);
  +            addCreatedTask(taskType, task);
  +            return task;
  +        } catch (Throwable t) {
  +            String msg = "Could not create task of type: "
  +                 + taskType + " due to " + t;
  +            throw new BuildException(msg, t);
  +        }
       }
   
       /**
  @@ -917,11 +863,47 @@
        * @return null if the datatype name is unknown
        */
       public Object createDataType(String typeName) throws BuildException {
  -	// This is to make the function backward compatible
  -	// Since we know if it returning an adapter for it
  -        DataTypeAdapterTask dt = 
  -	    (DataTypeAdapterTask) createForRole(DATATYPE_ROLE, typeName);
  -	return (dt != null? dt.getProxy() : null);
  +        Class c = symbols.get("datatype", typeName);
  +
  +        if (c == null) {
  +            return null;
  +        }
  +
  +        try {
  +            java.lang.reflect.Constructor ctor = null;
  +            boolean noArg = false;
  +            // DataType can have a "no arg" constructor or take a single 
  +            // Project argument.
  +            try {
  +                ctor = c.getConstructor(new Class[0]);
  +                noArg = true;
  +            } catch (NoSuchMethodException nse) {
  +                ctor = c.getConstructor(new Class[] {Project.class});
  +                noArg = false;
  +            }
  +
  +            Object o = null;
  +            if (noArg) {
  +                 o = ctor.newInstance(new Object[0]);
  +            } else {
  +                 o = ctor.newInstance(new Object[] {this});
  +            }
  +            if (o instanceof ProjectComponent) {
  +                ((ProjectComponent)o).setProject(this);
  +            }
  +            String msg = "   +DataType: " + typeName;
  +            log (msg, MSG_DEBUG);
  +            return o;
  +        } catch (java.lang.reflect.InvocationTargetException ite) {
  +            Throwable t = ite.getTargetException();
  +            String msg = "Could not create datatype of type: "
  +                 + typeName + " due to " + t;
  +            throw new BuildException(msg, t);
  +        } catch (Throwable t) {
  +            String msg = "Could not create datatype of type: "
  +                 + typeName + " due to " + t;
  +            throw new BuildException(msg, t);
  +        }
       }
   
       /**
  @@ -1288,10 +1270,7 @@
       }
   
       public void addReference(String name, Object value) {
  -	Object o = references.get(name);
  -        if (null != o && o != value 
  -	    && (!(o instanceof RoleAdapter) 
  -		|| ((RoleAdapter)o).getProxy() != value)) {
  +        if (null != references.get(name)) {
               log("Overriding previous definition of reference to " + name, 
                   MSG_WARN);
           }
  
  
  
  1.3       +0 -5      jakarta-ant/proposal/sandbox/antlib/src/main/org/apache/tools/ant/RoleAdapter.java
  
  Index: RoleAdapter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/antlib/src/main/org/apache/tools/ant/RoleAdapter.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RoleAdapter.java	18 Feb 2002 08:55:16 -0000	1.2
  +++ RoleAdapter.java	2 Mar 2002 22:20:43 -0000	1.3
  @@ -56,11 +56,6 @@
   public interface RoleAdapter {
   
       /**
  -     * Obtain the id in case it is needed.
  -     */
  -    public void setId(String id);
  -
  -    /**
        * Set the object being adapted.
        * @param o the object being adapted
        */
  
  
  
  1.3       +143 -211  jakarta-ant/proposal/sandbox/antlib/src/main/org/apache/tools/ant/SymbolTable.java
  
  Index: SymbolTable.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/antlib/src/main/org/apache/tools/ant/SymbolTable.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SymbolTable.java	18 Feb 2002 08:55:16 -0000	1.2
  +++ SymbolTable.java	2 Mar 2002 22:20:43 -0000	1.3
  @@ -54,7 +54,6 @@
   package org.apache.tools.ant;
   
   import java.lang.reflect.InvocationTargetException;
  -import java.lang.reflect.Constructor;
   import java.lang.reflect.Method;
   import java.lang.reflect.Modifier;
   import java.util.*;
  @@ -97,8 +96,8 @@
        * from that defined in the calling Project.
        * @param p the calling project
        */
  -    public SymbolTable(SymbolTable st) {
  -	parentTable = st;
  +    public SymbolTable(Project p) {
  +	parentTable = p.getSymbols();
       }
   
       /**
  @@ -110,54 +109,6 @@
       }
   
       /**
  -     * Get the specified loader for the project.
  -     * @param name the name of the loader
  -     * @return the corresponding ANT classloader
  -     */
  -    private AntClassLoader getLoader(String name) {
  -	AntClassLoader cl = (AntClassLoader) loaders.get(name);
  -	if (cl == null && parentTable != null) {
  -	    return parentTable.getLoader(name);
  -	}
  -	return cl;
  -    }
  -
  -    /**
  -     * Add the specified class-path to a loader.
  -     * If the loader is defined in an ancestor project then a new
  -     * classloader inheritin from the one already existing
  -     * will be created, otherwise the path willbe added to the existing
  -     * ClassLoader.
  -     * @param name the name of the loader to use.
  -     * @param clspath the path to be added to the classloader
  -     */
  -    public ClassLoader addToLoader(String name, Path clspath) {
  -	// Find if the loader is already defined in the current project
  -	AntClassLoader cl = (AntClassLoader) loaders.get(name);
  -	if (cl == null) {
  -	    // Is it inherited from the calling project
  -	    if (parentTable != null) {
  -		cl = parentTable.getLoader(name);
  -	    }
  -	    cl = new AntClassLoader(cl, project, clspath, true);
  -	    loaders.put(name, cl);
  -	}
  -	else {
  -            // Add additional path to the existing definition
  -	    String[] pathElements = clspath.list();
  -            for (int i = 0; i < pathElements.length; ++i) {
  -                try {
  -                    cl.addPathElement(pathElements[i]);
  -                }
  -                catch (BuildException e) {
  -                    // ignore path elements invalid relative to the project
  -                }
  -            }
  -	}
  -	return cl;
  -    }
  -    
  -    /**
        * Find all the roles supported by a Class
        * on this symbol table.
        * @param clz the class to analyze
  @@ -182,13 +133,13 @@
   		list.addElement(role);
   	    }
   	}
  -	if (parentTable != null) parentTable.findRoles(clz, list);
  +	if (parentTable != null) findRoles(clz, list);
       }
       
       /**
        * Get the Role definition
        * @param role the name of the role
  -     * @return the Role description
  +     * @return the method used to support objects on this role
        */
       public Role getRole(String role) {
   	Role r = (Role) roles.get(role);
  @@ -220,6 +171,112 @@
   	return (old != null);
       }
   
  +    /** 
  +     * Verify if the interface is valid.
  +     * @param clz the interface to validate
  +     * @return the method defined by the interface
  +     */
  +    private Method validInterface(Class clz) {
  +	Method m[] = clz.getDeclaredMethods();
  +	if (m.length == 1
  +	    && java.lang.Void.TYPE.equals(m[0].getReturnType())) {
  +	    Class args[] = m[0].getParameterTypes();
  +	    if (args.length == 1
  +		&& !java.lang.String.class.equals(args[0])
  +		&& !args[0].isArray()
  +		&& !args[0].isPrimitive()) {
  +		return m[0];
  +	    }
  +	    else {
  +		throw new BuildException("Invalid role interface method in: "
  +					 + clz.getName());
  +	    }
  +	}
  +	else {
  +	    throw new BuildException("More than one method on role interface");
  +	}
  +    }
  +
  +    /** 
  +     * Verify if the adapter is valid with respect to the interface.
  +     * @param clz the class adapter to validate
  +     * @param mtd the method whose only argument must match
  +     * @return the static method to use for validating adaptees
  +     */
  +    private Method validAdapter(Class clz, Method mtd) {
  +	if (clz == null) return null;
  +	
  +	checkClass(clz);
  +	if (!mtd.getParameterTypes()[0].isAssignableFrom(clz)) {
  +	    String msg = "Adapter " + clz.getName() + 
  +		" is incompatible with role interface " + 
  +		mtd.getDeclaringClass().getName();
  +	    throw new BuildException(msg);
  +	}
  +	String msg = "Class " + clz.getName() + " is not an adapter: ";
  +	if (!RoleAdapter.class.isAssignableFrom(clz)) {
  +	    throw new BuildException(msg + "does not implement RoleAdapter");
  +	}
  +	try {
  +	    Method chk = clz.getMethod("checkClass", CHECK_ADAPTER_PARAMS);
  +	    if (!Modifier.isStatic(chk.getModifiers())) {
  +		throw new BuildException(msg + "checkClass() is not static");
  +	    }
  +	    return chk;
  +	}
  +	catch(NoSuchMethodException nme){
  +	    throw new BuildException(msg + "checkClass() not found", nme);
  +	}
  +    }
  +
  +    /**
  +     * Get the specified loader for the project.
  +     * @param name the name of the loader
  +     * @return the corresponding ANT classloader
  +     */
  +    private AntClassLoader getLoader(String name) {
  +	AntClassLoader cl = (AntClassLoader) loaders.get(name);
  +	if (cl == null && parentTable != null) {
  +	    return parentTable.getLoader(name);
  +	}
  +	return cl;
  +    }
  +
  +    /**
  +     * Add the specified class-path to a loader.
  +     * If the loader is defined in an ancestor project then a new
  +     * classloader inheritin from the one already existing
  +     * will be created, otherwise the path willbe added to the existing
  +     * ClassLoader.
  +     * @param name the name of the loader to use.
  +     * @param clspath the path to be added to the classloader
  +     */
  +    public ClassLoader addToLoader(String name, Path clspath) {
  +	// Find if the loader is already defined in the current project
  +	AntClassLoader cl = (AntClassLoader) loaders.get(name);
  +	if (cl == null) {
  +	    // Is it inherited from the calling project
  +	    if (parentTable != null) {
  +		cl = parentTable.getLoader(name);
  +	    }
  +	    cl = new AntClassLoader(cl, project, clspath, true);
  +	    loaders.put(name, cl);
  +	}
  +	else {
  +            // Add additional path to the existing definition
  +	    String[] pathElements = clspath.list();
  +            for (int i = 0; i < pathElements.length; ++i) {
  +                try {
  +                    cl.addPathElement(pathElements[i]);
  +                }
  +                catch (BuildException e) {
  +                    // ignore path elements invalid relative to the project
  +                }
  +            }
  +	}
  +	return cl;
  +    }
  +    
       /**
        * Add a new type of element to a role.
        * @param role the role for this Class.
  @@ -234,13 +291,13 @@
   	    throw new BuildException("Unknown role: " + role);
   	}
   	// Check if it is already defined
  -	Factory old = get(role, name);
  +	Class old = get(role, name);
   	if (old != null) {
  -	    if (old.getOriginalClass().equals(clz)) {
  +	    if (old.equals(clz)) {
   		project.log("Ignoring override for "+ role + " " + name 
   			    + ", it is already defined by the same class.", 
   			    project.MSG_VERBOSE);
  -		return old.getOriginalClass();
  +		return old;
   	    }
   	    else {
                   project.log("Trying to override old definition of " +
  @@ -248,33 +305,26 @@
   			    project.MSG_WARN);
   	    }
   	}
  -	Factory f = checkClass(clz);
  +	checkClass(clz);
   	// Check that the Class is compatible with the role definition
  -	f = r.verifyAdaptability(role, f);
  +	r.verifyAdaptability(role, clz);
   	// Record the new type
   	Hashtable defTable = (Hashtable)defs.get(role);
   	if (defTable == null) {
   	    defTable = new Hashtable();
   	    defs.put(role, defTable);
   	}
  -	defTable.put(name, f);
  -
  -        String msg = 
  -	    " +User " + role + ": " + name + "     " + clz.getName();
  -        project.log(msg, project.MSG_DEBUG);
  -	return (old != null ? old.getOriginalClass() : null);
  +	defTable.put(name, clz);
  +	return old;
       }
   
       /**
        * Checks a class, whether it is suitable for serving in ANT.
  -     * @return the factory to use when instantiating the class
        * @throws BuildException and logs as Project.MSG_ERR for
        * conditions, that will cause execution to fail.
        */
  -    Factory checkClass(final Class clz) // Package on purpose
  +    void checkClass(final Class clz) 
   	throws BuildException {
  -	if (clz == null) return null;
  -
           if(!Modifier.isPublic(clz.getModifiers())) {
               final String message = clz + " is not public";
               project.log(message, Project.MSG_ERR);
  @@ -292,37 +342,8 @@
               // getConstructor finds public constructors only.
               try {
                   clz.getConstructor(new Class[0]);
  -		return new Factory(){
  -			public Object create(Project p) {
  -			    try {
  -				return clz.newInstance();
  -			    }
  -			    catch(Exception e) {
  -				throw new BuildException(e);
  -			    }
  -			}
  -
  -			public Class getOriginalClass() {
  -			    return clz;
  -			}
  -		    };
               } catch (NoSuchMethodException nse) {
  -                final Constructor c = 
  -		    clz.getConstructor(new Class[] {Project.class});
  -		return new Factory(){
  -			public Object create(Project p) {
  -			    try {
  -				return c.newInstance(new Object[]{p});
  -			    }
  -			    catch(Exception e) {
  -				throw new BuildException(e);
  -			    }
  -			}
  -
  -			public Class getOriginalClass() {
  -			    return clz;
  -			}
  -		    };
  +                clz.getConstructor(new Class[] {Project.class});
               }
           } catch(NoSuchMethodException e) {
               final String message = 
  @@ -338,11 +359,11 @@
        * @param name the name of the element to sea
        * @return the Class implementation
        */
  -    public Factory get(String role, String name) {
  +    public Class get(String role, String name) {
   	Hashtable defTable = (Hashtable)defs.get(role);
   	if (defTable != null) {
  -	    Factory f = (Factory)defTable.get(name);
  -	    if (f != null) return f;
  +	    Class clz = (Class)defTable.get(name);
  +	    if (clz != null) return clz;
   	}
   	if (parentTable != null) {
   	    return parentTable.get(role, name);
  @@ -351,12 +372,19 @@
       }
   
       /**
  -     * Get a Hashtable that is usable for manipulating elements on Role.
  -     * @param role the role of the elements in the table
  +     * Get a Hashtable that is usable for manipulating Tasks,
        * @return a Hashtable that delegates to the Symbol table.
        */ 
  -    Hashtable getDefinitions(String role) { // package scope on purpose
  -	return new SymbolHashtable(role);
  +    public Hashtable getTaskDefinitions() {
  +	return new SymbolHashtable("task");
  +    }
  +
  +    /**
  +     * Get a Hashtable that is usable for manipulating Datatypes,
  +     * @return a Hashtable that delegates to the Symbol table.
  +     */
  +    public Hashtable getDataTypeDefinitions() {
  +	return new SymbolHashtable("datatype");
       }
   
       /**
  @@ -374,43 +402,16 @@
   	}
   
   	public synchronized Object get(Object key) {
  -	    Factory f = SymbolTable.this.get(role, (String)key);
  -	    return (f == null? null : f.getOriginalClass());
  +	    return SymbolTable.this.get(role, (String)key);
   	}
       }
   
       /**
  -     * Factory for creating ANT objects.
  -     * Class objects are not instanciated directly but through a Factory
  -     * which is able to resolve issues such as proxys and such.
  -     */
  -    public static interface Factory {
  -	/**
  -	 * Creates an object for the Role
  -	 * @param the project in which it is created
  -	 * @return the instantiated object with a proxy if necessary
  -	 */
  -	public Object create(Project p);
  -
  -	/**
  -	 * Creates an object for the Role, adapted if necessary
  -	 * for a particular interface.
  -	 */
  -//  	public Object adaptFor(Class clz, Project p, Object o);
  -
  -	/**
  -	 * The original class of the object without proxy.
  -	 */
  -	public Class getOriginalClass();
  -    }
  -
  -    /**
        * The definition of a role
        */
       public class Role {
   	private Method interfaceMethod;
   	private Method adapterVerifier;
  -	private Factory adapterFactory;
   	
   	/**
   	 * Creates a new Role object
  @@ -419,7 +420,6 @@
   	 */
   	Role(Class roleClz, Class adapterClz) {
   	    interfaceMethod = validInterface(roleClz);
  -	    adapterFactory = checkClass(adapterClz);
   	    adapterVerifier = validAdapter(adapterClz, interfaceMethod);
   	}
   
  @@ -433,11 +433,12 @@
   	/**
   	 * Instantiate a new adapter for this role.
   	 */
  -	public RoleAdapter createAdapter(Project p) {
  -	    if (adapterFactory == null) return null;
  +	public RoleAdapter createAdapter() {
  +	    if (adapterVerifier == null) return null;
   	    
   	    try {
  -		return (RoleAdapter) adapterFactory.create(p);
  +		return (RoleAdapter) 
  +		    adapterVerifier.getDeclaringClass().newInstance();
   	    }
   	    catch(BuildException be) {
   		throw be;
  @@ -450,12 +451,11 @@
   	/**
   	 * Verify if the class can be adapted to use by the role
   	 * @param role the name of the role to verify
  -	 * @param f the factory for the class to verify
  +	 * @param clz the class to verify
   	 */
  -	public Factory verifyAdaptability(String role, final Factory f) {
  -	    final Class clz = f.getOriginalClass();
  +	public void verifyAdaptability(String role, Class clz) {
   	    if (interfaceMethod.getParameterTypes()[0].isAssignableFrom(clz)) {
  -		return f;
  +		return;
   	    }
   	    if (adapterVerifier == null) {
   		String msg = "Class " + clz.getName() + 
  @@ -464,18 +464,8 @@
   	    }
   	    try {
   		try {
  -		    adapterVerifier.invoke(null, new Object[]{clz, project});
  -		    return new Factory(){
  -			    public Object create(Project p) {
  -				RoleAdapter ra = createAdapter(p);
  -				ra.setProxy(f.create(p));
  -				return ra;
  -			    }
  -
  -			    public Class getOriginalClass() {
  -				return clz;
  -			    }
  -			};
  +		    adapterVerifier.invoke(null, 
  +					   new Object[]{clz, project});
   		}
   		catch (InvocationTargetException ite) {
   		    throw ite.getTargetException();
  @@ -497,63 +487,5 @@
   	public boolean isImplementedBy(Class clz) {
   	    return interfaceMethod.getDeclaringClass().isAssignableFrom(clz);
   	}
  -
  -	/** 
  -	 * Verify if the interface is valid.
  -	 * @param clz the interface to validate
  -	 * @return the method defined by the interface
  -	 */
  -	private Method validInterface(Class clz) {
  -	    Method m[] = clz.getDeclaredMethods();
  -	    if (m.length == 1
  -		&& java.lang.Void.TYPE.equals(m[0].getReturnType())) {
  -		Class args[] = m[0].getParameterTypes();
  -		if (args.length == 1
  -		    && !java.lang.String.class.equals(args[0])
  -		    && !args[0].isArray()
  -		    && !args[0].isPrimitive()) {
  -		    return m[0];
  -		}
  -		else {
  -		    throw new BuildException("Invalid role interface method in: "
  -					     + clz.getName());
  -		}
  -	    }
  -	    else {
  -		throw new BuildException("More than one method on role interface");
  -	    }
  -	}
  -	
  -	/** 
  -	 * Verify if the adapter is valid with respect to the interface.
  -	 * @param clz the class adapter to validate
  -	 * @param mtd the method whose only argument must match
  -	 * @return the static method to use for validating adaptees
  -	 */
  -	private Method validAdapter(Class clz, Method mtd) {
  -	    if (clz == null) return null;
  -	    
  -	    if (!mtd.getParameterTypes()[0].isAssignableFrom(clz)) {
  -		String msg = "Adapter " + clz.getName() + 
  -		    " is incompatible with role interface " + 
  -		    mtd.getDeclaringClass().getName();
  -		throw new BuildException(msg);
  -	    }
  -	    String msg = "Class " + clz.getName() + " is not an adapter: ";
  -	    if (!RoleAdapter.class.isAssignableFrom(clz)) {
  -		throw new BuildException(msg + "does not implement RoleAdapter");
  -	    }
  -	    try {
  -		Method chk = clz.getMethod("checkClass", CHECK_ADAPTER_PARAMS);
  -		if (!Modifier.isStatic(chk.getModifiers())) {
  -		    throw new BuildException(msg + "checkClass() is not static");
  -		}
  -		return chk;
  -	    }
  -	    catch(NoSuchMethodException nme){
  -		throw new BuildException(msg + "checkClass() not found", nme);
  -	    }
  -	}
  -	
       }
   }
  
  
  
  1.3       +0 -1      jakarta-ant/proposal/sandbox/antlib/src/main/org/apache/tools/ant/TaskAdapter.java
  
  Index: TaskAdapter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/antlib/src/main/org/apache/tools/ant/TaskAdapter.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TaskAdapter.java	18 Feb 2002 08:55:16 -0000	1.2
  +++ TaskAdapter.java	2 Mar 2002 22:20:43 -0000	1.3
  @@ -165,5 +165,4 @@
           return this.proxy ;
       }
   
  -    public void setId(String id) {}
   }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>