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 <plugins> 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