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 ); | |||||
| } | |||||
| } | |||||
| } | |||||