Return-Path: Mailing-List: contact ant-dev-help@jakarta.apache.org; run by ezmlm Delivered-To: mailing list ant-dev@jakarta.apache.org Received: (qmail 21822 invoked by uid 500); 11 Dec 2000 00:33:47 -0000 Delivered-To: apmail-jakarta-ant-cvs@apache.org Received: (qmail 21818 invoked by uid 1195); 11 Dec 2000 00:33:46 -0000 Date: 11 Dec 2000 00:33:46 -0000 Message-ID: <20001211003346.21817.qmail@locus.apache.org> From: donaldp@locus.apache.org To: jakarta-ant-cvs@apache.org Subject: cvs commit: jakarta-ant/proposal/myrmidon/src/manifest taskdefs.xml donaldp 00/12/10 16:33:46 Modified: proposal/myrmidon/src/java/org/apache/ant/convert ConverterEngine.java ConverterInfo.java ConverterRegistry.java DefaultConverterEngine.java DefaultConverterInfo.java DefaultConverterRegistry.java proposal/myrmidon/src/java/org/apache/ant/tasklet/engine DefaultTaskletEngine.java DefaultTskDeployer.java TaskletConverterEngine.java TaskletEngine.java TskDeployer.java proposal/myrmidon/src/java/org/apache/ant/tasks/core AbstractResourceRegisterer.java RegisterConverter.java RegisterTasklet.java Added: proposal/myrmidon/src/java/org/apache/ant/configuration Configurer.java DefaultConfigurer.java proposal/myrmidon/src/manifest taskdefs.xml Removed: proposal/myrmidon/src/java/org/apache/ant/convert ConverterFactory.java ConverterLoader.java DefaultConverterFactory.java DefaultConverterLoader.java proposal/myrmidon/src/java/org/apache/ant/convert/core converters.properties proposal/myrmidon/src/java/org/apache/ant/tasklet/engine DefaultTaskletConfigurer.java DefaultTaskletFactory.java DefaultTaskletInfo.java DefaultTaskletLoader.java DefaultTaskletRegistry.java TaskletConfigurer.java TaskletFactory.java TaskletInfo.java TaskletLoader.java TaskletRegistry.java proposal/myrmidon/src/java/org/apache/ant/tasks/core taskdefs.properties Log: Updated to latest Avalon which involved removing a lot of cruft from Ant. Revision Changes Path 1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/configuration/Configurer.java Index: Configurer.java =================================================================== /* * 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.configuration; import org.apache.avalon.Component; import org.apache.avalon.ConfigurationException; import org.apache.avalon.Context; /** * Class used to configure tasks. * * @author Peter Donald */ public interface Configurer extends Component { /** * Configure an object based on a configuration in a particular context. * This configuring can be done in different ways for different * configurers. * * @param object the object * @param configuration the configuration * @param context the Context * @exception ConfigurationException if an error occurs */ void configure( Object object, Configuration configuration, Context context ) throws ConfigurationException; } 1.1 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/configuration/DefaultConfigurer.java Index: DefaultConfigurer.java =================================================================== /* * 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.configuration; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import org.apache.ant.convert.Converter; import org.apache.ant.convert.ConverterException; import org.apache.avalon.ComponentManager; import org.apache.avalon.ComponentNotAccessibleException; import org.apache.avalon.ComponentNotFoundException; import org.apache.avalon.Composer; import org.apache.avalon.ConfigurationException; import org.apache.avalon.Context; import org.apache.avalon.util.PropertyException; import org.apache.avalon.util.PropertyUtil; /** * Class used to configure tasks. * * @author Peter Donald */ public class DefaultConfigurer implements Configurer, Composer { protected final static String RESERVED_ATTRIBUTES[] = { "id" }; protected final static String RESERVED_ELEMENTS[] = { "content" }; protected Converter m_converter; public void compose( final ComponentManager componentManager ) throws ComponentNotFoundException, ComponentNotAccessibleException { 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 Object object, final Configuration configuration, final Context context ) throws ConfigurationException { if( object instanceof Configurable ) { ((Configurable)object).configure( configuration ); } else { final Iterator attributes = configuration.getAttributeNames(); while( attributes.hasNext() ) { final String name = (String)attributes.next(); final String value = configuration.getAttribute( name ); configureAttribute( object, name, value, context ); } final Iterator elements = configuration.getChildren(); while( elements.hasNext() ) { final Configuration element = (Configuration)elements.next(); configureElement( object, element, context ); } final String content = configuration.getValue( null ); if( null != content ) { if( !content.trim().equals( "" ) ) { configureContent( object, content, context ); } } } } /** * Try to configure content of an object. * * @param object the object * @param content the content value to be set * @param context the Context * @exception ConfigurationException if an error occurs */ protected void configureContent( final Object object, final String content, final Context context ) throws ConfigurationException { setValue( object, "addContent", content, context ); } protected void configureAttribute( final Object object, final String name, final String value, final Context context ) throws ConfigurationException { for( int i = 0; i < RESERVED_ATTRIBUTES.length; i++ ) { if( RESERVED_ATTRIBUTES[ i ].equals( name ) ) return; } final String methodName = getMethodNameFor( name ); setValue( object, methodName, value, context ); } protected void setValue( final Object object, final String methodName, final String value, final Context context ) throws ConfigurationException { // OMFG the rest of this is soooooooooooooooooooooooooooooooo // slow. Need to cache results per class etc. final Class clazz = object.getClass(); final Method methods[] = getMethodsFor( clazz, methodName ); if( 0 == methods.length ) { throw new ConfigurationException( "Unable to set attribute via " + methodName + " due to not finding any appropriate " + "accessor method" ); } setValue( object, value, context, methods ); } protected void setValue( final Object object, final String value, final Context context, final Method methods[] ) throws ConfigurationException { try { final Object objectValue = PropertyUtil.resolveProperty( value, context, false ); setValue( object, objectValue, methods ); } catch( final PropertyException pe ) { throw new ConfigurationException( "Error resolving property " + value, pe ); } } protected void setValue( final Object object, Object value, final Method methods[] ) throws ConfigurationException { final Class sourceClass = value.getClass(); final String source = sourceClass.getName(); for( int i = 0; i < methods.length; i++ ) { if( setValue( object, value, methods[ i ], sourceClass, source ) ) { return; } } throw new ConfigurationException( "Unable to set attribute via " + methods[ 0 ].getName() + " as could not convert " + source + " to a matching type" ); } protected boolean setValue( final Object object, Object value, final Method method, final Class sourceClass, final String source ) throws ConfigurationException { Class parameterType = method.getParameterTypes()[ 0 ]; if( parameterType.isPrimitive() ) { parameterType = getComplexTypeFor( parameterType ); } if( !parameterType.isAssignableFrom( sourceClass ) ) { try { value = m_converter.convert( parameterType, object ); } catch( final ConverterException ce ) { return false; } catch( final Exception e ) { throw new ConfigurationException( "Error converting attribute for " + method.getName(), e ); } } try { method.invoke( object, new Object[] { value } ); } catch( final IllegalAccessException iae ) { //should never happen .... throw new ConfigurationException( "Error retrieving methods with " + "correct access specifiers", iae ); } catch( final InvocationTargetException ite ) { throw new ConfigurationException( "Error calling method attribute " + method.getName(), ite ); } return true; } protected Class getComplexTypeFor( final Class clazz ) { if( String.class == clazz ) return String.class; else if( Integer.TYPE.equals( clazz ) ) return Integer.class; else if( Long.TYPE.equals( clazz ) ) return Long.class; else if( Short.TYPE.equals( clazz ) ) return Short.class; else if( Byte.TYPE.equals( clazz ) ) return Byte.class; else if( Boolean.TYPE.equals( clazz ) ) return Boolean.class; else if( Float.TYPE.equals( clazz ) ) return Float.class; else if( Double.TYPE.equals( clazz ) ) return Double.class; else { throw new IllegalArgumentException( "Can not get complex type for non-primitive " + "type " + clazz.getName() ); } } protected Method[] getMethodsFor( final Class clazz, final String methodName ) { final Method methods[] = clazz.getMethods(); final ArrayList matches = new ArrayList(); for( int i = 0; i < methods.length; i++ ) { final Method method = methods[ i ]; if( methodName.equals( method.getName() ) && Method.PUBLIC == (method.getModifiers() & Method.PUBLIC) ) { if( method.getReturnType().equals( Void.TYPE ) ) { final Class parameters[] = method.getParameterTypes(); if( 1 == parameters.length ) { matches.add( method ); } } } } return (Method[])matches.toArray( new Method[0] ); } protected Method[] getCreateMethodsFor( final Class clazz, final String methodName ) { final Method methods[] = clazz.getMethods(); final ArrayList matches = new ArrayList(); for( int i = 0; i < methods.length; i++ ) { final Method method = methods[ i ]; if( methodName.equals( method.getName() ) && Method.PUBLIC == (method.getModifiers() & Method.PUBLIC) ) { final Class returnType = method.getReturnType(); if( !returnType.equals( Void.TYPE ) && !returnType.isPrimitive() ) { final Class parameters[] = method.getParameterTypes(); if( 0 == parameters.length ) { matches.add( method ); } } } } return (Method[])matches.toArray( new Method[0] ); } protected String getMethodNameFor( final String attribute ) { return "set" + getJavaNameFor( attribute ); } protected String getJavaNameFor( final String name ) { final StringBuffer sb = new StringBuffer(); int index = name.indexOf( '-' ); int last = 0; while( -1 != index ) { final String word = name.substring( last, index ).toLowerCase(); sb.append( Character.toUpperCase( word.charAt( 0 ) ) ); sb.append( word.substring( 1, word.length() ) ); last = index + 1; index = name.indexOf( '-', last ); } index = name.length(); final String word = name.substring( last, index ).toLowerCase(); sb.append( Character.toUpperCase( word.charAt( 0 ) ) ); sb.append( word.substring( 1, word.length() ) ); return sb.toString(); } protected void configureElement( final Object object, final Configuration configuration, final Context context ) throws ConfigurationException { final String name = configuration.getName(); for( int i = 0; i < RESERVED_ELEMENTS.length; i++ ) { if( RESERVED_ATTRIBUTES[ i ].equals( name ) ) return; } final String javaName = getJavaNameFor( name ); // OMFG the rest of this is soooooooooooooooooooooooooooooooo // slow. Need to cache results per class etc. final Class clazz = object.getClass(); Method methods[] = getMethodsFor( clazz, "add" + javaName ); if( 0 != methods.length ) { //guess it is first method ???? addElement( object, methods[ 0 ], configuration, context ); } else { methods = getCreateMethodsFor( clazz, "create" + javaName ); if( 0 == methods.length ) { throw new ConfigurationException( "Unable to set attribute " + javaName + " due to not finding any appropriate " + "accessor method" ); } //guess it is first method ???? createElement( object, methods[ 0 ], configuration, context ); } } protected void createElement( final Object object, final Method method, final Configuration configuration, final Context context ) throws ConfigurationException { try { final Object created = method.invoke( object, new Object[ 0 ] ); configure( created, configuration, context ); } catch( final ConfigurationException ce ) { throw ce; } catch( final Exception e ) { throw new ConfigurationException( "Error creating sub-element", e ); } } protected void addElement( final Object object, final Method method, final Configuration configuration, final Context context ) throws ConfigurationException { try { final Class clazz = method.getParameterTypes()[ 0 ]; final Object created = clazz.newInstance(); configure( created, configuration, context ); method.invoke( object, new Object[] { created } ); } catch( final ConfigurationException ce ) { throw ce; } catch( final Exception e ) { throw new ConfigurationException( "Error creating sub-element", e ); } } } 1.2 +4 -4 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterEngine.java Index: ConverterEngine.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterEngine.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ConverterEngine.java 2000/12/06 06:11:24 1.1 +++ ConverterEngine.java 2000/12/11 00:33:39 1.2 @@ -8,13 +8,13 @@ package org.apache.ant.convert; import org.apache.avalon.Component; +import org.apache.avalon.Loggable; +import org.apache.avalon.camelot.LocatorRegistry; import org.apache.log.Logger; public interface ConverterEngine - extends Component, Converter + extends Component, Converter, Loggable { - void setLogger( Logger logger ); - + LocatorRegistry getLocatorRegistry(); ConverterRegistry getConverterRegistry(); - ConverterFactory getConverterFactory(); } 1.2 +0 -16 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterInfo.java Index: ConverterInfo.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterInfo.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ConverterInfo.java 2000/12/04 13:37:28 1.1 +++ ConverterInfo.java 2000/12/11 00:33:39 1.2 @@ -7,7 +7,6 @@ */ package org.apache.ant.convert; -import java.net.URL; import org.apache.avalon.camelot.Info; /** @@ -33,19 +32,4 @@ * @return the classname of the produced object */ 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.3 +3 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterRegistry.java Index: ConverterRegistry.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterRegistry.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ConverterRegistry.java 2000/12/06 00:23:21 1.2 +++ ConverterRegistry.java 2000/12/11 00:33:39 1.3 @@ -17,11 +17,12 @@ 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 destination the destination classname * @return the converter-info or null if none available */ - ConverterInfo getConverterInfo( String source, String destination ); + String getConverterInfoName( String source, String destination ); } 1.3 +25 -13 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterEngine.java Index: DefaultConverterEngine.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterEngine.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- DefaultConverterEngine.java 2000/12/06 10:35:58 1.2 +++ DefaultConverterEngine.java 2000/12/11 00:33:39 1.3 @@ -10,12 +10,17 @@ import org.apache.ant.AntException; import org.apache.avalon.Component; 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; public class DefaultConverterEngine implements ConverterEngine, Initializable { - protected ConverterFactory m_converterFactory; + protected DefaultFactory m_factory; + protected LocatorRegistry m_locatorRegistry; protected ConverterRegistry m_converterRegistry; protected Logger m_logger; @@ -24,48 +29,55 @@ 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() throws Exception { m_converterRegistry = createConverterRegistry(); - m_converterFactory = createConverterFactory(); + m_locatorRegistry = createLocatorRegistry(); + m_factory = createFactory(); } protected ConverterRegistry createConverterRegistry() { return new DefaultConverterRegistry(); } + + protected LocatorRegistry createLocatorRegistry() + { + return new DefaultLocatorRegistry(); + } - protected ConverterFactory createConverterFactory() + protected DefaultFactory createFactory() { - return new DefaultConverterFactory(); + return new DefaultFactory(); } public Object convert( Class destination, final Object original ) 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 " + original.getClass() + " to " + destination + " 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 ); } } 1.2 +1 -30 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterInfo.java Index: DefaultConverterInfo.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterInfo.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DefaultConverterInfo.java 2000/12/04 13:37:28 1.1 +++ DefaultConverterInfo.java 2000/12/11 00:33:39 1.2 @@ -7,8 +7,6 @@ */ package org.apache.ant.convert; -import java.net.URL; - /** * This info represents meta-information about a converter. * @@ -19,18 +17,11 @@ { protected final String m_source; 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_destination = destination; - m_classname = classname; - m_location = location; } /** @@ -53,26 +44,6 @@ public String getDestination() { 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.3 +3 -3 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterRegistry.java Index: DefaultConverterRegistry.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterRegistry.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- DefaultConverterRegistry.java 2000/12/06 00:23:22 1.2 +++ DefaultConverterRegistry.java 2000/12/11 00:33:39 1.3 @@ -30,11 +30,11 @@ * @param destination the destination classname * @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 ); if( null == map ) return null; - return (ConverterInfo)map.get( destination ); + return (String)map.get( destination ); } protected void checkInfo( final String name, final Info info ) @@ -53,7 +53,7 @@ m_mapping.put( source, map ); } - map.put( destination, info ); + map.put( destination, name ); } protected Class getInfoClass() 1.6 +36 -27 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java Index: DefaultTaskletEngine.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- DefaultTaskletEngine.java 2000/12/06 10:36:04 1.5 +++ DefaultTaskletEngine.java 2000/12/11 00:33:40 1.6 @@ -11,19 +11,25 @@ import org.apache.ant.AntException; import org.apache.ant.configuration.Configurable; 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.ConverterFactory; import org.apache.ant.tasklet.Tasklet; import org.apache.ant.tasklet.TaskletContext; import org.apache.avalon.Component; -import org.apache.avalon.Composer; import org.apache.avalon.ComponentManager; +import org.apache.avalon.Composer; import org.apache.avalon.Context; import org.apache.avalon.Contextualizable; import org.apache.avalon.DefaultComponentManager; import org.apache.avalon.Disposable; +import org.apache.avalon.Loggable; import org.apache.avalon.Initializable; +import org.apache.avalon.camelot.DefaultFactory; 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.log.Logger; @@ -31,9 +37,9 @@ implements TaskletEngine, Initializable { 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 ConverterEngine m_converterEngine; @@ -52,22 +58,23 @@ return m_converterEngine; } - public TaskletRegistry getTaskletRegistry() + public LocatorRegistry getLocatorRegistry() { - return m_taskletRegistry; + return m_locatorRegistry; } public void init() throws Exception { - m_taskletRegistry = createTaskletRegistry(); - m_taskletFactory = createTaskletFactory(); + m_locatorRegistry = createLocatorRegistry(); + m_factory = createFactory(); + setupSubComponent( m_factory ); m_converterEngine = createConverterEngine(); m_converterEngine.setLogger( m_logger ); setupSubComponent( m_converterEngine ); - m_configurer = createTaskletConfigurer(); + m_configurer = createConfigurer(); setupSubComponent( m_configurer ); m_tskDeployer = createTskDeployer(); @@ -78,6 +85,11 @@ protected void setupSubComponent( final Component component ) throws Exception { + if( component instanceof Loggable ) + { + ((Loggable)component).setLogger( m_logger ); + } + if( component instanceof Composer ) { final DefaultComponentManager componentManager = new DefaultComponentManager(); @@ -90,7 +102,7 @@ ((Composer)component).compose( componentManager ); } - + if( component instanceof Initializable ) { ((Initializable)component).init(); @@ -102,19 +114,19 @@ 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() @@ -122,7 +134,7 @@ //this is done so that the loaders are shared //which results in much less overhead final TaskletConverterEngine engine = new TaskletConverterEngine(); - engine.setConverterFactory( (ConverterFactory)m_taskletFactory ); + engine.setFactory( m_factory ); return engine; } @@ -236,21 +248,18 @@ throws AntException { 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 ) { throw new AntException( "Unable to locate task " + name, re ); } - - try { return m_taskletFactory.createTasklet( info ); } 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.2 +88 -181 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTskDeployer.java Index: DefaultTskDeployer.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTskDeployer.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DefaultTskDeployer.java 2000/12/06 06:11:26 1.1 +++ DefaultTskDeployer.java 2000/12/11 00:33:41 1.2 @@ -11,22 +11,26 @@ import java.io.IOException; import java.net.MalformedURLException; 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.ZipException; import java.util.zip.ZipFile; import org.apache.ant.convert.ConverterEngine; import org.apache.ant.convert.ConverterRegistry; import org.apache.ant.convert.DefaultConverterInfo; -import org.apache.ant.tasklet.engine.DefaultTaskletInfo; import org.apache.avalon.Component; import org.apache.avalon.ComponentManager; import org.apache.avalon.ComponentNotAccessibleException; import org.apache.avalon.ComponentNotFoundException; 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.Loader; +import org.apache.avalon.camelot.LocatorRegistry; import org.apache.avalon.camelot.RegistryException; import org.apache.log.Logger; @@ -36,20 +40,21 @@ * @author Peter Donald */ public class DefaultTskDeployer - extends AbstractDeployer + extends AbstractZipDeployer 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. */ public DefaultTskDeployer() { + super( false ); m_autoUndeploy = true; m_type = "Tasklet"; } @@ -67,12 +72,13 @@ final ConverterEngine converterEngine = (ConverterEngine)componentManager. lookup( "org.apache.ant.convert.ConverterEngine" ); - m_converterRegistry = converterEngine.getConverterRegistry(); + m_converterInfoRegistry = converterEngine.getConverterRegistry(); + m_converterRegistry = converterEngine.getLocatorRegistry(); final TaskletEngine taskletEngine = (TaskletEngine)componentManager. lookup( "org.apache.ant.tasklet.engine.TaskletEngine" ); - m_taskletRegistry = taskletEngine.getTaskletRegistry(); + m_taskletRegistry = taskletEngine.getLocatorRegistry(); } public void setLogger( final Logger logger ) @@ -80,50 +86,30 @@ 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 { - m_logger.info( "Deploying .tsk file (" + file + ") as " + location ); + final Configuration taskdefs = loadConfiguration( zipFile, TSKDEF_FILE ); - final ZipFile zipFile = getZipFileFor( file ); - 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 @@ { checkDeployment( location, 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; + } + } } - - handleConverter( name, value, url ); + catch( final ConfigurationException ce ) + { + throw new DeploymentException( "Malformed taskdefs.xml", ce ); + } } public void deployTasklet( final String name, final String location, final URL url ) @@ -148,109 +144,65 @@ { checkDeployment( location, 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 ) { - throw new DeploymentException( "Error registering converter " + + throw new DeploymentException( "Error registering converter locator " + name + " due to " + re, re ); } - + m_logger.debug( "Registered converter " + name + " that converts from " + 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 ); } catch( final RegistryException re ) @@ -260,50 +212,5 @@ } 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 - { } } 1.2 +5 -5 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletConverterEngine.java Index: TaskletConverterEngine.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletConverterEngine.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- TaskletConverterEngine.java 2000/12/06 06:11:26 1.1 +++ TaskletConverterEngine.java 2000/12/11 00:33:41 1.2 @@ -7,8 +7,8 @@ */ package org.apache.ant.tasklet.engine; -import org.apache.ant.convert.ConverterFactory; import org.apache.ant.convert.DefaultConverterEngine; +import org.apache.avalon.camelot.DefaultFactory; public class TaskletConverterEngine extends DefaultConverterEngine @@ -17,13 +17,13 @@ * Set the ConverterFactory. * 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; } } 1.5 +6 -6 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java Index: TaskletEngine.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- TaskletEngine.java 2000/12/06 06:11:26 1.4 +++ TaskletEngine.java 2000/12/11 00:33:41 1.5 @@ -12,7 +12,9 @@ import org.apache.ant.convert.ConverterEngine; import org.apache.ant.tasklet.TaskletContext; import org.apache.avalon.Component; +import org.apache.avalon.Loggable; import org.apache.avalon.ComponentManager; +import org.apache.avalon.camelot.LocatorRegistry; import org.apache.log.Logger; /** @@ -21,10 +23,8 @@ * @author Peter Donald */ public interface TaskletEngine - extends Component + extends Component, Loggable { - void setLogger( Logger logger ); - /** * Retrieve deployer for engine. * @@ -33,11 +33,11 @@ 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. 1.4 +3 -3 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java Index: TskDeployer.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- TskDeployer.java 2000/12/06 06:11:26 1.3 +++ TskDeployer.java 2000/12/11 00:33:41 1.4 @@ -8,6 +8,7 @@ package org.apache.ant.tasklet.engine; import java.net.URL; +import org.apache.avalon.Loggable; import org.apache.avalon.camelot.Deployer; import org.apache.avalon.camelot.DeploymentException; import org.apache.log.Logger; @@ -18,13 +19,12 @@ * @author Peter Donald */ public interface TskDeployer - extends Deployer + extends Deployer, Loggable { - void setLogger( Logger logger ); - void deployConverter( String name, String location, URL url ) throws DeploymentException; void deployTasklet( String name, String location, URL url ) throws DeploymentException; } + 1.2 +0 -1 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AbstractResourceRegisterer.java Index: AbstractResourceRegisterer.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AbstractResourceRegisterer.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- AbstractResourceRegisterer.java 2000/12/06 06:11:27 1.1 +++ AbstractResourceRegisterer.java 2000/12/11 00:33:42 1.2 @@ -12,7 +12,6 @@ import java.net.URL; import org.apache.ant.AntException; import org.apache.ant.tasklet.AbstractTasklet; -import org.apache.ant.tasklet.engine.DefaultTaskletInfo; import org.apache.ant.tasklet.engine.TaskletEngine; import org.apache.avalon.ComponentManager; import org.apache.avalon.ComponentNotAccessibleException; 1.2 +6 -2 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterConverter.java Index: RegisterConverter.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterConverter.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RegisterConverter.java 2000/12/06 06:11:27 1.1 +++ RegisterConverter.java 2000/12/11 00:33:43 1.2 @@ -11,8 +11,9 @@ import java.net.URL; import java.net.MalformedURLException; 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.DefaultConverterInfo; import org.apache.ant.tasklet.AbstractTasklet; import org.apache.ant.tasklet.engine.TaskletEngine; import org.apache.avalon.ComponentManager; @@ -106,12 +107,15 @@ else { 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 { m_engine.getConverterEngine(). getConverterRegistry().register( m_classname, info ); + m_engine.getConverterEngine(). + getLocatorRegistry().register( m_classname, locator ); } catch( final RegistryException re ) { 1.4 +3 -3 jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java Index: RegisterTasklet.java =================================================================== RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- RegisterTasklet.java 2000/12/06 06:11:27 1.3 +++ RegisterTasklet.java 2000/12/11 00:33:43 1.4 @@ -9,7 +9,7 @@ import java.net.URL; 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.RegistryException; @@ -36,8 +36,8 @@ } 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.1 jakarta-ant/proposal/myrmidon/src/manifest/taskdefs.xml Index: taskdefs.xml ===================================================================