svn commit: rev 21387 - in avalon/trunk: central/site central/system central/system/build planet/tutorials/dynamics planet/tutorials/hello runtime/meta/tools/src/java/org/apache/avalon/meta/info/ant runtime/test/components runtime/test/dynamics runtime/test/playground runtime/test/testa runtime/test/testb runtime/test/testc runtime/test/testd runtime/test/teste tools/magic/src/main/org/apache/avalon/tools tools/magic/src/main/org/apache/avalon/tools/project tools/magic/src/main/org/apache/avalon/tools/project/builder tools/magic/src/main/org/apache/avalon/tools/tasks

[email protected]
Newsgroups gmane.comp.jakarta.avalon.cvs
Message-ID <[email protected]>
Author: mcconnell
Date: Thu Jun 17 11:56:18 2004
New Revision: 21387

Added:
   avalon/trunk/runtime/meta/tools/src/java/org/apache/avalon/meta/info/ant/MetaBuildListener.java   (contents, props changed)
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/InitializeTask.java   (contents, props changed)
Modified:
   avalon/trunk/central/site/build.xml
   avalon/trunk/central/system/build/standard.xml
   avalon/trunk/central/system/index.xml
   avalon/trunk/planet/tutorials/dynamics/build.xml
   avalon/trunk/planet/tutorials/hello/build.xml
   avalon/trunk/runtime/meta/tools/src/java/org/apache/avalon/meta/info/ant/MetaTask.java
   avalon/trunk/runtime/test/components/build.xml
   avalon/trunk/runtime/test/dynamics/build.xml
   avalon/trunk/runtime/test/playground/build.xml
   avalon/trunk/runtime/test/testa/build.xml
   avalon/trunk/runtime/test/testb/build.xml
   avalon/trunk/runtime/test/testc/build.xml
   avalon/trunk/runtime/test/testd/build.xml
   avalon/trunk/runtime/test/teste/build.xml
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/antlib.xml
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/project/Plugin.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/project/builder/XMLDefinitionBuilder.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/DeclareTask.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/PluginTask.java
   avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/PrepareTask.java
Log:
Add automatic project lister registration to plugin loading and leanup current build.xml to take advantage of this.

Modified: avalon/trunk/central/site/build.xml
==============================================================================
--- avalon/trunk/central/site/build.xml	(original)
+++ avalon/trunk/central/site/build.xml	Thu Jun 17 11:56:18 2004
@@ -16,5 +16,9 @@
        id="avalon-merlin-impl"/>
   </target>
 
+  <target name="xdoc" depends="standard.init">
+    <x:xdoc theme="modern"/>
+  </target>
+
 </project>
 

Modified: avalon/trunk/central/system/build/standard.xml
==============================================================================
--- avalon/trunk/central/system/build/standard.xml	(original)
+++ avalon/trunk/central/system/build/standard.xml	Thu Jun 17 11:56:18 2004
@@ -5,6 +5,7 @@
 
   <target name="init">
     <x:info/>
+    <x:init/>
   </target>
 
   <target name="clean" depends="init">

Modified: avalon/trunk/central/system/index.xml
==============================================================================
--- avalon/trunk/central/system/index.xml	(original)
+++ avalon/trunk/central/system/index.xml	Thu Jun 17 11:56:18 2004
@@ -291,6 +291,9 @@
       <tasks>
         <taskdef name="meta" class="org.apache.avalon.meta.info.ant.MetaTask"/>
       </tasks>
+      <listeners>
+        <listener class="org.apache.avalon.meta.info.ant.MetaBuildListener"/>
+      </listeners>
     </plugin>
 
     <!--

Modified: avalon/trunk/planet/tutorials/dynamics/build.xml
==============================================================================
--- avalon/trunk/planet/tutorials/dynamics/build.xml	(original)
+++ avalon/trunk/planet/tutorials/dynamics/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-tutorial-dynamics" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools" >
+    xmlns:x="antlib:org.apache.avalon.tools">
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
@@ -12,14 +11,6 @@
        token="DYNAMICS-SPEC"/>
     <x:filter key="avalon-framework-impl" feature="uri" 
        token="FRAMEWORK-IMPL-SPEC"/>
