From 403768d1334c36d21f163abcff4b7e3d449fc201 Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Sat, 16 Jun 2001 03:22:21 +0000 Subject: [PATCH] Move Ant1 compatibility layer files into separate library. 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-ffa450edef68 --- .../myrmidon/libs/ant1/Ant1Project.java | 153 ++++++++++++++++++ .../myrmidon/libs/ant1/Ant1Tasklib.java | 92 +++++++++++ .../myrmidon/libs/ant1/Ant1TypeFactory.java | 57 +++++++ .../myrmidon/libs/ant1/TaskAdapter.java | 76 +++++++++ 4 files changed, 378 insertions(+) create mode 100644 proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Project.java create mode 100644 proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Tasklib.java create mode 100644 proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1TypeFactory.java create mode 100644 proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/TaskAdapter.java diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Project.java b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Project.java new file mode 100644 index 000000000..bfb9e0126 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Project.java @@ -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 ); + } + } +} diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Tasklib.java b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Tasklib.java new file mode 100644 index 000000000..18b2dbeb6 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1Tasklib.java @@ -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 Peter Donald + */ +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 ); + } + } +} diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1TypeFactory.java b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1TypeFactory.java new file mode 100644 index 000000000..c8537ae27 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/Ant1TypeFactory.java @@ -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 Peter Donald + */ +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 ); + } +} + diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/TaskAdapter.java b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/TaskAdapter.java new file mode 100644 index 000000000..b73dd5ac8 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/libs/ant1/TaskAdapter.java @@ -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 Peter Donald + */ +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 ); + } + } +}