Browse Source

* Moved PropertyStore to interfaces.property. Left DefaultPropertyStore

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-ffa450edef68
master
adammurdoch 23 years ago
parent
commit
0f1259d2f3
13 changed files with 153 additions and 154 deletions
  1. +4
    -1
      proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java
  2. +7
    -9
      proposal/myrmidon/src/java/org/apache/myrmidon/components/property/ClassicPropertyResolver.java
  3. +17
    -26
      proposal/myrmidon/src/java/org/apache/myrmidon/components/property/DefaultPropertyResolver.java
  4. +45
    -28
      proposal/myrmidon/src/java/org/apache/myrmidon/components/store/DefaultPropertyStore.java
  5. +3
    -3
      proposal/myrmidon/src/java/org/apache/myrmidon/components/store/Resources.properties
  6. +9
    -31
      proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java
  7. +4
    -1
      proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java
  8. +2
    -3
      proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/property/PropertyResolver.java
  9. +12
    -12
      proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/property/PropertyStore.java
  10. +16
    -4
      proposal/myrmidon/src/test/org/apache/antlib/core/test/PropertyTestCase.java
  11. +26
    -31
      proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java
  12. +1
    -1
      proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/ClassicPropertyResolverTestCase.java
  13. +7
    -4
      proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/DefaultPropertyResolverTestCase.java

+ 4
- 1
proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java View File

@@ -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 );


+ 7
- 9
proposal/myrmidon/src/java/org/apache/myrmidon/components/property/ClassicPropertyResolver.java View File

@@ -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 );
} }
} }

+ 17
- 26
proposal/myrmidon/src/java/org/apache/myrmidon/components/property/DefaultPropertyResolver.java View File

@@ -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 );
} }
} }



+ 45
- 28
proposal/myrmidon/src/java/org/apache/myrmidon/components/store/DefaultPropertyStore.java View File

@@ -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 );
} }
} }


+ 3
- 3
proposal/myrmidon/src/java/org/apache/myrmidon/components/store/Resources.properties View File

@@ -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}".

+ 9
- 31
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java View File

@@ -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 );
} }
} }

+ 4
- 1
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java View File

@@ -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


+ 2
- 3
proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/property/PropertyResolver.java View File

@@ -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;
} }

proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/store/PropertyStore.java → proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/property/PropertyStore.java View File

@@ -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;
} }

+ 16
- 4
proposal/myrmidon/src/test/org/apache/antlib/core/test/PropertyTestCase.java View File

@@ -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 );
} }




+ 26
- 31
proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java View File

@@ -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 )


+ 1
- 1
proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/ClassicPropertyResolverTestCase.java View File

@@ -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 );
} }
} }

+ 7
- 4
proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/DefaultPropertyResolverTestCase.java View File

@@ -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 );
} }
} }

Loading…
Cancel
Save