-  </target>
-
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/target/build/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
   </target>
 
 </project>

Modified: avalon/trunk/planet/tutorials/hello/build.xml
==============================================================================
--- avalon/trunk/planet/tutorials/hello/build.xml	(original)
+++ avalon/trunk/planet/tutorials/hello/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,19 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-tutorial-hello" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools" >
+    xmlns:x="antlib:org.apache.avalon.tools">
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
-
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/target/build/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
-  </target>
 
 </project>
 

Added: avalon/trunk/runtime/meta/tools/src/java/org/apache/avalon/meta/info/ant/MetaBuildListener.java
==============================================================================
--- (empty file)
+++ avalon/trunk/runtime/meta/tools/src/java/org/apache/avalon/meta/info/ant/MetaBuildListener.java	Thu Jun 17 11:56:18 2004
@@ -0,0 +1,193 @@
+/* 
+ * 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.meta.info.ant;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.FileSet;
+
+/**
+ * An abstract build listener. 
+ *
+ * @author <a href="mailto:[email protected]">Avalon Development Team</a>
+ * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
+ */
+public class MetaBuildListener implements BuildListener
+{
+    private static final String PREPARE_TASK_KEY = 
+      "antlib:org.apache.avalon.tools:prepare";
+
+    private static final String META_TASK_KEY = 
+      "plugin:avalon/meta/avalon-meta-tools:meta";
+
+    private final String m_uri;
+
+    private boolean m_flag = false;
+
+    public MetaBuildListener( String uri )
+    {
+        m_uri = uri;
+    }
+
+    /**
+     * Signals that a build has started. This event
+     * is fired before any targets have started.
+     *
+     * @param event An event with any relevant extra information.
+     *              Must not be <code>null</code>.
+     */
+    public void buildStarted(BuildEvent event)
+    {
+        // will not happen
+    }
+
+    /**
+     * Signals that the last target has finished. This event
+     * will still be fired if an error occurred during the build.
+     *
+     * @param event An event with any relevant extra information.
+     *              Must not be <code>null</code>.
+     *
+     * @see BuildEvent#getException()
+     */
+    public void buildFinished(BuildEvent event)
+    {
+    }
+
+    /**
+     * Signals that a target is starting.
+     *
+     * @param event An event with any relevant extra information.
+     *              Must not be <code>null</code>.
+     *
+     * @see BuildEvent#getTarget()
+     */
+    public void targetStarted(BuildEvent event)
+    {
+    }
+
+    /**
+     * Signals that a target has finished. This event will
+     * still be fired if an error occurred during the build.
+     *
+     * @param event An event with any relevant extra information.
+     *              Must not be <code>null</code>.
+     *
+     * @see BuildEvent#getException()
+     */
+    public void targetFinished(BuildEvent event)
+    {
+    }
+
+    /**
+     * Signals that a task is starting.
+     *
+     * @param event An event with any relevant extra information.
+     *              Must not be <code>null</code>.
+     *
+     * @see BuildEvent#getTask()
+     */
+    public void taskStarted(BuildEvent event)
+    {
+    }
+
+    /**
+     * Signals that a task has finished. This event will still
+     * be fired if an error occurred during the build.
+     *
+     * @param event An event with any relevant extra information.
+     *              Must not be <code>null</code>.
+     *
+     * @see BuildEvent#getException()
+     */
+    public void taskFinished(BuildEvent event)
+    {
+        if( m_flag ) return;
+
+        String type = event.getTask().getTaskType();
+        if( PREPARE_TASK_KEY.equals( type ) )
+        {
+            Project project = event.getProject();
+            generateForMain( project );
+            generateForTest( project );
+            m_flag = true;
+        }
+    }
+
+    private void generateForMain( Project project )
+    {
+        File basedir = project.getBaseDir();
+        File main = new File( basedir, "target/build/main" );
+        if( main.exists() )
+        {
+            File classes = new File( basedir, "target/classes" );
+            classes.mkdirs();
+            MetaTask meta = createMetaTask( project );
+            meta.setDestDir( classes );
+            FileSet fileset = new FileSet();
+            fileset.setDir( main );
+            fileset.setIncludes( "**/*.java" );
+            meta.addConfigured( fileset );
+            meta.execute();
+        }
+    }
+
+    private void generateForTest( Project project )
+    {
+        File basedir = project.getBaseDir();
+        File test = new File( basedir, "target/build/test" );
+        if( test.exists() )
+        {
+            File classes = new File( basedir, "target/test/classes" );
+            classes.mkdirs();
+            MetaTask meta = createMetaTask( project );
+            meta.setDestDir( classes );
+            FileSet fileset = new FileSet();
+            fileset.setDir( test );
+            fileset.setIncludes( "**/*.java" );
+            meta.addConfigured( fileset );
+            meta.execute();
+        }
+    }
+
+
+    private MetaTask createMetaTask( Project project )
+    {
+        MetaTask meta = new MetaTask();
+        meta.setProject( project );
+        meta.setTaskName( "meta" );
+        meta.init();
+        return meta;
+    }
+
+    /**
+     * Signals a message logging event.
+     *
+     * @param event An event with any relevant extra information.
+     *              Must not be <code>null</code>.
+     *
+     * @see BuildEvent#getMessage()
+     * @see BuildEvent#getPriority()
+     */
+    public void messageLogged(BuildEvent event)
+    {
+    }   
+}

