You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by mc...@apache.org on 2004/06/04 03:26:44 UTC

svn commit: rev 20799 - in avalon/trunk/tools/project/core: . src/main/org/apache/avalon/tools src/main/org/apache/avalon/tools/event src/main/org/apache/avalon/tools/home src/main/org/apache/avalon/tools/project src/main/org/apache/avalon/tools/tasks src/test src/test/projects/demo src/test/projects/gizmo src/test/projects/sample src/test/projects/widget

Author: mcconnell
Date: Thu Jun  3 18:26:43 2004
New Revision: 20799

Added:
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Context.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Organization.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JUnitTestTask.java
Removed:
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/project/ProjectTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/DeliverableTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/HomeTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/TestTask.java
Modified:
   avalon/trunk/tools/project/core/build.xml
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/antlib.xml
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/event/StandardListener.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Home.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/project/Info.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/CleanTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/DeclareTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/InstallTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JarTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JavacTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PluginTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PrepareTask.java
   avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/XdocTask.java
   avalon/trunk/tools/project/core/src/test/index.xml
   avalon/trunk/tools/project/core/src/test/projects/demo/build.xml
   avalon/trunk/tools/project/core/src/test/projects/gizmo/build.properties
   avalon/trunk/tools/project/core/src/test/projects/gizmo/build.xml
   avalon/trunk/tools/project/core/src/test/projects/sample/build.xml
   avalon/trunk/tools/project/core/src/test/projects/widget/build.xml
Log:
Initial steps to support better integration of task/target/resource notions in ant with the project task set.  Still a work-in-progress.

Modified: avalon/trunk/tools/project/core/build.xml
==============================================================================
--- avalon/trunk/tools/project/core/build.xml	(original)
+++ avalon/trunk/tools/project/core/build.xml	Thu Jun  3 18:26:43 2004
@@ -64,6 +64,8 @@
     <ant dir="${target.test.dir}/projects/widget" />
     <ant dir="${target.test.dir}/projects/demo" />
     <ant dir="${target.test.dir}/projects/sample" />
+    <!--
+    -->
   </target>
 
   <target name="clean">

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/antlib.xml
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/antlib.xml	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/antlib.xml	Thu Jun  3 18:26:43 2004
@@ -1,14 +1,16 @@
 <?xml version="1.0"?>
 <antlib xmlns:current="ant:current"> 
-  <taskdef name="project" classname="org.apache.avalon.tools.project.ProjectTask"/> 
-  <typedef name="home" classname="org.apache.avalon.tools.home.Home"/> 
-  <taskdef name="prepare" classname="org.apache.avalon.tools.tasks.PrepareTask"/> 
+
+  <taskdef name="home" classname="org.apache.avalon.tools.home.Home"/>
+
   <taskdef name="clean" classname="org.apache.avalon.tools.tasks.CleanTask"/> 
-  <taskdef name="javac" classname="org.apache.avalon.tools.tasks.JavacTask"/> 
-  <taskdef name="jar" classname="org.apache.avalon.tools.tasks.JarTask"/> 
-  <taskdef name="test" classname="org.apache.avalon.tools.tasks.TestTask"/> 
+  <taskdef name="prepare" classname="org.apache.avalon.tools.tasks.PrepareTask"/> 
+  <taskdef name="javac" classname="org.apache.avalon.tools.tasks.JavacTask"/>
+  <taskdef name="jar" classname="org.apache.avalon.tools.tasks.JarTask"/>
+  <taskdef name="junit" classname="org.apache.avalon.tools.tasks.JUnitTestTask"/>
   <taskdef name="declare" classname="org.apache.avalon.tools.tasks.DeclareTask"/> 
-  <taskdef name="plugin" classname="org.apache.avalon.tools.tasks.PluginTask"/> 
   <taskdef name="install" classname="org.apache.avalon.tools.tasks.InstallTask"/> 
+  <taskdef name="plugin" classname="org.apache.avalon.tools.tasks.PluginTask"/> 
   <taskdef name="xdoc" classname="org.apache.avalon.tools.tasks.XdocTask"/> 
-</antlib> 
+
+</antlib>

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/event/StandardListener.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/event/StandardListener.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/event/StandardListener.java	Thu Jun  3 18:26:43 2004
@@ -48,11 +48,15 @@
     private Definition m_definition;
     private Task m_task;
 
