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/17 20:56:20 UTC

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

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:dev@avalon.apache.org">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:dev@avalon.apache.org">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
         //
 

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