Also create a task to actually load the task definitions from Ant1 jar. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269178 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,153 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE file. | |||
| */ | |||
| package org.apache.myrmidon.libs.ant1; | |||
| import java.io.File; | |||
| import org.apache.avalon.framework.context.Context; | |||
| import org.apache.avalon.framework.context.Contextualizable; | |||
| import org.apache.avalon.framework.logger.Loggable; | |||
| import org.apache.log.Logger; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.tools.ant.*; | |||
| import org.apache.tools.ant.Project; | |||
| public class Ant1Project | |||
| extends Project | |||
| implements Loggable, Contextualizable | |||
| { | |||
| private Logger m_logger; | |||
| ///Variable to hold context for use by sub-classes | |||
| private TaskContext m_context; | |||
| public void setLogger( final Logger logger ) | |||
| { | |||
| m_logger = logger; | |||
| } | |||
| protected final Logger getLogger() | |||
| { | |||
| return m_logger; | |||
| } | |||
| /** | |||
| * Retrieve context from container. | |||
| * | |||
| * @param context the context | |||
| */ | |||
| public void contextualize( final Context context ) | |||
| { | |||
| m_context = (TaskContext)context; | |||
| } | |||
| protected final TaskContext getContext() | |||
| { | |||
| return m_context; | |||
| } | |||
| /** | |||
| * Initialise the project. | |||
| */ | |||
| public void init() | |||
| throws BuildException | |||
| { | |||
| setJavaVersionProperty(); | |||
| } | |||
| public void setProperty( final String name, final String value ) | |||
| { | |||
| try { getContext().setProperty( name, value ); } | |||
| catch( final Exception e ) | |||
| { | |||
| getLogger().warn( "Failed to set property " + name + " to " + value, e ); | |||
| } | |||
| } | |||
| public void setUserProperty( final String name, final String value ) | |||
| { | |||
| setProperty( name, value ); | |||
| } | |||
| public String getProperty( final String name ) | |||
| { | |||
| return "" + getContext().getProperty( name ); | |||
| } | |||
| public String getUserProperty( final String name ) | |||
| { | |||
| return getProperty( name ); | |||
| } | |||
| public String getName() | |||
| { | |||
| return "Ant1 Project"; | |||
| } | |||
| public Task createTask( final String taskType ) | |||
| throws BuildException | |||
| { | |||
| throw new UnsupportedOperationException(); | |||
| } | |||
| public Object createDataType( final String typeName ) | |||
| throws BuildException | |||
| { | |||
| throw new UnsupportedOperationException(); | |||
| } | |||
| public File resolveFile( final String fileName ) | |||
| { | |||
| try { return getContext().resolveFile( fileName ); } | |||
| catch( final Exception e ) | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| protected void fireBuildStarted() {} | |||
| protected void fireBuildFinished(Throwable exception) {} | |||
| protected void fireTargetStarted(Target target) {} | |||
| protected void fireTargetFinished(Target target, Throwable exception) {} | |||
| protected void fireTaskStarted(Task task) {} | |||
| protected void fireTaskFinished(Task task, Throwable exception) {} | |||
| private void fireMessageLoggedEvent(BuildEvent event, String message, int priority) | |||
| { | |||
| messageLogged( message, priority ); | |||
| } | |||
| protected void fireMessageLogged(Project project, String message, int priority) | |||
| { | |||
| messageLogged( message, priority ); | |||
| } | |||
| protected void fireMessageLogged(Target target, String message, int priority) | |||
| { | |||
| messageLogged( message, priority ); | |||
| } | |||
| protected void fireMessageLogged(Task task, String message, int priority) | |||
| { | |||
| messageLogged( message, priority ); | |||
| } | |||
| private void messageLogged( String message, int priority ) | |||
| { | |||
| switch( priority ) | |||
| { | |||
| case MSG_ERR: getLogger().error( message ); break; | |||
| case MSG_WARN: getLogger().warn( message ); break; | |||
| case MSG_INFO: getLogger().info( message ); break; | |||
| case MSG_VERBOSE: getLogger().debug( message ); break; | |||
| case MSG_DEBUG: getLogger().debug( message ); break; | |||
| default: | |||
| getLogger().debug( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,92 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE file. | |||
| */ | |||
| package org.apache.myrmidon.libs.ant1; | |||
| import java.io.File; | |||
| import java.io.InputStream; | |||
| import java.io.IOException; | |||
| import java.net.URL; | |||
| import java.util.Enumeration; | |||
| import java.util.Properties; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.api.Task; | |||
| import org.apache.avalon.framework.component.ComponentException; | |||
| import org.apache.avalon.framework.component.ComponentManager; | |||
| import org.apache.avalon.framework.component.Composable; | |||
| import org.apache.myrmidon.components.type.TypeManager; | |||
| /** | |||
| * Method to register a tasklib. | |||
| * | |||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||
| */ | |||
| public class Ant1Tasklib | |||
| extends AbstractTask | |||
| implements Composable | |||
| { | |||
| private String m_prefix = ""; | |||
| private File m_lib; | |||
| private TypeManager m_typeManager; | |||
| public void compose( final ComponentManager componentManager ) | |||
| throws ComponentException | |||
| { | |||
| m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE ); | |||
| } | |||
| public void setLib( final File lib ) | |||
| { | |||
| m_lib = lib; | |||
| } | |||
| public void setPrefix( final String prefix ) | |||
| { | |||
| m_prefix = prefix; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_lib ) | |||
| { | |||
| throw new TaskException( "Must specify lib parameter" ); | |||
| } | |||
| try | |||
| { | |||
| final String location = "jar:" + m_lib.toURL() + | |||
| "!/org/apache/tools/ant/taskdefs/defaults.properties"; | |||
| final URL url = new URL( location ); | |||
| final InputStream input = url.openStream(); | |||
| final Properties tasks = new Properties(); | |||
| tasks.load( input ); | |||
| input.close(); | |||
| final Ant1TypeFactory factory = new Ant1TypeFactory( m_lib.toURL() ); | |||
| final Enumeration enum = tasks.propertyNames(); | |||
| while( enum.hasMoreElements() ) | |||
| { | |||
| final String rawName = (String)enum.nextElement(); | |||
| final String className = tasks.getProperty( rawName ); | |||
| final String name = m_prefix + rawName; | |||
| factory.addNameClassMapping( name, className ); | |||
| m_typeManager.registerType( Task.ROLE, name, factory ); | |||
| } | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| throw new TaskException( "Failed to load task definitions", e ); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,57 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE file. | |||
| */ | |||
| package org.apache.myrmidon.libs.ant1; | |||
| import java.net.URL; | |||
| import org.apache.myrmidon.components.type.DefaultTypeFactory; | |||
| import org.apache.myrmidon.components.type.TypeException; | |||
| import org.apache.tools.ant.Task; | |||
| /** | |||
| * Factory used to create adaptors for Ant1 tasks. | |||
| * | |||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||
| */ | |||
| public class Ant1TypeFactory | |||
| extends DefaultTypeFactory | |||
| { | |||
| public Ant1TypeFactory( final URL url ) | |||
| { | |||
| super( url ); | |||
| } | |||
| public Ant1TypeFactory( final URL[] urls ) | |||
| { | |||
| super( urls ); | |||
| } | |||
| public Ant1TypeFactory( final URL[] urls, final ClassLoader parent ) | |||
| { | |||
| super( urls, parent ); | |||
| } | |||
| public Ant1TypeFactory( final ClassLoader classLoader ) | |||
| { | |||
| super( classLoader ); | |||
| } | |||
| public Object create( final String name ) | |||
| throws TypeException | |||
| { | |||
| final Object object = super.create( name ); | |||
| if( !(object instanceof Task) ) | |||
| { | |||
| throw new TypeException( "Expected an Ant1 task but received an " + | |||
| "object of type : " + object.getClass().getName() ); | |||
| } | |||
| return new TaskAdapter( (Task)object ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,76 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE file. | |||
| */ | |||
| package org.apache.myrmidon.libs.ant1; | |||
| import org.apache.avalon.framework.configuration.Configurable; | |||
| import org.apache.avalon.framework.configuration.Configuration; | |||
| import org.apache.avalon.framework.configuration.ConfigurationException; | |||
| import org.apache.myrmidon.api.DataType; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.components.type.TypeException; | |||
| import org.apache.myrmidon.components.type.TypeFactory; | |||
| import org.apache.myrmidon.components.type.TypeManager; | |||
| import org.apache.myrmidon.framework.AbstractContainerTask; | |||
| import org.apache.tools.ant.Task; | |||
| /** | |||
| * Adapter of Ant1 tasks to ant2. | |||
| * | |||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||
| */ | |||
| public class TaskAdapter | |||
| extends AbstractContainerTask | |||
| implements Configurable | |||
| { | |||
| private Task m_ant1Task; | |||
| private Ant1Project m_project = new Ant1Project(); | |||
| public TaskAdapter( final Task ant1Task ) | |||
| { | |||
| m_ant1Task = ant1Task; | |||
| } | |||
| protected final Task getTask() | |||
| { | |||
| return m_ant1Task; | |||
| } | |||
| protected final Ant1Project getProject() | |||
| { | |||
| return m_project; | |||
| } | |||
| public void configure( final Configuration configuration ) | |||
| throws ConfigurationException | |||
| { | |||
| getTask().setTaskName( configuration.getName() ); | |||
| //do configuration | |||
| configure( getTask(), configuration ); | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| try | |||
| { | |||
| getProject().setLogger( getLogger() ); | |||
| getProject().contextualize( getContext() ); | |||
| getProject().init(); | |||
| getTask().setProject( getProject() ); | |||
| getTask().init(); | |||
| getTask().execute(); | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| throw new TaskException( e.getMessage(), e ); | |||
| } | |||
| } | |||
| } | |||