+    public StandardListener( Home home, Definition definition )
+    {
+        this( null, home, definition );
+    }
+
     public StandardListener( Task task, Home home, Definition definition )
     {
         m_home = home;
         m_definition = definition;
-        m_task = task;
     }
 
     /**
@@ -67,8 +71,8 @@
         Project project = event.getProject();
         project.log( "" );
         project.log( BANNER );
-        getTask().log( "project: " + getDefinition() );
-        getTask().log( "basedir: " + project.getBaseDir() );
+        project.log( "project: " + getDefinition() );
+        project.log( "basedir: " + project.getBaseDir() );
         project.log( BANNER );
 
         /*

Added: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Context.java
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Context.java	Thu Jun  3 18:26:43 2004
@@ -0,0 +1,274 @@
+/* 
+ * Copyright 2004 Apache Software Foundation
+ * Licensed  under the  Apache License,  Version 2.0  (the "License");
+ * you may not use  this file  except in  compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed  under the  License is distributed on an "AS IS" BASIS,
+ * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
+ * implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.avalon.tools.home;
+
+import java.io.File;
+import java.util.Hashtable;
+import java.util.Map;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Property;
+
+/**
+ * Organization descriptor.
+ *
+ * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
+ * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
+ */
+public class Context 
+{
+    public static final String KEY = "project.context";
+    public static final String HOME_KEY = "project.home";
+
+    public static final String SRC_KEY = "project.src";
+    public static final String SRC_VALUE = "src";
+
+    public static final String SRC_MAIN_KEY = "project.src.main";
+    public static final String SRC_MAIN_VALUE = "main";
+
+    public static final String SRC_CONFIG_KEY = "project.src.config";
+    public static final String SRC_CONFIG_VALUE = "config";
+
+    public static final String SRC_TEST_KEY = "project.src.test";
+    public static final String SRC_TEST_VALUE = "test";
+
+    public static final String TARGET_KEY = "project.target";
+    public static final String TARGET_VALUE = "target";
+
+    private static final String USER_PROPERTIES = "user.properties";
+    private static final String BUILD_PROPERTIES = "build.properties";
+
+    public static final String DELIVERABLES_KEY = "project.target.deliverables";
+    private static final String DELIVERABLES_VALUE = "deliverables";
+
+    public static final String TEMP_KEY = "project.target.temp";
+    private static final String TEMP_VALUE = "temp";
+
+    public static final String DOCS_KEY = "project.target.docs";
+    private static final String DOCS_VALUE = "docs";
+
+    public static Context getContext( Project project )
+    {
+        return getContext( project, null );
+    }
+
+    public static Context getContext( Project project, File home )
+    {
+        Context context = (Context) project.getReference( KEY );
+        if( null == context )
+        {
+            context = new Context( project, home );
+            project.addReference( KEY, context );
+        }
+        return context;
+    }
+
+    private final File m_home;
+
+    private final File m_src;
+    private final File m_target;
+    private final File m_deliverables;
+    private final File m_temp;
+    private final File m_docs;
+    
+    private final Map m_map = new Hashtable();
+    private final Map m_resources = new Hashtable();
+
+    private Context( Project project, File home )
+    {
+        setupProperties( project );
+
+        project.setNewProperty( SRC_KEY, SRC_VALUE );
+        project.setNewProperty( SRC_MAIN_KEY, SRC_MAIN_VALUE );
+        project.setNewProperty( SRC_CONFIG_KEY, SRC_CONFIG_VALUE );
+        project.setNewProperty( SRC_TEST_KEY, SRC_TEST_VALUE );
+        project.setNewProperty( DELIVERABLES_KEY, DELIVERABLES_VALUE );
+        project.setNewProperty( TARGET_KEY, TARGET_VALUE );
+        project.setNewProperty( DOCS_KEY, DOCS_VALUE );
+        project.setNewProperty( TEMP_KEY, TEMP_VALUE );
+
+        File basedir = project.getBaseDir();
+        String src = project.getProperty( SRC_KEY );
+        String target = project.getProperty( TARGET_KEY );
+        String temp = project.getProperty( TEMP_KEY );
+        String docs = project.getProperty( DOCS_KEY );
+        String deliverables = project.getProperty( DELIVERABLES_KEY );
+
+        m_src = setupSrc( basedir, src );
+        m_target = setupTarget( basedir, target );
+        if( null == home )
+        {
+            String path = project.getProperty( HOME_KEY );
+            if( null == path ) 
+            {
+                //final String error = 
+                //  "Missing 'project.home' declaration.";
+                //project.log( error );
+                m_home = null;
+            }
+            else
+            {
+                m_home = new File( basedir, path );
+            }
+        }
+        else
+        {
+            m_home = home;
+        }
+
+        m_deliverables = 
+          setBuildPath( DELIVERABLES_KEY, deliverables );
+        m_temp = 
+          setBuildPath( TEMP_KEY, temp );
+        m_docs = 
+          setBuildPath( DOCS_KEY, docs );
+    }
+
+    //public File getHomeDirectory()
+    //{
+    //    return m_home;
+    //}
+
+    public File getSrcDirectory()
+    {
+        return m_src;
+    }
+
+    public File getTargetDirectory()
+    {
+        return m_target;
+    }
+
+    public File getDeliverablesDirectory()
+    {
+        return m_deliverables;
+    }
+
+    public File getTempDirectory()
+    {
+        return m_temp;
+    }
+
+    public File getDocsDirectory()
+    {
+        return m_docs;
+    }
+
+
+    public File setBuildPath( String key, String path )
+    {
+        if( null == key )
+        {
+            throw new NullPointerException( "key" );
+        }
+        if( null == path )
+        {
+            throw new NullPointerException( "null path for key: " + key );
+        }
+        if( m_map.containsKey( key ) )
+        {
+            final String error = 
+              "Duplicate path registration request for key '" 
+              + key + "'.";
+            throw new BuildException( error );
+        }
+        File build = getFile( m_target, path );
+        m_map.put( key, build );
+        return build;
+    }
+
+    public File getBuildPath( String key )
+    {
+        return getBuildPath( key, true );
+    }
+
+    public File getBuildPath( String key, boolean fail )
+    {
+        if( m_map.containsKey( key ) )
+        {
+            return (File) m_map.get( key ) ;
+        }
+        else if( fail )
+        {
+            final String error = 
+              "Unknown build key '" 
+              + key + "'.";
+            throw new BuildException( error );
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+    public File getTargetDirectory( String path )
+    {
+        return new File( m_target, path );
+    }
+
+    private File setupSrc( File basedir, String path )
+    {
+        if( null == path ) return new File( basedir, SRC_VALUE );
+        return new File( basedir, path );
+    }
+
+    private File setupTarget( File basedir, String path )
+    {
+        if( null == path ) return new File( basedir, TARGET_VALUE );
+        return new File( basedir, path );
+    }
+
+    private void setupProperties( Project project )
+    {
+        File basedir = project.getBaseDir();
+        setupUserProperties( project, basedir );
+        setupBuildProperties( project, basedir );
+    }
+
+    private void setupUserProperties( Project project, File basedir )
+    {
+        File user = new File( basedir, USER_PROPERTIES );
+        readProperties( project, user );
+    }
+
+    private void setupBuildProperties( Project project, File basedir )
+    {
+        File build = new File( basedir, BUILD_PROPERTIES );
+        readProperties( project, build );
+    }
+
+    private void readProperties( Project project, File file ) throws BuildException 
+    {
+        Property props = (Property) project.createTask( "property" );
+        props.setFile( file );
+        props.init();
+        props.execute();
+    }
+
+    private File getFile( File root, String path )
+    {
+        File file = new File( path );
+        if( file.isAbsolute() ) return file;
+        if( null == root )
+        {
+            throw new NullPointerException( "root" );
+        }
+        return new File( root, path );
+    }
+}

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Home.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Home.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Home.java	Thu Jun  3 18:26:43 2004
@@ -25,6 +25,7 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.apache.tools.ant.Task;
 import org.apache.tools.ant.BuildEvent;
 import org.apache.tools.ant.BuildListener;
 import org.apache.tools.ant.ProjectComponent;
@@ -33,6 +34,7 @@
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.DataType;
 import org.apache.tools.ant.util.FileUtils;
 import org.apache.tools.ant.taskdefs.Sequential;
 import org.apache.tools.ant.taskdefs.Property;
@@ -45,6 +47,7 @@
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
+import org.apache.avalon.tools.event.StandardListener;
 import org.apache.avalon.tools.project.Definition;
 import org.apache.avalon.tools.project.ProjectRef;
 import org.apache.avalon.tools.project.ResourceRef;
@@ -59,21 +62,27 @@
  * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
  * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
  */
-public class Home 
+public class Home extends Sequential
 {
-    private static Home HOME;
+    //-------------------------------------------------------------
+    // static immutable
+    //-------------------------------------------------------------
 
-    public static boolean isInitialized()
-    {
-        return null != HOME;
-    }
+    //private static Home HOME;
 
-    public static void initialize( Project project, File index )
+    //-------------------------------------------------------------
+    // static operations
+    //-------------------------------------------------------------
+
+    /*
+    public static Home initialize( Task task, File index )
     {
-        if( !isInitialized() )
+        Project project = task.getProject();
+        if( null == HOME )
         {
             try
             {
+                task.log( "index: " + index, Project.MSG_INFO );
                 HOME = new Home( project, index );
             }
             catch( Throwable e )
@@ -81,103 +90,114 @@
                 throw new BuildException( e );
             }
         }
+        setHomeReference( project );
+        return HOME;
     }
 
-    public static Home getHome( Project project )
+    public static Home getHome()
     {
-        if( !isInitialized() )
-        {
-            final String error =
-              "Home has not been initialized.";
-            throw new BuildException( error );
-        }
-        project.addReference( "urn:avalon.home", HOME );
         return HOME;
     }
+    */
 
-    private final Project m_project;
-    private final Repository m_repository;
-    private final File m_home;
-    private final File m_file;
+    //-------------------------------------------------------------
+    // immutable state
+    //-------------------------------------------------------------
+
+    private String m_key;
+
+    private Project m_project;
+    private Repository m_repository;
+    private File m_home;
+    private File m_file;
 
     private final Hashtable m_resources = new Hashtable();
+    private Definition m_definition;
+    private BuildListener m_listener;
+
+    //-------------------------------------------------------------
+    // constructor
+    //-------------------------------------------------------------
 
-    public Home( Project project, File file )
+    public Home( Project project )
     {
-        m_file = file;
+        super();
         m_project = project;
-        m_home = file.getParentFile();
+    }
+
+    //private Home( Project project, File file )
+    //{
+    //    init( project, file );
+    //}
+
+    //-------------------------------------------------------------
+    // setters
+    //-------------------------------------------------------------
+
+    public void setIndex( File file ) throws BuildException
+    {
+        m_file = file;
+    }
 
-        HOME = this;
+    public void setKey( String key )
+    {
+        m_key = key;
+    }
+
+    //-------------------------------------------------------------
+    // internal
+    //-------------------------------------------------------------
+
+    public void execute()
+    {
+        //m_file = file;
+        //m_project = project;
+        m_home = m_file.getParentFile();
+
+        //HOME = this;
  
-        Element root = ElementHelper.getRootElement( file );
-        project.log( "home: " + m_home, Project.MSG_DEBUG );
+        Element root = ElementHelper.getRootElement( m_file );
+        m_project.log( "home: " + m_home, Project.MSG_DEBUG );
 
         final Element repo = ElementHelper.getChild( root, "repository" );
         final Element resources = ElementHelper.getChild( root, "resources" );
         final Element projects = ElementHelper.getChild( root, "projects" );
 
         //
-        // construct the repository
+        // construct the repository, build the definition of the available 
+        // resources and projects used within the system and associate a build
+        // listener
         //
 
         m_repository = createRepository( repo );
-
-        //
-        // build the definition of the available resources  
-        // used within the system
-        //
-
         buildResourceList( resources );
+        buildProjectList( projects );
 
-        //
-        // build the definition of the available projects  
-        // used within the system
-        //
+        final String key = getKey();
+        m_definition = getDefinition( key, false );
 
-        buildProjectList( projects );
+        m_listener = new StandardListener( this, m_definition );
+
+        super.execute();
 
     }
 
-    private void buildResourceList( Element resources )
+    private String getKey()
     {
-        if( null == resources ) return;
-
-        Element[] resourceArray = ElementHelper.getChildren( resources, "resource" );
-        m_project.log( "resources: " + resourceArray.length, Project.MSG_DEBUG );
-        for( int i=0; i<resourceArray.length; i++ )
+        if( null != m_key )
         {
-            Element child = resourceArray[i];
-            Resource resource = XMLDefinitionBuilder.createResource( this, child );
-            String key = resource.getKey();
-            m_resources.put( key, resource );
-            m_project.log( 
-              "resource: " + resource + " key=" + key, 
-              Project.MSG_DEBUG );
+            return m_key;
         }
-    }
-
-    private void buildProjectList( Element projects )
-    {
-        if( null == projects ) return;
-
-        Element[] entries = ElementHelper.getChildren( projects );
-        m_project.log( 
-          "projects: " + entries.length, 
-          Project.MSG_DEBUG );
-        for( int i=0; i<entries.length; i++ )
+        else
         {
-            Element element = entries[i];
-            Definition definition = 
-              XMLDefinitionBuilder.createDefinition( this, element, m_home );
-            String key = definition.getKey();
-            m_resources.put( key, definition );
-            m_project.log( 
-              "project: " + definition + " key=" + key, 
-              Project.MSG_DEBUG );
+            return getProject().getName();
         }
     }
 
+    //-------------------------------------------------------------
+    // implementation
+    //-------------------------------------------------------------
+
     public File getHomeDirectory()
     {
         return m_home;
@@ -204,6 +224,11 @@
         return (Plugin) getDefinition( ref );
     }
 
+    public Definition getDefinition()
+    {
+        return m_definition;
+    }
+
     public Definition getDefinition( ProjectRef ref )
       throws BuildException
     {
@@ -227,20 +252,39 @@
     public Definition getDefinition( String key )
       throws BuildException
     {
+        return getDefinition( key, true );
+    }
+
+    public Definition getDefinition( String key, boolean fail )
+      throws BuildException
+    {
         Resource def = (Resource) m_resources.get( key );
         if( null == def )
         {
-            final String error = 
-              "Unknown definition [" + key + "]";
-            throw new BuildException( error );
+            if( fail )
+            {
+                final String error = 
+                  "Unknown definition [" + key + "]";
+                throw new BuildException( error );
+            }
         }
-        if( !( def instanceof Definition ) )
+        else
         {
-            final String error =
-              "Key [" + key + "] is not project.";
-            throw new BuildException( error );
+            if( def instanceof Definition )
+            {
+                return (Definition) def;
+            }
+            else
+            {
+                if( fail )
+                {
+                    final String error =
+                      "Key [" + key + "] is not project.";
+                    throw new BuildException( error );
+                }
+            }
         }
-        return (Definition) def;
+        return null;
     }
 
     public void build( Definition definition )
@@ -268,6 +312,10 @@
         return (Definition[]) targets.toArray( new Definition[0] );
     }
 
+    //-------------------------------------------------------------
+    // internal
+    //-------------------------------------------------------------
+
     private void getBuildSequence( List visited, List targets, Definition definition )
     {
         if( visited.contains( definition ) ) return;
@@ -294,6 +342,45 @@
         }
     }
 
+    private void buildResourceList( Element resources )
+    {
+        if( null == resources ) return;
+
+        Element[] resourceArray = ElementHelper.getChildren( resources, "resource" );
+        m_project.log( "resources: " + resourceArray.length, Project.MSG_DEBUG );
+        for( int i=0; i<resourceArray.length; i++ )
+        {
+            Element child = resourceArray[i];
+            Resource resource = XMLDefinitionBuilder.createResource( this, child );
+            String key = resource.getKey();
+            m_resources.put( key, resource );
+            m_project.log( 
+              "resource: " + resource + " key=" + key, 
+              Project.MSG_DEBUG );
+        }
+    }
+
+    private void buildProjectList( Element projects )
+    {
+        if( null == projects ) return;
+
+        Element[] entries = ElementHelper.getChildren( projects );
+        m_project.log( 
+          "projects: " + entries.length, 
+          Project.MSG_DEBUG );
+        for( int i=0; i<entries.length; i++ )
+        {
+            Element element = entries[i];
+            Definition definition = 
+              XMLDefinitionBuilder.createDefinition( this, element, m_home );
+            String key = definition.getKey();
+            m_resources.put( key, definition );
+            m_project.log( 
+              "project: " + definition + " key=" + key, 
+              Project.MSG_DEBUG );
+        }
+    }
+
     private Repository createRepository( Element repo )
     {
         Repository repository = new Repository( this, repo );
@@ -307,4 +394,14 @@
         return repository;
     }
 
+    /*
+    private static void setHomeReference( Project project )
+    {
+        if( null == HOME ) throw new IllegalStateException( "home" );
+        if( null == project.getReference( "urn:project.home" ) )
+        {
+            project.addReference( "urn:project.home", HOME );
+        }
+    }
+    */
 }

Added: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Organization.java
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/home/Organization.java	Thu Jun  3 18:26:43 2004
@@ -0,0 +1,74 @@
+/* 
+ * Copyright 2004 Apache Software Foundation
+ * Licensed  under the  Apache License,  Version 2.0  (the "License");
+ * you may not use  this file  except in  compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed  under the  License is distributed on an "AS IS" BASIS,
+ * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
+ * implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.avalon.tools.home;
+
+
+/**
+ * Organization descriptor.
+ *
+ * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
+ * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
+ */
+public class Organization 
+{
+    private final String m_key;
+
+    private final String m_name;
+
+    private final int m_inception;
+
+    public Organization( String key, String name, int year )
+    {
+        m_inception = year;
+        m_key = getKey( key );
+        m_name = getName( name );
+    }
+
+    public String getKey()
+    {
+        return m_key;
+    }
+
+    public String getName()
+    {
+        return m_name;
+    }
+
+    public int getInceptionYear()
+    {
+        return m_inception;
+    }
+
+    private String getKey( String key )
+    {
+        if( null == key )
+        {
+            return "unknown";
+        }
+        return key;
+    }
+
+    private String getName( String name )
+    {
+        if( null == name )
+        {
+            return "unknown";
+        }
+        return name;
+    }
+}

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/project/Info.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/project/Info.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/project/Info.java	Thu Jun  3 18:26:43 2004
@@ -27,7 +27,22 @@
  */
 public class Info 
 {
-    public static Info create( String id, String type )
+    public static Info create( String id )
+    {
+        int i = id.indexOf( ":" );
+        if( i<0 )
+        {
+            final String error =
+              "Missing protocol in id [" + id + "]";
+            throw new BuildException( error );
+        }
+        String protocol = id.substring( 0, i );
+        String spec = id.substring( i+1 );
+        return Info.create( protocol, spec);
+    }
+
+
+    public static Info create( String type, String id )
     {
         int n = getGroupIndex( id );
         String group = getGroupFromId( id, n );
@@ -92,14 +107,7 @@
             buffer.append( getVersion() );
         }
         buffer.append( "." );
-        if( getType().equals( "plugin" ) )
-        {
-            buffer.append( "jar" );
-        }
-        else
-        {
-            buffer.append( getType() );
-        }
+        buffer.append( getType() );
         return buffer.toString();
     }
 

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/CleanTask.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/CleanTask.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/CleanTask.java	Thu Jun  3 18:26:43 2004
@@ -19,22 +19,38 @@
 
 import java.io.File;
 
+import org.apache.tools.ant.Task;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.taskdefs.Delete;
 
+import org.apache.avalon.tools.home.Context;
+
 /**
- * Cleanup the target directory.
+ * Load a goal. 
  *
  * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
  * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
  */
-public class CleanTask extends PrepareTask
+public class CleanTask extends Task
 {
+    private Context m_context;
+    private boolean m_init = false;
+
+    public void init() throws BuildException 
+    {
+        if( !m_init )
+        {
+            Project project = getProject();
+            m_context = Context.getContext( project );
+            m_init = true;
+        }
+    }
+
     public void execute() throws BuildException 
     {
+        File target = m_context.getTargetDirectory();
         Project project = getProject();
-        File target = PrepareTask.getTargetDirectory( project );
         Delete delete = (Delete) project.createTask( "delete" );
         delete.setDir( target );
         delete.init();

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/DeclareTask.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/DeclareTask.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/DeclareTask.java	Thu Jun  3 18:26:43 2004
@@ -27,8 +27,10 @@
 import org.apache.tools.ant.Task;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Mkdir;
 
 import org.apache.avalon.tools.home.Home;
+import org.apache.avalon.tools.home.Context;
 import org.apache.avalon.tools.project.Definition;
 import org.apache.avalon.tools.project.Resource;
 import org.apache.avalon.tools.project.ResourceRef;
@@ -38,24 +40,66 @@
 import org.apache.avalon.tools.project.Plugin.TaskDef;
 
 /**
- * Load a plugin. 
+ * Load a plugin.
  *
  * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
  * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
  */
-public class DeclareTask extends DeliverableTask
+public class DeclareTask extends Task
 {
-    private static final String FILENAME = "plugin.xml";
+    private static final String TYPE = "plugin";
+
+    private boolean m_init = false;
+    private Context m_context;
+    private Home m_home;
+
+   /**
+    * Set the home ref id.
+    * @param id a home id
+    */
+    public void setRefid( String id )
+    {
+        Object object = getProject().getReference( id );
+        if( null == object )
+        {
+            final String error = 
+              "Unknown ref id '" + id + "'.";
+            throw new BuildException( error );
+        }
+        if( object instanceof Home )
+        {
+            m_home = (Home) object;
+        }
+        else
+        {
+            final String error = 
+              "Supplied id '" + id + "' does not refer to a Home.";
+            throw new BuildException( error );
+        }
+    }
 
     public void init() throws BuildException 
     {
-        super.init();
+        if( !m_init )
+        {
+            Project project = getProject();
+            m_context = Context.getContext( project );
+            m_init = true;
+        }
     }
 
     public void execute() throws BuildException 
     {
+        if( null == m_home ) 
+        {
+            final String error = 
+              "Required system home 'refid' attribute not set in the task definition ["
+              + getTaskName() + "].";
+            throw new BuildException( error );
+        }
+
         log( "creating plugin declaration" );
-        final Definition def = getDefinition();
+        final Definition def = m_home.getDefinition();
 
         try
         {
@@ -80,11 +124,11 @@
 
     private File getPluginFile()
     {
-        Project project = getProject();
-        File dir = DeliverableTask.getTargetDeliverablesDirectory( project );
-        File ants = new File( dir, "ants" );
-        createDirectory( ants );
-        Definition def = getDefinition();
+        File dir = m_context.getDeliverablesDirectory();
+        File ants = new File( dir, TYPE + "s" );
+        mkDir( ants );
+
+        Definition def = m_home.getDefinition();
         Info info = def.getInfo();
         String filename = getFilename( info );
         return new File( ants, filename );
@@ -95,11 +139,11 @@
         String version = info.getVersion();
         if( null == version )
         {
-            return info.getName() + ".ant";
+            return info.getName() + "." + TYPE;
         }
         else
         {
-            return info.getName() + "-" + version + ".ant";
+            return info.getName() + "-" + version + "." + TYPE;
         }
     }
 
@@ -173,7 +217,7 @@
         {
             writer.write( "\n    <version>" + version + "</version>" );
         }
-        writer.write( "\n    <type>" + type + "</type>" );
+        writer.write( "\n    <type>" + TYPE + "</type>" );
         writer.write( "\n  </info>" );
     }
 
@@ -182,7 +226,7 @@
     {
         writer.write( "\n  <classpath>" );
         final String pad = "    ";
-        ResourceRef[] resources = getHome().getRepository().getResourceRefs( def );
+        ResourceRef[] resources = m_home.getRepository().getResourceRefs( def );
         writeResourceRefs( writer, pad, resources );
         writeResource( writer, pad, def );
         writer.write( "\n  </classpath>" );
@@ -197,7 +241,7 @@
             Policy policy = ref.getPolicy();
             if( policy.isRuntimeEnabled() )
             {
-                Resource resource = getHome().getResource( ref );
+                Resource resource = m_home.getResource( ref );
                 writeResource( writer, pad, resource );
             }
         }
@@ -240,6 +284,14 @@
                 // ignore
             }
         }
+    }
+
+    private void mkDir( File dir )
+    {
+        Mkdir mkdir = (Mkdir) getProject().createTask( "mkdir" );
+        mkdir.setDir( dir );
+        mkdir.init();
+        mkdir.execute();
     }
 
 }

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/InstallTask.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/InstallTask.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/InstallTask.java	Thu Jun  3 18:26:43 2004
@@ -21,6 +21,7 @@
 import java.io.IOException;
 
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.taskdefs.Copy;
 import org.apache.tools.ant.taskdefs.Jar;
@@ -28,6 +29,7 @@
 import org.apache.tools.ant.types.Path;
 
 import org.apache.avalon.tools.home.Home;
+import org.apache.avalon.tools.home.Context;
 import org.apache.avalon.tools.project.Definition;
 
 /**
@@ -36,11 +38,50 @@
  * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
  * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
  */
-public class InstallTask extends DeliverableTask
+public class InstallTask extends Task
 {
+    private boolean m_init = false;
+    private Context m_context;
+    private Home m_home;
+
+   /**
+    * Set the home ref id.
+    * @param id a home id
+    */
+    public void setRefid( String id )
+    {
+        Object object = getProject().getReference( id );
+        if( null == object )
+        {
+            final String error = 
+              "Unknown ref id '" + id + "'.";
+            throw new BuildException( error );
+        }
+        if( object instanceof Home )
+        {
+            m_home = (Home) object;
+        }
+        else
+        {
+            final String error = 
+              "Supplied id '" + id + "' does not refer to a Home.";
+            throw new BuildException( error );
+        }
+    }
+
+    public void init() throws BuildException 
+    {
+        if( !m_init )
+        {
+            Project project = getProject();
+            m_context = Context.getContext( project );
+            m_init = true;
+        }
+    }
+
     public void execute() throws BuildException 
     {
-        File deliverables = getTargetDeliverablesDirectory();
+        File deliverables = m_context.getDeliverablesDirectory();
         if( deliverables.exists() )
         {
             install( deliverables );
@@ -53,8 +94,8 @@
         fileset.setDir( deliverables );
         fileset.createInclude().setName( "**/*" );
 
-        File cache = getHome().getRepository().getCacheDirectory();
-        String group = getDefinition().getInfo().getGroup();
+        File cache = m_home.getRepository().getCacheDirectory();
+        String group = m_home.getDefinition().getInfo().getGroup();
         File target = new File( cache, group );
 
         Copy copy = (Copy) getProject().createTask( "copy" );

Added: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JUnitTestTask.java
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JUnitTestTask.java	Thu Jun  3 18:26:43 2004
@@ -0,0 +1,256 @@
+/* 
+ * Copyright 2004 Apache Software Foundation
+ * Licensed  under the  Apache License,  Version 2.0  (the "License");
+ * you may not use  this file  except in  compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed  under the  License is distributed on an "AS IS" BASIS,
+ * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
+ * implied.
+ * 
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.avalon.tools.tasks;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Copy;
+import org.apache.tools.ant.taskdefs.Javac;
+import org.apache.tools.ant.taskdefs.Mkdir;
+import org.apache.tools.ant.taskdefs.optional.junit.FormatterElement;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTask;
+import org.apache.tools.ant.taskdefs.optional.junit.BatchTest;
+import org.apache.tools.ant.types.Environment;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
+
+import org.apache.avalon.tools.home.Home;
+import org.apache.avalon.tools.project.Definition;
+import org.apache.avalon.tools.home.Context;
+
+/**
+ * Load a goal. 
+ *
+ * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
+ * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
+ */
+public class JUnitTestTask extends Task
+{
+    public static final String TEST_KEY = "project.test";
+    public static final String TEST_VALUE = "test";
+
+    public static final String TEST_SRC_KEY = "project.test.src";
+    public static final String TEST_SRC_VALUE = "test";
+
+    public static final String TEST_ENV_KEY = "project.test.env";
+    public static final String TEST_ENV_VALUE = "env";
+
+    public static final String TEST_TMP_KEY = "project.test.temp";
+    public static final String TEST_TMP_VALUE = "temp";
+
+    public static final String DEBUG_KEY = "test.compile.debug";
+    public static final boolean DEBUG_VALUE = true;
+
+    public static final String FORK_KEY = "test.compile.fork";
+    public static final boolean FORK_VALUE = false;
+
+    private boolean m_init = false;
+    private Context m_context;
+    private File m_test;
+
+    private Home m_home;
+
+   /**
+    * Set the home ref id.
+    * @param id a home id
+    */
+    public void setRefid( String id )
+    {
+        Object object = getProject().getReference( id );
+        if( null == object )
+        {
+            final String error = 
+              "Unknown ref id '" + id + "'.";
+            throw new BuildException( error );
+        }
+        if( object instanceof Home )
+        {
+            m_home = (Home) object;
+        }
+        else
+        {
+            final String error = 
+              "Supplied id '" + id + "' does not refer to a Home.";
+            throw new BuildException( error );
+        }
+    }
+
+    public void init() throws BuildException 
+    {
+        if( !m_init )
+        {
+            Project project = getProject();
+            m_context = Context.getContext( project );
+            project.setNewProperty( DEBUG_KEY, "" + DEBUG_VALUE );
+            project.setNewProperty( FORK_KEY, "" + FORK_VALUE );
+            project.setNewProperty( TEST_SRC_KEY, "" + TEST_SRC_VALUE );
+            project.setNewProperty( TEST_ENV_KEY, "" + TEST_ENV_VALUE );
+            project.setNewProperty( TEST_TMP_KEY, "" + TEST_TMP_VALUE );
+            m_context.setBuildPath( TEST_KEY, TEST_VALUE );
+            m_test = m_context.getBuildPath( TEST_KEY );
+            m_init = true;
+        }
+    }
+
+    public void execute() throws BuildException 
+    {
+        if( null == m_home ) 
+        {
+            final String error = 
+              "Required system home 'refid' attribute not set in the task definition ["
+              + getTaskName() + "].";
+            throw new BuildException( error );
+        }
+
+        Project project = getProject();
+        File build = m_context.getBuildPath( PrepareTask.BUILD_SRC_KEY );
+        String testPath = project.getProperty( TEST_SRC_KEY );
+        File src = new File( build, testPath );
+
+        if( src.exists() )
+        {
+            File classes = new File( m_test, "classes" );
+            mkDir( classes );
+            Definition definition = m_home.getDefinition();
+            Path classpath = 
+              m_home.getRepository().createPath( project, definition );
+
+            //
+            // add the project jar to the classpath for the compilation
+            // of the test classes and compile the test classes into the 
+            // target/test-classes directory
+            //
+
+            File jar = m_context.getBuildPath( "jar" );
+            classpath.createPathElement().setLocation( jar );
+            compile( src, classes, classpath );
+            classpath.createPathElement().setLocation( classes );
+            test( src, classpath );
+        }
+    }
+
+    private void compile( File sources, File classes, Path classpath )
+    {
+        File basedir = getProject().getBaseDir();
+        Javac javac = (Javac) getProject().createTask( "javac" );
+        Path src = javac.createSrc();
+        Path.PathElement element = src.createPathElement();
+        element.setLocation( sources );
+        javac.setDestdir( classes );
+        javac.setDebug( getDebugProperty() );
+        javac.setFork( getForkProperty() );
+        javac.setClasspath( classpath );
+        javac.init();
+        javac.execute();
+    }
+
+    private void test( File src, Path classpath )
+    {
+        FileSet fileset = new FileSet();
+        fileset.setDir( src );
+        fileset.createInclude().setName( "**/*TestCase.java" );
+        fileset.createExclude().setName( "**/Abstract*.java" );
+
+        File base = new File( m_test, "temp" );
+        mkDir( base );
+
+        JUnitTask junit = (JUnitTask) getProject().createTask( "junit" );
+        junit.setFork( getForkProperty() );
+
+        JUnitTask.SummaryAttribute summary = new JUnitTask.SummaryAttribute();
+        summary.setValue( "on" );
+        junit.setPrintsummary( summary );
+        junit.setHaltonfailure( true );
+        junit.setHaltonerror( true );
+        junit.setErrorProperty( "test-errors" );
+        junit.setFailureProperty( "test-failures" );
+        if( FORK_VALUE )
+        {
+            junit.setFork( true );
+            junit.setDir( base );
+        }
+        junit.setShowOutput( true );
+        junit.setTempdir( base );
+        junit.setReloading( true );
+        junit.setFiltertrace( true );
+        junit.createClasspath().add( classpath );
+
+        File reports = new File( m_test, "reports" );
+        mkDir( reports );
+
+        BatchTest batch = (BatchTest) junit.createBatchTest();
+        batch.addFileSet( fileset );
+        batch.setTodir( reports );
+
+        FormatterElement plainFormatter = new FormatterElement();
+        FormatterElement.TypeAttribute plain = new FormatterElement.TypeAttribute();
+        plain.setValue( "plain" );
+        plainFormatter.setType( plain );
+        junit.addFormatter( plainFormatter );
+
+        FormatterElement xmlFormatter = new FormatterElement();
+        FormatterElement.TypeAttribute xml = new FormatterElement.TypeAttribute();
+        xml.setValue( "xml" );
+        xmlFormatter.setType( xml );
+        junit.addFormatter( xmlFormatter );
+
+        Environment.Variable basedir = new Environment.Variable();
+        basedir.setKey( "basedir" );
+        basedir.setValue( base.toString() );
+
+        junit.addSysproperty( basedir );
+
+        junit.init();
+        junit.execute();
+    }
+
+    private void mkDir( File dir )
+    {
+        Mkdir mkdir = (Mkdir) getProject().createTask( "mkdir" );
+        mkdir.setDir( dir );
+        mkdir.init();
+        mkdir.execute();
+    }
+
+    private boolean getDebugProperty()
+    {
+        return getBooleanProperty( DEBUG_KEY, DEBUG_VALUE );
+    }
+
+    private boolean getForkProperty()
+    {
+        return getBooleanProperty( FORK_KEY, FORK_VALUE );
+    }
+
+    private boolean getBooleanProperty( String key, boolean fallback )
+    {
+        String value = getProject().getProperty( key );
+        if( null == value )
+        {
+            return fallback;
+        }
+        else
+        {
+            return getProject().toBoolean( value );
+        }
+    }
+}

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JarTask.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JarTask.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JarTask.java	Thu Jun  3 18:26:43 2004
@@ -26,11 +26,13 @@
 import org.apache.tools.ant.taskdefs.Copy;
 import org.apache.tools.ant.taskdefs.Delete;
 import org.apache.tools.ant.taskdefs.Jar;
+import org.apache.tools.ant.taskdefs.Mkdir;
 import org.apache.tools.ant.taskdefs.Checksum;
 import org.apache.tools.ant.taskdefs.Execute;
 import org.apache.tools.ant.types.FileSet;
 import org.apache.tools.ant.types.Path;
 
+import org.apache.avalon.tools.home.Context;
 import org.apache.avalon.tools.home.Home;
 import org.apache.avalon.tools.project.Definition;
 
@@ -40,37 +42,68 @@
  * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
  * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
  */
-public class JarTask extends DeliverableTask
+public class JarTask extends Task
 {
     public static final String MD5_EXT = "md5";
     public static final String JAR_EXT = "jar";
     public static final String ASC_EXT = "asc";
-
-    public static String getJarFilename( Definition def )
-    {
-        String name = def.getInfo().getName();
-        if( null != def.getInfo().getVersion() )
+    public static final String GPG_EXE_KEY = "project.gpg.exe";
+    
+    private boolean m_init = false;
+    private Context m_context;
+    private Home m_home;
+
+   /**
+    * Set the home ref id.
+    * @param id a home id
+    */
+    public void setRefid( String id )
+    {
+        Object object = getProject().getReference( id );
+        if( null == object )
+        {
+            final String error = 
+              "Unknown ref id '" + id + "'.";
+            throw new BuildException( error );
+        }
+        if( object instanceof Home )
         {
-            return name + "-" + def.getInfo().getVersion() + "." + JAR_EXT;
+            m_home = (Home) object;
         }
         else
         {
-            return name + "." + JAR_EXT;
+            final String error = 
+              "Supplied id '" + id + "' does not refer to a Home.";
+            throw new BuildException( error );
         }
     }
 
-    public static File getJarFile( Project project, Definition def )
+    public void init() throws BuildException 
     {
-        File type = getTargetDeliverablesTypeDirectory( project, def );
-        String filename = getJarFilename( def );
-        return new File( type, filename );
+        if( !m_init )
+        {
+            Project project = getProject();
+            m_context = Context.getContext( project );
+            m_init = true;
+        }
     }
 
     public void execute() throws BuildException 
     {
+        if( null == m_home ) 
+        {
+            final String error = 
+              "Required system home 'refid' attribute not set in the task definition ["
+              + getTaskName() + "].";
+            throw new BuildException( error );
+        }
+
         File classes = 
-          JavacTask.getTargetClassesDirectory( getProject() );
-        File jarFile = getJarFile();
+          m_context.getBuildPath( JavacTask.BUILD_CLASSES_KEY );
+        File deliverables = 
+          m_context.getDeliverablesDirectory();
+
+        File jarFile = getJarFile( deliverables );
         if( classes.exists() )
         {
             try
@@ -84,15 +117,41 @@
                 throw new BuildException( ioe );
             }
         }
+        m_context.setBuildPath( "jar", jarFile.toString() );
     }
 
-    private File getJarFile()
+    public File getJarFile( File deliverables )
     {
-        return getJarFile( getProject(), getDefinition() );
+        Project project = getProject();
+        Definition def = m_home.getDefinition();
+        String type = m_home.getDefinition().getInfo().getType();
+        File types = new File( deliverables, type + "s" );
+        String filename = getJarFilename( def );
+        return new File( types, filename );
+    }
+
+    public String getJarFilename( Definition def )
+    {
+        String name = def.getInfo().getName();
+        if( null != def.getInfo().getVersion() )
+        {
+            return name + "-" + def.getInfo().getVersion() + "." + JAR_EXT;
+        }
+        else
+        {
+            return name + "." + JAR_EXT;
+        }
     }
 
     private boolean jar( File classes, File jarFile )
     {
+        File dir = jarFile.getParentFile();
+
+        Mkdir mkdir = (Mkdir) getProject().createTask( "mkdir" );
+        mkdir.setDir( dir );
+        mkdir.init();
+        mkdir.execute();
+
         long modified = -1;
         if( jarFile.exists() )
         {
@@ -133,7 +192,7 @@
                 md5.delete();
             }
 
-            String gpg = getProject().getProperty( "avalon.gpg.exe" );
+            String gpg = getProject().getProperty( GPG_EXE_KEY );
             if( null != gpg )
             {
                 log( "Creating asc signature" );

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JavacTask.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JavacTask.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/JavacTask.java	Thu Jun  3 18:26:43 2004
@@ -25,72 +25,116 @@
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.taskdefs.Copy;
 import org.apache.tools.ant.taskdefs.Javac;
+import org.apache.tools.ant.taskdefs.Mkdir;
 import org.apache.tools.ant.types.FileSet;
 import org.apache.tools.ant.types.Path;
 
+import org.apache.avalon.tools.home.Context;
 import org.apache.avalon.tools.home.Home;
 import org.apache.avalon.tools.project.Definition;
 
 /**
- * Load a goal. 
+ * Compile sources.
  *
  * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
  * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
  */
-public class JavacTask extends HomeTask
+public class JavacTask extends Task
 {
-    public static final String CLASSES_KEY = "avalon.target.classes";
-    public static final String CLASSES_VALUE = "classes";
+    public static final String BUILD_CLASSES_KEY = "classes";
+    public static final String BUILD_CLASSES_PATH = "classes";
 
     public static final String DEBUG_KEY = "java.compile.debug";
-    public static final boolean DEBUG_FLAG = false;
+    public static final boolean DEBUG_VALUE = false;
 
     public static final String FORK_KEY = "java.compile.fork";
-    public static final boolean FORK_FLAG = false;
+    public static final boolean FORK_VALUE = false;
 
-    public static File getTargetClassesDirectory( Project project )
+    private boolean m_init = false;
+
+    private Context m_context;
+
+    private Home m_home;
+
+   /**
+    * Set the home ref id.
+    * @param id a home id
+    */
+    public void setRefid( String id )
     {
-        File target = PrepareTask.getTargetDirectory( project );
-        String classes = project.getProperty( CLASSES_KEY );
-        return new File( target, classes );
+        Object object = getProject().getReference( id );
+        if( null == object )
+        {
+            final String error = 
+              "Unknown ref id '" + id + "'.";
+            throw new BuildException( error );
+        }
+        if( object instanceof Home )
+        {
+            m_home = (Home) object;
+        }
+        else
+        {
+            final String error = 
+              "Supplied id '" + id + "' does not refer to a Home.";
+            throw new BuildException( error );
+        }
     }
 
     public void init() throws BuildException 
     {
-        super.init();
-        setProjectProperty( CLASSES_KEY, CLASSES_VALUE );
-        setProjectProperty( DEBUG_KEY, "" + DEBUG_FLAG );
-        setProjectProperty( FORK_KEY, "" + FORK_FLAG );
+        if( !m_init )
+        {
+            Project project = getProject();
+            m_context = Context.getContext( project );
+            project.setNewProperty( DEBUG_KEY, "" + DEBUG_VALUE );
+            project.setNewProperty( FORK_KEY, "" + FORK_VALUE );
+            m_context.setBuildPath( 
+              BUILD_CLASSES_KEY, 
+              BUILD_CLASSES_PATH );
+            m_init = true;
+        }
     }
 
     public void execute() throws BuildException 
     {
-        File src = getTargetSrcMainDirectory();
-        if( src.exists() )
+        if( null == m_home )
         {
-            File classes = getTargetClassesDirectory();
-            if( !classes.exists() )
-            {
-                log( "creating target classes directory" );
-                createDirectory( classes );
-            }
-            Path classpath = 
-              getHome().getRepository().createPath( 
-                getProject(), getDefinition() );
-            compile( src, classes, classpath );
-            copy( src, classes );
+            final String error = 
+              "Required system home 'refid' value is not declared";
+            throw new BuildException( error );
         }
-    }
 
-    private File getTargetSrcMainDirectory()
-    {
-        String src = getProject().getProperty( PrepareTask.TARGET_SRC_MAIN_KEY );
-        return new File( getProject().getBaseDir(), src );
-    }
+        Project project = getProject();
+        File build = m_context.getBuildPath( PrepareTask.BUILD_SRC_KEY, false );
+        String mainPath = project.getProperty( Context.SRC_MAIN_KEY );
+        File main = new File( build, mainPath );
 
-    private File getTargetClassesDirectory()
-    {
-        return getTargetClassesDirectory( getProject() );
+        if( main.exists() )
+        {
+            File classes = m_context.getBuildPath( BUILD_CLASSES_KEY );
+            Mkdir mkdir = (Mkdir) getProject().createTask( "mkdir" );
+            mkdir.setDir( classes );
+            mkdir.init();
+            mkdir.execute();
+
+            Path classpath = 
+              m_home.getRepository().createPath( 
+                getProject(), m_home.getDefinition() );
+            compile( main, classes, classpath );
+
+            Copy copy = (Copy) getProject().createTask( "copy" );
+            copy.setPreserveLastModified( true );
+            copy.setTodir( classes );
+
+            FileSet fileset = new FileSet();
+            fileset.setDir( main );
+            fileset.setIncludes( "**/**" );
+            fileset.setExcludes( "**/*.java,**/package.html" );
+            copy.addFileset( fileset );
+            copy.init();
+            copy.execute();
+        }
     }
 
     private void compile( File sources, File classes, Path classpath )
@@ -108,29 +152,14 @@
         javac.execute();
     }
 
-    private void copy( File sources, File classes )
-    {        
-        Copy copy = (Copy) getProject().createTask( "copy" );
-        copy.setPreserveLastModified( true );
-        copy.setTodir( classes );
-
-        FileSet fileset = new FileSet();
-        fileset.setDir( sources );
-        fileset.setIncludes( "**/**" );
-        fileset.setExcludes( "**/*.java,**/package.html" );
-        copy.addFileset( fileset );
-        copy.init();
-        copy.execute();
-    }
-
     private boolean getDebugProperty()
     {
-        return getBooleanProperty( DEBUG_KEY, DEBUG_FLAG );
+        return getBooleanProperty( DEBUG_KEY, DEBUG_VALUE );
     }
 
     private boolean getForkProperty()
     {
-        return getBooleanProperty( FORK_KEY, FORK_FLAG );
+        return getBooleanProperty( FORK_KEY, FORK_VALUE );
     }
 
     private boolean getBooleanProperty( String key, boolean fallback )

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PluginTask.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PluginTask.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PluginTask.java	Thu Jun  3 18:26:43 2004
@@ -31,6 +31,7 @@
 import org.apache.tools.ant.UnknownElement;
 
 import org.apache.avalon.tools.home.Home;
+import org.apache.avalon.tools.home.Context;
 import org.apache.avalon.tools.project.Definition;
 import org.apache.avalon.tools.project.Info;
 import org.apache.avalon.tools.project.Resource;
@@ -47,18 +48,57 @@
  * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
  * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
  */
-public class PluginTask extends HomeTask
+public class PluginTask extends Task
 {
     private String m_id;
-    private File m_definition;
     private String m_uri;
 
-    public void setId( String id )
+    private boolean m_init = false;
+    private Context m_context;
+    private Home m_home;
+
+   /**
+    * Set the home ref id.
+    * @param id a home id
+    */
+    public void setRefid( String id )
+    {
+        Object object = getProject().getReference( id );
+        if( null == object )
+        {
+            final String error = 
+              "Unknown ref id '" + id + "'.";
+            throw new BuildException( error );
+        }
+        if( object instanceof Home )
+        {
+            m_home = (Home) object;
+        }
+        else
+        {
+            final String error = 
+              "Supplied id '" + id + "' does not refer to a Home.";
+            throw new BuildException( error );
+        }
+    }
+
+
+    public void setArtifact( String id )
     {
         m_id = id;
     }
 
-    private String getId()
+    public void init() throws BuildException 
+    {
+        if( !m_init )
+        {
+            Project project = getProject();
+            m_context = Context.getContext( project );
+            m_init = true;
+        }
+    }
+
+    private String getArtifactSpec()
     {
         if( null != m_id )
         {
@@ -67,30 +107,40 @@
         else
         {
             final String error = 
-              "Missing plugin id attribute.";
+              "Missing plugin 'artifact' attribute.";
             throw new BuildException( error );
         }
     }
 
     public void execute() throws BuildException 
     {
+        if( null == m_home ) 
+        {
+            final String error = 
+              "Required system home 'refid' attribute not set in the task definition ["
+              + getTaskName() + "].";
+            throw new BuildException( error );
+        }
+
         try
         {
             //
             // get the xml definition of the plugin
             //
 
-            String id = getId();
-            Info info = Info.create( id, "ant" );
+            String id = getArtifactSpec();
+
+            Info info = Info.create( id );
             Project project = getProject();
             Resource resource = new Resource( info );
-            m_definition = getHome().getRepository().getResource( project, resource );
+            File file = m_home.getRepository().getResource( project, resource );
 
             //
             // create a utility data object from the defintion
             //
 
-            AntLibData data = new AntLibData( getProject(), m_definition );
+            AntLibData data = new AntLibData( getProject(), file );
+
             ClassLoader classloader = project.createClassLoader( data.getPath() );
             String uri = data.getInfo().getURI(); 
 
@@ -135,13 +185,12 @@
             for( int i=0; i<children.length; i++ )
             {
                 Element child = children[i];
-                String value = ElementHelper.getValue( child );
                 String type = child.getTagName();
-                Info info = Info.create( value, type );
+                String value = ElementHelper.getValue( child );
+                Info info = Info.create( type, value );
                 Resource resource = new Resource( info );
                 File jar = 
-                  getHome().getRepository().getResource( 
-                    project, resource );
+                  m_home.getRepository().getResource( project, resource );
                 m_path.createPathElement().setLocation( jar );
             }
         }

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PrepareTask.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PrepareTask.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/PrepareTask.java	Thu Jun  3 18:26:43 2004
@@ -19,17 +19,18 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Hashtable;
+import java.util.Map;
 
 import org.apache.tools.ant.Task;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.taskdefs.Copy;
+import org.apache.tools.ant.taskdefs.Mkdir;
 import org.apache.tools.ant.taskdefs.Property;
+import org.apache.tools.ant.taskdefs.Copy;
 import org.apache.tools.ant.types.FileSet;
 
-import org.apache.avalon.tools.home.Home;
-import org.apache.avalon.tools.project.Definition;
-import org.apache.avalon.tools.tasks.HomeTask;
+import org.apache.avalon.tools.home.Context;
 
 /**
  * Load a goal. 
@@ -37,93 +38,75 @@
  * @author <a href="mailto:dev@avalon.apache.org">Avalon Development Team</a>
  * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
  */
-public class PrepareTask extends HomeTask
+public class PrepareTask extends Task
 {
-    public static String SRC = "src";
-    public static String TARGET = "target";
-    public static String TARGET_SRC = TARGET + "/src";
-    public static String TARGET_SRC_MAIN = TARGET_SRC + "/main";
-    public static String TARGET_SRC_TEST = TARGET_SRC + "/test";
-    public static String TARGET_SRC_RES = TARGET_SRC + "/resources";
-
-    public static final String SRC_KEY = "avalon.src";
-    public static final String TARGET_KEY = "avalon.target";
-    public static final String TARGET_SRC_KEY = "avalon.target.src";
-    public static final String TARGET_SRC_MAIN_KEY = "avalon.target.src.main";
-    public static final String TARGET_SRC_TEST_KEY = "avalon.target.src.test";
-    public static final String TARGET_SRC_RES_KEY = "avalon.target.src.resources";
 
-    public static File getTargetDirectory( Project project )
-    {
-        String target = project.getProperty( TARGET_KEY );
-        return new File( project.getBaseDir(), target );
-    }
+    public static final String BUILD_SRC_KEY = "src";
+    private static final String BUILD_SRC_PATH = "src";
 
-    public static File getTargetSrcResourcesDirectory( Project project )
+    private static final String SRC_FILTERED_INCLUDES_KEY = 
+      "project.prepare.src.filtered.includes";
+    private static final String SRC_FILTERED_INCLUDES_VALUE = 
+      "**/*.java,**/*.x*,**/*.properties";
+
+    private Context m_context;
+    private boolean m_init = false;
+    private File m_home;
+
+   /**
+    * Optional setting of the project home.
+    */
+    public void setHome( File home )
     {
-        String res = project.getProperty( TARGET_SRC_RES_KEY );
-        return new File( project.getBaseDir(), res );
+        m_home = home;
     }
 
     public void init() throws BuildException 
     {
-        setProjectProperty( SRC_KEY, SRC );
-        setProjectProperty( TARGET_KEY, TARGET );
-        setProjectProperty( TARGET_SRC_KEY, TARGET_SRC );
-        setProjectProperty( TARGET_SRC_MAIN_KEY, TARGET_SRC_MAIN );
-        setProjectProperty( TARGET_SRC_TEST_KEY, TARGET_SRC_TEST );
-        setProjectProperty( TARGET_SRC_RES_KEY, TARGET_SRC_RES );
+        if( !m_init )
+        {
+            Project project = getProject();
+            m_context = Context.getContext( project, m_home );
+            project.setNewProperty(
+              SRC_FILTERED_INCLUDES_KEY, SRC_FILTERED_INCLUDES_VALUE );
+            m_context.setBuildPath( BUILD_SRC_KEY, BUILD_SRC_PATH );
+            m_init = true;
+        }
     }
 
     public void execute() throws BuildException 
     {
-        File target = getTargetDirectory();
+        Project project = getProject();
+        File target = m_context.getTargetDirectory();
         if( !target.exists() )
         {
             log( "creating target directory" );
-            createDirectory( target );
+            Mkdir mkdir = (Mkdir) getProject().createTask( "mkdir" );
+            mkdir.setDir( target );
+            mkdir.init();
+            mkdir.execute();
         }
-        File src = getSrcDirectory();
+        File src = m_context.getSrcDirectory();
         if( src.exists() )
         {
-            copySrcToBuildWithFiltering( target );
-            copySrcToBuildWithoutFiltering( target );
+            String filters = project.getProperty( SRC_FILTERED_INCLUDES_KEY );
+            File build = m_context.getBuildPath( "src" );
+            copy( src, build, true, filters, "" );
+            copy( src, build, false, "**/*.*", filters );
         }
     }
 
-    private File getSrcDirectory()
+    private void copy( 
+       File src, File destination, boolean filtering, String includes, String excludes )
     {
-        String src = getProject().getProperty( "avalon.src" );
-        return new File( getProject().getBaseDir(), src );
-    }
-
-    private File getTargetDirectory()
-    {
-        return getTargetDirectory( getProject() );
-    }
-
-    private void copySrcToBuildWithFiltering( File target )
-    {
-        copySrcToBuild( target, true, "**/*.java,**/*.x*,**/*.properties", "" );
-    }
-
-    private void copySrcToBuildWithoutFiltering( File target )
-    {
-        copySrcToBuild( target, false, "**/*.*", "**/*.java,**/*.x*,**/*.properties" );
-    }
-
-    private void copySrcToBuild( 
-       File target, boolean filtering, String includes, String excludes )
-    {
-        File targetSrc = new File( target, SRC );
         Copy copy = (Copy) getProject().createTask( "copy" );
-        copy.setTodir( targetSrc );
+        copy.setTodir( destination );
         copy.setFiltering( filtering );
         copy.setOverwrite( false );
         copy.setPreserveLastModified( true );
 
         FileSet fileset = new FileSet();
-        fileset.setDir( getSrcDirectory() );
+        fileset.setDir( src );
         fileset.setIncludes( includes );
         fileset.setExcludes( excludes );
         copy.addFileset( fileset );
@@ -131,4 +114,5 @@
         copy.init();
         copy.execute();
     }
+
 }

Modified: avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/XdocTask.java
==============================================================================
--- avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/XdocTask.java	(original)
+++ avalon/trunk/tools/project/core/src/main/org/apache/avalon/tools/tasks/XdocTask.java	Thu Jun  3 18:26:43 2004
@@ -23,107 +23,227 @@
 import org.apache.tools.ant.types.FileSet;
 import org.apache.tools.ant.taskdefs.Copy;
 import org.apache.tools.ant.taskdefs.XSLTProcess;
+import org.apache.tools.ant.taskdefs.Mkdir;
+
+import org.apache.avalon.tools.home.Context;
+import org.apache.avalon.tools.home.Home;
 
-public class XdocTask extends HomeTask
+public class XdocTask extends Task
 {
-    public static final String XDOC_TARGET_SRC_KEY = "avalon.target.src.xdoc";
-    public static final String XDOC_TARGET_SRC_VALUE = 
-       PrepareTask.TARGET_SRC + "/xdocs";
-
-    public static final String XDOC_TARGET_DOCS_KEY = "avalon.target.docs";
-    public static final String XDOC_TARGET_DOCS_VALUE = 
-       PrepareTask.TARGET + "/docs";
+    //public static final String BUILD_DOCS_KEY = "project.target.docs.name";
+    //public static final String BUILD_DOCS_VALUE = "docs";
+
+    public static final String XDOC_TEMP_KEY = "project.target.temp.xdocs";
+    public static final String XDOC_TEMP_VALUE = "xdocs";
+
+    public static final String XDOC_SRC_KEY = "project.xdocs.src";
+    public static final String XDOC_SRC_VALUE = "xdocs";
+
+    public static final String XDOC_RESOURCES_KEY = "project.xdocs.resources";
+    public static final String XDOC_RESOURCES_VALUE = "resources";
 
-    public static final String XDOC_THEME_KEY = "xdoc.theme.name";
+    public static final String XDOC_THEME_KEY = "project.xdoc.theme";
     public static final String XDOC_THEME_VALUE = "avalon2";
 
-    public static final String XDOC_OUTPUT_FORMAT_KEY = "xdoc.output.format";
-    public static final String XDOC_OUTPUT_FORMAT_VALUE = "html";
+    public static final String XDOC_FORMAT_KEY = "project.xdoc.output.format";
+    public static final String XDOC_FORMAT_VALUE = "html";
+
+    public static final String ORG_NAME_KEY = "project.organization.name";
+    public static final String ORG_NAME_VALUE = "The Apache Software Foundation";
+
+    public static final String XDOC_LOGO_RIGHT_FILE_KEY = "project.xdoc.logo.right.file";
+    public static final String XDOC_LOGO_RIGHT_FILE_VALUE = "";
+
+    public static final String XDOC_LOGO_RIGHT_URL_KEY = "project.xdoc.logo.right.url";
+    public static final String XDOC_LOGO_RIGHT_URL_VALUE = "";
+
+    public static final String XDOC_LOGO_LEFT_FILE_KEY = "project.xdoc.logo.left.file";
+    public static final String XDOC_LOGO_LEFT_FILE_VALUE = "";
+
+    public static final String XDOC_LOGO_LEFT_URL_KEY = "project.xdoc.logo.left.url";
+    public static final String XDOC_LOGO_LEFT_URL_VALUE = "";
+
+    public static final String XDOC_LOGO_MIDDLE_FILE_KEY = "project.xdoc.logo.middle.file";
+    public static final String XDOC_LOGO_MIDDLE_FILE_VALUE = "";
+
+    public static final String XDOC_LOGO_MIDDLE_URL_KEY = "project.xdoc.logo.middle.url";
+    public static final String XDOC_LOGO_MIDDLE_URL_VALUE = "";
+
+    public static final String XDOC_BRAND_NAME_KEY = "project.xdoc.brand.name";
+    public static final String XDOC_BRAND_NAME_VALUE = "Avalon";
+
+    public static final String XDOC_ANCHOR_URL_KEY = "project.xdoc.anchor.url";
+
+
+    private boolean m_init = false;
+    private Context m_context;
+    private Home m_home;
+    private String m_theme;
 
     private File m_BaseToDir;    
     private File m_BaseSrcDir;    
-    private String m_theme;
 
     public void setTheme( String theme )
     {
         m_theme = theme;
     }
 
-    public void init()
+   /**
+    * Set the home ref id.
+    * @param id a home id
+    */
+    public void setRefid( String id )
     {
-        super.init();
-        setProjectProperty( XDOC_TARGET_SRC_KEY, XDOC_TARGET_SRC_VALUE );
-        setProjectProperty( XDOC_TARGET_DOCS_KEY, XDOC_TARGET_DOCS_VALUE );
-        setProjectProperty( XDOC_THEME_KEY, XDOC_THEME_VALUE );
-        setProjectProperty( XDOC_OUTPUT_FORMAT_KEY, XDOC_OUTPUT_FORMAT_VALUE );
-        setProjectProperty( "xdoc.organization", "" );
-        setProjectProperty( "xdoc.logo.right.file", "" );
-        setProjectProperty( "xdoc.logo.right.url", "" );
-        setProjectProperty( "xdoc.logo.left.file", "" );
-        setProjectProperty( "xdoc.logo.left.url", "" );
-        setProjectProperty( "xdoc.logo.middle.file", "" );
-        setProjectProperty( "xdoc.logo.middle.url", "" );
-        setProjectProperty( "xdoc.brand.name", "" );
+        Object object = getProject().getReference( id );
+        if( null == object )
+        {
+            final String error = 
+              "Unknown ref id '" + id + "'.";
+            throw new BuildException( error );
+        }
+        if( object instanceof Home )
+        {
+            m_home = (Home) object;
+        }
+        else
+        {
+            final String error = 
+              "Supplied id '" + id + "' does not refer to a Home.";
+            throw new BuildException( error );
+        }
     }
 
-    private File getThemesDirectory()
+    public void init() throws BuildException 
     {
-        return new File( getHome().getHomeDirectory(), "themes" );
-    }
+        if( !m_init )
+        {
+            Project project = getProject();
+            m_context = Context.getContext( project );
+            project.setNewProperty( ORG_NAME_KEY, ORG_NAME_VALUE );
+            project.setNewProperty( XDOC_SRC_KEY, XDOC_SRC_VALUE );
+            project.setNewProperty( XDOC_RESOURCES_KEY, XDOC_RESOURCES_VALUE );
+            project.setNewProperty( XDOC_THEME_KEY, XDOC_THEME_VALUE );
+            project.setNewProperty( XDOC_FORMAT_KEY, XDOC_FORMAT_VALUE );
+            project.setNewProperty( XDOC_TEMP_KEY, XDOC_TEMP_VALUE );
+            project.setNewProperty( XDOC_LOGO_RIGHT_FILE_KEY, XDOC_LOGO_RIGHT_FILE_VALUE );
+            project.setNewProperty( XDOC_LOGO_RIGHT_URL_KEY, XDOC_LOGO_RIGHT_URL_VALUE );
+            project.setNewProperty( XDOC_LOGO_LEFT_FILE_KEY, XDOC_LOGO_LEFT_FILE_VALUE );
+            project.setNewProperty( XDOC_LOGO_LEFT_URL_KEY, XDOC_LOGO_LEFT_URL_VALUE );
+            project.setNewProperty( XDOC_LOGO_MIDDLE_FILE_KEY, XDOC_LOGO_MIDDLE_FILE_VALUE );
+            project.setNewProperty( XDOC_LOGO_MIDDLE_URL_KEY, XDOC_LOGO_MIDDLE_URL_VALUE );
+            project.setNewProperty( XDOC_BRAND_NAME_KEY, XDOC_BRAND_NAME_VALUE );
 
-    private File getTargetSrcXdocDirectory()
-    {
-        File basedir = getProject().getBaseDir();
-        return new File( basedir, getProject().getProperty( XDOC_TARGET_SRC_KEY ) );
+            m_init = true;
+        }
     }
 
-    private File getTargetDocsDirectory()
+    private File getThemesDirectory()
     {
-        File basedir = getProject().getBaseDir();
-        return new File( basedir, getProject().getProperty( XDOC_TARGET_DOCS_KEY ) );
+        File home = m_home.getHomeDirectory();
+        return new File( home, "themes" );
     }
-    
-    private File getTargetBuildXdocDirectory()
+    
+    private String getOutputFormat()
     {
-        File target = PrepareTask.getTargetDirectory( getProject() );
-        return new File( target, "temp/xdoc-build" );
+        return getProject().getProperty( XDOC_FORMAT_KEY );
     }
-    
+
     private String getTheme()
     {
         if( m_theme != null ) return m_theme;
         return getProject().getProperty( XDOC_THEME_KEY );
     }
 
-    private String getOutputFormat()
-    {
-        return getProject().getProperty( XDOC_OUTPUT_FORMAT_KEY );
-    }
-
     public void execute()
     {        
+        log( "Executing" );
+
+        if( null == m_home ) 
+        {
+            final String error = 
+              "Required system home 'refid' attribute not set in the task definition ["
+              + getTaskName() + "].";
+            throw new BuildException( error );
+        }
+
+        Project project = getProject();
+        File docs = m_context.getDocsDirectory();
+        log( "Docs:" + docs );
+
+        //
+        // get the directory containing the filtered xdocs source files 
+        // (normally target/src/xdocs)
+        //
+
+        File build = m_context.getBuildPath( PrepareTask.BUILD_SRC_KEY, false );
 
-        File srcDir = getTargetSrcXdocDirectory();
+        if( null == build )
+        {
+            final String message =
+              "Src directory does not exist: "
+              + build;
+            log( message );
+            return;
+        }
+
+        String xdocsPath = project.getProperty( XDOC_SRC_KEY );
+        if( null == xdocsPath )
+        {
+            final String message =
+              "Cannot processed as xdoc src directory not defined.";
+            log( message );
+            return;
+        }
+
+        File srcDir = new File( build, xdocsPath );
         if( !srcDir.exists() ) return;
+        log( "Filtered source: " + srcDir.getAbsolutePath() );
 
-        File destDir = getTargetBuildXdocDirectory();
-        createDirectory( destDir );
+        //
+        // create the temporary directory into which we generate the 
+        // navigation structure (normally target/temp/xdocs)
+        //
+
+        File temp = m_context.getTempDirectory();
+        String tempPath = project.getProperty( XDOC_TEMP_KEY );
+        File destDir = new File( temp, tempPath );
+        mkDir( destDir );
+
+        //
+        // get the theme, output formats, etc.
+        //
+
+        log( "Destination: " + docs.getAbsolutePath() );
+        mkDir( docs );
 
         String theme = getTheme();
         String output = getOutputFormat();
         File themeRoot = getThemesDirectory();
         File themeDir = new File( themeRoot, theme + "/" + output );
-        
+        
+        String resourcesPath = project.getProperty( XDOC_RESOURCES_KEY );
+        File resources = new File( build, resourcesPath );
+
         log( "Year: " + getProject().getProperty( "magic.year" ) );
-        log( "Source: " + srcDir.getAbsolutePath() );
         log( "Theme: " + themeDir );
         
+        //
+        // initiate the transformation starting with the generation of 
+        // the navigation structure based on the src directory content
+        // into the temporary destingation directory, copy the content
+        // sources to to the temp directory, transform the content and 
+        // generated navigation in the temp dir using the selected them
+        // into the final docs directory, and copy over resources to 
+        // the final docs directory
+        //
+
         try
         {
             transformNavigation( themeDir, srcDir, destDir );
             copySources( srcDir, destDir );
-            transformXdocs( themeDir, destDir );
-            copyResources( themeDir );
+            transformXdocs( themeDir, destDir, docs );
+            copyThemeResources( themeDir, docs );
+            copySrcResources( resources, docs );
         } 
         catch( Throwable e )
         {
@@ -146,35 +266,25 @@
         copy( source, dest, "**/*", "**/navigation.xml" );
     }
     
-    private void transformXdocs( File themeDir, File build )
+    private void transformXdocs( File themeDir, File build, File docs )
     {
         File xslFile = new File( themeDir,  "transform.xsl" );
         String output = getOutputFormat();
-        File docs = getTargetDocsDirectory();
         log( "Transforming content." );
         transformTrax( 
           build, docs, xslFile, 
           "^.*\\.xml$", "^.*/navigation.xml$", "." + output, "html" );
     }
     
-    private void copyResources( File themeDir )
-    {
-        copyThemeResources( themeDir );
-        copySrcResources();
-    }
-
-    private void copySrcResources()
+    private void copySrcResources( File resources, File docs )
     {
-        File destDir = getTargetDocsDirectory();
-        File resources = PrepareTask.getTargetSrcResourcesDirectory( getProject() );
-        copy( resources, destDir, "**/*", "" );
+        copy( resources, docs, "**/*", "" );
     }
 
-    private void copyThemeResources( File themeDir )
+    private void copyThemeResources( File themeDir, File docs )
     {
-        File destDir = getTargetDocsDirectory();
         File fromDir = new File( themeDir, "resources" );
-        copy( fromDir, destDir, "**/*", "" );
+        copy( fromDir, docs, "**/*", "" );
     }
     
     private void copy( File fromDir, File toDir, String includes, String excludes )
@@ -182,8 +292,9 @@
         FileSet from = new FileSet();
         from.setDir( fromDir );
         from.setIncludes( includes );
-        from.setExcludes( excludes );
-        toDir.mkdirs();  /* ensure that the directory exists. */
+        from.setExcludes( excludes );
+
+        mkDir( toDir );
         
         Copy copy = (Copy) getProject().createTask( "copy" );
         copy.setTodir( toDir );
@@ -221,7 +332,7 @@
         throws BuildException
     {
         String year = getProject().getProperty( "magic.year" );
-        String org = getProject().getProperty( "xdoc.organization" );
+        String org = getProject().getProperty( ORG_NAME_KEY );
         String copyright = 
           "Copyright " + year + ", " + org + " All rights reserved.";
 
@@ -238,7 +349,7 @@
             }
             if( content[i].isFile() )
             {
-                String svnRoot = getProject().getProperty( "xdoc.svn.root.xdocs" );
+                String svnRoot = getProject().getProperty( XDOC_ANCHOR_URL_KEY );
                 String svnSource = svnRoot + getRelSrcPath( srcDir ) + "/" + base;
                 
                 int pos = base.lastIndexOf( '.' );
@@ -259,25 +370,25 @@
                 transformer.setParameter( "copyright", copyright );
                 transformer.setParameter( 
                   "logoright_file", 
-                  getProject().getProperty( "xdoc.logo.right.file" ).trim() );
+                  getProject().getProperty( XDOC_LOGO_RIGHT_FILE_KEY ).trim() );
                 transformer.setParameter( 
                   "logoright_url", 
-                  getProject().getProperty( "xdoc.logo.right.url" ).trim() );
+                  getProject().getProperty( XDOC_LOGO_RIGHT_URL_KEY).trim() );
                 transformer.setParameter( 
                   "logoleft_file", 
-                  getProject().getProperty( "xdoc.logo.left.file" ).trim() );
+                  getProject().getProperty( XDOC_LOGO_LEFT_FILE_KEY ).trim() );
                 transformer.setParameter( 
                   "logoleft_url", 
-                  getProject().getProperty( "xdoc.logo.left.url" ).trim() );
+                  getProject().getProperty( XDOC_LOGO_LEFT_URL_KEY ).trim() );
                 transformer.setParameter( 
                   "logomiddle_file", 
-                  getProject().getProperty( "xdoc.logo.middle.file" ).trim() );
+                  getProject().getProperty( XDOC_LOGO_MIDDLE_FILE_KEY ).trim() );
                 transformer.setParameter( 
                   "logomiddle_url", 
-                  getProject().getProperty( "xdoc.logo.middle.url" ).trim() );
+                  getProject().getProperty( XDOC_LOGO_MIDDLE_URL_KEY ).trim() );
                 transformer.setParameter( 
                   "brand_name", 
-                  getProject().getProperty( "xdoc.brand.name" ).trim() );
+                  getProject().getProperty( XDOC_BRAND_NAME_KEY ).trim() );
 
                 try
                 {
@@ -333,7 +444,6 @@
             if( file.isDirectory() )
                 return true;
 
-        
             String fullpath = file.getAbsolutePath().replace( '\\', '/' );
 
             Matcher m = m_Includes.matcher( fullpath );
@@ -344,4 +454,12 @@
             return ! m.matches() ;
         }
     } 
+
+    private void mkDir( File dir )
+    {
+        Mkdir mkdir = (Mkdir) getProject().createTask( "mkdir" );
+        mkdir.setDir( dir );
+        mkdir.init();
+        mkdir.execute();
+    }
 }

Modified: avalon/trunk/tools/project/core/src/test/index.xml
==============================================================================
--- avalon/trunk/tools/project/core/src/test/index.xml	(original)
+++ avalon/trunk/tools/project/core/src/test/index.xml	Thu Jun  3 18:26:43 2004
@@ -11,7 +11,7 @@
     <cache dir=".cache"/>
     <proxy/>
     <hosts>
-      <host>http://www.dpml.net</host>
+      <host>http://www.apache.org/dist/avalon/</host>
     </hosts>
   </repository>
 

Modified: avalon/trunk/tools/project/core/src/test/projects/demo/build.xml
==============================================================================
--- avalon/trunk/tools/project/core/src/test/projects/demo/build.xml	(original)
+++ avalon/trunk/tools/project/core/src/test/projects/demo/build.xml	Thu Jun  3 18:26:43 2004
@@ -1,14 +1,32 @@
 
-<project name="my-demo" default="" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"> 
+<project name="my-demo" default="install" basedir="." 
+    xmlns:x="antlib:org.apache.avalon.tools">
 
-  <x:project index="../../index.xml" key="demo"/>
+  <x:home id="system" index="../../index.xml" key="demo"/>
 
-  <x:prepare/>
-  <x:javac/>
-  <x:declare/>
-  <x:jar/>
-  <x:test/>
-  <x:install/>
+  <target name="clean">
+    <x:clean/>
+  </target>
+
+  <target name="prepare" depends="">
+    <x:prepare/>
+  </target>
+
+  <target name="build" depends="prepare">
+    <x:declare refid="system"/>
+    <x:javac refid="system"/>
+  </target>
+
+  <target name="package" depends="build">
+    <x:jar refid="system"/>
+  </target>
+
+  <target name="test" depends="package">
+    <x:junit refid="system"/>
+  </target>
+
+  <target name="install" depends="test">
+    <x:install refid="system"/>
+  </target>
 
 </project>

Modified: avalon/trunk/tools/project/core/src/test/projects/gizmo/build.properties
==============================================================================
--- avalon/trunk/tools/project/core/src/test/projects/gizmo/build.properties	(original)
+++ avalon/trunk/tools/project/core/src/test/projects/gizmo/build.properties	Thu Jun  3 18:26:43 2004
@@ -1 +1,5 @@
 #avalon.target = targetx
+
+project.index = ../../index.xml
+project.home = ../..
+project.gpg.exe = gpg
\ No newline at end of file

Modified: avalon/trunk/tools/project/core/src/test/projects/gizmo/build.xml
==============================================================================
--- avalon/trunk/tools/project/core/src/test/projects/gizmo/build.xml	(original)
+++ avalon/trunk/tools/project/core/src/test/projects/gizmo/build.xml	Thu Jun  3 18:26:43 2004
@@ -1,13 +1,31 @@
 
-<project name="gizmo" default="" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"> 
+<project name="gizmo" default="install" basedir="." 
+    xmlns:x="antlib:org.apache.avalon.tools">
 
-  <x:project index="../../index.xml"/>
+  <x:home id="system" index="../../index.xml"/>
 
-  <x:prepare/>
-  <x:javac/>
-  <x:jar/>
-  <x:test/>
-  <x:install/>
+  <target name="clean">
+    <x:clean/>
+  </target>
+
+  <target name="prepare" depends="">
+    <x:prepare/>
+  </target>
+
+  <target name="build" depends="prepare">
+    <x:javac refid="system"/>
+  </target>
+
+  <target name="package" depends="build">
+    <x:jar refid="system"/>
+  </target>
+
+  <target name="test" depends="package">
+    <x:junit refid="system"/>
+  </target>
+
+  <target name="install" depends="test">
+    <x:install refid="system"/>
+  </target>
 
 </project>

Modified: avalon/trunk/tools/project/core/src/test/projects/sample/build.xml
==============================================================================
--- avalon/trunk/tools/project/core/src/test/projects/sample/build.xml	(original)
+++ avalon/trunk/tools/project/core/src/test/projects/sample/build.xml	Thu Jun  3 18:26:43 2004
@@ -1,9 +1,35 @@
 
-<project name="sample" default="" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools" xmlns:d="jar:demo/demo#1.0" > 
+<project name="sample" default="install" basedir="." 
+    xmlns:x="antlib:org.apache.avalon.tools" xmlns:d="plugin:demo/demo#1.0" > 
 
-  <x:project index="../../index.xml"/>
-  <x:plugin id="demo/demo#1.0"/>
-  <d:hello/>
+  <x:home id="system" index="../../index.xml">
+    <x:plugin refid="system" artifact="plugin:demo/demo#1.0"/>
+  </x:home>
+
+  <target name="clean">
+    <x:clean/>
+  </target>
+
+  <target name="prepare" depends="">
+    <x:prepare/>
+  </target>
+
+  <target name="build" depends="prepare">
+    <x:javac refid="system"/>
+    <d:hello/>
+  </target>
+
+  <target name="package" depends="build">
+    <x:jar refid="system"/>
+  </target>
+
+  <target name="test" depends="package">
+    <x:junit refid="system"/>
+  </target>
+
+  <target name="install" depends="test">
+    <x:install refid="system"/>
+  </target>
 
 </project>
+

Modified: avalon/trunk/tools/project/core/src/test/projects/widget/build.xml
==============================================================================
--- avalon/trunk/tools/project/core/src/test/projects/widget/build.xml	(original)
+++ avalon/trunk/tools/project/core/src/test/projects/widget/build.xml	Thu Jun  3 18:26:43 2004
@@ -1,13 +1,32 @@
 
-<project name="widget" default="" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"> 
+<project name="widget" default="install" basedir="." 
+    xmlns:x="antlib:org.apache.avalon.tools">
 
-  <x:project index="../../index.xml"/>
+  <x:home id="system" index="../../index.xml"/>
 
-  <x:prepare/>
-  <x:javac/>
-  <x:jar/>
-  <x:test/>
-  <x:install/>
+  <target name="clean">
+    <x:clean/>
+  </target>
+
+  <target name="prepare" depends="">
+    <x:prepare/>
+  </target>
+
+  <target name="build" depends="prepare">
+    <x:javac refid="system"/>
+  </target>
+
+  <target name="package" depends="build">
+    <x:jar refid="system"/>
+  </target>
+
+  <target name="test" depends="package">
+    <x:junit refid="system"/>
+  </target>
+
+  <target name="install" depends="test">
+    <x:install refid="system"/>
+  </target>
 
 </project>
+

---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org