Modified: avalon/trunk/runtime/meta/tools/src/java/org/apache/avalon/meta/info/ant/MetaTask.java
==============================================================================
--- avalon/trunk/runtime/meta/tools/src/java/org/apache/avalon/meta/info/ant/MetaTask.java	(original)
+++ avalon/trunk/runtime/meta/tools/src/java/org/apache/avalon/meta/info/ant/MetaTask.java	Thu Jun 17 11:56:18 2004
@@ -77,7 +77,7 @@
     /**
      * A utility object that writes out a service as serialized object files.
      */
-    private static final ServiceWriter SERIAL_SERVICE_WRITER = new SerializedServiceWriter();
+    private static final ServiceWriter SERIAL_SERVICE_WRITER = new SerializedServiceWriter();
 
     /**
      * The destination directory for metadata files.

Modified: avalon/trunk/runtime/test/components/build.xml
==============================================================================
--- avalon/trunk/runtime/test/components/build.xml	(original)
+++ avalon/trunk/runtime/test/components/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,18 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-test-components" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools" >
+    xmlns:x="antlib:org.apache.avalon.tools">
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
-
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/src/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
-  </target>
 
 </project>

Modified: avalon/trunk/runtime/test/dynamics/build.xml
==============================================================================
--- avalon/trunk/runtime/test/dynamics/build.xml	(original)
+++ avalon/trunk/runtime/test/dynamics/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,18 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-test-dynamics" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools">
+    xmlns:x="antlib:org.apache.avalon.tools">
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
-
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/src/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
-  </target>
 
 </project>

Modified: avalon/trunk/runtime/test/playground/build.xml
==============================================================================
--- avalon/trunk/runtime/test/playground/build.xml	(original)
+++ avalon/trunk/runtime/test/playground/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-test-playground" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools">
+    xmlns:x="antlib:org.apache.avalon.tools">
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
@@ -12,14 +11,6 @@
        token="FRAMEWORK-IMPL-SPEC"/>
     <x:filter key="avalon-test-playground" feature="uri" 
        token="PLAYGROUND-SPEC"/>
-  </target>
-
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/src/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
   </target>
 
 </project>

Modified: avalon/trunk/runtime/test/testa/build.xml
==============================================================================
--- avalon/trunk/runtime/test/testa/build.xml	(original)
+++ avalon/trunk/runtime/test/testa/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,18 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-test-testa" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools">
+    xmlns:x="antlib:org.apache.avalon.tools" >
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
-
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/src/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
-  </target>
 
 </project>

Modified: avalon/trunk/runtime/test/testb/build.xml
==============================================================================
--- avalon/trunk/runtime/test/testb/build.xml	(original)
+++ avalon/trunk/runtime/test/testb/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,18 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-test-testb" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools">
+    xmlns:x="antlib:org.apache.avalon.tools" >
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
 
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/src/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
-  </target>
 
 </project>

Modified: avalon/trunk/runtime/test/testc/build.xml
==============================================================================
--- avalon/trunk/runtime/test/testc/build.xml	(original)
+++ avalon/trunk/runtime/test/testc/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,18 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-test-testc" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools">
+    xmlns:x="antlib:org.apache.avalon.tools">
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
-
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/src/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
-  </target>
 
 </project>

Modified: avalon/trunk/runtime/test/testd/build.xml
==============================================================================
--- avalon/trunk/runtime/test/testd/build.xml	(original)
+++ avalon/trunk/runtime/test/testd/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,18 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-test-testd" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools">
+    xmlns:x="antlib:org.apache.avalon.tools" >
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
-
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/src/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
-  </target>
 
 </project>

Modified: avalon/trunk/runtime/test/teste/build.xml
==============================================================================
--- avalon/trunk/runtime/test/teste/build.xml	(original)
+++ avalon/trunk/runtime/test/teste/build.xml	Thu Jun 17 11:56:18 2004
@@ -1,18 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <project name="avalon-test-teste" default="dist" basedir="." 
-    xmlns:x="antlib:org.apache.avalon.tools"
-    xmlns:m="plugin:avalon/meta/avalon-meta-tools">
+    xmlns:x="antlib:org.apache.avalon.tools" >
 
   <property file="build.properties"/>
   <import file="${project.home}/build/standard.xml"/>
-
-  <target name="build" depends="standard.build">
-    <m:meta destDir="${basedir}/target/classes">
-      <fileset dir="${basedir}/src/main">
-        <include name="**/*.java"/>
-      </fileset>
-    </m:meta>
-  </target>
 
 </project>

