git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268337 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -165,10 +165,8 @@ Legal: | |||||
| --> | --> | ||||
| <mkdir dir="${build.classes}/TASK-LIB"/> | <mkdir dir="${build.classes}/TASK-LIB"/> | ||||
| <copy file="${build.src}/org/apache/ant/tasks/core/taskdefs.properties" | |||||
| todir="${build.classes}/TASK-LIB"/> | |||||
| <copy file="${build.src}/org/apache/ant/convert/core/converters.properties" | |||||
| todir="${build.classes}/TASK-LIB"/> | |||||
| <copy file="${manifest.dir}/taskdefs.xml" todir="${build.classes}/TASK-LIB"/> | |||||
| </target> | </target> | ||||
| <!-- | <!-- | ||||
| @@ -5,10 +5,8 @@ | |||||
| * version 1.1, a copy of which has been included with this distribution in | * version 1.1, a copy of which has been included with this distribution in | ||||
| * the LICENSE file. | * the LICENSE file. | ||||
| */ | */ | ||||
| package org.apache.ant.tasklet.engine; | |||||
| package org.apache.ant.configuration; | |||||
| import org.apache.ant.configuration.Configuration; | |||||
| import org.apache.ant.tasklet.Tasklet; | |||||
| import org.apache.avalon.Component; | import org.apache.avalon.Component; | ||||
| import org.apache.avalon.ConfigurationException; | import org.apache.avalon.ConfigurationException; | ||||
| import org.apache.avalon.Context; | import org.apache.avalon.Context; | ||||
| @@ -18,19 +16,19 @@ import org.apache.avalon.Context; | |||||
| * | * | ||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | ||||
| */ | */ | ||||
| public interface TaskletConfigurer | |||||
| public interface Configurer | |||||
| extends Component | extends Component | ||||
| { | { | ||||
| /** | /** | ||||
| * Configure a task based on a configuration in a particular context. | |||||
| * Configure an object based on a configuration in a particular context. | |||||
| * This configuring can be done in different ways for different | * This configuring can be done in different ways for different | ||||
| * configurers. | * configurers. | ||||
| * | * | ||||
| * @param tasklet the tasklet | |||||
| * @param object the object | |||||
| * @param configuration the configuration | * @param configuration the configuration | ||||
| * @param context the Context | * @param context the Context | ||||
| * @exception ConfigurationException if an error occurs | * @exception ConfigurationException if an error occurs | ||||
| */ | */ | ||||
| void configure( Tasklet tasklet, Configuration configuration, Context context ) | |||||
| void configure( Object object, Configuration configuration, Context context ) | |||||
| throws ConfigurationException; | throws ConfigurationException; | ||||
| } | } | ||||
| @@ -5,17 +5,14 @@ | |||||
| * version 1.1, a copy of which has been included with this distribution in | * version 1.1, a copy of which has been included with this distribution in | ||||
| * the LICENSE file. | * the LICENSE file. | ||||
| */ | */ | ||||
| package org.apache.ant.tasklet.engine; | |||||
| package org.apache.ant.configuration; | |||||
| import java.lang.reflect.InvocationTargetException; | import java.lang.reflect.InvocationTargetException; | ||||
| import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.Iterator; | import java.util.Iterator; | ||||
| import org.apache.ant.configuration.Configurable; | |||||
| import org.apache.ant.configuration.Configuration; | |||||
| import org.apache.ant.convert.Converter; | import org.apache.ant.convert.Converter; | ||||
| import org.apache.ant.convert.ConverterException; | import org.apache.ant.convert.ConverterException; | ||||
| import org.apache.ant.tasklet.Tasklet; | |||||
| import org.apache.avalon.ComponentManager; | import org.apache.avalon.ComponentManager; | ||||
| import org.apache.avalon.ComponentNotAccessibleException; | import org.apache.avalon.ComponentNotAccessibleException; | ||||
| import org.apache.avalon.ComponentNotFoundException; | import org.apache.avalon.ComponentNotFoundException; | ||||
| @@ -30,8 +27,8 @@ import org.apache.avalon.util.PropertyUtil; | |||||
| * | * | ||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | ||||
| */ | */ | ||||
| public class DefaultTaskletConfigurer | |||||
| implements TaskletConfigurer, Composer | |||||
| public class DefaultConfigurer | |||||
| implements Configurer, Composer | |||||
| { | { | ||||
| protected final static String RESERVED_ATTRIBUTES[] = | protected final static String RESERVED_ATTRIBUTES[] = | ||||
| { | { | ||||
| @@ -51,27 +48,6 @@ public class DefaultTaskletConfigurer | |||||
| m_converter = (Converter)componentManager.lookup( "org.apache.ant.convert.Converter" ); | m_converter = (Converter)componentManager.lookup( "org.apache.ant.convert.Converter" ); | ||||
| } | } | ||||
| /** | |||||
| * Configure a task based on a configuration in a particular context. | |||||
| * This configuring can be done in different ways for different | |||||
| * configurers. | |||||
| * This one does it by first checking if object implements Configurable | |||||
| * and if it does will pass the task the configuration - else it will use | |||||
| * ants rules to map configuration to types | |||||
| * | |||||
| * @param tasklet the tasklet | |||||
| * @param configuration the configuration | |||||
| * @param context the Context | |||||
| * @exception ConfigurationException if an error occurs | |||||
| */ | |||||
| public void configure( final Tasklet tasklet, | |||||
| final Configuration configuration, | |||||
| final Context context ) | |||||
| throws ConfigurationException | |||||
| { | |||||
| configure( (Object)tasklet, configuration, context ); | |||||
| } | |||||
| /** | /** | ||||
| * Configure a task based on a configuration in a particular context. | * Configure a task based on a configuration in a particular context. | ||||
| * This configuring can be done in different ways for different | * This configuring can be done in different ways for different | ||||
| @@ -8,13 +8,13 @@ | |||||
| package org.apache.ant.convert; | package org.apache.ant.convert; | ||||
| import org.apache.avalon.Component; | import org.apache.avalon.Component; | ||||
| import org.apache.avalon.Loggable; | |||||
| import org.apache.avalon.camelot.LocatorRegistry; | |||||
| import org.apache.log.Logger; | import org.apache.log.Logger; | ||||
| public interface ConverterEngine | public interface ConverterEngine | ||||
| extends Component, Converter | |||||
| extends Component, Converter, Loggable | |||||
| { | { | ||||
| void setLogger( Logger logger ); | |||||
| LocatorRegistry getLocatorRegistry(); | |||||
| ConverterRegistry getConverterRegistry(); | ConverterRegistry getConverterRegistry(); | ||||
| ConverterFactory getConverterFactory(); | |||||
| } | } | ||||
| @@ -1,30 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.convert; | |||||
| import org.apache.avalon.camelot.Factory; | |||||
| import org.apache.avalon.camelot.FactoryException; | |||||
| /** | |||||
| * Facility used to load Converters. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public interface ConverterFactory | |||||
| extends Factory | |||||
| { | |||||
| /** | |||||
| * Create entries (ie instances) from infos (ie types). | |||||
| * | |||||
| * @param info the info | |||||
| * @return the entry | |||||
| * @exception FactoryException if an error occurs | |||||
| */ | |||||
| Converter createConverter( ConverterInfo info ) | |||||
| throws FactoryException; | |||||
| } | |||||
| @@ -7,7 +7,6 @@ | |||||
| */ | */ | ||||
| package org.apache.ant.convert; | package org.apache.ant.convert; | ||||
| import java.net.URL; | |||||
| import org.apache.avalon.camelot.Info; | import org.apache.avalon.camelot.Info; | ||||
| /** | /** | ||||
| @@ -33,19 +32,4 @@ public interface ConverterInfo | |||||
| * @return the classname of the produced object | * @return the classname of the produced object | ||||
| */ | */ | ||||
| String getDestination(); | String getDestination(); | ||||
| /** | |||||
| * Retrieve classname for concerter. | |||||
| * | |||||
| * @return the taskname | |||||
| */ | |||||
| String getClassname(); | |||||
| /** | |||||
| * Retrieve location of task library where task is contained. | |||||
| * | |||||
| * @return the location of task library | |||||
| */ | |||||
| URL getLocation(); | |||||
| } | } | ||||
| @@ -1,29 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.convert; | |||||
| import org.apache.avalon.camelot.Loader; | |||||
| /** | |||||
| * Class used to load converters et al from a source. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public interface ConverterLoader | |||||
| extends Loader | |||||
| { | |||||
| /** | |||||
| * Load a particular converter. | |||||
| * | |||||
| * @param converter the converter name | |||||
| * @return the loaded Converter | |||||
| * @exception Exception if an error occurs | |||||
| */ | |||||
| Converter loadConverter( String converter ) | |||||
| throws Exception; | |||||
| } | |||||
| @@ -17,11 +17,12 @@ public interface ConverterRegistry | |||||
| extends Registry | extends Registry | ||||
| { | { | ||||
| /** | /** | ||||
| * Retrieve ConverterInfo that describes converter that converts from source to destination. | |||||
| * Retrieve name of ConverterInfo that describes converter that converts | |||||
| * from source to destination. | |||||
| * | * | ||||
| * @param source the source classname | * @param source the source classname | ||||
| * @param destination the destination classname | * @param destination the destination classname | ||||
| * @return the converter-info or null if none available | * @return the converter-info or null if none available | ||||
| */ | */ | ||||
| ConverterInfo getConverterInfo( String source, String destination ); | |||||
| String getConverterInfoName( String source, String destination ); | |||||
| } | } | ||||
| @@ -10,12 +10,17 @@ package org.apache.ant.convert; | |||||
| import org.apache.ant.AntException; | import org.apache.ant.AntException; | ||||
| import org.apache.avalon.Component; | import org.apache.avalon.Component; | ||||
| import org.apache.avalon.Initializable; | import org.apache.avalon.Initializable; | ||||
| import org.apache.avalon.camelot.DefaultFactory; | |||||
| import org.apache.avalon.camelot.DefaultLocatorRegistry; | |||||
| import org.apache.avalon.camelot.Locator; | |||||
| import org.apache.avalon.camelot.LocatorRegistry; | |||||
| import org.apache.log.Logger; | import org.apache.log.Logger; | ||||
| public class DefaultConverterEngine | public class DefaultConverterEngine | ||||
| implements ConverterEngine, Initializable | implements ConverterEngine, Initializable | ||||
| { | { | ||||
| protected ConverterFactory m_converterFactory; | |||||
| protected DefaultFactory m_factory; | |||||
| protected LocatorRegistry m_locatorRegistry; | |||||
| protected ConverterRegistry m_converterRegistry; | protected ConverterRegistry m_converterRegistry; | ||||
| protected Logger m_logger; | protected Logger m_logger; | ||||
| @@ -24,21 +29,22 @@ public class DefaultConverterEngine | |||||
| m_logger = logger; | m_logger = logger; | ||||
| } | } | ||||
| public ConverterRegistry getConverterRegistry() | |||||
| public LocatorRegistry getLocatorRegistry() | |||||
| { | { | ||||
| return m_converterRegistry; | |||||
| return m_locatorRegistry; | |||||
| } | } | ||||
| public ConverterFactory getConverterFactory() | |||||
| public ConverterRegistry getConverterRegistry() | |||||
| { | { | ||||
| return m_converterFactory; | |||||
| return m_converterRegistry; | |||||
| } | } | ||||
| public void init() | public void init() | ||||
| throws Exception | throws Exception | ||||
| { | { | ||||
| m_converterRegistry = createConverterRegistry(); | m_converterRegistry = createConverterRegistry(); | ||||
| m_converterFactory = createConverterFactory(); | |||||
| m_locatorRegistry = createLocatorRegistry(); | |||||
| m_factory = createFactory(); | |||||
| } | } | ||||
| protected ConverterRegistry createConverterRegistry() | protected ConverterRegistry createConverterRegistry() | ||||
| @@ -46,26 +52,32 @@ public class DefaultConverterEngine | |||||
| return new DefaultConverterRegistry(); | return new DefaultConverterRegistry(); | ||||
| } | } | ||||
| protected ConverterFactory createConverterFactory() | |||||
| protected LocatorRegistry createLocatorRegistry() | |||||
| { | |||||
| return new DefaultLocatorRegistry(); | |||||
| } | |||||
| protected DefaultFactory createFactory() | |||||
| { | { | ||||
| return new DefaultConverterFactory(); | |||||
| return new DefaultFactory(); | |||||
| } | } | ||||
| public Object convert( Class destination, final Object original ) | public Object convert( Class destination, final Object original ) | ||||
| throws Exception | throws Exception | ||||
| { | { | ||||
| final ConverterInfo info = | |||||
| m_converterRegistry.getConverterInfo( original.getClass().getName(), | |||||
| destination.getName() ); | |||||
| final String name = | |||||
| m_converterRegistry.getConverterInfoName( original.getClass().getName(), | |||||
| destination.getName() ); | |||||
| if( null == info ) | |||||
| if( null == name ) | |||||
| { | { | ||||
| throw new ConverterException( "Unable to find converter for " + | throw new ConverterException( "Unable to find converter for " + | ||||
| original.getClass() + " to " + destination + | original.getClass() + " to " + destination + | ||||
| " conversion" ); | " conversion" ); | ||||
| } | } | ||||
| final Converter converter = m_converterFactory.createConverter( info ); | |||||
| final Locator locator = m_locatorRegistry.getLocator( name ); | |||||
| final Converter converter = (Converter)m_factory.create( locator, Converter.class ); | |||||
| return converter.convert( destination, original ); | return converter.convert( destination, original ); | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,98 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.convert; | |||||
| import java.net.URL; | |||||
| import java.net.URLClassLoader; | |||||
| import java.util.HashMap; | |||||
| import org.apache.ant.convert.Converter; | |||||
| import org.apache.avalon.camelot.Entry; | |||||
| import org.apache.avalon.camelot.Factory; | |||||
| import org.apache.avalon.camelot.Loader; | |||||
| import org.apache.avalon.camelot.FactoryException; | |||||
| import org.apache.avalon.camelot.Info; | |||||
| /** | |||||
| * Facility used to load Converters. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public class DefaultConverterFactory | |||||
| implements ConverterFactory | |||||
| { | |||||
| protected final HashMap m_loaders = new HashMap(); | |||||
| /** | |||||
| * Method for generic Factory. | |||||
| * | |||||
| * @param info generic info | |||||
| * @return the created entry | |||||
| * @exception FactoryException if an error occurs | |||||
| */ | |||||
| public Object create( final Info info ) | |||||
| throws FactoryException | |||||
| { | |||||
| if( info.getClass().equals( ConverterInfo.class ) ) | |||||
| { | |||||
| throw new IllegalArgumentException( "Passed incorrect Info type to factory" ); | |||||
| } | |||||
| return create( (ConverterInfo)info ); | |||||
| } | |||||
| /** | |||||
| * Non-generic factory method. | |||||
| * | |||||
| * @param info the info to create instance from | |||||
| * @return the created entry | |||||
| * @exception FactoryException if an error occurs | |||||
| */ | |||||
| public Converter createConverter( final ConverterInfo info ) | |||||
| throws FactoryException | |||||
| { | |||||
| final ConverterLoader loader = getLoader( info.getLocation() ); | |||||
| try { return (Converter)loader.load( info.getClassname() ); } | |||||
| catch( final Exception e ) | |||||
| { | |||||
| throw new FactoryException( "Failed loading converter from " + info.getLocation() + | |||||
| " due to " + e, e ); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Get a loader for a particular location | |||||
| * | |||||
| * @param location the location | |||||
| * @return the loader | |||||
| */ | |||||
| protected ConverterLoader getLoader( final URL location ) | |||||
| { | |||||
| ConverterLoader loader = (ConverterLoader)m_loaders.get( location ); | |||||
| if( null == loader ) | |||||
| { | |||||
| loader = createLoader( location ); | |||||
| m_loaders.put( location, loader ); | |||||
| } | |||||
| return loader; | |||||
| } | |||||
| /** | |||||
| * Create a new loader. | |||||
| * Put in another method so that it can be overridden. | |||||
| * | |||||
| * @param location the location the Loader will load from | |||||
| * @return the loader | |||||
| */ | |||||
| protected ConverterLoader createLoader( final URL location ) | |||||
| { | |||||
| if( null != location ) return new DefaultConverterLoader( location ); | |||||
| else return new DefaultConverterLoader(); | |||||
| } | |||||
| } | |||||
| @@ -7,8 +7,6 @@ | |||||
| */ | */ | ||||
| package org.apache.ant.convert; | package org.apache.ant.convert; | ||||
| import java.net.URL; | |||||
| /** | /** | ||||
| * This info represents meta-information about a converter. | * This info represents meta-information about a converter. | ||||
| * | * | ||||
| @@ -19,18 +17,11 @@ public class DefaultConverterInfo | |||||
| { | { | ||||
| protected final String m_source; | protected final String m_source; | ||||
| protected final String m_destination; | protected final String m_destination; | ||||
| protected final String m_classname; | |||||
| protected final URL m_location; | |||||
| public DefaultConverterInfo( final String source, | |||||
| final String destination, | |||||
| final String classname, | |||||
| final URL location ) | |||||
| public DefaultConverterInfo( final String source, final String destination ) | |||||
| { | { | ||||
| m_source = source; | m_source = source; | ||||
| m_destination = destination; | m_destination = destination; | ||||
| m_classname = classname; | |||||
| m_location = location; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -54,25 +45,5 @@ public class DefaultConverterInfo | |||||
| { | { | ||||
| return m_destination; | return m_destination; | ||||
| } | } | ||||
| /** | |||||
| * Retrieve classname for concerter. | |||||
| * | |||||
| * @return the taskname | |||||
| */ | |||||
| public String getClassname() | |||||
| { | |||||
| return m_classname; | |||||
| } | |||||
| /** | |||||
| * Retrieve location of task library where task is contained. | |||||
| * | |||||
| * @return the location of task library | |||||
| */ | |||||
| public URL getLocation() | |||||
| { | |||||
| return m_location; | |||||
| } | |||||
| } | } | ||||
| @@ -1,47 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.convert; | |||||
| import java.net.URL; | |||||
| import java.net.URLClassLoader; | |||||
| import org.apache.avalon.camelot.AbstractLoader; | |||||
| /** | |||||
| * Class used to load converters et al from a source. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public class DefaultConverterLoader | |||||
| extends AbstractLoader | |||||
| implements ConverterLoader | |||||
| { | |||||
| public DefaultConverterLoader() | |||||
| { | |||||
| super( new URLClassLoader( new URL[0], | |||||
| Thread.currentThread().getContextClassLoader() ) ); | |||||
| } | |||||
| public DefaultConverterLoader( final URL location ) | |||||
| { | |||||
| super( new URLClassLoader( new URL[] { location }, | |||||
| Thread.currentThread().getContextClassLoader() ) ); | |||||
| } | |||||
| /** | |||||
| * Load a Converter object. | |||||
| * | |||||
| * @param converter the converter classname | |||||
| * @return the converter instance | |||||
| * @exception Exception if an error occurs | |||||
| */ | |||||
| public Converter loadConverter( final String converter ) | |||||
| throws Exception | |||||
| { | |||||
| return (Converter)load( converter ); | |||||
| } | |||||
| } | |||||
| @@ -30,11 +30,11 @@ public class DefaultConverterRegistry | |||||
| * @param destination the destination classname | * @param destination the destination classname | ||||
| * @return the converter-info or null if none available | * @return the converter-info or null if none available | ||||
| */ | */ | ||||
| public ConverterInfo getConverterInfo( final String source, final String destination ) | |||||
| public String getConverterInfoName( final String source, final String destination ) | |||||
| { | { | ||||
| final HashMap map = (HashMap)m_mapping.get( source ); | final HashMap map = (HashMap)m_mapping.get( source ); | ||||
| if( null == map ) return null; | if( null == map ) return null; | ||||
| return (ConverterInfo)map.get( destination ); | |||||
| return (String)map.get( destination ); | |||||
| } | } | ||||
| protected void checkInfo( final String name, final Info info ) | protected void checkInfo( final String name, final Info info ) | ||||
| @@ -53,7 +53,7 @@ public class DefaultConverterRegistry | |||||
| m_mapping.put( source, map ); | m_mapping.put( source, map ); | ||||
| } | } | ||||
| map.put( destination, info ); | |||||
| map.put( destination, name ); | |||||
| } | } | ||||
| protected Class getInfoClass() | protected Class getInfoClass() | ||||
| @@ -1,8 +0,0 @@ | |||||
| org.apache.ant.convert.core.StringToLongConverter=java.lang.String, java.lang.Long | |||||
| org.apache.ant.convert.core.StringToIntegerConverter=java.lang.String, java.lang.Integer | |||||
| org.apache.ant.convert.core.StringToShortConverter=java.lang.String, java.lang.Short | |||||
| org.apache.ant.convert.core.StringToByteConverter=java.lang.String, java.lang.Byte | |||||
| org.apache.ant.convert.core.StringToDoubleConverter=java.lang.String, java.lang.Double | |||||
| org.apache.ant.convert.core.StringToFloatConverter=java.lang.String, java.lang.Float | |||||
| org.apache.ant.convert.core.StringToClassConverter=java.lang.String, java.lang.Class | |||||
| org.apache.ant.convert.core.StringToURLConverter=java.lang.String, java.net.URL | |||||
| @@ -11,19 +11,25 @@ import java.util.HashMap; | |||||
| import org.apache.ant.AntException; | import org.apache.ant.AntException; | ||||
| import org.apache.ant.configuration.Configurable; | import org.apache.ant.configuration.Configurable; | ||||
| import org.apache.ant.configuration.Configuration; | import org.apache.ant.configuration.Configuration; | ||||
| import org.apache.ant.configuration.Configurer; | |||||
| import org.apache.ant.configuration.DefaultConfigurer; | |||||
| import org.apache.ant.convert.ConverterEngine; | import org.apache.ant.convert.ConverterEngine; | ||||
| import org.apache.ant.convert.ConverterFactory; | |||||
| import org.apache.ant.tasklet.Tasklet; | import org.apache.ant.tasklet.Tasklet; | ||||
| import org.apache.ant.tasklet.TaskletContext; | import org.apache.ant.tasklet.TaskletContext; | ||||
| import org.apache.avalon.Component; | import org.apache.avalon.Component; | ||||
| import org.apache.avalon.Composer; | |||||
| import org.apache.avalon.ComponentManager; | import org.apache.avalon.ComponentManager; | ||||
| import org.apache.avalon.Composer; | |||||
| import org.apache.avalon.Context; | import org.apache.avalon.Context; | ||||
| import org.apache.avalon.Contextualizable; | import org.apache.avalon.Contextualizable; | ||||
| import org.apache.avalon.DefaultComponentManager; | import org.apache.avalon.DefaultComponentManager; | ||||
| import org.apache.avalon.Disposable; | import org.apache.avalon.Disposable; | ||||
| import org.apache.avalon.Loggable; | |||||
| import org.apache.avalon.Initializable; | import org.apache.avalon.Initializable; | ||||
| import org.apache.avalon.camelot.DefaultFactory; | |||||
| import org.apache.avalon.camelot.FactoryException; | import org.apache.avalon.camelot.FactoryException; | ||||
| import org.apache.avalon.camelot.LocatorRegistry; | |||||
| import org.apache.avalon.camelot.Locator; | |||||
| import org.apache.avalon.camelot.DefaultLocatorRegistry; | |||||
| import org.apache.avalon.camelot.RegistryException; | import org.apache.avalon.camelot.RegistryException; | ||||
| import org.apache.log.Logger; | import org.apache.log.Logger; | ||||
| @@ -31,9 +37,9 @@ public class DefaultTaskletEngine | |||||
| implements TaskletEngine, Initializable | implements TaskletEngine, Initializable | ||||
| { | { | ||||
| protected TskDeployer m_tskDeployer; | protected TskDeployer m_tskDeployer; | ||||
| protected TaskletFactory m_taskletFactory; | |||||
| protected TaskletRegistry m_taskletRegistry; | |||||
| protected TaskletConfigurer m_configurer; | |||||
| protected DefaultFactory m_factory; | |||||
| protected LocatorRegistry m_locatorRegistry; | |||||
| protected Configurer m_configurer; | |||||
| protected Logger m_logger; | protected Logger m_logger; | ||||
| protected ConverterEngine m_converterEngine; | protected ConverterEngine m_converterEngine; | ||||
| @@ -52,22 +58,23 @@ public class DefaultTaskletEngine | |||||
| return m_converterEngine; | return m_converterEngine; | ||||
| } | } | ||||
| public TaskletRegistry getTaskletRegistry() | |||||
| public LocatorRegistry getLocatorRegistry() | |||||
| { | { | ||||
| return m_taskletRegistry; | |||||
| return m_locatorRegistry; | |||||
| } | } | ||||
| public void init() | public void init() | ||||
| throws Exception | throws Exception | ||||
| { | { | ||||
| m_taskletRegistry = createTaskletRegistry(); | |||||
| m_taskletFactory = createTaskletFactory(); | |||||
| m_locatorRegistry = createLocatorRegistry(); | |||||
| m_factory = createFactory(); | |||||
| setupSubComponent( m_factory ); | |||||
| m_converterEngine = createConverterEngine(); | m_converterEngine = createConverterEngine(); | ||||
| m_converterEngine.setLogger( m_logger ); | m_converterEngine.setLogger( m_logger ); | ||||
| setupSubComponent( m_converterEngine ); | setupSubComponent( m_converterEngine ); | ||||
| m_configurer = createTaskletConfigurer(); | |||||
| m_configurer = createConfigurer(); | |||||
| setupSubComponent( m_configurer ); | setupSubComponent( m_configurer ); | ||||
| m_tskDeployer = createTskDeployer(); | m_tskDeployer = createTskDeployer(); | ||||
| @@ -78,6 +85,11 @@ public class DefaultTaskletEngine | |||||
| protected void setupSubComponent( final Component component ) | protected void setupSubComponent( final Component component ) | ||||
| throws Exception | throws Exception | ||||
| { | { | ||||
| if( component instanceof Loggable ) | |||||
| { | |||||
| ((Loggable)component).setLogger( m_logger ); | |||||
| } | |||||
| if( component instanceof Composer ) | if( component instanceof Composer ) | ||||
| { | { | ||||
| final DefaultComponentManager componentManager = new DefaultComponentManager(); | final DefaultComponentManager componentManager = new DefaultComponentManager(); | ||||
| @@ -90,7 +102,7 @@ public class DefaultTaskletEngine | |||||
| ((Composer)component).compose( componentManager ); | ((Composer)component).compose( componentManager ); | ||||
| } | } | ||||
| if( component instanceof Initializable ) | if( component instanceof Initializable ) | ||||
| { | { | ||||
| ((Initializable)component).init(); | ((Initializable)component).init(); | ||||
| @@ -102,19 +114,19 @@ public class DefaultTaskletEngine | |||||
| return new DefaultTskDeployer(); | return new DefaultTskDeployer(); | ||||
| } | } | ||||
| protected TaskletConfigurer createTaskletConfigurer() | |||||
| protected Configurer createConfigurer() | |||||
| { | { | ||||
| return new DefaultTaskletConfigurer(); | |||||
| return new DefaultConfigurer(); | |||||
| } | } | ||||
| protected TaskletRegistry createTaskletRegistry() | |||||
| protected LocatorRegistry createLocatorRegistry() | |||||
| { | { | ||||
| return new DefaultTaskletRegistry(); | |||||
| return new DefaultLocatorRegistry(); | |||||
| } | } | ||||
| protected TaskletFactory createTaskletFactory() | |||||
| protected DefaultFactory createFactory() | |||||
| { | { | ||||
| return new DefaultTaskletFactory(); | |||||
| return new DefaultFactory(); | |||||
| } | } | ||||
| protected ConverterEngine createConverterEngine() | protected ConverterEngine createConverterEngine() | ||||
| @@ -122,7 +134,7 @@ public class DefaultTaskletEngine | |||||
| //this is done so that the loaders are shared | //this is done so that the loaders are shared | ||||
| //which results in much less overhead | //which results in much less overhead | ||||
| final TaskletConverterEngine engine = new TaskletConverterEngine(); | final TaskletConverterEngine engine = new TaskletConverterEngine(); | ||||
| engine.setConverterFactory( (ConverterFactory)m_taskletFactory ); | |||||
| engine.setFactory( m_factory ); | |||||
| return engine; | return engine; | ||||
| } | } | ||||
| @@ -236,21 +248,18 @@ public class DefaultTaskletEngine | |||||
| throws AntException | throws AntException | ||||
| { | { | ||||
| final String name = configuration.getName(); | final String name = configuration.getName(); | ||||
| TaskletInfo info = null; | |||||
| try { info = (TaskletInfo)m_taskletRegistry.getInfo( name ); } | |||||
| try | |||||
| { | |||||
| final Locator locator = m_locatorRegistry.getLocator( name ); | |||||
| return (Tasklet)m_factory.create( locator, Tasklet.class ); | |||||
| } | |||||
| catch( final RegistryException re ) | catch( final RegistryException re ) | ||||
| { | { | ||||
| throw new AntException( "Unable to locate task " + name, re ); | throw new AntException( "Unable to locate task " + name, re ); | ||||
| } | } | ||||
| try { return m_taskletFactory.createTasklet( info ); } | |||||
| catch( final FactoryException fe ) | catch( final FactoryException fe ) | ||||
| { | { | ||||
| throw new AntException( "Unable to create task " + name + | |||||
| " (of type " + info.getClassname() + " from " + | |||||
| info.getLocation() + ")", | |||||
| fe ); | |||||
| throw new AntException( "Unable to create task " + name, fe ); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,63 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.tasklet.engine; | |||||
| import java.net.URL; | |||||
| import java.net.URLClassLoader; | |||||
| import java.util.HashMap; | |||||
| import org.apache.ant.tasklet.Tasklet; | |||||
| import org.apache.ant.convert.ConverterLoader; | |||||
| import org.apache.ant.convert.DefaultConverterFactory; | |||||
| import org.apache.avalon.camelot.Entry; | |||||
| import org.apache.avalon.camelot.Factory; | |||||
| import org.apache.avalon.camelot.FactoryException; | |||||
| import org.apache.avalon.camelot.Info; | |||||
| /** | |||||
| * Facility used to load Tasklets. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public class DefaultTaskletFactory | |||||
| extends DefaultConverterFactory | |||||
| implements TaskletFactory | |||||
| { | |||||
| public Object create( final Info info ) | |||||
| throws FactoryException | |||||
| { | |||||
| if( !info.getClass().equals( TaskletInfo.class ) ) | |||||
| { | |||||
| return super.create( info ); | |||||
| } | |||||
| else | |||||
| { | |||||
| return createTasklet( (TaskletInfo)info ); | |||||
| } | |||||
| } | |||||
| public Tasklet createTasklet( final TaskletInfo info ) | |||||
| throws FactoryException | |||||
| { | |||||
| final TaskletLoader loader = (TaskletLoader)getLoader( info.getLocation() ); | |||||
| Object object = null; | |||||
| try { return (Tasklet)loader.load( info.getClassname() ); } | |||||
| catch( final Exception e ) | |||||
| { | |||||
| throw new FactoryException( "Failed loading tasklet from " + info.getLocation() + | |||||
| " due to " + e, e ); | |||||
| } | |||||
| } | |||||
| protected ConverterLoader createLoader( final URL location ) | |||||
| { | |||||
| if( null != location ) return new DefaultTaskletLoader( location ); | |||||
| else return new DefaultTaskletLoader(); | |||||
| } | |||||
| } | |||||
| @@ -1,54 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.tasklet.engine; | |||||
| import java.net.URL; | |||||
| import org.apache.avalon.camelot.Info; | |||||
| /** | |||||
| * This is default container of information about a task. | |||||
| * A BeanInfo equivelent for a task. Eventually it will auto-magically | |||||
| * generate a schema via reflection for Validator/Editor tools. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public class DefaultTaskletInfo | |||||
| implements TaskletInfo | |||||
| { | |||||
| protected final String m_classname; | |||||
| protected final URL m_location; | |||||
| /** | |||||
| * Constructor that takes classname and taskLibraryLocation. | |||||
| */ | |||||
| public DefaultTaskletInfo( final String classname, final URL location ) | |||||
| { | |||||
| m_location = location; | |||||
| m_classname = classname; | |||||
| } | |||||
| /** | |||||
| * Retrieve classname for task. | |||||
| * | |||||
| * @return the taskname | |||||
| */ | |||||
| public String getClassname() | |||||
| { | |||||
| return m_classname; | |||||
| } | |||||
| /** | |||||
| * Retrieve tasklib location from which task is loaded. | |||||
| * | |||||
| * @return the location | |||||
| */ | |||||
| public URL getLocation() | |||||
| { | |||||
| return m_location; | |||||
| } | |||||
| } | |||||
| @@ -1,44 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.tasklet.engine; | |||||
| import java.net.URL; | |||||
| import org.apache.ant.convert.DefaultConverterLoader; | |||||
| import org.apache.ant.tasklet.Tasklet; | |||||
| /** | |||||
| * Class used to load tasks et al from a source. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public class DefaultTaskletLoader | |||||
| extends DefaultConverterLoader | |||||
| implements TaskletLoader | |||||
| { | |||||
| public DefaultTaskletLoader() | |||||
| { | |||||
| } | |||||
| public DefaultTaskletLoader( final URL location ) | |||||
| { | |||||
| super( location ); | |||||
| } | |||||
| /** | |||||
| * Load a tasklet with a particular classname. | |||||
| * | |||||
| * @param tasklet the tasklet classname | |||||
| * @return the tasklet | |||||
| * @exception Exception if an error occurs | |||||
| */ | |||||
| public Tasklet loadTasklet( final String tasklet ) | |||||
| throws Exception | |||||
| { | |||||
| return (Tasklet)load( tasklet ); | |||||
| } | |||||
| } | |||||
| @@ -1,20 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.tasklet.engine; | |||||
| import org.apache.avalon.camelot.AbstractRegistry; | |||||
| public class DefaultTaskletRegistry | |||||
| extends AbstractRegistry | |||||
| implements TaskletRegistry | |||||
| { | |||||
| protected Class getInfoClass() | |||||
| { | |||||
| return TaskletInfo.class; | |||||
| } | |||||
| } | |||||
| @@ -11,22 +11,26 @@ import java.io.File; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.net.MalformedURLException; | import java.net.MalformedURLException; | ||||
| import java.net.URL; | import java.net.URL; | ||||
| import java.util.Enumeration; | |||||
| import java.util.Properties; | |||||
| import java.util.Iterator; | |||||
| import java.util.zip.ZipEntry; | import java.util.zip.ZipEntry; | ||||
| import java.util.zip.ZipException; | import java.util.zip.ZipException; | ||||
| import java.util.zip.ZipFile; | import java.util.zip.ZipFile; | ||||
| import org.apache.ant.convert.ConverterEngine; | import org.apache.ant.convert.ConverterEngine; | ||||
| import org.apache.ant.convert.ConverterRegistry; | import org.apache.ant.convert.ConverterRegistry; | ||||
| import org.apache.ant.convert.DefaultConverterInfo; | import org.apache.ant.convert.DefaultConverterInfo; | ||||
| import org.apache.ant.tasklet.engine.DefaultTaskletInfo; | |||||
| import org.apache.avalon.Component; | import org.apache.avalon.Component; | ||||
| import org.apache.avalon.ComponentManager; | import org.apache.avalon.ComponentManager; | ||||
| import org.apache.avalon.ComponentNotAccessibleException; | import org.apache.avalon.ComponentNotAccessibleException; | ||||
| import org.apache.avalon.ComponentNotFoundException; | import org.apache.avalon.ComponentNotFoundException; | ||||
| import org.apache.avalon.Composer; | import org.apache.avalon.Composer; | ||||
| import org.apache.avalon.camelot.AbstractDeployer; | |||||
| import org.apache.avalon.Configuration; | |||||
| import org.apache.avalon.ConfigurationException; | |||||
| import org.apache.avalon.camelot.AbstractZipDeployer; | |||||
| import org.apache.avalon.camelot.DefaultLocator; | |||||
| import org.apache.avalon.camelot.DefaultLocatorRegistry; | |||||
| import org.apache.avalon.camelot.DeploymentException; | import org.apache.avalon.camelot.DeploymentException; | ||||
| import org.apache.avalon.camelot.Loader; | |||||
| import org.apache.avalon.camelot.LocatorRegistry; | |||||
| import org.apache.avalon.camelot.RegistryException; | import org.apache.avalon.camelot.RegistryException; | ||||
| import org.apache.log.Logger; | import org.apache.log.Logger; | ||||
| @@ -36,20 +40,21 @@ import org.apache.log.Logger; | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | ||||
| */ | */ | ||||
| public class DefaultTskDeployer | public class DefaultTskDeployer | ||||
| extends AbstractDeployer | |||||
| extends AbstractZipDeployer | |||||
| implements Composer, TskDeployer | implements Composer, TskDeployer | ||||
| { | { | ||||
| protected final static String TASKDEF_FILE = "TASK-LIB/taskdefs.properties"; | |||||
| protected final static String CONVERTER_FILE = "TASK-LIB/converters.properties"; | |||||
| protected final static String TSKDEF_FILE = "TASK-LIB/taskdefs.xml"; | |||||
| protected TaskletRegistry m_taskletRegistry; | |||||
| protected ConverterRegistry m_converterRegistry; | |||||
| protected LocatorRegistry m_taskletRegistry; | |||||
| protected LocatorRegistry m_converterRegistry; | |||||
| protected ConverterRegistry m_converterInfoRegistry; | |||||
| /** | /** | ||||
| * Default constructor. | * Default constructor. | ||||
| */ | */ | ||||
| public DefaultTskDeployer() | public DefaultTskDeployer() | ||||
| { | { | ||||
| super( false ); | |||||
| m_autoUndeploy = true; | m_autoUndeploy = true; | ||||
| m_type = "Tasklet"; | m_type = "Tasklet"; | ||||
| } | } | ||||
| @@ -67,12 +72,13 @@ public class DefaultTskDeployer | |||||
| final ConverterEngine converterEngine = (ConverterEngine)componentManager. | final ConverterEngine converterEngine = (ConverterEngine)componentManager. | ||||
| lookup( "org.apache.ant.convert.ConverterEngine" ); | lookup( "org.apache.ant.convert.ConverterEngine" ); | ||||
| m_converterRegistry = converterEngine.getConverterRegistry(); | |||||
| m_converterInfoRegistry = converterEngine.getConverterRegistry(); | |||||
| m_converterRegistry = converterEngine.getLocatorRegistry(); | |||||
| final TaskletEngine taskletEngine = (TaskletEngine)componentManager. | final TaskletEngine taskletEngine = (TaskletEngine)componentManager. | ||||
| lookup( "org.apache.ant.tasklet.engine.TaskletEngine" ); | lookup( "org.apache.ant.tasklet.engine.TaskletEngine" ); | ||||
| m_taskletRegistry = taskletEngine.getTaskletRegistry(); | |||||
| m_taskletRegistry = taskletEngine.getLocatorRegistry(); | |||||
| } | } | ||||
| public void setLogger( final Logger logger ) | public void setLogger( final Logger logger ) | ||||
| @@ -80,50 +86,30 @@ public class DefaultTskDeployer | |||||
| m_logger = logger; | m_logger = logger; | ||||
| } | } | ||||
| protected boolean isValidLocation( final String location ) | |||||
| { | |||||
| //TODO: Make sure it is valid JavaIdentifier | |||||
| //that optionally has '-' embedded in it | |||||
| return true; | |||||
| } | |||||
| /** | |||||
| * Deploy Tasklets from a .tsk file. | |||||
| * Eventually this should be cached for performance reasons. | |||||
| * | |||||
| * @param location the location | |||||
| * @param file the file | |||||
| * @exception DeploymentException if an error occurs | |||||
| */ | |||||
| protected void deployFromFile( final String location, final File file ) | |||||
| protected void loadResources( final ZipFile zipFile, final String location, final URL url ) | |||||
| throws DeploymentException | throws DeploymentException | ||||
| { | { | ||||
| m_logger.info( "Deploying .tsk file (" + file + ") as " + location ); | |||||
| final ZipFile zipFile = getZipFileFor( file ); | |||||
| final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); | |||||
| try | try | ||||
| { | { | ||||
| final Properties taskdefs = loadProperties( zipFile, TASKDEF_FILE ); | |||||
| final Properties converters = loadProperties( zipFile, CONVERTER_FILE ); | |||||
| try { zipFile.close(); } | |||||
| catch( final IOException ioe ) {} | |||||
| URL url = null; | |||||
| try { url = file.toURL(); } | |||||
| catch( final MalformedURLException mue ) {} | |||||
| handleTasklets( taskdefs, url ); | |||||
| handleConverters( converters, url ); | |||||
| final Iterator tasks = taskdefs.getChildren( "task" ); | |||||
| while( tasks.hasNext() ) | |||||
| { | |||||
| final Configuration task = (Configuration)tasks.next(); | |||||
| handleTasklet( task, url ); | |||||
| } | |||||
| final Iterator converters = taskdefs.getChildren( "converter" ); | |||||
| while( converters.hasNext() ) | |||||
| { | |||||
| final Configuration converter = (Configuration)converters.next(); | |||||
| handleConverter( converter, url ); | |||||
| } | |||||
| } | } | ||||
| catch( final DeploymentException de ) | |||||
| catch( final ConfigurationException ce ) | |||||
| { | { | ||||
| try { zipFile.close(); } | |||||
| catch( final IOException ioe ) {} | |||||
| throw de; | |||||
| throw new DeploymentException( "Malformed taskdefs.xml", ce ); | |||||
| } | } | ||||
| } | } | ||||
| @@ -132,15 +118,25 @@ public class DefaultTskDeployer | |||||
| { | { | ||||
| checkDeployment( location, url ); | checkDeployment( location, url ); | ||||
| final ZipFile zipFile = getZipFileFor( url ); | final ZipFile zipFile = getZipFileFor( url ); | ||||
| final Properties converters = loadProperties( zipFile, CONVERTER_FILE ); | |||||
| final String value = converters.getProperty( name ); | |||||
| if( null == value ) | |||||
| final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); | |||||
| try | |||||
| { | { | ||||
| throw new DeploymentException( "Unable to locate converter named " + name ); | |||||
| final Iterator converters = taskdefs.getChildren( "converter" ); | |||||
| while( converters.hasNext() ) | |||||
| { | |||||
| final Configuration converter = (Configuration)converters.next(); | |||||
| if( converter.getAttribute( "classname" ).equals( name ) ) | |||||
| { | |||||
| handleConverter( converter, url ); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| catch( final ConfigurationException ce ) | |||||
| { | |||||
| throw new DeploymentException( "Malformed taskdefs.xml", ce ); | |||||
| } | } | ||||
| handleConverter( name, value, url ); | |||||
| } | } | ||||
| public void deployTasklet( final String name, final String location, final URL url ) | public void deployTasklet( final String name, final String location, final URL url ) | ||||
| @@ -148,109 +144,65 @@ public class DefaultTskDeployer | |||||
| { | { | ||||
| checkDeployment( location, url ); | checkDeployment( location, url ); | ||||
| final ZipFile zipFile = getZipFileFor( url ); | final ZipFile zipFile = getZipFileFor( url ); | ||||
| final Properties tasklets = loadProperties( zipFile, TASKDEF_FILE ); | |||||
| final String value = tasklets.getProperty( name ); | |||||
| final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); | |||||
| if( null == value ) | |||||
| try | |||||
| { | { | ||||
| throw new DeploymentException( "Unable to locate tasklet named " + name ); | |||||
| final Iterator tasks = taskdefs.getChildren( "task" ); | |||||
| while( tasks.hasNext() ) | |||||
| { | |||||
| final Configuration task = (Configuration)tasks.next(); | |||||
| if( task.getAttribute( "name" ).equals( name ) ) | |||||
| { | |||||
| handleTasklet( task, url ); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| handleTasklet( name, value, url ); | |||||
| } | |||||
| protected ZipFile getZipFileFor( final URL url ) | |||||
| throws DeploymentException | |||||
| { | |||||
| final File file = getFileFor( url ); | |||||
| return getZipFileFor( file ); | |||||
| } | |||||
| protected ZipFile getZipFileFor( final File file ) | |||||
| throws DeploymentException | |||||
| { | |||||
| try { return new ZipFile( file ); } | |||||
| catch( final IOException ioe ) | |||||
| catch( final ConfigurationException ce ) | |||||
| { | { | ||||
| throw new DeploymentException( "Error opening " + file + | |||||
| " due to " + ioe.getMessage(), | |||||
| ioe ); | |||||
| } | |||||
| throw new DeploymentException( "Malformed taskdefs.xml", ce ); | |||||
| } | |||||
| } | } | ||||
| /** | |||||
| * Create and register Infos for all converters stored in deployment. | |||||
| * | |||||
| * @param properties the properties | |||||
| * @param url the url of deployment | |||||
| * @exception DeploymentException if an error occurs | |||||
| */ | |||||
| protected void handleConverters( final Properties properties, final URL url ) | |||||
| throws DeploymentException | |||||
| protected void handleConverter( final Configuration converter, final URL url ) | |||||
| throws DeploymentException, ConfigurationException | |||||
| { | { | ||||
| final Enumeration enum = properties.propertyNames(); | |||||
| final String name = converter.getAttribute( "classname" ); | |||||
| final String source = converter.getAttribute( "source" ); | |||||
| final String destination = converter.getAttribute( "destination" ); | |||||
| while( enum.hasMoreElements() ) | |||||
| final DefaultConverterInfo info = new DefaultConverterInfo( source, destination ); | |||||
| try { m_converterInfoRegistry.register( name, info ); } | |||||
| catch( final RegistryException re ) | |||||
| { | { | ||||
| final String key = (String)enum.nextElement(); | |||||
| final String value = (String)properties.get( key ); | |||||
| handleConverter( key, value, url ); | |||||
| throw new DeploymentException( "Error registering converter info " + | |||||
| name + " due to " + re, | |||||
| re ); | |||||
| } | } | ||||
| } | |||||
| protected void handleConverter( final String name, final String param, final URL url ) | |||||
| throws DeploymentException | |||||
| { | |||||
| final int index = param.indexOf( ',' ); | |||||
| if( -1 == index ) | |||||
| { | |||||
| throw new DeploymentException( "Malformed converter definition (" + name + ")" ); | |||||
| } | |||||
| final String source = param.substring( 0, index ).trim(); | |||||
| final String destination = param.substring( index + 1 ).trim(); | |||||
| final DefaultConverterInfo info = | |||||
| new DefaultConverterInfo( source, destination, name, url ); | |||||
| try { m_converterRegistry.register( name, info ); } | |||||
| final DefaultLocator locator = new DefaultLocator( name, url ); | |||||
| try { m_converterRegistry.register( name, locator ); } | |||||
| catch( final RegistryException re ) | catch( final RegistryException re ) | ||||
| { | { | ||||
| throw new DeploymentException( "Error registering converter " + | |||||
| throw new DeploymentException( "Error registering converter locator " + | |||||
| name + " due to " + re, | name + " due to " + re, | ||||
| re ); | re ); | ||||
| } | } | ||||
| m_logger.debug( "Registered converter " + name + " that converts from " + | m_logger.debug( "Registered converter " + name + " that converts from " + | ||||
| source + " to " + destination ); | source + " to " + destination ); | ||||
| } | } | ||||
| /** | |||||
| * Create and register Infos for all tasklets stored in deployment. | |||||
| * | |||||
| * @param properties the properties | |||||
| * @param url the url of deployment | |||||
| * @exception DeploymentException if an error occurs | |||||
| */ | |||||
| protected void handleTasklets( final Properties properties, final URL url ) | |||||
| throws DeploymentException | |||||
| protected void handleTasklet( final Configuration task, final URL url ) | |||||
| throws DeploymentException, ConfigurationException | |||||
| { | { | ||||
| final Enumeration enum = properties.propertyNames(); | |||||
| while( enum.hasMoreElements() ) | |||||
| { | |||||
| final String key = (String)enum.nextElement(); | |||||
| final String value = (String)properties.get( key ); | |||||
| handleTasklet( key, value, url ); | |||||
| } | |||||
| } | |||||
| final String name = task.getAttribute( "name" ); | |||||
| final String classname = task.getAttribute( "classname" ); | |||||
| protected void handleTasklet( final String name, final String classname, final URL url ) | |||||
| throws DeploymentException | |||||
| { | |||||
| final DefaultTaskletInfo info = new DefaultTaskletInfo( classname, url ); | |||||
| final DefaultLocator info = new DefaultLocator( classname, url ); | |||||
| try { m_taskletRegistry.register( name, info ); } | try { m_taskletRegistry.register( name, info ); } | ||||
| catch( final RegistryException re ) | catch( final RegistryException re ) | ||||
| @@ -261,49 +213,4 @@ public class DefaultTskDeployer | |||||
| m_logger.debug( "Registered tasklet " + name + " as " + classname ); | m_logger.debug( "Registered tasklet " + name + " as " + classname ); | ||||
| } | } | ||||
| /** | |||||
| * Utility method to load properties from zip. | |||||
| * | |||||
| * @param zipFile the zip file | |||||
| * @param filename the property filename | |||||
| * @return the Properties | |||||
| * @exception DeploymentException if an error occurs | |||||
| */ | |||||
| protected Properties loadProperties( final ZipFile zipFile, final String filename ) | |||||
| throws DeploymentException | |||||
| { | |||||
| final ZipEntry entry = zipFile.getEntry( filename ); | |||||
| if( null == entry ) | |||||
| { | |||||
| throw new DeploymentException( "Unable to locate " + filename + | |||||
| " in " + zipFile.getName() ); | |||||
| } | |||||
| Properties properties = new Properties(); | |||||
| try | |||||
| { | |||||
| properties.load( zipFile.getInputStream( entry ) ); | |||||
| } | |||||
| catch( final IOException ioe ) | |||||
| { | |||||
| throw new DeploymentException( "Error reading " + filename + | |||||
| " from " + zipFile.getName(), | |||||
| ioe ); | |||||
| } | |||||
| return properties; | |||||
| } | |||||
| protected boolean canUndeploy( final Component component ) | |||||
| throws DeploymentException | |||||
| { | |||||
| return true; | |||||
| } | |||||
| protected void shutdownDeployment( final Component component ) | |||||
| throws DeploymentException | |||||
| { | |||||
| } | |||||
| } | } | ||||
| @@ -7,8 +7,8 @@ | |||||
| */ | */ | ||||
| package org.apache.ant.tasklet.engine; | package org.apache.ant.tasklet.engine; | ||||
| import org.apache.ant.convert.ConverterFactory; | |||||
| import org.apache.ant.convert.DefaultConverterEngine; | import org.apache.ant.convert.DefaultConverterEngine; | ||||
| import org.apache.avalon.camelot.DefaultFactory; | |||||
| public class TaskletConverterEngine | public class TaskletConverterEngine | ||||
| extends DefaultConverterEngine | extends DefaultConverterEngine | ||||
| @@ -17,13 +17,13 @@ public class TaskletConverterEngine | |||||
| * Set the ConverterFactory. | * Set the ConverterFactory. | ||||
| * Package access intended. | * Package access intended. | ||||
| */ | */ | ||||
| void setConverterFactory( final ConverterFactory converterFactory ) | |||||
| void setFactory( final DefaultFactory factory ) | |||||
| { | { | ||||
| m_converterFactory = converterFactory; | |||||
| m_factory = factory; | |||||
| } | } | ||||
| protected ConverterFactory createConverterFactory() | |||||
| protected DefaultFactory createFactory() | |||||
| { | { | ||||
| return m_converterFactory; | |||||
| return m_factory; | |||||
| } | } | ||||
| } | } | ||||
| @@ -12,7 +12,9 @@ import org.apache.ant.configuration.Configuration; | |||||
| import org.apache.ant.convert.ConverterEngine; | import org.apache.ant.convert.ConverterEngine; | ||||
| import org.apache.ant.tasklet.TaskletContext; | import org.apache.ant.tasklet.TaskletContext; | ||||
| import org.apache.avalon.Component; | import org.apache.avalon.Component; | ||||
| import org.apache.avalon.Loggable; | |||||
| import org.apache.avalon.ComponentManager; | import org.apache.avalon.ComponentManager; | ||||
| import org.apache.avalon.camelot.LocatorRegistry; | |||||
| import org.apache.log.Logger; | import org.apache.log.Logger; | ||||
| /** | /** | ||||
| @@ -21,10 +23,8 @@ import org.apache.log.Logger; | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | ||||
| */ | */ | ||||
| public interface TaskletEngine | public interface TaskletEngine | ||||
| extends Component | |||||
| extends Component, Loggable | |||||
| { | { | ||||
| void setLogger( Logger logger ); | |||||
| /** | /** | ||||
| * Retrieve deployer for engine. | * Retrieve deployer for engine. | ||||
| * | * | ||||
| @@ -33,11 +33,11 @@ public interface TaskletEngine | |||||
| TskDeployer getTskDeployer(); | TskDeployer getTskDeployer(); | ||||
| /** | /** | ||||
| * Retrieve tasklet registry associated with engine. | |||||
| * Retrieve locator registry associated with engine. | |||||
| * | * | ||||
| * @return the TaskletRegistry | |||||
| * @return the LocatorRegistry | |||||
| */ | */ | ||||
| TaskletRegistry getTaskletRegistry(); | |||||
| LocatorRegistry getLocatorRegistry(); | |||||
| /** | /** | ||||
| * Retrieve converter engine. | * Retrieve converter engine. | ||||
| @@ -1,24 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.tasklet.engine; | |||||
| import org.apache.avalon.camelot.Factory; | |||||
| import org.apache.avalon.camelot.FactoryException; | |||||
| import org.apache.ant.tasklet.Tasklet; | |||||
| /** | |||||
| * Facility used to load Tasklets. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public interface TaskletFactory | |||||
| extends Factory | |||||
| { | |||||
| Tasklet createTasklet( TaskletInfo info ) | |||||
| throws FactoryException; | |||||
| } | |||||
| @@ -1,36 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.tasklet.engine; | |||||
| import java.net.URL; | |||||
| import org.apache.avalon.camelot.Info; | |||||
| /** | |||||
| * This is information about a task. | |||||
| * A BeanInfo equivelent for a task. Eventually it will auto-magically | |||||
| * generate a schema via reflection for Validator/Editor tools. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public interface TaskletInfo | |||||
| extends Info | |||||
| { | |||||
| /** | |||||
| * Retrieve classname for task. | |||||
| * | |||||
| * @return the taskname | |||||
| */ | |||||
| String getClassname(); | |||||
| /** | |||||
| * Retrieve location of task library where task is contained. | |||||
| * | |||||
| * @return the location of task library | |||||
| */ | |||||
| URL getLocation(); | |||||
| } | |||||
| @@ -1,30 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.tasklet.engine; | |||||
| import org.apache.ant.tasklet.Tasklet; | |||||
| import org.apache.avalon.camelot.Loader; | |||||
| /** | |||||
| * Class used to load tasks et al from a source. | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public interface TaskletLoader | |||||
| extends Loader | |||||
| { | |||||
| /** | |||||
| * Load a tasklet with a particular classname. | |||||
| * | |||||
| * @param tasklet the tasklet classname | |||||
| * @return the tasklet | |||||
| * @exception Exception if an error occurs | |||||
| */ | |||||
| Tasklet loadTasklet( String tasklet ) | |||||
| throws Exception; | |||||
| } | |||||
| @@ -1,20 +0,0 @@ | |||||
| /* | |||||
| * 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.ant.tasklet.engine; | |||||
| import org.apache.avalon.camelot.Registry; | |||||
| /** | |||||
| * The registry for tasklets | |||||
| * | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||||
| */ | |||||
| public interface TaskletRegistry | |||||
| extends Registry | |||||
| { | |||||
| } | |||||
| @@ -8,6 +8,7 @@ | |||||
| package org.apache.ant.tasklet.engine; | package org.apache.ant.tasklet.engine; | ||||
| import java.net.URL; | import java.net.URL; | ||||
| import org.apache.avalon.Loggable; | |||||
| import org.apache.avalon.camelot.Deployer; | import org.apache.avalon.camelot.Deployer; | ||||
| import org.apache.avalon.camelot.DeploymentException; | import org.apache.avalon.camelot.DeploymentException; | ||||
| import org.apache.log.Logger; | import org.apache.log.Logger; | ||||
| @@ -18,13 +19,12 @@ import org.apache.log.Logger; | |||||
| * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | * @author <a href="mailto:donaldp@apache.org">Peter Donald</a> | ||||
| */ | */ | ||||
| public interface TskDeployer | public interface TskDeployer | ||||
| extends Deployer | |||||
| extends Deployer, Loggable | |||||
| { | { | ||||
| void setLogger( Logger logger ); | |||||
| void deployConverter( String name, String location, URL url ) | void deployConverter( String name, String location, URL url ) | ||||
| throws DeploymentException; | throws DeploymentException; | ||||
| void deployTasklet( String name, String location, URL url ) | void deployTasklet( String name, String location, URL url ) | ||||
| throws DeploymentException; | throws DeploymentException; | ||||
| } | } | ||||
| @@ -12,7 +12,6 @@ import java.net.MalformedURLException; | |||||
| import java.net.URL; | import java.net.URL; | ||||
| import org.apache.ant.AntException; | import org.apache.ant.AntException; | ||||
| import org.apache.ant.tasklet.AbstractTasklet; | import org.apache.ant.tasklet.AbstractTasklet; | ||||
| import org.apache.ant.tasklet.engine.DefaultTaskletInfo; | |||||
| import org.apache.ant.tasklet.engine.TaskletEngine; | import org.apache.ant.tasklet.engine.TaskletEngine; | ||||
| import org.apache.avalon.ComponentManager; | import org.apache.avalon.ComponentManager; | ||||
| import org.apache.avalon.ComponentNotAccessibleException; | import org.apache.avalon.ComponentNotAccessibleException; | ||||
| @@ -11,8 +11,9 @@ import java.io.File; | |||||
| import java.net.URL; | import java.net.URL; | ||||
| import java.net.MalformedURLException; | import java.net.MalformedURLException; | ||||
| import org.apache.ant.AntException; | import org.apache.ant.AntException; | ||||
| import org.apache.ant.convert.DefaultConverterInfo; | |||||
| import org.apache.avalon.camelot.DefaultLocator; | |||||
| import org.apache.ant.convert.ConverterEngine; | import org.apache.ant.convert.ConverterEngine; | ||||
| import org.apache.ant.convert.DefaultConverterInfo; | |||||
| import org.apache.ant.tasklet.AbstractTasklet; | import org.apache.ant.tasklet.AbstractTasklet; | ||||
| import org.apache.ant.tasklet.engine.TaskletEngine; | import org.apache.ant.tasklet.engine.TaskletEngine; | ||||
| import org.apache.avalon.ComponentManager; | import org.apache.avalon.ComponentManager; | ||||
| @@ -106,12 +107,15 @@ public class RegisterConverter | |||||
| else | else | ||||
| { | { | ||||
| final DefaultConverterInfo info = | final DefaultConverterInfo info = | ||||
| new DefaultConverterInfo( m_sourceType, m_destinationType, m_classname, url ); | |||||
| new DefaultConverterInfo( m_sourceType, m_destinationType ); | |||||
| final DefaultLocator locator = new DefaultLocator( m_classname, url ); | |||||
| try | try | ||||
| { | { | ||||
| m_engine.getConverterEngine(). | m_engine.getConverterEngine(). | ||||
| getConverterRegistry().register( m_classname, info ); | getConverterRegistry().register( m_classname, info ); | ||||
| m_engine.getConverterEngine(). | |||||
| getLocatorRegistry().register( m_classname, locator ); | |||||
| } | } | ||||
| catch( final RegistryException re ) | catch( final RegistryException re ) | ||||
| { | { | ||||
| @@ -9,7 +9,7 @@ package org.apache.ant.tasks.core; | |||||
| import java.net.URL; | import java.net.URL; | ||||
| import org.apache.ant.AntException; | import org.apache.ant.AntException; | ||||
| import org.apache.ant.tasklet.engine.DefaultTaskletInfo; | |||||
| import org.apache.avalon.camelot.DefaultLocator; | |||||
| import org.apache.avalon.camelot.DeploymentException; | import org.apache.avalon.camelot.DeploymentException; | ||||
| import org.apache.avalon.camelot.RegistryException; | import org.apache.avalon.camelot.RegistryException; | ||||
| @@ -36,8 +36,8 @@ public class RegisterTasklet | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| final DefaultTaskletInfo info = new DefaultTaskletInfo( classname, url ); | |||||
| m_engine.getTaskletRegistry().register( name, info ); | |||||
| final DefaultLocator locator = new DefaultLocator( classname, url ); | |||||
| m_engine.getLocatorRegistry().register( name, locator ); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,11 +0,0 @@ | |||||
| # TASK-LIB/taskdefs.properties | |||||
| echo=org.apache.ant.tasks.core.Echo | |||||
| prim-test=org.apache.ant.tasks.core.PrimitiveTypesTest | |||||
| sub-elements-test=org.apache.ant.tasks.core.SubElementTest | |||||
| conf-test=org.apache.ant.tasks.core.ConfigurationTest | |||||
| content-test=org.apache.ant.tasks.core.ContentTest | |||||
| property=org.apache.ant.tasks.core.Property | |||||
| register-tasklet=org.apache.ant.tasks.core.RegisterTasklet | |||||
| register-converter=org.apache.ant.tasks.core.RegisterConverter | |||||
| register-tasklib=org.apache.ant.tasks.core.RegisterTasklib | |||||
| ant-call=org.apache.ant.tasks.core.AntCall | |||||
| @@ -0,0 +1,36 @@ | |||||
| <tasklib> | |||||
| <task name="echo" classname="org.apache.ant.tasks.core.Echo" /> | |||||
| <task name="prim-test" classname="org.apache.ant.tasks.core.PrimitiveTypesTest" /> | |||||
| <task name="sub-elements-test" classname="org.apache.ant.tasks.core.SubElementTest" /> | |||||
| <task name="conf-test" classname="org.apache.ant.tasks.core.ConfigurationTest" /> | |||||
| <task name="content-test" classname="org.apache.ant.tasks.core.ContentTest" /> | |||||
| <task name="property" classname="org.apache.ant.tasks.core.Property" /> | |||||
| <task name="register-tasklet" classname="org.apache.ant.tasks.core.RegisterTasklet" /> | |||||
| <task name="register-converter" classname="org.apache.ant.tasks.core.RegisterConverter" /> | |||||
| <task name="ant-call" classname="org.apache.ant.tasks.core.AntCall" /> | |||||
| <converter classname="org.apache.ant.convert.core.StringToLongConverter" | |||||
| source="java.lang.String" | |||||
| destination="java.lang.Long" /> | |||||
| <converter classname="org.apache.ant.convert.core.StringToIntegerConverter" | |||||
| source="java.lang.String" | |||||
| destination="java.lang.Integer" /> | |||||
| <converter classname="org.apache.ant.convert.core.StringToShortConverter" | |||||
| source="java.lang.String" | |||||
| destination="java.lang.Short" /> | |||||
| <converter classname="org.apache.ant.convert.core.StringToByteConverter" | |||||
| source="java.lang.String" | |||||
| destination="java.lang.Byte" /> | |||||
| <converter classname="org.apache.ant.convert.core.StringToDoubleConverter" | |||||
| source="java.lang.String" | |||||
| destination="java.lang.Double" /> | |||||
| <converter classname="org.apache.ant.convert.core.StringToFloatConverter" | |||||
| source="java.lang.String" | |||||
| destination="java.lang.Float" /> | |||||
| <converter classname="org.apache.ant.convert.core.StringToClassConverter" | |||||
| source="java.lang.String" | |||||
| destination="java.lang.Class" /> | |||||
| <converter classname="org.apache.ant.convert.core.StringToURLConverter" | |||||
| source="java.lang.String" | |||||
| destination="java.net.URL" /> | |||||
| </tasklib> | |||||