From bba92ec2234c85ea1ff3ec3e4e2bb45adaaf3197 Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Tue, 12 Dec 2000 11:46:08 +0000 Subject: [PATCH] Added in the ability to deploy datatypes in properties. Datatypes are currently solely registered through taskdef.xml. Will in future be registered through tasks aswell. Made conditions (if/unless interpreted in a context) git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268342 13f79535-47bb-0310-9956-ffa450edef68 --- proposal/myrmidon/lib/avalonapi.jar | Bin 180861 -> 195012 bytes .../src/java/org/apache/ant/Main.java | 8 +- .../ant/configuration/DefaultConfigurer.java | 73 ++++++++--- .../apache/ant/convert/ConverterEngine.java | 4 +- .../ant/convert/DefaultConverterEngine.java | 44 ++++--- .../org/apache/ant/datatypes/Condition.java | 71 +++++++++++ .../org/apache/ant/datatypes/DataType.java | 22 ++++ .../apache/ant/datatypes/DataTypeEngine.java | 23 ++++ .../ant/datatypes/DefaultDataTypeEngine.java | 73 +++++++++++ .../org/apache/ant/datatypes/Pattern.java | 60 +++++++++ .../ant/project/DefaultProjectBuilder.java | 13 +- .../ant/project/DefaultProjectEngine.java | 21 ++- .../org/apache/ant/project/DefaultTarget.java | 33 ++--- ...r.java => LogTargetToListenerAdapter.java} | 4 +- .../java/org/apache/ant/project/Target.java | 4 +- .../apache/ant/tasklet/AbstractTasklet.java | 11 +- .../ant/tasklet/DefaultTaskletContext.java | 19 +-- .../java/org/apache/ant/tasklet/Tasklet.java | 3 +- .../apache/ant/tasklet/TaskletContext.java | 9 -- .../tasklet/engine/DefaultTaskletEngine.java | 64 +++++++--- .../tasklet/engine/DefaultTskDeployer.java | 46 ++++++- .../tasklet/engine/TaskletDataTypeEngine.java | 29 +++++ .../ant/tasklet/engine/TaskletEngine.java | 12 +- .../ant/tasklet/engine/TskDeployer.java | 5 +- .../org/apache/ant/tasks/core/AntCall.java | 19 ++- .../org/apache/ant/tasks/core/Property.java | 120 +++++++++++++++++- .../ant/tasks/core/RegisterConverter.java | 6 +- .../ant/tasks/core/RegisterTasklet.java | 2 +- proposal/myrmidon/src/make/sample.xmk | 21 ++- proposal/myrmidon/src/manifest/taskdefs.xml | 2 + 30 files changed, 674 insertions(+), 147 deletions(-) create mode 100644 proposal/myrmidon/src/java/org/apache/ant/datatypes/Condition.java create mode 100644 proposal/myrmidon/src/java/org/apache/ant/datatypes/DataType.java create mode 100644 proposal/myrmidon/src/java/org/apache/ant/datatypes/DataTypeEngine.java create mode 100644 proposal/myrmidon/src/java/org/apache/ant/datatypes/DefaultDataTypeEngine.java create mode 100644 proposal/myrmidon/src/java/org/apache/ant/datatypes/Pattern.java rename proposal/myrmidon/src/java/org/apache/ant/project/{ProjectToListenerAdapter.java => LogTargetToListenerAdapter.java} (88%) create mode 100644 proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletDataTypeEngine.java diff --git a/proposal/myrmidon/lib/avalonapi.jar b/proposal/myrmidon/lib/avalonapi.jar index f68bdb822912be6baa580fa9b55a52ccd0971361..8a8f6ad5cca1ffaebc8e02daec8dff8eb780d4d7 100644 GIT binary patch delta 52660 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%0AxLV2xMd(7?v+bEb8630j^FDGzeLT&~ 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 delta 39006 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 Donald */ public class DefaultConfigurer - implements Configurer, Composer + implements Configurer, Composer, Loggable { protected final static String RESERVED_ATTRIBUTES[] = { @@ -40,7 +42,14 @@ public class DefaultConfigurer "content" }; + protected final static boolean DEBUG = false; protected Converter m_converter; + protected Logger m_logger; + + public void setLogger( final Logger logger ) + { + m_logger = logger; + } public void compose( final ComponentManager componentManager ) throws ComponentNotFoundException, ComponentNotAccessibleException @@ -66,18 +75,39 @@ public class DefaultConfigurer final Context context ) throws ConfigurationException { + if( DEBUG ) + { + m_logger.debug( "Configuring " + object ); + } + if( object instanceof Configurable ) { + if( DEBUG ) + { + m_logger.debug( "Configuring object via Configurable interface" ); + } + ((Configurable)object).configure( configuration ); } else { - final Iterator attributes = configuration.getAttributeNames(); + if( DEBUG ) + { + m_logger.debug( "Configuring object via Configurable reflection" ); + } + final Iterator attributes = configuration.getAttributeNames(); while( attributes.hasNext() ) { final String name = (String)attributes.next(); final String value = configuration.getAttribute( name ); + + if( DEBUG ) + { + m_logger.debug( "Configuring attribute name=" + name + + " value=" + value ); + } + configureAttribute( object, name, value, context ); } @@ -86,6 +116,12 @@ public class DefaultConfigurer while( elements.hasNext() ) { final Configuration element = (Configuration)elements.next(); + + if( DEBUG ) + { + m_logger.debug( "Configuring subelement name=" + element.getName() ); + } + configureElement( object, element, context ); } @@ -95,6 +131,11 @@ public class DefaultConfigurer { if( !content.trim().equals( "" ) ) { + if( DEBUG ) + { + m_logger.debug( "Configuring content " + content ); + } + configureContent( object, content, context ); } } @@ -206,22 +247,24 @@ public class DefaultConfigurer parameterType = getComplexTypeFor( parameterType ); } - if( !parameterType.isAssignableFrom( sourceClass ) ) + try { - try - { - value = m_converter.convert( parameterType, object ); - } - catch( final ConverterException ce ) - { - return false; - } - catch( final Exception e ) + value = m_converter.convert( parameterType, value ); + } + catch( final ConverterException ce ) + { + if( DEBUG ) { - throw new ConfigurationException( "Error converting attribute for " + - method.getName(), - e ); + m_logger.debug( "Failed to find converter ", ce ); } + + return false; + } + catch( final Exception e ) + { + throw new ConfigurationException( "Error converting attribute for " + + method.getName(), + e ); } try diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterEngine.java b/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterEngine.java index 8dff694f4..08b2b7485 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterEngine.java +++ b/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterEngine.java @@ -15,6 +15,6 @@ import org.apache.log.Logger; public interface ConverterEngine extends Component, Converter, Loggable { - LocatorRegistry getLocatorRegistry(); - ConverterRegistry getConverterRegistry(); + LocatorRegistry getRegistry(); + ConverterRegistry getInfoRegistry(); } diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterEngine.java b/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterEngine.java index 4a16b3c55..daabefe2c 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterEngine.java +++ b/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterEngine.java @@ -19,9 +19,10 @@ import org.apache.log.Logger; public class DefaultConverterEngine implements ConverterEngine, Initializable { + protected final static boolean DEBUG = false; protected DefaultFactory m_factory; - protected LocatorRegistry m_locatorRegistry; - protected ConverterRegistry m_converterRegistry; + protected LocatorRegistry m_registry; + protected ConverterRegistry m_infoRegistry; protected Logger m_logger; public void setLogger( final Logger logger ) @@ -29,30 +30,30 @@ public class DefaultConverterEngine m_logger = logger; } - public LocatorRegistry getLocatorRegistry() + public LocatorRegistry getRegistry() { - return m_locatorRegistry; + return m_registry; } - public ConverterRegistry getConverterRegistry() + public ConverterRegistry getInfoRegistry() { - return m_converterRegistry; + return m_infoRegistry; } public void init() throws Exception { - m_converterRegistry = createConverterRegistry(); - m_locatorRegistry = createLocatorRegistry(); + m_infoRegistry = createInfoRegistry(); + m_registry = createRegistry(); m_factory = createFactory(); } - protected ConverterRegistry createConverterRegistry() + protected ConverterRegistry createInfoRegistry() { return new DefaultConverterRegistry(); } - protected LocatorRegistry createLocatorRegistry() + protected LocatorRegistry createRegistry() { return new DefaultLocatorRegistry(); } @@ -65,18 +66,31 @@ public class DefaultConverterEngine public Object convert( Class destination, final Object original ) throws Exception { + final Class originalClass = original.getClass(); + + if( destination.isAssignableFrom( originalClass ) ) + { + return original; + } + + if( DEBUG ) + { + m_logger.debug( "Looking for converter from " + originalClass.getName() + + " to " + destination.getName() ); + } + final String name = - m_converterRegistry.getConverterInfoName( original.getClass().getName(), - destination.getName() ); + m_infoRegistry.getConverterInfoName( originalClass.getName(), + destination.getName() ); if( null == name ) { throw new ConverterException( "Unable to find converter for " + - original.getClass() + " to " + destination + - " conversion" ); + originalClass.getName() + " to " + + destination.getName() + " conversion" ); } - final Locator locator = m_locatorRegistry.getLocator( name ); + final Locator locator = m_registry.getLocator( name ); final Converter converter = (Converter)m_factory.create( locator, Converter.class ); return converter.convert( destination, original ); } diff --git a/proposal/myrmidon/src/java/org/apache/ant/datatypes/Condition.java b/proposal/myrmidon/src/java/org/apache/ant/datatypes/Condition.java new file mode 100644 index 000000000..c22f73eca --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/ant/datatypes/Condition.java @@ -0,0 +1,71 @@ +/* + * 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.datatypes; + +import org.apache.ant.AntException; +import org.apache.avalon.Component; +import org.apache.avalon.Context; +import org.apache.avalon.util.PropertyException; +import org.apache.avalon.util.PropertyUtil; + +/** + * Class representing a condition. + * + * @author Peter Donald + */ +public class Condition + implements Component +{ + protected String m_condition; + protected boolean m_isIfCondition; + + public Condition( final boolean isIfCondition, final String condition ) + { + m_isIfCondition = isIfCondition; + m_condition = condition; + } + + public String getCondition() + { + return m_condition; + } + + public boolean isIfCondition() + { + return m_isIfCondition; + } + + public boolean evaluate( final Context context ) + { + try + { + final Object resolved = + PropertyUtil.resolveProperty( m_condition, context, false ); + + boolean result = false; + + if( null != resolved ) + { + result = ( null != context.get( resolved ) ); + } + + if( !m_isIfCondition ) + { + result = !result; + } + + return result; + } + catch( final PropertyException pe ) + { + throw new AntException( "Error resolving " + m_condition, pe ); + } + } +} + + diff --git a/proposal/myrmidon/src/java/org/apache/ant/datatypes/DataType.java b/proposal/myrmidon/src/java/org/apache/ant/datatypes/DataType.java new file mode 100644 index 000000000..48a9e311f --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/ant/datatypes/DataType.java @@ -0,0 +1,22 @@ +/* + * 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.datatypes; + +import org.apache.avalon.Component; + +/** + * Base class for those classes that can appear inside the build file + * as stand alone data types. + * + * @author Stefan Bodewig + * @author Peter Donald + */ +public interface DataType + extends Component +{ +} diff --git a/proposal/myrmidon/src/java/org/apache/ant/datatypes/DataTypeEngine.java b/proposal/myrmidon/src/java/org/apache/ant/datatypes/DataTypeEngine.java new file mode 100644 index 000000000..db51c1458 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/ant/datatypes/DataTypeEngine.java @@ -0,0 +1,23 @@ +/* + * 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.datatypes; + +import org.apache.avalon.Component; +import org.apache.avalon.Loggable; +import org.apache.avalon.camelot.FactoryException; +import org.apache.avalon.camelot.LocatorRegistry; +import org.apache.avalon.camelot.RegistryException; + +public interface DataTypeEngine + extends Component, Loggable +{ + LocatorRegistry getRegistry(); + + DataType createDataType( String name ) + throws RegistryException, FactoryException; +} diff --git a/proposal/myrmidon/src/java/org/apache/ant/datatypes/DefaultDataTypeEngine.java b/proposal/myrmidon/src/java/org/apache/ant/datatypes/DefaultDataTypeEngine.java new file mode 100644 index 000000000..3dc2f1cc4 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/ant/datatypes/DefaultDataTypeEngine.java @@ -0,0 +1,73 @@ +/* + * 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.datatypes; + +import org.apache.ant.AntException; +import org.apache.avalon.Initializable; +import org.apache.avalon.Loggable; +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.avalon.camelot.RegistryException; +import org.apache.avalon.camelot.FactoryException; +import org.apache.log.Logger; + +public class DefaultDataTypeEngine + implements DataTypeEngine, Initializable +{ + protected DefaultFactory m_factory; + protected LocatorRegistry m_registry; + protected Logger m_logger; + + public void setLogger( final Logger logger ) + { + m_logger = logger; + } + + public LocatorRegistry getRegistry() + { + return m_registry; + } + + public void init() + throws Exception + { + m_registry = createRegistry(); + setupComponent( m_registry ); + + m_factory = createFactory(); + setupComponent( m_factory ); + } + + protected void setupComponent( final Object object ) + throws Exception + { + if( object instanceof Loggable ) + { + ((Loggable)object).setLogger( m_logger ); + } + } + + protected LocatorRegistry createRegistry() + { + return new DefaultLocatorRegistry(); + } + + protected DefaultFactory createFactory() + { + return new DefaultFactory(); + } + + public DataType createDataType( final String name ) + throws RegistryException, FactoryException + { + final Locator locator = m_registry.getLocator( name ); + return (DataType)m_factory.create( locator, DataType.class ); + } +} diff --git a/proposal/myrmidon/src/java/org/apache/ant/datatypes/Pattern.java b/proposal/myrmidon/src/java/org/apache/ant/datatypes/Pattern.java new file mode 100644 index 000000000..ca64161ee --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/ant/datatypes/Pattern.java @@ -0,0 +1,60 @@ +/* + * 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.datatypes; + +import org.apache.ant.AntException; + +/** + * Basic data type for holding patterns. + * + * @author Peter Donald + */ +public class Pattern + implements DataType +{ + protected String m_name; + protected Condition m_condition; + + public String getName() + { + return m_name; + } + + public Condition getCondition() + { + return m_condition; + } + + public void setName( final String name ) + { + m_name = name; + } + + public void setIf( final String condition ) + throws AntException + { + verifyConditionNull(); + m_condition = new Condition( true, condition ); + } + + public void setUnless( final String condition ) + throws AntException + { + verifyConditionNull(); + m_condition = new Condition( false, condition ); + } + + protected void verifyConditionNull() + throws AntException + { + if( null != m_condition ) + { + throw new AntException( "Can only set one of if/else for pattern data type" ); + } + } +} diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectBuilder.java b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectBuilder.java index ab760516a..2978cbb05 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectBuilder.java +++ b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectBuilder.java @@ -13,6 +13,7 @@ import java.util.Iterator; import org.apache.ant.AntException; import org.apache.ant.configuration.Configuration; import org.apache.ant.configuration.ConfigurationBuilder; +import org.apache.ant.datatypes.Condition; import org.apache.ant.tasklet.TaskletContext; import org.apache.avalon.ConfigurationException; import org.apache.log.Logger; @@ -133,21 +134,21 @@ public class DefaultProjectBuilder "unless condition at " + configuration.getLocation() ); } - final DefaultTarget target = new DefaultTarget(); - + Condition condition = null; + if( null != ifCondition ) { m_logger.debug( "Target if condition: " + ifCondition ); - target.setIfCondition( true ); - target.setCondition( ifCondition ); + condition = new Condition( true, ifCondition ); } else if( null != unlessCondition ) { m_logger.debug( "Target unless condition: " + unlessCondition ); - target.setIfCondition( false ); - target.setCondition( unlessCondition ); + condition = new Condition( false, unlessCondition ); } + final DefaultTarget target = new DefaultTarget( condition ); + if( null != depends ) { int start = 0; diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java index e6374c897..836a52817 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java +++ b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Iterator; import org.apache.ant.AntException; import org.apache.ant.configuration.Configuration; +import org.apache.ant.datatypes.Condition; import org.apache.ant.tasklet.DefaultTaskletContext; import org.apache.ant.tasklet.TaskletContext; import org.apache.ant.tasklet.engine.DefaultTaskletEngine; @@ -100,13 +101,9 @@ public class DefaultProjectEngine m_listenerSupport.projectStarted( projectName ); - executeTargetWork( "", project.getImplicitTarget(), context ); - //context = new DefaultTaskletContext( context ); - - //placing logger lower (at targetlevel or at task level) - //is possible if you want more fine grained control - context.setProperty( TaskletContext.LOGGER, m_logger ); + + executeTargetWork( "", project.getImplicitTarget(), context ); execute( project, target, context ); @@ -168,6 +165,18 @@ public class DefaultProjectEngine final Target target, final TaskletContext context ) { + final Condition condition = target.getCondition(); + + if( null != condition ) + { + if( false == condition.evaluate( context ) ) + { + m_logger.debug( "Skipping target " + name + + " as it does not satisfy condition" ); + return; + } + } + m_logger.debug( "Executing target " + name ); final Iterator tasks = target.getTasks(); diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultTarget.java b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultTarget.java index 242062aa5..952fc3c7f 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultTarget.java +++ b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultTarget.java @@ -10,43 +10,38 @@ package org.apache.ant.project; import java.util.ArrayList; import java.util.Iterator; import org.apache.ant.configuration.Configuration; +import org.apache.ant.datatypes.Condition; public class DefaultTarget implements Target { - protected ArrayList m_dependencies = new ArrayList(); - protected ArrayList m_tasks = new ArrayList(); - protected String m_condition; - protected boolean m_isIfCondition; + protected final ArrayList m_dependencies = new ArrayList(); + protected final ArrayList m_tasks = new ArrayList(); + protected final Condition m_condition; - public Iterator getDependencies() + public DefaultTarget( final Condition condition ) { - return m_dependencies.iterator(); + m_condition = condition; } - public Iterator getTasks() + public DefaultTarget() { - return m_tasks.iterator(); + this( null ); } - public String getCondition() + public Condition getCondition() { return m_condition; } - - public void setCondition( final String condition ) - { - m_condition = condition; - } - - public boolean isIfCondition() + + public Iterator getDependencies() { - return m_isIfCondition; + return m_dependencies.iterator(); } - public void setIfCondition( final boolean isIfCondition ) + public Iterator getTasks() { - m_isIfCondition = isIfCondition; + return m_tasks.iterator(); } public void addDependency( final String dependency ) diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/ProjectToListenerAdapter.java b/proposal/myrmidon/src/java/org/apache/ant/project/LogTargetToListenerAdapter.java similarity index 88% rename from proposal/myrmidon/src/java/org/apache/ant/project/ProjectToListenerAdapter.java rename to proposal/myrmidon/src/java/org/apache/ant/project/LogTargetToListenerAdapter.java index d9d1a8206..0b32ee08a 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/project/ProjectToListenerAdapter.java +++ b/proposal/myrmidon/src/java/org/apache/ant/project/LogTargetToListenerAdapter.java @@ -10,13 +10,13 @@ package org.apache.ant.project; import org.apache.log.LogEntry; import org.apache.log.LogTarget; -public class ProjectToListenerAdapter +public class LogTargetToListenerAdapter implements LogTarget { protected final ProjectListener m_listener; - public ProjectToListenerAdapter( final ProjectListener listener ) + public LogTargetToListenerAdapter( final ProjectListener listener ) { m_listener = listener; } diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/Target.java b/proposal/myrmidon/src/java/org/apache/ant/project/Target.java index 1697f98c9..419e8c91c 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/project/Target.java +++ b/proposal/myrmidon/src/java/org/apache/ant/project/Target.java @@ -9,14 +9,14 @@ package org.apache.ant.project; import java.util.Iterator; import org.apache.avalon.Component; +import org.apache.ant.datatypes.Condition; public interface Target extends Component { Iterator getDependencies(); Iterator getTasks(); - String getCondition(); - boolean isIfCondition(); + Condition getCondition(); } diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/AbstractTasklet.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/AbstractTasklet.java index d381f811b..32288933b 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/AbstractTasklet.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/AbstractTasklet.java @@ -26,6 +26,16 @@ public abstract class AbstractTasklet private TaskletContext m_context; private Logger m_logger; + /** + * Receive logger from container. + * + * @param logger the logger + */ + public void setLogger( final Logger logger ) + { + m_logger = logger; + } + /** * Retrieve context from container. * @@ -34,7 +44,6 @@ public abstract class AbstractTasklet public void contextualize( final Context context ) { m_context = (TaskletContext)context; - m_logger = (Logger)m_context.getLogger(); } /** diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/DefaultTaskletContext.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/DefaultTaskletContext.java index 3f7e53675..f5cb60b0a 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/DefaultTaskletContext.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/DefaultTaskletContext.java @@ -13,7 +13,6 @@ import org.apache.avalon.DefaultContext; import org.apache.avalon.util.PropertyException; import org.apache.avalon.util.PropertyUtil; import org.apache.avalon.util.io.FileUtil; -import org.apache.log.Logger; /** * Default implementation of TaskletContext. @@ -68,16 +67,6 @@ public class DefaultTaskletContext return (String)get( NAME ); } - /** - * Retrieve Logger associated with task. - * - * @return the logger - */ - public Logger getLogger() - { - return (Logger)get( LOGGER ); - } - /** * Retrieve base directory. * @@ -209,13 +198,7 @@ public class DefaultTaskletContext protected void checkPropertyValid( final String name, final Object value ) throws AntException { - if( LOGGER.equals( name ) && !( value instanceof Logger ) ) - { - throw new AntException( "property " + LOGGER + - " must have a value of type " + - Logger.class.getName() ); - } - else if( BASE_DIRECTORY.equals( name ) && !( value instanceof File ) ) + if( BASE_DIRECTORY.equals( name ) && !( value instanceof File ) ) { throw new AntException( "Property " + BASE_DIRECTORY + " must have a value of type " + diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/Tasklet.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/Tasklet.java index cb31a5df4..1a643c1f2 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/Tasklet.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/Tasklet.java @@ -9,6 +9,7 @@ package org.apache.ant.tasklet; import org.apache.avalon.Component; import org.apache.avalon.Contextualizable; +import org.apache.avalon.Loggable; /** * This represents the individual tasks. @@ -23,6 +24,6 @@ import org.apache.avalon.Contextualizable; * @author Peter Donald */ public interface Tasklet - extends Component, Contextualizable, Runnable + extends Component, Contextualizable, Runnable, Loggable { } diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/TaskletContext.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/TaskletContext.java index 3c089d7d0..7f641de9f 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/TaskletContext.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/TaskletContext.java @@ -11,7 +11,6 @@ import java.io.File; import org.apache.avalon.Context; import org.apache.avalon.util.Enum; import org.apache.avalon.util.ValuedEnum; -import org.apache.log.Logger; /** * This represents the *Context* in which a task can be executed. @@ -30,7 +29,6 @@ public interface TaskletContext //these are the names of properties that every TaskContext must contain String JAVA_VERSION = "ant.java.version"; String BASE_DIRECTORY = "ant.base.directory"; - String LOGGER = "ant.logger"; String NAME = "ant.task.name"; /** @@ -46,13 +44,6 @@ public interface TaskletContext * @return the name */ String getName(); - - /** - * Retrieve Logger associated with task. - * - * @return the logger - */ - Logger getLogger(); /** * Retrieve base directory. diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java index 133f4ef65..fd2f16a6f 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java @@ -14,6 +14,7 @@ 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.datatypes.DataTypeEngine; import org.apache.ant.tasklet.Tasklet; import org.apache.ant.tasklet.TaskletContext; import org.apache.avalon.Component; @@ -23,13 +24,13 @@ 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.Loggable; import org.apache.avalon.camelot.DefaultFactory; +import org.apache.avalon.camelot.DefaultLocatorRegistry; 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.LocatorRegistry; import org.apache.avalon.camelot.RegistryException; import org.apache.log.Logger; @@ -41,6 +42,7 @@ public class DefaultTaskletEngine protected LocatorRegistry m_locatorRegistry; protected Configurer m_configurer; protected Logger m_logger; + protected DataTypeEngine m_dataTypeEngine; protected ConverterEngine m_converterEngine; public void setLogger( final Logger logger ) @@ -58,27 +60,41 @@ public class DefaultTaskletEngine return m_converterEngine; } - public LocatorRegistry getLocatorRegistry() + public LocatorRegistry getRegistry() { return m_locatorRegistry; } + /** + * Retrieve datatype engine. + * + * @return the DataTypeEngine + */ + public DataTypeEngine getDataTypeEngine() + { + return m_dataTypeEngine; + } + public void init() throws Exception { - m_locatorRegistry = createLocatorRegistry(); - m_factory = createFactory(); - setupSubComponent( m_factory ); - + //converter must be created before configurerer + //so that it gets placed in configurers componentManager m_converterEngine = createConverterEngine(); - m_converterEngine.setLogger( m_logger ); setupSubComponent( m_converterEngine ); m_configurer = createConfigurer(); setupSubComponent( m_configurer ); + m_locatorRegistry = createLocatorRegistry(); + m_factory = createFactory(); + setupSubComponent( m_factory ); + + m_dataTypeEngine = createDataTypeEngine(); + setupSubComponent( m_dataTypeEngine ); + + m_tskDeployer = createTskDeployer(); - m_tskDeployer.setLogger( m_logger ); setupSubComponent( m_tskDeployer ); } @@ -93,10 +109,10 @@ public class DefaultTaskletEngine if( component instanceof Composer ) { final DefaultComponentManager componentManager = new DefaultComponentManager(); - componentManager.put( "org.apache.ant.convert.Converter", - getConverterEngine() ); - componentManager.put( "org.apache.ant.convert.ConverterEngine", + componentManager.put( "org.apache.ant.convert.Converter", getConverterEngine() ); + componentManager.put( "org.apache.ant.configuration.Configurer", + m_configurer ); componentManager.put( "org.apache.ant.tasklet.engine.TaskletEngine", this ); @@ -108,6 +124,13 @@ public class DefaultTaskletEngine ((Initializable)component).init(); } } + + protected DataTypeEngine createDataTypeEngine() + { + final TaskletDataTypeEngine engine = new TaskletDataTypeEngine(); + engine.setFactory( m_factory ); + return engine; + } protected TskDeployer createTskDeployer() { @@ -143,9 +166,9 @@ public class DefaultTaskletEngine final ComponentManager componentManager ) throws AntException { - m_logger.debug( "Creating" ); - final Tasklet tasklet = createTasklet( task ); + final Tasklet tasklet = createTasklet( task.getName() ); + tasklet.setLogger( m_logger ); m_logger.debug( "Contextualizing" ); doContextualize( tasklet, task, context ); @@ -185,9 +208,15 @@ public class DefaultTaskletEngine final ComponentManager componentManager ) throws AntException { + + final DefaultComponentManager subComponentManager = + new DefaultComponentManager( componentManager ); + + subComponentManager.put( "org.apache.ant.configuration.Configurer", m_configurer ); + if( tasklet instanceof Composer ) { - try { ((Composer)tasklet).compose( componentManager ); } + try { ((Composer)tasklet).compose( subComponentManager ); } catch( final Throwable throwable ) { throw new AntException( "Error composing task " + task.getName() + " at " + @@ -244,10 +273,9 @@ public class DefaultTaskletEngine } } - protected Tasklet createTasklet( final Configuration configuration ) + protected Tasklet createTasklet( final String name ) throws AntException { - final String name = configuration.getName(); try { final Locator locator = m_locatorRegistry.getLocator( name ); diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTskDeployer.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTskDeployer.java index 7db41ded3..c83494c5f 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTskDeployer.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTskDeployer.java @@ -45,6 +45,7 @@ public class DefaultTskDeployer { protected final static String TSKDEF_FILE = "TASK-LIB/taskdefs.xml"; + protected LocatorRegistry m_dataTypeRegistry; protected LocatorRegistry m_taskletRegistry; protected LocatorRegistry m_converterRegistry; protected ConverterRegistry m_converterInfoRegistry; @@ -69,16 +70,17 @@ public class DefaultTskDeployer public void compose( final ComponentManager componentManager ) throws ComponentNotFoundException, ComponentNotAccessibleException { - final ConverterEngine converterEngine = (ConverterEngine)componentManager. - lookup( "org.apache.ant.convert.ConverterEngine" ); - - m_converterInfoRegistry = converterEngine.getConverterRegistry(); - m_converterRegistry = converterEngine.getLocatorRegistry(); - final TaskletEngine taskletEngine = (TaskletEngine)componentManager. lookup( "org.apache.ant.tasklet.engine.TaskletEngine" ); - m_taskletRegistry = taskletEngine.getLocatorRegistry(); + final ConverterEngine converterEngine = taskletEngine.getConverterEngine(); + + m_converterInfoRegistry = converterEngine.getInfoRegistry(); + m_converterRegistry = converterEngine.getRegistry(); + + m_taskletRegistry = taskletEngine.getRegistry(); + + m_dataTypeRegistry = taskletEngine.getDataTypeEngine().getRegistry(); } public void setLogger( final Logger logger ) @@ -106,6 +108,13 @@ public class DefaultTskDeployer final Configuration converter = (Configuration)converters.next(); handleConverter( converter, url ); } + + final Iterator datatypes = taskdefs.getChildren( "datatype" ); + while( datatypes.hasNext() ) + { + final Configuration datatype = (Configuration)datatypes.next(); + handleDataType( datatype, url ); + } } catch( final ConfigurationException ce ) { @@ -138,6 +147,11 @@ public class DefaultTskDeployer throw new DeploymentException( "Malformed taskdefs.xml", ce ); } } + + public void deployDataType( final String name, final String location, final URL url ) + throws DeploymentException + { + } public void deployTasklet( final String name, final String location, final URL url ) throws DeploymentException @@ -213,4 +227,22 @@ public class DefaultTskDeployer m_logger.debug( "Registered tasklet " + name + " as " + classname ); } + + protected void handleDataType( final Configuration datatype, final URL url ) + throws DeploymentException, ConfigurationException + { + final String name = datatype.getAttribute( "name" ); + final String classname = datatype.getAttribute( "classname" ); + + final DefaultLocator info = new DefaultLocator( classname, url ); + + try { m_dataTypeRegistry.register( name, info ); } + catch( final RegistryException re ) + { + throw new DeploymentException( "Error registering " + name + " due to " + re, + re ); + } + + m_logger.debug( "Registered datatype " + name + " as " + classname ); + } } diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletDataTypeEngine.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletDataTypeEngine.java new file mode 100644 index 000000000..11d53bb06 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletDataTypeEngine.java @@ -0,0 +1,29 @@ +/* + * 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.datatypes.DefaultDataTypeEngine; +import org.apache.avalon.camelot.DefaultFactory; + +public class TaskletDataTypeEngine + extends DefaultDataTypeEngine +{ + /** + * Set the DataTypeFactory. + * Package access intended. + */ + void setFactory( final DefaultFactory factory ) + { + m_factory = factory; + } + + protected DefaultFactory createFactory() + { + return m_factory; + } +} diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java index d1026ee46..8419c1c60 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java @@ -10,10 +10,11 @@ package org.apache.ant.tasklet.engine; import org.apache.ant.AntException; import org.apache.ant.configuration.Configuration; import org.apache.ant.convert.ConverterEngine; +import org.apache.ant.datatypes.DataTypeEngine; 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.Loggable; import org.apache.avalon.camelot.LocatorRegistry; import org.apache.log.Logger; @@ -37,7 +38,7 @@ public interface TaskletEngine * * @return the LocatorRegistry */ - LocatorRegistry getLocatorRegistry(); + LocatorRegistry getRegistry(); /** * Retrieve converter engine. @@ -46,6 +47,13 @@ public interface TaskletEngine */ ConverterEngine getConverterEngine(); + /** + * Retrieve datatype engine. + * + * @return the DataTypeEngine + */ + DataTypeEngine getDataTypeEngine(); + /** * execute a task. * diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java index dad49a5da..89d706acb 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java @@ -23,7 +23,10 @@ public interface TskDeployer { void deployConverter( String name, String location, URL url ) throws DeploymentException; - + + void deployDataType( String name, String location, URL url ) + throws DeploymentException; + void deployTasklet( String name, String location, URL url ) throws DeploymentException; } diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AntCall.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AntCall.java index b0c019bac..291372294 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AntCall.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AntCall.java @@ -15,6 +15,7 @@ import org.apache.ant.tasklet.AbstractTasklet; import org.apache.ant.tasklet.DefaultTaskletContext; import org.apache.ant.tasklet.TaskletContext; import org.apache.avalon.ComponentManager; +import org.apache.avalon.Context; import org.apache.avalon.ComponentNotAccessibleException; import org.apache.avalon.ComponentNotFoundException; import org.apache.avalon.Composer; @@ -32,10 +33,19 @@ public class AntCall protected Project m_project; protected String m_target; protected ArrayList m_properties = new ArrayList(); + protected TaskletContext m_childContext; + protected ComponentManager m_componentManager; + + public void contextualize( final Context context ) + { + super.contextualize( context ); + m_childContext = new DefaultTaskletContext( getContext() ); + } public void compose( final ComponentManager componentManager ) throws ComponentNotFoundException, ComponentNotAccessibleException { + m_componentManager = componentManager; m_projectEngine = (ProjectEngine)componentManager. lookup( "org.apache.ant.project.ProjectEngine" ); m_project = (Project)componentManager.lookup( "org.apache.ant.project.Project" ); @@ -47,8 +57,12 @@ public class AntCall } public Property createParam() + throws Exception { final Property property = new Property(); + property.setLogger( getLogger() ); + property.contextualize( m_childContext ); + property.compose( m_componentManager ); m_properties.add( property ); return property; } @@ -61,17 +75,14 @@ public class AntCall throw new AntException( "Target attribute must be specified" ); } - final TaskletContext context = new DefaultTaskletContext( getContext() ); - final int size = m_properties.size(); for( int i = 0; i < size; i++ ) { final Property property = (Property)m_properties.get( i ); - property.contextualize( context ); property.run(); } getLogger().info( "Calling target " + m_target ); - m_projectEngine.execute( m_project, m_target, context ); + m_projectEngine.execute( m_project, m_target, m_childContext ); } } diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/Property.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/Property.java index dcf2a892d..8c819c32d 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/Property.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/Property.java @@ -7,27 +7,130 @@ */ package org.apache.ant.tasks.core; +import java.util.Iterator; 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.convert.Converter; +import org.apache.ant.datatypes.DataType; +import org.apache.ant.datatypes.DataTypeEngine; import org.apache.ant.tasklet.AbstractTasklet; import org.apache.ant.tasklet.TaskletContext; +import org.apache.ant.tasklet.engine.TaskletEngine; +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.Resolvable; /** * @author Peter Donald */ public class Property extends AbstractTasklet + implements Configurable, Composer { protected String m_name; - protected String m_value; + protected Object m_value; protected boolean m_localScope = true; + protected DataTypeEngine m_engine; + protected Converter m_converter; + protected Configurer m_configurer; + + public void compose( final ComponentManager componentManager ) + throws ComponentNotFoundException, ComponentNotAccessibleException + { + m_configurer = (Configurer)componentManager. + lookup( "org.apache.ant.configuration.Configurer" ); + + final TaskletEngine taskletEngine = (TaskletEngine)componentManager. + lookup( "org.apache.ant.tasklet.engine.TaskletEngine" ); + + m_engine = taskletEngine.getDataTypeEngine(); + m_converter = taskletEngine.getConverterEngine(); + } + + public void configure( final Configuration configuration ) + throws ConfigurationException + { + final Iterator attributes = configuration.getAttributeNames(); + + while( attributes.hasNext() ) + { + final String name = (String)attributes.next(); + final String value = configuration.getAttribute( name ); + + final Object object = getContext().resolveValue( value ); + + if( null == object ) + { + throw new AntException( "Value for attribute " + name + "resolved to null" ); + } + + if( name.equals( "name" ) ) + { + try { setName( (String)m_converter.convert( String.class, object ) ); } + catch( final Exception e ) + { + throw new ConfigurationException( "Error converting value", e ); + } + } + else if( name.equals( "value" ) ) + { + setValue( object ); + } + else if( name.equals( "local-scope" ) ) + { + try + { + final Boolean localScope = + (Boolean)m_converter.convert( Boolean.class, object ); + setLocalScope( Boolean.TRUE == localScope ); + } + catch( final Exception e ) + { + throw new ConfigurationException( "Error converting value", e ); + } + } + else + { + throw new ConfigurationException( "Unknown attribute " + name ); + } + } + + final Iterator children = configuration.getChildren(); + while( children.hasNext() ) + { + final Configuration child = (Configuration)children.next(); + + try + { + final DataType value = m_engine.createDataType( child.getName() ); + setValue( value ); + m_configurer.configure( value, child, getContext() ); + } + catch( final Exception e ) + { + throw new ConfigurationException( "Unable to set datatype", e ); + } + } + } public void setName( final String name ) { m_name = name; } - public void setValue( final String value ) + public void setValue( final Object value ) + throws AntException { + if( null != m_value ) + { + throw new AntException( "Value can not be set multiple times" ); + } + m_value = value; } @@ -50,7 +153,18 @@ public class Property } final TaskletContext context = getContext(); - final Object value = context.resolveValue( m_value ); + + Object value = m_value; + + if( value instanceof String ) + { + value = context.resolveValue( (String)value ); + } + + while( null != value && value instanceof Resolvable ) + { + value = ((Resolvable)value).resolve( context ); + } if( m_localScope ) { diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterConverter.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterConverter.java index f2aeda607..ee5874cf4 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterConverter.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterConverter.java @@ -112,10 +112,8 @@ public class RegisterConverter try { - m_engine.getConverterEngine(). - getConverterRegistry().register( m_classname, info ); - m_engine.getConverterEngine(). - getLocatorRegistry().register( m_classname, locator ); + m_engine.getConverterEngine().getInfoRegistry().register( m_classname, info ); + m_engine.getConverterEngine().getRegistry().register( m_classname, locator ); } catch( final RegistryException re ) { diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java index 5b9c12236..ddecb0168 100644 --- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java +++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java @@ -37,7 +37,7 @@ public class RegisterTasklet else { final DefaultLocator locator = new DefaultLocator( classname, url ); - m_engine.getLocatorRegistry().register( name, locator ); + m_engine.getRegistry().register( name, locator ); } } } diff --git a/proposal/myrmidon/src/make/sample.xmk b/proposal/myrmidon/src/make/sample.xmk index 67fb3d9e2..00e7316a2 100644 --- a/proposal/myrmidon/src/make/sample.xmk +++ b/proposal/myrmidon/src/make/sample.xmk @@ -20,12 +20,13 @@ Legal: - - + + + + + + + - + @@ -77,6 +78,12 @@ Legal: + + + + + + diff --git a/proposal/myrmidon/src/manifest/taskdefs.xml b/proposal/myrmidon/src/manifest/taskdefs.xml index f3a10589d..eb5d6f226 100644 --- a/proposal/myrmidon/src/manifest/taskdefs.xml +++ b/proposal/myrmidon/src/manifest/taskdefs.xml @@ -9,6 +9,8 @@ + +