diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/Project.java b/proposal/myrmidon/src/main/org/apache/tools/ant/Project.java
index 49390d928..6135e9333 100644
--- a/proposal/myrmidon/src/main/org/apache/tools/ant/Project.java
+++ b/proposal/myrmidon/src/main/org/apache/tools/ant/Project.java
@@ -8,12 +8,9 @@
package org.apache.tools.ant;
import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
import java.lang.reflect.Modifier;
import java.util.Enumeration;
import java.util.Hashtable;
-import java.util.Properties;
import java.util.Stack;
import java.util.Vector;
import org.apache.myrmidon.api.TaskException;
@@ -171,78 +168,6 @@ public class Project
return path.toString();
}
- private static TaskException makeCircularException( String end, Stack stk )
- {
- StringBuffer sb = new StringBuffer( "Circular dependency: " );
- sb.append( end );
- String c;
- do
- {
- c = (String)stk.pop();
- sb.append( " <- " );
- sb.append( c );
- } while( !c.equals( end ) );
- return new TaskException( new String( sb ) );
- }
-
- /**
- * set the base directory; XML attribute. checks for the directory existing
- * and being a directory type
- *
- * @param baseDir project base directory.
- * @throws TaskException if the directory was invalid
- */
- public void setBaseDir( File baseDir )
- throws TaskException
- {
- baseDir = FileUtils.newFileUtils().normalize( baseDir.getAbsolutePath() );
- if( !baseDir.exists() )
- throw new TaskException( "Basedir " + baseDir.getAbsolutePath() + " does not exist" );
- if( !baseDir.isDirectory() )
- throw new TaskException( "Basedir " + baseDir.getAbsolutePath() + " is not a directory" );
- this.baseDir = baseDir;
- setPropertyInternal( "basedir", this.baseDir.getPath() );
- String msg = "Project base dir set to: " + this.baseDir;
- log( msg, MSG_VERBOSE );
- }
-
- /**
- * match basedir attribute in xml
- *
- * @param baseD project base directory.
- * @throws TaskException if the directory was invalid
- */
- public void setBasedir( String baseD )
- throws TaskException
- {
- setBaseDir( new File( baseD ) );
- }
-
- public void setCoreLoader( ClassLoader coreLoader )
- {
- this.coreLoader = coreLoader;
- }
-
- /**
- * set the default target of the project XML attribute name.
- *
- * @param defaultTarget The new Default value
- */
- public void setDefault( String defaultTarget )
- {
- this.defaultTarget = defaultTarget;
- }
-
- /**
- * set the project description
- *
- * @param description text
- */
- public void setDescription( String description )
- {
- this.description = description;
- }
-
/**
* set the ant.java.version property, also tests for unsupported JVM
* versions, prints the verbose log messages
@@ -265,18 +190,6 @@ public class Project
log( "Detected OS: " + System.getProperty( "os.name" ), MSG_VERBOSE );
}
- /**
- * ant xml property. Set the project name as an attribute of this class, and
- * of the property ant.project.name
- *
- * @param name The new Name value
- */
- public void setName( String name )
- {
- setUserProperty( "ant.project.name", name );
- this.name = name;
- }
-
/**
* set a property. An existing property of the same name will not be
* overwritten.
@@ -297,65 +210,6 @@ public class Project
properties.put( name, value );
}
- /**
- * set a property. Any existing property of the same name is overwritten,
- * unless it is a user property.
- *
- * @param name name of property
- * @param value new value of the property
- */
- public void setProperty( String name, String value )
- {
- // command line properties take precedence
- if( null != userProperties.get( name ) )
- {
- log( "Override ignored for user property " + name, MSG_VERBOSE );
- return;
- }
-
- if( null != properties.get( name ) )
- {
- log( "Overriding previous definition of property " + name,
- MSG_VERBOSE );
- }
-
- log( "Setting project property: " + name + " -> " +
- value, MSG_DEBUG );
- properties.put( name, value );
- }
-
- /**
- * 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 );
- }
- }
-
- /**
- * set a user property, which can not be overwritten by set/unset property
- * calls
- *
- * @param name The new UserProperty value
- * @param value The new UserProperty value
- * @see #setProperty(String,String)
- */
- public void setUserProperty( String name, String value )
- {
- log( "Setting ro project property: " + name + " -> " +
- value, MSG_DEBUG );
- userProperties.put( name, value );
- properties.put( name, value );
- }
-
/**
* get the base directory of the project as a file object
*
@@ -364,25 +218,9 @@ public class Project
*/
public File getBaseDir()
{
- if( baseDir == null )
- {
- try
- {
- setBasedir( "." );
- }
- catch( TaskException ex )
- {
- ex.printStackTrace();
- }
- }
return baseDir;
}
- public Vector getBuildListeners()
- {
- return listeners;
- }
-
public ClassLoader getCoreLoader()
{
return coreLoader;
@@ -398,41 +236,11 @@ public class Project
return dataClassDefinitions;
}
- /**
- * get the default target of the project
- *
- * @return default target or null
- */
- public String getDefaultTarget()
- {
- return defaultTarget;
- }
-
- /**
- * get the project description
- *
- * @return description or null if no description has been set
- */
- public String getDescription()
- {
- return description;
- }
-
public FilterSet getGlobalFilterSet()
{
return globalFilterSet;
}
- /**
- * get the project name
- *
- * @return name string
- */
- public String getName()
- {
- return name;
- }
-
/**
* get a copy of the property hashtable
*
@@ -501,314 +309,11 @@ public class Project
return taskClassDefinitions;
}
- /**
- * get a copy of the user property hashtable
- *
- * @return the hashtable user properties only
- */
- public Hashtable getUserProperties()
- {
- Hashtable propertiesCopy = new Hashtable();
-
- Enumeration e = userProperties.keys();
- while( e.hasMoreElements() )
- {
- Object name = e.nextElement();
- Object value = properties.get( name );
- propertiesCopy.put( name, value );
- }
-
- return propertiesCopy;
- }
-
- /**
- * query a user property.
- *
- * @param name the name of the property
- * @return the property value, or null for no match
- */
- public String getUserProperty( String name )
- {
- if( name == null )
- return null;
- String property = (String)userProperties.get( name );
- return property;
- }
-
- /**
- * Topologically sort a set of Targets.
- *
- * @param root is the (String) name of the root Target. The sort is created
- * in such a way that the sequence of Targets uptil the root target is
- * the minimum possible such sequence.
- * @param targets is a Hashtable representing a "name to Target" mapping
- * @return a Vector of Strings with the names of the targets in sorted
- * order.
- * @exception TaskException if there is a cyclic dependency among the
- * Targets, or if a Target does not exist.
- */
- public final Vector topoSort( String root, Hashtable targets )
- throws TaskException
- {
- Vector ret = new Vector();
- Hashtable state = new Hashtable();
- Stack visiting = new Stack();
-
- // We first run a DFS based sort using the root as the starting node.
- // This creates the minimum sequence of Targets to the root node.
- // We then do a sort on any remaining unVISITED targets.
- // This is unnecessary for doing our build, but it catches
- // circular dependencies or missing Targets on the entire
- // dependency tree, not just on the Targets that depend on the
- // build Target.
-
- tsort( root, targets, state, visiting, ret );
- log( "Build sequence for target `" + root + "' is " + ret, MSG_VERBOSE );
- for( Enumeration en = targets.keys(); en.hasMoreElements(); )
- {
- String curTarget = (String)( en.nextElement() );
- String st = (String)state.get( curTarget );
- if( st == null )
- {
- tsort( curTarget, targets, state, visiting, ret );
- }
- else if( st == VISITING )
- {
- throw new RuntimeException( "Unexpected node in visiting state: " + curTarget );
- }
- }
- log( "Complete build sequence is " + ret, MSG_VERBOSE );
- return ret;
- }
-
public void addBuildListener( BuildListener listener )
{
listeners.addElement( listener );
}
- /**
- * add a new datatype
- *
- * @param typeName name of the datatype
- * @param typeClass full datatype classname
- */
- public void addDataTypeDefinition( String typeName, Class typeClass )
- {
- if( null != dataClassDefinitions.get( typeName ) )
- {
- log( "Trying to override old definition of datatype " + typeName,
- MSG_WARN );
- }
-
- String msg = " +User datatype: " + typeName + " " + typeClass.getName();
- log( msg, MSG_DEBUG );
- dataClassDefinitions.put( typeName, typeClass );
- }
-
- /**
- * @param target is the Target to be added or replaced in the current
- * Project.
- */
- public void addOrReplaceTarget( Target target )
- {
- addOrReplaceTarget( target.getName(), target );
- }
-
- /**
- * @param target is the Target to be added/replaced in the current Project.
- * @param targetName is the name to use for the Target
- */
- public void addOrReplaceTarget( String targetName, Target target )
- {
- String msg = " +Target: " + targetName;
- log( msg, MSG_DEBUG );
- target.setProject( this );
- targets.put( targetName, target );
- }
-
- public void addReference( String name, Object value )
- {
- if( null != references.get( name ) )
- {
- log( "Overriding previous definition of reference to " + name,
- MSG_WARN );
- }
- log( "Adding reference: " + name + " -> " + value, MSG_DEBUG );
- references.put( name, value );
- }
-
- /**
- * This call expects to add a new Target.
- *
- * @param target is the Target to be added to the current Project.
- * @see Project#addOrReplaceTarget to replace existing Targets.
- */
- public void addTarget( Target target )
- throws TaskException
- {
- String name = target.getName();
- if( targets.get( name ) != null )
- {
- throw new TaskException( "Duplicate target: `" + name + "'" );
- }
- addOrReplaceTarget( name, target );
- }
-
- /**
- * This call expects to add a new Target.
- *
- * @param target is the Target to be added to the current Project.
- * @param targetName is the name to use for the Target
- * @exception TaskException if the Target already exists in the project.
- * @see Project#addOrReplaceTarget to replace existing Targets.
- */
- public void addTarget( String targetName, Target target )
- throws TaskException
- {
- if( targets.get( targetName ) != null )
- {
- throw new TaskException( "Duplicate target: `" + targetName + "'" );
- }
- addOrReplaceTarget( targetName, target );
- }
-
- /**
- * add a new task definition, complain if there is an overwrite attempt
- *
- * @param taskName name of the task
- * @param taskClass full task classname
- * @throws TaskException and logs as Project.MSG_ERR for conditions, that
- * will cause the task execution to fail.
- */
- public void addTaskDefinition( String taskName, Class taskClass )
- throws TaskException
- {
- Class old = (Class)taskClassDefinitions.get( taskName );
- if( null != old )
- {
- if( old.equals( taskClass ) )
- {
- log( "Ignoring override for task " + taskName
- + ", it is already defined by the same class.",
- MSG_VERBOSE );
- return;
- }
- else
- {
- log( "Trying to override old definition of task " + taskName,
- MSG_WARN );
-
- }
- }
-
- String msg = " +User task: " + taskName + " " + taskClass.getName();
- log( msg, MSG_DEBUG );
- checkTaskClass( taskClass );
- taskClassDefinitions.put( taskName, taskClass );
- }
-
- /**
- * Checks a class, whether it is suitable for serving as ant task.
- *
- * @param taskClass Description of Parameter
- * @throws TaskException and logs as Project.MSG_ERR for conditions, that
- * will cause the task execution to fail.
- */
- public void checkTaskClass( final Class taskClass )
- throws TaskException
- {
- if( !Modifier.isPublic( taskClass.getModifiers() ) )
- {
- final String message = taskClass + " is not public";
- log( message, Project.MSG_ERR );
- throw new TaskException( message );
- }
- if( Modifier.isAbstract( taskClass.getModifiers() ) )
- {
- final String message = taskClass + " is abstract";
- log( message, Project.MSG_ERR );
- throw new TaskException( message );
- }
- try
- {
- taskClass.getConstructor( null );
- // don't have to check for public, since
- // getConstructor finds public constructors only.
- }
- catch( NoSuchMethodException e )
- {
- final String message = "No public default constructor in " + taskClass;
- log( message, Project.MSG_ERR );
- throw new TaskException( message );
- }
- if( !Task.class.isAssignableFrom( taskClass ) )
- TaskAdapter.checkTaskClass( taskClass, this );
- }
-
- /**
- * create a new DataType instance
- *
- * @param typeName name of the datatype
- * @return null if the datatype name is unknown
- * @throws TaskException when datatype creation goes bad
- */
- public Object createDataType( String typeName )
- throws TaskException
- {
- Class c = (Class)dataClassDefinitions.get( 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 TaskException( msg, t );
- }
- catch( Throwable t )
- {
- String msg = "Could not create datatype of type: "
- + typeName + " due to " + t;
- throw new TaskException( msg, t );
- }
- }
-
/**
* create a new task instance
*
@@ -819,40 +324,7 @@ public class Project
public Task createTask( String taskType )
throws TaskException
{
- Class c = (Class)taskClassDefinitions.get( 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 );
-
- 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 TaskException( msg, t );
- }
+ throw new TaskException( "Task needs reimplementing" );
}
public void demuxOutput( String line, boolean isError )
@@ -860,7 +332,7 @@ public class Project
Task task = (Task)threadTasks.get( Thread.currentThread() );
if( task == null )
{
- fireMessageLogged( this, line, isError ? MSG_ERR : MSG_INFO );
+ //fireMessageLogged( this, line, isError ? MSG_ERR : MSG_INFO );
}
else
{
@@ -875,113 +347,11 @@ public class Project
}
}
- /**
- * execute the targets and any targets it depends on
- *
- * @param targetName the target to execute
- * @throws TaskException if the build failed
- */
- public void executeTarget( String targetName )
- throws TaskException
- {
- }
-
- /**
- * Initialise the project. This involves setting the default task
- * definitions and loading the system properties.
- *
- * @exception TaskException Description of Exception
- */
- public void init()
- throws TaskException
- {
- setJavaVersionProperty();
-
- String defs = "/org/apache/tools/ant/taskdefs/defaults.properties";
-
- try
- {
- Properties props = new Properties();
- InputStream in = this.getClass().getResourceAsStream( defs );
- if( in == null )
- {
- throw new TaskException( "Can't load default task list" );
- }
- props.load( in );
- in.close();
-
- Enumeration enum = props.propertyNames();
- while( enum.hasMoreElements() )
- {
- String key = (String)enum.nextElement();
- String value = props.getProperty( key );
- try
- {
- Class taskClass = Class.forName( value );
- addTaskDefinition( key, taskClass );
- }
- catch( NoClassDefFoundError ncdfe )
- {
- // ignore...
- }
- catch( ClassNotFoundException cnfe )
- {
- // ignore...
- }
- }
- }
- catch( IOException ioe )
- {
- throw new TaskException( "Can't load default task list" );
- }
-
- String dataDefs = "/org/apache/tools/ant/types/defaults.properties";
-
- try
- {
- Properties props = new Properties();
- InputStream in = this.getClass().getResourceAsStream( dataDefs );
- if( in == null )
- {
- throw new TaskException( "Can't load default datatype list" );
- }
- props.load( in );
- in.close();
-
- Enumeration enum = props.propertyNames();
- while( enum.hasMoreElements() )
- {
- String key = (String)enum.nextElement();
- String value = props.getProperty( key );
- try
- {
- Class dataClass = Class.forName( value );
- addDataTypeDefinition( key, dataClass );
- }
- catch( NoClassDefFoundError ncdfe )
- {
- // ignore...
- }
- catch( ClassNotFoundException cnfe )
- {
- // ignore...
- }
- }
- }
- catch( IOException ioe )
- {
- throw new TaskException( "Can't load default datatype list" );
- }
-
- setSystemProperties();
- }
-
/**
* Output a message to the log with the default log level of MSG_INFO
*
* @param msg text to log
*/
-
public void log( String msg )
{
log( msg, MSG_INFO );
@@ -996,7 +366,6 @@ public class Project
*/
public void log( String msg, int msgLevel )
{
- fireMessageLogged( this, msg, msgLevel );
}
/**
@@ -1009,7 +378,6 @@ public class Project
*/
public void log( Task task, String msg, int msgLevel )
{
- fireMessageLogged( task, msg, msgLevel );
}
/**
@@ -1022,12 +390,6 @@ public class Project
*/
public void log( Target target, String msg, int msgLevel )
{
- fireMessageLogged( target, msg, msgLevel );
- }
-
- public void removeBuildListener( BuildListener listener )
- {
- listeners.removeElement( listener );
}
/**
@@ -1142,111 +504,6 @@ public class Project
}
}
- /**
- * send build finished event to the listeners
- *
- * @param exception exception which indicates failure if not null
- */
- protected void fireBuildFinished( Throwable exception )
- {
- BuildEvent event = new BuildEvent( this );
- event.setException( exception );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.buildFinished( event );
- }
- }
-
- /**
- * send build started event to the listeners
- */
- protected void fireBuildStarted()
- {
- BuildEvent event = new BuildEvent( this );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.buildStarted( event );
- }
- }
-
- protected void fireMessageLogged( Project project, String message, int priority )
- {
- BuildEvent event = new BuildEvent( project );
- fireMessageLoggedEvent( event, message, priority );
- }
-
- protected void fireMessageLogged( Target target, String message, int priority )
- {
- BuildEvent event = new BuildEvent( target );
- fireMessageLoggedEvent( event, message, priority );
- }
-
- protected void fireMessageLogged( Task task, String message, int priority )
- {
- BuildEvent event = new BuildEvent( task );
- fireMessageLoggedEvent( event, message, priority );
- }
-
- /**
- * send build finished event to the listeners
- *
- * @param exception exception which indicates failure if not null
- * @param target Description of Parameter
- */
- protected void fireTargetFinished( Target target, Throwable exception )
- {
- BuildEvent event = new BuildEvent( target );
- event.setException( exception );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.targetFinished( event );
- }
- }
-
- /**
- * send target started event to the listeners
- *
- * @param target Description of Parameter
- */
- protected void fireTargetStarted( Target target )
- {
- BuildEvent event = new BuildEvent( target );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.targetStarted( event );
- }
- }
-
- protected void fireTaskFinished( Task task, Throwable exception )
- {
- threadTasks.remove( Thread.currentThread() );
- System.out.flush();
- System.err.flush();
- BuildEvent event = new BuildEvent( task );
- event.setException( exception );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.taskFinished( event );
- }
- }
-
- protected void fireTaskStarted( Task task )
- {
- // register this as the current task on the current thread.
- threadTasks.put( Thread.currentThread(), task );
- BuildEvent event = new BuildEvent( task );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.taskStarted( event );
- }
- }
-
/**
* Allows Project and subclasses to set a property unless its already
* defined as a user property. There are a few cases internally to Project
@@ -1263,105 +520,4 @@ public class Project
}
properties.put( name, value );
}
-
- // one step in a recursive DFS traversal of the Target dependency tree.
- // - The Hashtable "state" contains the state (VISITED or VISITING or null)
- // of all the target names.
- // - The Stack "visiting" contains a stack of target names that are
- // currently on the DFS stack. (NB: the target names in "visiting" are
- // exactly the target names in "state" that are in the VISITING state.)
- // 1. Set the current target to the VISITING state, and push it onto
- // the "visiting" stack.
- // 2. Throw a TaskException if any child of the current node is
- // in the VISITING state (implies there is a cycle.) It uses the
- // "visiting" Stack to construct the cycle.
- // 3. If any children have not been VISITED, tsort() the child.
- // 4. Add the current target to the Vector "ret" after the children
- // have been visited. Move the current target to the VISITED state.
- // "ret" now contains the sorted sequence of Targets upto the current
- // Target.
-
- private final void tsort( String root, Hashtable targets,
- Hashtable state, Stack visiting,
- Vector ret )
- throws TaskException
- {
- state.put( root, VISITING );
- visiting.push( root );
-
- Target target = (Target)( targets.get( root ) );
-
- // Make sure we exist
- if( target == null )
- {
- StringBuffer sb = new StringBuffer( "Target `" );
- sb.append( root );
- sb.append( "' does not exist in this project. " );
- visiting.pop();
- if( !visiting.empty() )
- {
- String parent = (String)visiting.peek();
- sb.append( "It is used from target `" );
- sb.append( parent );
- sb.append( "'." );
- }
-
- throw new TaskException( new String( sb ) );
- }
-
- for( Enumeration en = target.getDependencies(); en.hasMoreElements(); )
- {
- String cur = (String)en.nextElement();
- String m = (String)state.get( cur );
- if( m == null )
- {
- // Not been visited
- tsort( cur, targets, state, visiting, ret );
- }
- else if( m == VISITING )
- {
- // Currently visiting this node, so have a cycle
- throw makeCircularException( cur, visiting );
- }
- }
-
- String p = (String)visiting.pop();
- if( root != p )
- {
- throw new RuntimeException( "Unexpected internal error: expected to pop " + root + " but got " + p );
- }
- state.put( root, VISITED );
- ret.addElement( target );
- }
-
- /**
- * Keep a record of all tasks that have been created so that they can be
- * invalidated if a taskdef overrides the definition.
- *
- * @param type The feature to be added to the CreatedTask attribute
- * @param task The feature to be added to the CreatedTask attribute
- */
- private void addCreatedTask( String type, Task task )
- {
- synchronized( createdTasks )
- {
- Vector v = (Vector)createdTasks.get( type );
- if( v == null )
- {
- v = new Vector();
- createdTasks.put( type, v );
- }
- v.addElement( task );
- }
- }
-
- private void fireMessageLoggedEvent( BuildEvent event, String message, int priority )
- {
- event.setMessage( message, priority );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.messageLogged( event );
- }
- }
}
diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/Project.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/Project.java
index 49390d928..6135e9333 100644
--- a/proposal/myrmidon/src/todo/org/apache/tools/ant/Project.java
+++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/Project.java
@@ -8,12 +8,9 @@
package org.apache.tools.ant;
import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
import java.lang.reflect.Modifier;
import java.util.Enumeration;
import java.util.Hashtable;
-import java.util.Properties;
import java.util.Stack;
import java.util.Vector;
import org.apache.myrmidon.api.TaskException;
@@ -171,78 +168,6 @@ public class Project
return path.toString();
}
- private static TaskException makeCircularException( String end, Stack stk )
- {
- StringBuffer sb = new StringBuffer( "Circular dependency: " );
- sb.append( end );
- String c;
- do
- {
- c = (String)stk.pop();
- sb.append( " <- " );
- sb.append( c );
- } while( !c.equals( end ) );
- return new TaskException( new String( sb ) );
- }
-
- /**
- * set the base directory; XML attribute. checks for the directory existing
- * and being a directory type
- *
- * @param baseDir project base directory.
- * @throws TaskException if the directory was invalid
- */
- public void setBaseDir( File baseDir )
- throws TaskException
- {
- baseDir = FileUtils.newFileUtils().normalize( baseDir.getAbsolutePath() );
- if( !baseDir.exists() )
- throw new TaskException( "Basedir " + baseDir.getAbsolutePath() + " does not exist" );
- if( !baseDir.isDirectory() )
- throw new TaskException( "Basedir " + baseDir.getAbsolutePath() + " is not a directory" );
- this.baseDir = baseDir;
- setPropertyInternal( "basedir", this.baseDir.getPath() );
- String msg = "Project base dir set to: " + this.baseDir;
- log( msg, MSG_VERBOSE );
- }
-
- /**
- * match basedir attribute in xml
- *
- * @param baseD project base directory.
- * @throws TaskException if the directory was invalid
- */
- public void setBasedir( String baseD )
- throws TaskException
- {
- setBaseDir( new File( baseD ) );
- }
-
- public void setCoreLoader( ClassLoader coreLoader )
- {
- this.coreLoader = coreLoader;
- }
-
- /**
- * set the default target of the project XML attribute name.
- *
- * @param defaultTarget The new Default value
- */
- public void setDefault( String defaultTarget )
- {
- this.defaultTarget = defaultTarget;
- }
-
- /**
- * set the project description
- *
- * @param description text
- */
- public void setDescription( String description )
- {
- this.description = description;
- }
-
/**
* set the ant.java.version property, also tests for unsupported JVM
* versions, prints the verbose log messages
@@ -265,18 +190,6 @@ public class Project
log( "Detected OS: " + System.getProperty( "os.name" ), MSG_VERBOSE );
}
- /**
- * ant xml property. Set the project name as an attribute of this class, and
- * of the property ant.project.name
- *
- * @param name The new Name value
- */
- public void setName( String name )
- {
- setUserProperty( "ant.project.name", name );
- this.name = name;
- }
-
/**
* set a property. An existing property of the same name will not be
* overwritten.
@@ -297,65 +210,6 @@ public class Project
properties.put( name, value );
}
- /**
- * set a property. Any existing property of the same name is overwritten,
- * unless it is a user property.
- *
- * @param name name of property
- * @param value new value of the property
- */
- public void setProperty( String name, String value )
- {
- // command line properties take precedence
- if( null != userProperties.get( name ) )
- {
- log( "Override ignored for user property " + name, MSG_VERBOSE );
- return;
- }
-
- if( null != properties.get( name ) )
- {
- log( "Overriding previous definition of property " + name,
- MSG_VERBOSE );
- }
-
- log( "Setting project property: " + name + " -> " +
- value, MSG_DEBUG );
- properties.put( name, value );
- }
-
- /**
- * 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 );
- }
- }
-
- /**
- * set a user property, which can not be overwritten by set/unset property
- * calls
- *
- * @param name The new UserProperty value
- * @param value The new UserProperty value
- * @see #setProperty(String,String)
- */
- public void setUserProperty( String name, String value )
- {
- log( "Setting ro project property: " + name + " -> " +
- value, MSG_DEBUG );
- userProperties.put( name, value );
- properties.put( name, value );
- }
-
/**
* get the base directory of the project as a file object
*
@@ -364,25 +218,9 @@ public class Project
*/
public File getBaseDir()
{
- if( baseDir == null )
- {
- try
- {
- setBasedir( "." );
- }
- catch( TaskException ex )
- {
- ex.printStackTrace();
- }
- }
return baseDir;
}
- public Vector getBuildListeners()
- {
- return listeners;
- }
-
public ClassLoader getCoreLoader()
{
return coreLoader;
@@ -398,41 +236,11 @@ public class Project
return dataClassDefinitions;
}
- /**
- * get the default target of the project
- *
- * @return default target or null
- */
- public String getDefaultTarget()
- {
- return defaultTarget;
- }
-
- /**
- * get the project description
- *
- * @return description or null if no description has been set
- */
- public String getDescription()
- {
- return description;
- }
-
public FilterSet getGlobalFilterSet()
{
return globalFilterSet;
}
- /**
- * get the project name
- *
- * @return name string
- */
- public String getName()
- {
- return name;
- }
-
/**
* get a copy of the property hashtable
*
@@ -501,314 +309,11 @@ public class Project
return taskClassDefinitions;
}
- /**
- * get a copy of the user property hashtable
- *
- * @return the hashtable user properties only
- */
- public Hashtable getUserProperties()
- {
- Hashtable propertiesCopy = new Hashtable();
-
- Enumeration e = userProperties.keys();
- while( e.hasMoreElements() )
- {
- Object name = e.nextElement();
- Object value = properties.get( name );
- propertiesCopy.put( name, value );
- }
-
- return propertiesCopy;
- }
-
- /**
- * query a user property.
- *
- * @param name the name of the property
- * @return the property value, or null for no match
- */
- public String getUserProperty( String name )
- {
- if( name == null )
- return null;
- String property = (String)userProperties.get( name );
- return property;
- }
-
- /**
- * Topologically sort a set of Targets.
- *
- * @param root is the (String) name of the root Target. The sort is created
- * in such a way that the sequence of Targets uptil the root target is
- * the minimum possible such sequence.
- * @param targets is a Hashtable representing a "name to Target" mapping
- * @return a Vector of Strings with the names of the targets in sorted
- * order.
- * @exception TaskException if there is a cyclic dependency among the
- * Targets, or if a Target does not exist.
- */
- public final Vector topoSort( String root, Hashtable targets )
- throws TaskException
- {
- Vector ret = new Vector();
- Hashtable state = new Hashtable();
- Stack visiting = new Stack();
-
- // We first run a DFS based sort using the root as the starting node.
- // This creates the minimum sequence of Targets to the root node.
- // We then do a sort on any remaining unVISITED targets.
- // This is unnecessary for doing our build, but it catches
- // circular dependencies or missing Targets on the entire
- // dependency tree, not just on the Targets that depend on the
- // build Target.
-
- tsort( root, targets, state, visiting, ret );
- log( "Build sequence for target `" + root + "' is " + ret, MSG_VERBOSE );
- for( Enumeration en = targets.keys(); en.hasMoreElements(); )
- {
- String curTarget = (String)( en.nextElement() );
- String st = (String)state.get( curTarget );
- if( st == null )
- {
- tsort( curTarget, targets, state, visiting, ret );
- }
- else if( st == VISITING )
- {
- throw new RuntimeException( "Unexpected node in visiting state: " + curTarget );
- }
- }
- log( "Complete build sequence is " + ret, MSG_VERBOSE );
- return ret;
- }
-
public void addBuildListener( BuildListener listener )
{
listeners.addElement( listener );
}
- /**
- * add a new datatype
- *
- * @param typeName name of the datatype
- * @param typeClass full datatype classname
- */
- public void addDataTypeDefinition( String typeName, Class typeClass )
- {
- if( null != dataClassDefinitions.get( typeName ) )
- {
- log( "Trying to override old definition of datatype " + typeName,
- MSG_WARN );
- }
-
- String msg = " +User datatype: " + typeName + " " + typeClass.getName();
- log( msg, MSG_DEBUG );
- dataClassDefinitions.put( typeName, typeClass );
- }
-
- /**
- * @param target is the Target to be added or replaced in the current
- * Project.
- */
- public void addOrReplaceTarget( Target target )
- {
- addOrReplaceTarget( target.getName(), target );
- }
-
- /**
- * @param target is the Target to be added/replaced in the current Project.
- * @param targetName is the name to use for the Target
- */
- public void addOrReplaceTarget( String targetName, Target target )
- {
- String msg = " +Target: " + targetName;
- log( msg, MSG_DEBUG );
- target.setProject( this );
- targets.put( targetName, target );
- }
-
- public void addReference( String name, Object value )
- {
- if( null != references.get( name ) )
- {
- log( "Overriding previous definition of reference to " + name,
- MSG_WARN );
- }
- log( "Adding reference: " + name + " -> " + value, MSG_DEBUG );
- references.put( name, value );
- }
-
- /**
- * This call expects to add a new Target.
- *
- * @param target is the Target to be added to the current Project.
- * @see Project#addOrReplaceTarget to replace existing Targets.
- */
- public void addTarget( Target target )
- throws TaskException
- {
- String name = target.getName();
- if( targets.get( name ) != null )
- {
- throw new TaskException( "Duplicate target: `" + name + "'" );
- }
- addOrReplaceTarget( name, target );
- }
-
- /**
- * This call expects to add a new Target.
- *
- * @param target is the Target to be added to the current Project.
- * @param targetName is the name to use for the Target
- * @exception TaskException if the Target already exists in the project.
- * @see Project#addOrReplaceTarget to replace existing Targets.
- */
- public void addTarget( String targetName, Target target )
- throws TaskException
- {
- if( targets.get( targetName ) != null )
- {
- throw new TaskException( "Duplicate target: `" + targetName + "'" );
- }
- addOrReplaceTarget( targetName, target );
- }
-
- /**
- * add a new task definition, complain if there is an overwrite attempt
- *
- * @param taskName name of the task
- * @param taskClass full task classname
- * @throws TaskException and logs as Project.MSG_ERR for conditions, that
- * will cause the task execution to fail.
- */
- public void addTaskDefinition( String taskName, Class taskClass )
- throws TaskException
- {
- Class old = (Class)taskClassDefinitions.get( taskName );
- if( null != old )
- {
- if( old.equals( taskClass ) )
- {
- log( "Ignoring override for task " + taskName
- + ", it is already defined by the same class.",
- MSG_VERBOSE );
- return;
- }
- else
- {
- log( "Trying to override old definition of task " + taskName,
- MSG_WARN );
-
- }
- }
-
- String msg = " +User task: " + taskName + " " + taskClass.getName();
- log( msg, MSG_DEBUG );
- checkTaskClass( taskClass );
- taskClassDefinitions.put( taskName, taskClass );
- }
-
- /**
- * Checks a class, whether it is suitable for serving as ant task.
- *
- * @param taskClass Description of Parameter
- * @throws TaskException and logs as Project.MSG_ERR for conditions, that
- * will cause the task execution to fail.
- */
- public void checkTaskClass( final Class taskClass )
- throws TaskException
- {
- if( !Modifier.isPublic( taskClass.getModifiers() ) )
- {
- final String message = taskClass + " is not public";
- log( message, Project.MSG_ERR );
- throw new TaskException( message );
- }
- if( Modifier.isAbstract( taskClass.getModifiers() ) )
- {
- final String message = taskClass + " is abstract";
- log( message, Project.MSG_ERR );
- throw new TaskException( message );
- }
- try
- {
- taskClass.getConstructor( null );
- // don't have to check for public, since
- // getConstructor finds public constructors only.
- }
- catch( NoSuchMethodException e )
- {
- final String message = "No public default constructor in " + taskClass;
- log( message, Project.MSG_ERR );
- throw new TaskException( message );
- }
- if( !Task.class.isAssignableFrom( taskClass ) )
- TaskAdapter.checkTaskClass( taskClass, this );
- }
-
- /**
- * create a new DataType instance
- *
- * @param typeName name of the datatype
- * @return null if the datatype name is unknown
- * @throws TaskException when datatype creation goes bad
- */
- public Object createDataType( String typeName )
- throws TaskException
- {
- Class c = (Class)dataClassDefinitions.get( 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 TaskException( msg, t );
- }
- catch( Throwable t )
- {
- String msg = "Could not create datatype of type: "
- + typeName + " due to " + t;
- throw new TaskException( msg, t );
- }
- }
-
/**
* create a new task instance
*
@@ -819,40 +324,7 @@ public class Project
public Task createTask( String taskType )
throws TaskException
{
- Class c = (Class)taskClassDefinitions.get( 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 );
-
- 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 TaskException( msg, t );
- }
+ throw new TaskException( "Task needs reimplementing" );
}
public void demuxOutput( String line, boolean isError )
@@ -860,7 +332,7 @@ public class Project
Task task = (Task)threadTasks.get( Thread.currentThread() );
if( task == null )
{
- fireMessageLogged( this, line, isError ? MSG_ERR : MSG_INFO );
+ //fireMessageLogged( this, line, isError ? MSG_ERR : MSG_INFO );
}
else
{
@@ -875,113 +347,11 @@ public class Project
}
}
- /**
- * execute the targets and any targets it depends on
- *
- * @param targetName the target to execute
- * @throws TaskException if the build failed
- */
- public void executeTarget( String targetName )
- throws TaskException
- {
- }
-
- /**
- * Initialise the project. This involves setting the default task
- * definitions and loading the system properties.
- *
- * @exception TaskException Description of Exception
- */
- public void init()
- throws TaskException
- {
- setJavaVersionProperty();
-
- String defs = "/org/apache/tools/ant/taskdefs/defaults.properties";
-
- try
- {
- Properties props = new Properties();
- InputStream in = this.getClass().getResourceAsStream( defs );
- if( in == null )
- {
- throw new TaskException( "Can't load default task list" );
- }
- props.load( in );
- in.close();
-
- Enumeration enum = props.propertyNames();
- while( enum.hasMoreElements() )
- {
- String key = (String)enum.nextElement();
- String value = props.getProperty( key );
- try
- {
- Class taskClass = Class.forName( value );
- addTaskDefinition( key, taskClass );
- }
- catch( NoClassDefFoundError ncdfe )
- {
- // ignore...
- }
- catch( ClassNotFoundException cnfe )
- {
- // ignore...
- }
- }
- }
- catch( IOException ioe )
- {
- throw new TaskException( "Can't load default task list" );
- }
-
- String dataDefs = "/org/apache/tools/ant/types/defaults.properties";
-
- try
- {
- Properties props = new Properties();
- InputStream in = this.getClass().getResourceAsStream( dataDefs );
- if( in == null )
- {
- throw new TaskException( "Can't load default datatype list" );
- }
- props.load( in );
- in.close();
-
- Enumeration enum = props.propertyNames();
- while( enum.hasMoreElements() )
- {
- String key = (String)enum.nextElement();
- String value = props.getProperty( key );
- try
- {
- Class dataClass = Class.forName( value );
- addDataTypeDefinition( key, dataClass );
- }
- catch( NoClassDefFoundError ncdfe )
- {
- // ignore...
- }
- catch( ClassNotFoundException cnfe )
- {
- // ignore...
- }
- }
- }
- catch( IOException ioe )
- {
- throw new TaskException( "Can't load default datatype list" );
- }
-
- setSystemProperties();
- }
-
/**
* Output a message to the log with the default log level of MSG_INFO
*
* @param msg text to log
*/
-
public void log( String msg )
{
log( msg, MSG_INFO );
@@ -996,7 +366,6 @@ public class Project
*/
public void log( String msg, int msgLevel )
{
- fireMessageLogged( this, msg, msgLevel );
}
/**
@@ -1009,7 +378,6 @@ public class Project
*/
public void log( Task task, String msg, int msgLevel )
{
- fireMessageLogged( task, msg, msgLevel );
}
/**
@@ -1022,12 +390,6 @@ public class Project
*/
public void log( Target target, String msg, int msgLevel )
{
- fireMessageLogged( target, msg, msgLevel );
- }
-
- public void removeBuildListener( BuildListener listener )
- {
- listeners.removeElement( listener );
}
/**
@@ -1142,111 +504,6 @@ public class Project
}
}
- /**
- * send build finished event to the listeners
- *
- * @param exception exception which indicates failure if not null
- */
- protected void fireBuildFinished( Throwable exception )
- {
- BuildEvent event = new BuildEvent( this );
- event.setException( exception );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.buildFinished( event );
- }
- }
-
- /**
- * send build started event to the listeners
- */
- protected void fireBuildStarted()
- {
- BuildEvent event = new BuildEvent( this );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.buildStarted( event );
- }
- }
-
- protected void fireMessageLogged( Project project, String message, int priority )
- {
- BuildEvent event = new BuildEvent( project );
- fireMessageLoggedEvent( event, message, priority );
- }
-
- protected void fireMessageLogged( Target target, String message, int priority )
- {
- BuildEvent event = new BuildEvent( target );
- fireMessageLoggedEvent( event, message, priority );
- }
-
- protected void fireMessageLogged( Task task, String message, int priority )
- {
- BuildEvent event = new BuildEvent( task );
- fireMessageLoggedEvent( event, message, priority );
- }
-
- /**
- * send build finished event to the listeners
- *
- * @param exception exception which indicates failure if not null
- * @param target Description of Parameter
- */
- protected void fireTargetFinished( Target target, Throwable exception )
- {
- BuildEvent event = new BuildEvent( target );
- event.setException( exception );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.targetFinished( event );
- }
- }
-
- /**
- * send target started event to the listeners
- *
- * @param target Description of Parameter
- */
- protected void fireTargetStarted( Target target )
- {
- BuildEvent event = new BuildEvent( target );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.targetStarted( event );
- }
- }
-
- protected void fireTaskFinished( Task task, Throwable exception )
- {
- threadTasks.remove( Thread.currentThread() );
- System.out.flush();
- System.err.flush();
- BuildEvent event = new BuildEvent( task );
- event.setException( exception );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.taskFinished( event );
- }
- }
-
- protected void fireTaskStarted( Task task )
- {
- // register this as the current task on the current thread.
- threadTasks.put( Thread.currentThread(), task );
- BuildEvent event = new BuildEvent( task );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.taskStarted( event );
- }
- }
-
/**
* Allows Project and subclasses to set a property unless its already
* defined as a user property. There are a few cases internally to Project
@@ -1263,105 +520,4 @@ public class Project
}
properties.put( name, value );
}
-
- // one step in a recursive DFS traversal of the Target dependency tree.
- // - The Hashtable "state" contains the state (VISITED or VISITING or null)
- // of all the target names.
- // - The Stack "visiting" contains a stack of target names that are
- // currently on the DFS stack. (NB: the target names in "visiting" are
- // exactly the target names in "state" that are in the VISITING state.)
- // 1. Set the current target to the VISITING state, and push it onto
- // the "visiting" stack.
- // 2. Throw a TaskException if any child of the current node is
- // in the VISITING state (implies there is a cycle.) It uses the
- // "visiting" Stack to construct the cycle.
- // 3. If any children have not been VISITED, tsort() the child.
- // 4. Add the current target to the Vector "ret" after the children
- // have been visited. Move the current target to the VISITED state.
- // "ret" now contains the sorted sequence of Targets upto the current
- // Target.
-
- private final void tsort( String root, Hashtable targets,
- Hashtable state, Stack visiting,
- Vector ret )
- throws TaskException
- {
- state.put( root, VISITING );
- visiting.push( root );
-
- Target target = (Target)( targets.get( root ) );
-
- // Make sure we exist
- if( target == null )
- {
- StringBuffer sb = new StringBuffer( "Target `" );
- sb.append( root );
- sb.append( "' does not exist in this project. " );
- visiting.pop();
- if( !visiting.empty() )
- {
- String parent = (String)visiting.peek();
- sb.append( "It is used from target `" );
- sb.append( parent );
- sb.append( "'." );
- }
-
- throw new TaskException( new String( sb ) );
- }
-
- for( Enumeration en = target.getDependencies(); en.hasMoreElements(); )
- {
- String cur = (String)en.nextElement();
- String m = (String)state.get( cur );
- if( m == null )
- {
- // Not been visited
- tsort( cur, targets, state, visiting, ret );
- }
- else if( m == VISITING )
- {
- // Currently visiting this node, so have a cycle
- throw makeCircularException( cur, visiting );
- }
- }
-
- String p = (String)visiting.pop();
- if( root != p )
- {
- throw new RuntimeException( "Unexpected internal error: expected to pop " + root + " but got " + p );
- }
- state.put( root, VISITED );
- ret.addElement( target );
- }
-
- /**
- * Keep a record of all tasks that have been created so that they can be
- * invalidated if a taskdef overrides the definition.
- *
- * @param type The feature to be added to the CreatedTask attribute
- * @param task The feature to be added to the CreatedTask attribute
- */
- private void addCreatedTask( String type, Task task )
- {
- synchronized( createdTasks )
- {
- Vector v = (Vector)createdTasks.get( type );
- if( v == null )
- {
- v = new Vector();
- createdTasks.put( type, v );
- }
- v.addElement( task );
- }
- }
-
- private void fireMessageLoggedEvent( BuildEvent event, String message, int priority )
- {
- event.setMessage( message, priority );
- for( int i = 0; i < listeners.size(); i++ )
- {
- BuildListener listener = (BuildListener)listeners.elementAt( i );
- listener.messageLogged( event );
- }
- }
}