Modified: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/antlib.xml
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/antlib.xml	(original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/antlib.xml	Thu Jun 17 11:56:18 2004
@@ -6,6 +6,7 @@
 
   <taskdef name="clean" classname="org.apache.avalon.tools.tasks.CleanTask"/> 
   <taskdef name="prepare" classname="org.apache.avalon.tools.tasks.PrepareTask"/> 
+  <taskdef name="init" classname="org.apache.avalon.tools.tasks.InitializeTask"/> 
   <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"/>

Modified: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/project/Plugin.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/project/Plugin.java	(original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/project/Plugin.java	Thu Jun 17 11:56:18 2004
@@ -30,14 +30,16 @@
 public class Plugin extends Definition
 {
     private final TaskDef[] m_tasks;
+    private final ListenerDef[] m_listeners;
 
     public Plugin(
       Home home, String key, File basedir, Info info, 
       ResourceRef[] resources, ResourceRef[] plugins, 
-      TaskDef[] tasks )
+      TaskDef[] tasks, ListenerDef[] listeners )
     {
         super( home, key, basedir, info, resources, plugins );
         m_tasks = tasks;
+        m_listeners = listeners;
     }
 
     public TaskDef[] getTaskDefs()
@@ -45,6 +47,11 @@
         return m_tasks;
     }
 
+    public ListenerDef[] getListenerDefs()
+    {
+        return m_listeners;
+    }
+
     public boolean equals( Object other )
     {
         if( super.equals( other ) && ( other instanceof Plugin ))
@@ -54,25 +61,44 @@
         return false;
     }
 
-    public static class TaskDef
+    public static class AbstractDef
     {
-        private String m_name;
         private String m_classname;
         
+        public AbstractDef( String classname )
+        {
+            m_classname = classname;
+        }
+
+        public String getClassname()
+        {
+            return m_classname;
+        }
+    }
+
+
+    public static class TaskDef extends AbstractDef
+    {
+        private String m_name;
+        
         public TaskDef( String name, String classname )
         {
+            super( classname );
             m_name = name;
-            m_classname = classname;
         }
 
         public String getName()
         {
             return m_name;
         }
+    }
 
-        public String getClassname()
+    public static class ListenerDef extends AbstractDef
+    {
+        public ListenerDef( String classname )
         {
-            return m_classname;
+            super( classname );
         }
     }
+
 }

