where it was. * Changed PropertyResolver.resolveProperties() to use a PropertyStore, rather than a TaskContext. * Changed PropertyStore methods to throw a TaskException. * Changed contract of PropertyStore.getProperty() to throw exception if the requested property is not set. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272288 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -101,6 +101,7 @@ public class DefaultEmbeddor | |||||
| projectType = FileUtil.getExtension( location ); | projectType = FileUtil.getExtension( location ); | ||||
| } | } | ||||
| // TODO - reuse the project builders, or dispose them | |||||
| final ProjectBuilder builder = getProjectBuilder( projectType, parameters ); | final ProjectBuilder builder = getProjectBuilder( projectType, parameters ); | ||||
| return builder.build( location ); | return builder.build( location ); | ||||
| } | } | ||||
| @@ -136,6 +137,8 @@ public class DefaultEmbeddor | |||||
| // to the workspace | // to the workspace | ||||
| parameters.setParameter( MYRMIDON_HOME, m_parameters.getParameter( MYRMIDON_HOME ) ); | parameters.setParameter( MYRMIDON_HOME, m_parameters.getParameter( MYRMIDON_HOME ) ); | ||||
| setupObject( workspace, m_workspaceServiceManager, parameters ); | setupObject( workspace, m_workspaceServiceManager, parameters ); | ||||
| // TODO - should keep track of workspaces, to dispose them later | |||||
| return workspace; | return workspace; | ||||
| } | } | ||||
| @@ -145,7 +148,7 @@ public class DefaultEmbeddor | |||||
| * @param name The shorthand name of the listener. | * @param name The shorthand name of the listener. | ||||
| * @return the listener. | * @return the listener. | ||||
| */ | */ | ||||
| public ProjectListener createListener( String name ) | |||||
| public ProjectListener createListener( final String name ) | |||||
| throws Exception | throws Exception | ||||
| { | { | ||||
| final TypeFactory factory = m_typeManager.getFactory( ProjectListener.ROLE ); | final TypeFactory factory = m_typeManager.getFactory( ProjectListener.ROLE ); | ||||
| @@ -8,7 +8,8 @@ | |||||
| package org.apache.myrmidon.components.property; | package org.apache.myrmidon.components.property; | ||||
| import org.apache.myrmidon.interfaces.property.PropertyResolver; | import org.apache.myrmidon.interfaces.property.PropertyResolver; | ||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.interfaces.property.PropertyStore; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | /** | ||||
| * A {@link PropertyResolver} implementation which resolves properties | * A {@link PropertyResolver} implementation which resolves properties | ||||
| @@ -28,19 +29,16 @@ public class ClassicPropertyResolver | |||||
| * If there is no such value, returns the original property reference. | * If there is no such value, returns the original property reference. | ||||
| * | * | ||||
| * @param propertyName the name of the property to retrieve | * @param propertyName the name of the property to retrieve | ||||
| * @param context the set of known properties | |||||
| * @param properties the set of known properties | |||||
| */ | */ | ||||
| protected Object getPropertyValue( final String propertyName, | protected Object getPropertyValue( final String propertyName, | ||||
| final TaskContext context ) | |||||
| final PropertyStore properties ) | |||||
| throws TaskException | |||||
| { | { | ||||
| Object propertyValue = context.getProperty( propertyName ); | |||||
| if ( propertyValue == null ) | |||||
| if( ! properties.isPropertySet( propertyName ) ) | |||||
| { | { | ||||
| return "${" + propertyName + "}"; | return "${" + propertyName + "}"; | ||||
| } | } | ||||
| else | |||||
| { | |||||
| return propertyValue; | |||||
| } | |||||
| return properties.getProperty( propertyName ); | |||||
| } | } | ||||
| } | } | ||||
| @@ -14,9 +14,9 @@ import org.apache.avalon.excalibur.i18n.Resources; | |||||
| import org.apache.avalon.framework.service.ServiceException; | import org.apache.avalon.framework.service.ServiceException; | ||||
| import org.apache.avalon.framework.service.ServiceManager; | import org.apache.avalon.framework.service.ServiceManager; | ||||
| import org.apache.avalon.framework.service.Serviceable; | import org.apache.avalon.framework.service.Serviceable; | ||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
| import org.apache.myrmidon.interfaces.property.PropertyResolver; | import org.apache.myrmidon.interfaces.property.PropertyResolver; | ||||
| import org.apache.myrmidon.interfaces.property.PropertyStore; | |||||
| /** | /** | ||||
| * Base class for PropertyResolver implementations. | * Base class for PropertyResolver implementations. | ||||
| @@ -51,12 +51,12 @@ public class DefaultPropertyResolver | |||||
| * <code>toString()</code> called on the property value. | * <code>toString()</code> called on the property value. | ||||
| * | * | ||||
| * @param content the property to resolve | * @param content the property to resolve | ||||
| * @param context the context in which to resolve property | |||||
| * @param properties the context in which to resolve property | |||||
| * @return the reolved property | * @return the reolved property | ||||
| * @exception TaskException if an error occurs | * @exception TaskException if an error occurs | ||||
| */ | */ | ||||
| public Object resolveProperties( final String content, | public Object resolveProperties( final String content, | ||||
| final TaskContext context ) | |||||
| final PropertyStore properties ) | |||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| int start = findNextProperty( content, 0 ); | int start = findNextProperty( content, 0 ); | ||||
| @@ -72,7 +72,7 @@ public class DefaultPropertyResolver | |||||
| if( 0 == start && end == ( length - 1 ) ) | if( 0 == start && end == ( length - 1 ) ) | ||||
| { | { | ||||
| return getPropertyValue( content.substring( start + 2, end ), | return getPropertyValue( content.substring( start + 2, end ), | ||||
| context ); | |||||
| properties ); | |||||
| } | } | ||||
| final StringBuffer sb = new StringBuffer( length * 2 ); | final StringBuffer sb = new StringBuffer( length * 2 ); | ||||
| @@ -82,7 +82,7 @@ public class DefaultPropertyResolver | |||||
| { | { | ||||
| final String propertyValue = | final String propertyValue = | ||||
| getPropertyStringValue( content.substring( start + 2, end ), | getPropertyStringValue( content.substring( start + 2, end ), | ||||
| context ); | |||||
| properties ); | |||||
| sb.append( content.substring( lastPlace, start ) ); | sb.append( content.substring( lastPlace, start ) ); | ||||
| sb.append( propertyValue ); | sb.append( propertyValue ); | ||||
| @@ -108,12 +108,12 @@ public class DefaultPropertyResolver | |||||
| * substitutions based on specified context. | * substitutions based on specified context. | ||||
| * | * | ||||
| * @param content the property to resolve | * @param content the property to resolve | ||||
| * @param context the context in which to resolve property | |||||
| * @param properties the context in which to resolve property | |||||
| * @return the reolved property | * @return the reolved property | ||||
| * @exception TaskException if an error occurs | * @exception TaskException if an error occurs | ||||
| */ | */ | ||||
| private Object recursiveResolveProperty( final String content, | private Object recursiveResolveProperty( final String content, | ||||
| final TaskContext context ) | |||||
| final PropertyStore properties ) | |||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| int start = findNextProperty( content, 0 ); | int start = findNextProperty( content, 0 ); | ||||
| @@ -129,8 +129,8 @@ public class DefaultPropertyResolver | |||||
| if( 0 == start && end == ( length - 1 ) ) | if( 0 == start && end == ( length - 1 ) ) | ||||
| { | { | ||||
| final String propertyName = content.substring( start + 2, end ); | final String propertyName = content.substring( start + 2, end ); | ||||
| final Object key = recursiveResolveProperty( propertyName, context ); | |||||
| return getPropertyValue( key.toString(), context ); | |||||
| final Object key = recursiveResolveProperty( propertyName, properties ); | |||||
| return getPropertyValue( key.toString(), properties ); | |||||
| } | } | ||||
| final StringBuffer sb = new StringBuffer( length * 2 ); | final StringBuffer sb = new StringBuffer( length * 2 ); | ||||
| @@ -140,8 +140,8 @@ public class DefaultPropertyResolver | |||||
| while( true ) | while( true ) | ||||
| { | { | ||||
| final String propertyName = content.substring( start + 2, end ); | final String propertyName = content.substring( start + 2, end ); | ||||
| final Object key = recursiveResolveProperty( propertyName, context ); | |||||
| final String value = getPropertyStringValue( key.toString(), context ); | |||||
| final Object key = recursiveResolveProperty( propertyName, properties ); | |||||
| final String value = getPropertyStringValue( key.toString(), properties ); | |||||
| sb.append( content.substring( lastPlace, start ) ); | sb.append( content.substring( lastPlace, start ) ); | ||||
| sb.append( value ); | sb.append( value ); | ||||
| @@ -246,17 +246,17 @@ public class DefaultPropertyResolver | |||||
| * Returns a property's value, converted to a String. | * Returns a property's value, converted to a String. | ||||
| */ | */ | ||||
| private String getPropertyStringValue( final String propertyName, | private String getPropertyStringValue( final String propertyName, | ||||
| final TaskContext context ) | |||||
| final PropertyStore properties ) | |||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| final Object value = getPropertyValue( propertyName, context ); | |||||
| final Object value = getPropertyValue( propertyName, properties ); | |||||
| if( value instanceof String ) | if( value instanceof String ) | ||||
| { | { | ||||
| return (String)value; | return (String)value; | ||||
| } | } | ||||
| try | try | ||||
| { | { | ||||
| return (String)m_converter.convert( String.class, value, context ); | |||||
| return (String)m_converter.convert( String.class, value, properties ); | |||||
| } | } | ||||
| catch( final ConverterException e ) | catch( final ConverterException e ) | ||||
| { | { | ||||
| @@ -268,24 +268,15 @@ public class DefaultPropertyResolver | |||||
| * Retrieve a value from the specified context using the specified key. | * Retrieve a value from the specified context using the specified key. | ||||
| * | * | ||||
| * @param propertyName the key of value in context | * @param propertyName the key of value in context | ||||
| * @param context the set of known properties | |||||
| * @param properties the set of known properties | |||||
| * @return the object retrieved from context | * @return the object retrieved from context | ||||
| * @exception TaskException if the property is undefined | * @exception TaskException if the property is undefined | ||||
| */ | */ | ||||
| protected Object getPropertyValue( final String propertyName, | protected Object getPropertyValue( final String propertyName, | ||||
| final TaskContext context ) | |||||
| final PropertyStore properties ) | |||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| Object propertyValue = context.getProperty( propertyName ); | |||||
| if ( propertyValue == null ) | |||||
| { | |||||
| final String message = REZ.getString( "prop.missing-value.error", propertyName ); | |||||
| throw new TaskException( message ); | |||||
| } | |||||
| else | |||||
| { | |||||
| return propertyValue; | |||||
| } | |||||
| return properties.getProperty( propertyName ); | |||||
| } | } | ||||
| } | } | ||||
| @@ -17,7 +17,7 @@ import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
| import org.apache.myrmidon.interfaces.model.DefaultNameValidator; | import org.apache.myrmidon.interfaces.model.DefaultNameValidator; | ||||
| import org.apache.myrmidon.interfaces.model.NameValidator; | import org.apache.myrmidon.interfaces.model.NameValidator; | ||||
| import org.apache.myrmidon.interfaces.store.PropertyStore; | |||||
| import org.apache.myrmidon.interfaces.property.PropertyStore; | |||||
| /** | /** | ||||
| * This is the Default implementation of PropertyStore. It follows | * This is the Default implementation of PropertyStore. It follows | ||||
| @@ -32,7 +32,7 @@ import org.apache.myrmidon.interfaces.store.PropertyStore; | |||||
| * | * | ||||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | * @author <a href="mailto:peter@apache.org">Peter Donald</a> | ||||
| * @version $Revision$ $Date$ | * @version $Revision$ $Date$ | ||||
| * @see PropertyStore | |||||
| * @see org.apache.myrmidon.interfaces.property.PropertyStore | |||||
| */ | */ | ||||
| public class DefaultPropertyStore | public class DefaultPropertyStore | ||||
| implements PropertyStore | implements PropertyStore | ||||
| @@ -61,15 +61,17 @@ public class DefaultPropertyStore | |||||
| */ | */ | ||||
| public DefaultPropertyStore() | public DefaultPropertyStore() | ||||
| { | { | ||||
| this( null, null ); | |||||
| this( "", null, null ); | |||||
| } | } | ||||
| /** | /** | ||||
| * Construct a PropertyStore with specified parent. | * Construct a PropertyStore with specified parent. | ||||
| * | * | ||||
| * @param parent the parent PropertyStore (may be null) | |||||
| * @param parent the parent PropertyStore (may be null). | |||||
| * @param validator the validator to use to check property names (may be null). | |||||
| */ | */ | ||||
| public DefaultPropertyStore( final PropertyStore parent, | |||||
| public DefaultPropertyStore( final String name, | |||||
| final PropertyStore parent, | |||||
| final NameValidator validator ) | final NameValidator validator ) | ||||
| { | { | ||||
| m_parent = parent; | m_parent = parent; | ||||
| @@ -82,6 +84,7 @@ public class DefaultPropertyStore | |||||
| m_validator = candidateValidator; | m_validator = candidateValidator; | ||||
| m_contextData.put( TaskContext.NAME, name ); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -91,10 +94,10 @@ public class DefaultPropertyStore | |||||
| * | * | ||||
| * @param name the name of property | * @param name the name of property | ||||
| * @param value the value of property | * @param value the value of property | ||||
| * @throws Exception if property can not be set | |||||
| * @throws TaskException if property can not be set | |||||
| */ | */ | ||||
| public void setProperty( final String name, final Object value ) | public void setProperty( final String name, final Object value ) | ||||
| throws Exception | |||||
| throws TaskException | |||||
| { | { | ||||
| checkPropertyName( name ); | checkPropertyName( name ); | ||||
| checkPropertyValid( name, value ); | checkPropertyValid( name, value ); | ||||
| @@ -118,11 +121,8 @@ public class DefaultPropertyStore | |||||
| { | { | ||||
| try | try | ||||
| { | { | ||||
| final Object value = getProperty( name ); | |||||
| if( null != value ) | |||||
| { | |||||
| return true; | |||||
| } | |||||
| getProperty( name ); | |||||
| return true; | |||||
| } | } | ||||
| catch( Exception e ) | catch( Exception e ) | ||||
| { | { | ||||
| @@ -136,18 +136,24 @@ public class DefaultPropertyStore | |||||
| * | * | ||||
| * @param name the name of the property | * @param name the name of the property | ||||
| * @return the value of the property, or null if no such property | * @return the value of the property, or null if no such property | ||||
| * @throws Exception if theres an error retrieving property, such | |||||
| * @throws TaskException if theres an error retrieving property, such | |||||
| * as an invalid property name | * as an invalid property name | ||||
| */ | */ | ||||
| public Object getProperty( String name ) | |||||
| throws Exception | |||||
| public Object getProperty( final String name ) | |||||
| throws TaskException | |||||
| { | { | ||||
| Object value = m_contextData.get( name ); | Object value = m_contextData.get( name ); | ||||
| if( value == null && m_parent != null ) | |||||
| if( value != null ) | |||||
| { | |||||
| return value; | |||||
| } | |||||
| if( m_parent != null ) | |||||
| { | { | ||||
| value = m_parent.getProperty( name ); | |||||
| return m_parent.getProperty( name ); | |||||
| } | } | ||||
| return value; | |||||
| final String message = REZ.getString( "unknown-prop.error", name ); | |||||
| throw new TaskException( message ); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -156,10 +162,10 @@ public class DefaultPropertyStore | |||||
| * | * | ||||
| * @return a copy of all the properties that are "in-scope" | * @return a copy of all the properties that are "in-scope" | ||||
| * for store. | * for store. | ||||
| * @throws Exception if theres an error retrieving propertys | |||||
| * @throws TaskException if theres an error retrieving propertys | |||||
| */ | */ | ||||
| public Map getProperties() | public Map getProperties() | ||||
| throws Exception | |||||
| throws TaskException | |||||
| { | { | ||||
| final Map properties = new HashMap(); | final Map properties = new HashMap(); | ||||
| if( m_parent != null ) | if( m_parent != null ) | ||||
| @@ -178,17 +184,28 @@ public class DefaultPropertyStore | |||||
| * | * | ||||
| * @param name the name of child store | * @param name the name of child store | ||||
| * @return the child store | * @return the child store | ||||
| * @throws Exception if theres an error creating child store | |||||
| * @throws TaskException if theres an error creating child store | |||||
| */ | */ | ||||
| public PropertyStore createChildStore( final String name ) | public PropertyStore createChildStore( final String name ) | ||||
| throws Exception | |||||
| throws TaskException | |||||
| { | { | ||||
| final DefaultPropertyStore store = new DefaultPropertyStore( this, m_validator ); | |||||
| final String newName = getProperty( TaskContext.NAME ) + "." + name; | |||||
| store.setProperty( TaskContext.NAME, newName ); | |||||
| // Build the name for the new store | |||||
| final String thisName = (String)m_contextData.get( TaskContext.NAME ); | |||||
| final String newName; | |||||
| if( name == null || name.length() == 0 ) | |||||
| { | |||||
| newName = thisName; | |||||
| } | |||||
| else if( thisName.length() == 0 ) | |||||
| { | |||||
| newName = name; | |||||
| } | |||||
| else | |||||
| { | |||||
| newName = thisName + "." + name; | |||||
| } | |||||
| return store; | |||||
| return new DefaultPropertyStore( newName, this, m_validator ); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -203,7 +220,7 @@ public class DefaultPropertyStore | |||||
| } | } | ||||
| catch( Exception e ) | catch( Exception e ) | ||||
| { | { | ||||
| String message = REZ.getString( "bad-property-name.error" ); | |||||
| String message = REZ.getString( "bad-property-name.error", name ); | |||||
| throw new TaskException( message, e ); | throw new TaskException( message, e ); | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,5 +1,5 @@ | |||||
| unknown-prop.error=Unknown property {0}. | |||||
| bad-property.error=Property {0} must have a value of type {1}. | |||||
| bad-property-name.error=Invalid property name. | |||||
| unknown-prop.error=Unknown property "{0}". | |||||
| bad-property.error=Property "{0}" must have a value of type {1}. | |||||
| bad-property-name.error=Invalid property name "{0}". | |||||
| null-resolved-value.error=Value "{0}" resolved to null. | null-resolved-value.error=Value "{0}" resolved to null. | ||||
| bad-resolve.error=Unable to resolve value "{0}". | bad-resolve.error=Unable to resolve value "{0}". | ||||
| @@ -19,7 +19,7 @@ import org.apache.avalon.framework.service.ServiceManager; | |||||
| import org.apache.myrmidon.api.TaskContext; | import org.apache.myrmidon.api.TaskContext; | ||||
| import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
| import org.apache.myrmidon.interfaces.property.PropertyResolver; | import org.apache.myrmidon.interfaces.property.PropertyResolver; | ||||
| import org.apache.myrmidon.interfaces.store.PropertyStore; | |||||
| import org.apache.myrmidon.interfaces.property.PropertyStore; | |||||
| /** | /** | ||||
| * Default implementation of TaskContext. | * Default implementation of TaskContext. | ||||
| @@ -44,7 +44,6 @@ public class DefaultTaskContext | |||||
| public DefaultTaskContext( final ServiceManager serviceManager, | public DefaultTaskContext( final ServiceManager serviceManager, | ||||
| final Logger logger, | final Logger logger, | ||||
| final PropertyStore store ) | final PropertyStore store ) | ||||
| throws TaskException | |||||
| { | { | ||||
| m_serviceManager = serviceManager; | m_serviceManager = serviceManager; | ||||
| m_logger = logger; | m_logger = logger; | ||||
| @@ -150,7 +149,7 @@ public class DefaultTaskContext | |||||
| m_propertyResolver = (PropertyResolver)getService( PropertyResolver.class ); | m_propertyResolver = (PropertyResolver)getService( PropertyResolver.class ); | ||||
| } | } | ||||
| final Object object = | final Object object = | ||||
| m_propertyResolver.resolveProperties( value, this ); | |||||
| m_propertyResolver.resolveProperties( value, m_store ); | |||||
| if( null == object ) | if( null == object ) | ||||
| { | { | ||||
| final String message = REZ.getString( "null-resolved-value.error", value ); | final String message = REZ.getString( "null-resolved-value.error", value ); | ||||
| @@ -192,14 +191,7 @@ public class DefaultTaskContext | |||||
| public Map getProperties() | public Map getProperties() | ||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| try | |||||
| { | |||||
| return m_store.getProperties(); | |||||
| } | |||||
| catch( final Exception e ) | |||||
| { | |||||
| throw new TaskException( e.getMessage(), e ); | |||||
| } | |||||
| return m_store.getProperties(); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -211,14 +203,7 @@ public class DefaultTaskContext | |||||
| public void setProperty( final String name, final Object value ) | public void setProperty( final String name, final Object value ) | ||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| try | |||||
| { | |||||
| m_store.setProperty( name, value ); | |||||
| } | |||||
| catch( final Exception e ) | |||||
| { | |||||
| throw new TaskException( e.getMessage(), e ); | |||||
| } | |||||
| m_store.setProperty( name, value ); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -387,18 +372,11 @@ public class DefaultTaskContext | |||||
| public TaskContext createSubContext( final String name ) | public TaskContext createSubContext( final String name ) | ||||
| throws TaskException | throws TaskException | ||||
| { | { | ||||
| try | |||||
| { | |||||
| final PropertyStore store = m_store.createChildStore( name ); | |||||
| final DefaultServiceManager serviceManager = | |||||
| new DefaultServiceManager( m_serviceManager ); | |||||
| final Logger logger = m_logger.getChildLogger( name ); | |||||
| final PropertyStore store = m_store.createChildStore( name ); | |||||
| final DefaultServiceManager serviceManager = | |||||
| new DefaultServiceManager( m_serviceManager ); | |||||
| final Logger logger = m_logger.getChildLogger( name ); | |||||
| return new DefaultTaskContext( serviceManager, logger, store ); | |||||
| } | |||||
| catch( final Exception e ) | |||||
| { | |||||
| throw new TaskException( e.getMessage(), e ); | |||||
| } | |||||
| return new DefaultTaskContext( serviceManager, logger, store ); | |||||
| } | } | ||||
| } | } | ||||
| @@ -37,7 +37,7 @@ import org.apache.myrmidon.interfaces.model.Target; | |||||
| import org.apache.myrmidon.interfaces.model.TypeLib; | import org.apache.myrmidon.interfaces.model.TypeLib; | ||||
| import org.apache.myrmidon.interfaces.type.TypeManager; | import org.apache.myrmidon.interfaces.type.TypeManager; | ||||
| import org.apache.myrmidon.interfaces.workspace.Workspace; | import org.apache.myrmidon.interfaces.workspace.Workspace; | ||||
| import org.apache.myrmidon.interfaces.store.PropertyStore; | |||||
| import org.apache.myrmidon.interfaces.property.PropertyStore; | |||||
| import org.apache.myrmidon.listeners.ProjectListener; | import org.apache.myrmidon.listeners.ProjectListener; | ||||
| import org.apache.myrmidon.components.store.DefaultPropertyStore; | import org.apache.myrmidon.components.store.DefaultPropertyStore; | ||||
| @@ -227,6 +227,8 @@ public class DefaultWorkspace | |||||
| final TypeManager typeManager = m_typeManager.createChildTypeManager(); | final TypeManager typeManager = m_typeManager.createChildTypeManager(); | ||||
| serviceManager.put( TypeManager.ROLE, typeManager ); | serviceManager.put( TypeManager.ROLE, typeManager ); | ||||
| // TODO - Add child role manager | |||||
| //We need to create a new deployer so that it deploys | //We need to create a new deployer so that it deploys | ||||
| //to project specific TypeManager | //to project specific TypeManager | ||||
| final Deployer deployer = m_deployer.createChildDeployer( serviceManager ); | final Deployer deployer = m_deployer.createChildDeployer( serviceManager ); | ||||
| @@ -427,6 +429,7 @@ public class DefaultWorkspace | |||||
| getLogger().debug( message ); | getLogger().debug( message ); | ||||
| } | } | ||||
| //TODO - put this back in | |||||
| //frame.getContext().setProperty( Project.TARGET, target ); | //frame.getContext().setProperty( Project.TARGET, target ); | ||||
| // Execute all tasks assciated with target | // Execute all tasks assciated with target | ||||
| @@ -8,7 +8,6 @@ | |||||
| package org.apache.myrmidon.interfaces.property; | package org.apache.myrmidon.interfaces.property; | ||||
| import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| /** | /** | ||||
| * | * | ||||
| @@ -31,11 +30,11 @@ public interface PropertyResolver | |||||
| * Rules used for property resolution are implementation dependent. | * Rules used for property resolution are implementation dependent. | ||||
| * | * | ||||
| * @param value the value to resolve, which may contain property identifiers | * @param value the value to resolve, which may contain property identifiers | ||||
| * @param context the set of properties to resolve against. | |||||
| * @param properties the set of properties to resolve against. | |||||
| * @return the resolved content | * @return the resolved content | ||||
| * @exception TaskException if an error occurs | * @exception TaskException if an error occurs | ||||
| */ | */ | ||||
| Object resolveProperties( final String value, | Object resolveProperties( final String value, | ||||
| final TaskContext context ) | |||||
| final PropertyStore properties ) | |||||
| throws TaskException; | throws TaskException; | ||||
| } | } | ||||
| @@ -5,9 +5,10 @@ | |||||
| * version 1.1, a copy of which has been included with this distribution in | * version 1.1, a copy of which has been included with this distribution in | ||||
| * the LICENSE.txt file. | * the LICENSE.txt file. | ||||
| */ | */ | ||||
| package org.apache.myrmidon.interfaces.store; | |||||
| package org.apache.myrmidon.interfaces.property; | |||||
| import java.util.Map; | import java.util.Map; | ||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | /** | ||||
| * This component stores and manages properties. It is also | * This component stores and manages properties. It is also | ||||
| @@ -36,10 +37,10 @@ public interface PropertyStore | |||||
| * | * | ||||
| * @param name the name of property | * @param name the name of property | ||||
| * @param value the value of property | * @param value the value of property | ||||
| * @throws Exception if property can not be set | |||||
| * @throws TaskException if property can not be set | |||||
| */ | */ | ||||
| void setProperty( String name, Object value ) | void setProperty( String name, Object value ) | ||||
| throws Exception; | |||||
| throws TaskException; | |||||
| /** | /** | ||||
| * Return <code>true</code> if the specified property is set. | * Return <code>true</code> if the specified property is set. | ||||
| @@ -50,15 +51,14 @@ public interface PropertyStore | |||||
| /** | /** | ||||
| * Retrieve the value of specified property. | * Retrieve the value of specified property. | ||||
| * Will return null if no such property exists. | |||||
| * | * | ||||
| * @param name the name of the property | * @param name the name of the property | ||||
| * @return the value of the property, or null if no such property | |||||
| * @throws Exception if theres an error retrieving property, such | |||||
| * as an invalid property name | |||||
| * @return the value of the property. Never returns null. | |||||
| * @throws TaskException if there is no such property, or on error | |||||
| * retrieving property, such as an invalid property name. | |||||
| */ | */ | ||||
| Object getProperty( String name ) | Object getProperty( String name ) | ||||
| throws Exception; | |||||
| throws TaskException; | |||||
| /** | /** | ||||
| * Retrieve a copy of all the properties that are "in-scope" | * Retrieve a copy of all the properties that are "in-scope" | ||||
| @@ -66,10 +66,10 @@ public interface PropertyStore | |||||
| * | * | ||||
| * @return a copy of all the properties that are "in-scope" | * @return a copy of all the properties that are "in-scope" | ||||
| * for store. | * for store. | ||||
| * @throws Exception if theres an error retrieving propertys | |||||
| * @throws TaskException if theres an error retrieving propertys | |||||
| */ | */ | ||||
| Map getProperties() | Map getProperties() | ||||
| throws Exception; | |||||
| throws TaskException; | |||||
| /** | /** | ||||
| * Return a child PropertyStore with specified name. | * Return a child PropertyStore with specified name. | ||||
| @@ -79,8 +79,8 @@ public interface PropertyStore | |||||
| * | * | ||||
| * @param name the name of child store | * @param name the name of child store | ||||
| * @return the child store | * @return the child store | ||||
| * @throws Exception if theres an error creating child store | |||||
| * @throws TaskException if theres an error creating child store | |||||
| */ | */ | ||||
| PropertyStore createChildStore( String name ) | PropertyStore createChildStore( String name ) | ||||
| throws Exception; | |||||
| throws TaskException; | |||||
| } | } | ||||
| @@ -13,6 +13,7 @@ import org.apache.avalon.excalibur.i18n.Resources; | |||||
| import org.apache.myrmidon.AbstractProjectTest; | import org.apache.myrmidon.AbstractProjectTest; | ||||
| import org.apache.myrmidon.LogMessageTracker; | import org.apache.myrmidon.LogMessageTracker; | ||||
| import org.apache.myrmidon.components.workspace.DefaultTaskContext; | import org.apache.myrmidon.components.workspace.DefaultTaskContext; | ||||
| import org.apache.myrmidon.components.store.DefaultPropertyStore; | |||||
| /** | /** | ||||
| * Test cases for <property> task. | * Test cases for <property> task. | ||||
| @@ -98,18 +99,29 @@ public class PropertyTestCase | |||||
| { | { | ||||
| final File projectFile = getTestResource( "property.ant" ); | final File projectFile = getTestResource( "property.ant" ); | ||||
| final Resources contextResources | |||||
| = ResourceManager.getPackageResources( DefaultTaskContext.class ); | |||||
| final Resources rez | |||||
| = ResourceManager.getPackageResources( DefaultPropertyStore.class ); | |||||
| // Invalid names | // Invalid names | ||||
| String[] messages = new String[] | String[] messages = new String[] | ||||
| { | { | ||||
| null, | null, | ||||
| contextResources.getString( "bad-property-name.error" ), | |||||
| null | |||||
| rez.getString( "bad-property-name.error", "badname!" ) | |||||
| }; | }; | ||||
| executeTargetExpectError( projectFile, "bad-prop-name1", messages ); | executeTargetExpectError( projectFile, "bad-prop-name1", messages ); | ||||
| messages = new String[] | |||||
| { | |||||
| null, | |||||
| rez.getString( "bad-property-name.error", "bad name" ) | |||||
| }; | |||||
| executeTargetExpectError( projectFile, "bad-prop-name2", messages ); | executeTargetExpectError( projectFile, "bad-prop-name2", messages ); | ||||
| messages = new String[] | |||||
| { | |||||
| null, | |||||
| rez.getString( "bad-property-name.error", "" ) | |||||
| }; | |||||
| executeTargetExpectError( projectFile, "bad-prop-name3", messages ); | executeTargetExpectError( projectFile, "bad-prop-name3", messages ); | ||||
| } | } | ||||
| @@ -11,13 +11,12 @@ import java.io.File; | |||||
| import java.util.Date; | import java.util.Date; | ||||
| import org.apache.aut.converter.lib.ObjectToStringConverter; | import org.apache.aut.converter.lib.ObjectToStringConverter; | ||||
| import org.apache.avalon.excalibur.i18n.Resources; | import org.apache.avalon.excalibur.i18n.Resources; | ||||
| import org.apache.avalon.framework.service.DefaultServiceManager; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
| import org.apache.myrmidon.components.AbstractComponentTest; | import org.apache.myrmidon.components.AbstractComponentTest; | ||||
| import org.apache.myrmidon.components.property.DefaultPropertyResolver; | |||||
| import org.apache.myrmidon.components.store.DefaultPropertyStore; | import org.apache.myrmidon.components.store.DefaultPropertyStore; | ||||
| import org.apache.myrmidon.components.workspace.DefaultTaskContext; | |||||
| import org.apache.myrmidon.interfaces.property.PropertyResolver; | import org.apache.myrmidon.interfaces.property.PropertyResolver; | ||||
| import org.apache.myrmidon.interfaces.property.PropertyStore; | |||||
| /** | /** | ||||
| * General-purpose property resolver test cases. | * General-purpose property resolver test cases. | ||||
| @@ -28,10 +27,8 @@ import org.apache.myrmidon.interfaces.property.PropertyResolver; | |||||
| public abstract class AbstractPropertyResolverTestCase | public abstract class AbstractPropertyResolverTestCase | ||||
| extends AbstractComponentTest | extends AbstractComponentTest | ||||
| { | { | ||||
| protected final static Resources REZ = getResourcesForTested( AbstractPropertyResolverTestCase.class ); | |||||
| protected PropertyResolver m_resolver; | protected PropertyResolver m_resolver; | ||||
| protected DefaultTaskContext m_context; | |||||
| protected PropertyStore m_store; | |||||
| public AbstractPropertyResolverTestCase( final String name ) | public AbstractPropertyResolverTestCase( final String name ) | ||||
| { | { | ||||
| @@ -42,11 +39,9 @@ public abstract class AbstractPropertyResolverTestCase | |||||
| { | { | ||||
| m_resolver = (PropertyResolver)getServiceManager().lookup( PropertyResolver.ROLE ); | m_resolver = (PropertyResolver)getServiceManager().lookup( PropertyResolver.ROLE ); | ||||
| final DefaultPropertyStore store = new DefaultPropertyStore(); | |||||
| final DefaultServiceManager serviceManager = new DefaultServiceManager(); | |||||
| m_context = new DefaultTaskContext( serviceManager, getLogger(), store ); | |||||
| m_context.setProperty( "intProp", new Integer( 333 ) ); | |||||
| m_context.setProperty( "stringProp", "String property" ); | |||||
| m_store = new DefaultPropertyStore(); | |||||
| m_store.setProperty( "intProp", new Integer( 333 ) ); | |||||
| m_store.setProperty( "stringProp", "String property" ); | |||||
| registerConverter( ObjectToStringConverter.class, Object.class, String.class ); | registerConverter( ObjectToStringConverter.class, Object.class, String.class ); | ||||
| } | } | ||||
| @@ -92,14 +87,14 @@ public abstract class AbstractPropertyResolverTestCase | |||||
| private void testPropertyValue( final Object propObject ) | private void testPropertyValue( final Object propObject ) | ||||
| throws Exception | throws Exception | ||||
| { | { | ||||
| m_context.setProperty( "typedProp", propObject ); | |||||
| m_store.setProperty( "typedProp", propObject ); | |||||
| final String propString = propObject.toString(); | final String propString = propObject.toString(); | ||||
| doTestResolution( "${typedProp}", propObject, m_context ); | |||||
| doTestResolution( "${typedProp}", propObject, m_store ); | |||||
| doTestResolution( "${typedProp} with following text", | doTestResolution( "${typedProp} with following text", | ||||
| propString + " with following text", m_context ); | |||||
| propString + " with following text", m_store ); | |||||
| doTestResolution( "Preceding text with ${typedProp}", | doTestResolution( "Preceding text with ${typedProp}", | ||||
| "Preceding text with " + propString, m_context ); | |||||
| "Preceding text with " + propString, m_store ); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -107,15 +102,15 @@ public abstract class AbstractPropertyResolverTestCase | |||||
| */ | */ | ||||
| public void testMultipleProperties() throws Exception | public void testMultipleProperties() throws Exception | ||||
| { | { | ||||
| m_context.setProperty( "prop1", "value1" ); | |||||
| m_context.setProperty( "prop2", "value2" ); | |||||
| m_context.setProperty( "int1", new Integer( 123 ) ); | |||||
| m_store.setProperty( "prop1", "value1" ); | |||||
| m_store.setProperty( "prop2", "value2" ); | |||||
| m_store.setProperty( "int1", new Integer( 123 ) ); | |||||
| doTestResolution( "${prop1}${prop2}", "value1value2", m_context ); | |||||
| doTestResolution( "${prop1}${prop1}${prop1}", "value1value1value1", m_context ); | |||||
| doTestResolution( "${prop1}${prop2}", "value1value2", m_store ); | |||||
| doTestResolution( "${prop1}${prop1}${prop1}", "value1value1value1", m_store ); | |||||
| doTestResolution( "before ${prop2} between ${prop1} after", | doTestResolution( "before ${prop2} between ${prop1} after", | ||||
| "before value2 between value1 after", m_context ); | |||||
| doTestResolution( "${prop1}-${int1}-${prop2}", "value1-123-value2", m_context ); | |||||
| "before value2 between value1 after", m_store ); | |||||
| doTestResolution( "${prop1}-${int1}-${prop2}", "value1-123-value2", m_store ); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -123,13 +118,13 @@ public abstract class AbstractPropertyResolverTestCase | |||||
| */ | */ | ||||
| public void testInvalidTypeDeclarations() throws Exception | public void testInvalidTypeDeclarations() throws Exception | ||||
| { | { | ||||
| final Resources rez = getResourcesForTested( DefaultPropertyResolver.class ); | |||||
| doTestFailure( "${unclosed", | doTestFailure( "${unclosed", | ||||
| REZ.getString( "prop.mismatched-braces.error" ), | |||||
| m_context ); | |||||
| rez.getString( "prop.mismatched-braces.error" ), | |||||
| m_store ); | |||||
| doTestFailure( "${", | doTestFailure( "${", | ||||
| REZ.getString( "prop.mismatched-braces.error" ), | |||||
| m_context ); | |||||
| rez.getString( "prop.mismatched-braces.error" ), | |||||
| m_store ); | |||||
| /* TODO - need to handle these cases. */ | /* TODO - need to handle these cases. */ | ||||
| // testFailure( "${bad${}", "", m_context ); | // testFailure( "${bad${}", "", m_context ); | ||||
| @@ -141,10 +136,10 @@ public abstract class AbstractPropertyResolverTestCase | |||||
| */ | */ | ||||
| protected void doTestResolution( final String value, | protected void doTestResolution( final String value, | ||||
| final Object expected, | final Object expected, | ||||
| final TaskContext context ) | |||||
| final PropertyStore properties ) | |||||
| throws Exception | throws Exception | ||||
| { | { | ||||
| final Object resolved = m_resolver.resolveProperties( value, context ); | |||||
| final Object resolved = m_resolver.resolveProperties( value, properties ); | |||||
| assertEquals( expected, resolved ); | assertEquals( expected, resolved ); | ||||
| } | } | ||||
| @@ -155,11 +150,11 @@ public abstract class AbstractPropertyResolverTestCase | |||||
| */ | */ | ||||
| protected void doTestFailure( final String value, | protected void doTestFailure( final String value, | ||||
| final String expectedErrorMessage, | final String expectedErrorMessage, | ||||
| final TaskContext context ) | |||||
| final PropertyStore properties ) | |||||
| { | { | ||||
| try | try | ||||
| { | { | ||||
| m_resolver.resolveProperties( value, context ); | |||||
| m_resolver.resolveProperties( value, properties ); | |||||
| fail( "Unexpected sucess - test should have failed." ); | fail( "Unexpected sucess - test should have failed." ); | ||||
| } | } | ||||
| catch( TaskException e ) | catch( TaskException e ) | ||||
| @@ -37,6 +37,6 @@ public class ClassicPropertyResolverTestCase | |||||
| { | { | ||||
| final String undefinedProp = "undefinedProperty"; | final String undefinedProp = "undefinedProperty"; | ||||
| final String propRef = "${" + undefinedProp + "}"; | final String propRef = "${" + undefinedProp + "}"; | ||||
| doTestResolution( propRef, propRef, m_context ); | |||||
| doTestResolution( propRef, propRef, m_store ); | |||||
| } | } | ||||
| } | } | ||||
| @@ -10,6 +10,8 @@ package org.apache.myrmidon.components.property.test; | |||||
| import org.apache.myrmidon.interfaces.property.PropertyResolver; | import org.apache.myrmidon.interfaces.property.PropertyResolver; | ||||
| import org.apache.myrmidon.components.property.test.AbstractPropertyResolverTestCase; | import org.apache.myrmidon.components.property.test.AbstractPropertyResolverTestCase; | ||||
| import org.apache.myrmidon.components.property.DefaultPropertyResolver; | import org.apache.myrmidon.components.property.DefaultPropertyResolver; | ||||
| import org.apache.myrmidon.components.store.DefaultPropertyStore; | |||||
| import org.apache.avalon.excalibur.i18n.Resources; | |||||
| /** | /** | ||||
| * Functional tests for {@link org.apache.myrmidon.components.property.DefaultPropertyResolver}. | * Functional tests for {@link org.apache.myrmidon.components.property.DefaultPropertyResolver}. | ||||
| @@ -35,14 +37,15 @@ public class DefaultPropertyResolverTestCase | |||||
| */ | */ | ||||
| public void testUndefinedProp() throws Exception | public void testUndefinedProp() throws Exception | ||||
| { | { | ||||
| final Resources rez = getResourcesForTested( DefaultPropertyStore.class ); | |||||
| final String undefinedProp = "undefinedProperty"; | final String undefinedProp = "undefinedProperty"; | ||||
| doTestFailure( "${" + undefinedProp + "}", | doTestFailure( "${" + undefinedProp + "}", | ||||
| REZ.getString( "prop.missing-value.error", undefinedProp ), | |||||
| m_context ); | |||||
| rez.getString( "unknown-prop.error", undefinedProp ), | |||||
| m_store ); | |||||
| //TODO - "" should be disallowed as a property name | //TODO - "" should be disallowed as a property name | ||||
| doTestFailure( "${}", | doTestFailure( "${}", | ||||
| REZ.getString( "prop.missing-value.error", "" ), | |||||
| m_context ); | |||||
| rez.getString( "unknown-prop.error", "" ), | |||||
| m_store ); | |||||
| } | } | ||||
| } | } | ||||