Modified: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/project/builder/XMLDefinitionBuilder.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/project/builder/XMLDefinitionBuilder.java	(original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/project/builder/XMLDefinitionBuilder.java	Thu Jun 17 11:56:18 2004
@@ -29,12 +29,11 @@
 import org.apache.avalon.tools.util.ElementHelper;
 import org.apache.avalon.tools.project.Info;
 import org.apache.avalon.tools.project.Definition;
-//import org.apache.avalon.tools.project.ProjectRef;
 import org.apache.avalon.tools.project.ResourceRef;
 import org.apache.avalon.tools.project.Resource;
-//import org.apache.avalon.tools.project.PluginRef;
 import org.apache.avalon.tools.project.Plugin;
 import org.apache.avalon.tools.project.Plugin.TaskDef;
+import org.apache.avalon.tools.project.Plugin.ListenerDef;
 import org.apache.avalon.tools.project.Policy;
 
 import org.w3c.dom.Element;
@@ -83,8 +82,10 @@
         {
             TaskDef[] tasks = 
               getTaskDefs( ElementHelper.getChild( element, "tasks" ) );
+            ListenerDef[] listeners = 
+              getListenerDefs( ElementHelper.getChild( element, "listeners" ) );
             return new Plugin( 
-              home, key, basedir, info, resources, plugins, tasks );
+              home, key, basedir, info, resources, plugins, tasks, listeners );
         }
         else
         {
@@ -92,6 +93,19 @@
               "Unrecognized project type \"" + tag + "\".";
             throw new BuildException( error );
         }
+    }
+
+    public static ListenerDef[] getListenerDefs( Element element )
+    {
+        Element[] children = ElementHelper.getChildren( element, "listener" );
+        ListenerDef[] listeners = new ListenerDef[ children.length ];
+        for( int i=0; i<children.length; i++ )
+        {
+            Element child = children[i];
+            ListenerDef listener = new ListenerDef( child.getAttribute( "class" ) );
+            listeners[i] = listener;
+        }
+        return listeners;
     }
 
     public static TaskDef[] getTaskDefs( Element element )

Modified: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/DeclareTask.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/DeclareTask.java	(original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/DeclareTask.java	Thu Jun 17 11:56:18 2004
@@ -38,6 +38,7 @@
 import org.apache.avalon.tools.project.Policy;
 import org.apache.avalon.tools.project.Plugin;
 import org.apache.avalon.tools.project.Plugin.TaskDef;
+import org.apache.avalon.tools.project.Plugin.ListenerDef;
 
 /**
  * Load a plugin.
@@ -131,6 +132,7 @@
         {
             Plugin plugin = (Plugin) def;
             writeTaskDefs( writer, plugin );
+            writeListenerDefs( writer, plugin );
         }
         writeClasspath( writer, def );
         writer.write( "\n</plugin>\n" );
@@ -153,6 +155,23 @@
               + "\"/>" );
         }
         writer.write( "\n  </tasks>" );
+    }
+
+    private void writeListenerDefs( final Writer writer, final Plugin plugin )
+        throws IOException
+    {
+        writer.write( "\n  " );
+        writer.write( "<listeners>" );
+        ListenerDef[] defs = plugin.getListenerDefs();
+        for( int i=0; i<defs.length; i++ )
+        {
+            ListenerDef def = defs[i];
+            writer.write( 
+              "\n    <listener class=\""
+              + def.getClassname() 
+              + "\"/>" );
+        }
+        writer.write( "\n  </listeners>" );
     }
 
     private void writeInfo( final Writer writer, final Info info )

Added: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/InitializeTask.java
==============================================================================
--- (empty file)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/InitializeTask.java	Thu Jun 17 11:56:18 2004
@@ -0,0 +1,72 @@
+/* 
+ * 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 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.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.Context;
+import org.apache.avalon.tools.project.Definition;
+import org.apache.avalon.tools.project.ResourceRef;
+import org.apache.avalon.tools.project.Plugin;
+
+/**
+ * The initialize task loads and plugins that a project
+ * has declared under the &lt;plugins&gt; element. 
+ *
+ * @author <a href="mailto:[email protected]">Avalon Development Team</a>
+ * @version $Revision: 1.2 $ $Date: 2004/03/17 10:30:09 $
+ */
+public class InitializeTask extends SystemTask
+{
+    public void execute() throws BuildException 
+    {
+        Project project = getProject();
+
+        //
+        // if the project declares plugin dependencies then install
+        // these now
+        //
+
+        String key = getContext().getKey();
+        Definition def = getHome().getDefinition( key );
+        ResourceRef[] refs = def.getPluginRefs();
+        for( int i=0; i<refs.length; i++ )
+        {
+            ResourceRef ref = refs[i];
+            Plugin plugin = getHome().getPlugin( ref );
+            String path = "plugin:" + plugin.getInfo().getSpec();
+            PluginTask task = new PluginTask();
+            task.setTaskName( "plugin" );
+            task.setProject( project );
+            task.setArtifact( path );
+            task.init();
+            task.execute();
+        }
+    }
+}

Modified: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/PluginTask.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/PluginTask.java	(original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/PluginTask.java	Thu Jun 17 11:56:18 2004
@@ -20,6 +20,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
+import java.lang.reflect.Constructor;
 
 import org.apache.tools.ant.AntClassLoader;
 import org.apache.tools.ant.Task;
@@ -30,6 +31,7 @@
 import org.apache.tools.ant.taskdefs.Antlib;
 import org.apache.tools.ant.helper.ProjectHelper2;
 import org.apache.tools.ant.UnknownElement;
+import org.apache.tools.ant.BuildListener;
 
 import org.apache.avalon.tools.home.Home;
 import org.apache.avalon.tools.home.Context;
@@ -38,6 +40,7 @@
 import org.apache.avalon.tools.project.Resource;
 import org.apache.avalon.tools.project.Plugin;
 import org.apache.avalon.tools.project.Plugin.TaskDef;
+import org.apache.avalon.tools.project.Plugin.ListenerDef;
 import org.apache.avalon.tools.project.builder.XMLDefinitionBuilder;
 import org.apache.avalon.tools.util.ElementHelper;
 
@@ -113,6 +116,105 @@
                 helper.addTaskDefinition( name, taskClass );
                 log( "Task \"" + name + "\"" );
             }
+
+            //
+            // register plugins that declare themselves as build listeners
+            //
+
+            ListenerDef[] listeners = data.getListenerDefs();
+            for( int i=0; i<listeners.length; i++ )
+            {
+                ListenerDef def = listeners[i];
+                Class listenerClass = classloader.loadClass( def.getClassname() );
+                BuildListener listener = createBuildListener( listenerClass, data, uri );
+                getProject().addBuildListener( listener );
+            }
+        }
+        catch( Throwable e )
+        {
+            throw new BuildException( e );
+        }
+    }
+
+   /**
+    * Create a build listerer using a supplied class.  The implementation
+    * checks the first available constructor arguments and builds a set of 
+    * arguments based on the arguments supplied to this task.
+    *
+    * @param clazz the listener class
+    * @return a instance of the class
+    * @exception BuildException if the class does not expose a public 
+    *    constructor, or the constructor requires arguments that the 
+    *    method cannot resolve, or if a unexpected instantiation error 
+    *    ooccurs
+    */ 
+    public BuildListener createBuildListener( Class clazz, AntLibData data, String uri ) 
+      throws BuildException
+    {
+        if( !BuildListener.class.isAssignableFrom( clazz ) )
+        {
+            final String error = 
+              "Listener class [" + clazz.getName() 
+              + "] declared within the plugin ["
+              + uri
+              + "] does not implement BuildListener.";
+            throw new BuildException( error );
+        }
+
+        Constructor[] constructors = clazz.getConstructors();
+        if( constructors.length < 1 ) 
+        {
+            final String error = 
+              "Cannot handle listeners classes with more than one public constructor.";
+            throw new BuildException( error );
+        }
+
+        Constructor constructor = constructors[0];
+        Class[] classes = constructor.getParameterTypes();
+        Object[] args = new Object[ classes.length ];
+        for( int i=0; i<classes.length; i++ )
+        {
+            Class c = classes[i];
+            if( AntLibData.class.isAssignableFrom( c ) )
+            {
+                args[i] = data;
+            }
+            else if( String.class.isAssignableFrom( c ) )
+            {
+                args[i] = uri;
+            }
+            else
+            {
+                final String error = 
+                  "Unrecognized constructor parameter: " + c.getName();
+                throw new BuildException( error );
+            }
+        }
+
+        //
+        // instantiate the factory
+        //
+
+        return instantiateBuildListener( constructor, args );
+    }
+
+   /**
+    * Instantiation of a listener instance using a supplied constructor 
+    * and arguments.
+    * 
+    * @param constructor the class constructor
+    * @param args the constructor arguments
+    * @return the listener instance
+    * @exception BuildException if an instantiation error occurs
+    */
+    private BuildListener instantiateBuildListener( 
+      Constructor constructor, Object[] args ) 
+      throws BuildException
+    {
+        Class clazz = constructor.getDeclaringClass();
+        try
+        {
+            return (BuildListener) constructor.newInstance( args );
         }
         catch( Throwable e )
         {
@@ -125,6 +227,7 @@
         private final Info m_info;
         private final Path m_path = new Path( project );
         private final TaskDef[] m_tasks;
+        private final ListenerDef[] m_listeners;
 
         public AntLibData( Home home, Project project, File file ) throws Exception
         {
@@ -133,6 +236,8 @@
             m_info = XMLDefinitionBuilder.createInfo( infoElement );
             Element tasksElement = ElementHelper.getChild( root, "tasks" );
             m_tasks = XMLDefinitionBuilder.getTaskDefs( tasksElement );
+            Element listenerElement = ElementHelper.getChild( root, "listeners" );
+            m_listeners = XMLDefinitionBuilder.getListenerDefs( listenerElement );
 
             Element classpathElement = ElementHelper.getChild( root, "classpath" );
             Element[] children = ElementHelper.getChildren( classpathElement );
@@ -144,8 +249,6 @@
                 Info info = Info.create( type, value );
                 Resource resource = new Resource( home, info );
                 File jar = resource.getArtifact( project );
-                //File jar = 
-                //  getHome().getRepository().getResource( project, resource );
                 m_path.createPathElement().setLocation( jar );
             }
         }
@@ -158,6 +261,11 @@
         public TaskDef[] getTaskDefs()
         {
             return m_tasks;
+        }
+
+        public ListenerDef[] getListenerDefs()
+        {
+            return m_listeners;
         }
 
         public Path getPath()

Modified: avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/PrepareTask.java
==============================================================================
--- avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/PrepareTask.java	(original)
+++ avalon/trunk/tools/magic/src/main/org/apache/avalon/tools/tasks/PrepareTask.java	Thu Jun 17 11:56:18 2004
@@ -78,27 +78,6 @@
         Project project = getProject();
 
         //
-        // if the project declares plugin dependencies then install
-        // these now
-        //
-
-        String key = getContext().getKey();
-        Definition def = getHome().getDefinition( key );
-        ResourceRef[] refs = def.getPluginRefs();
-        for( int i=0; i<refs.length; i++ )
-        {
-            ResourceRef ref = refs[i];
-            Plugin plugin = getHome().getPlugin( ref );
-            String path = "plugin:" + plugin.getInfo().getSpec();
-            PluginTask task = new PluginTask();
-            task.setTaskName( "plugin" );
-            task.setProject( project );
-            task.setArtifact( path );
-            task.init();
-            task.execute();
-        }
-
-        //
         // setup the file system
         //
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.