git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272257 13f79535-47bb-0310-9956-ffa450edef68master
@@ -0,0 +1,251 @@ | |||||
/* | |||||
* 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.txt file. | |||||
*/ | |||||
package org.apache.myrmidon.components.store; | |||||
import java.io.File; | |||||
import java.util.HashMap; | |||||
import java.util.Hashtable; | |||||
import java.util.Map; | |||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
import org.apache.myrmidon.api.TaskContext; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.myrmidon.interfaces.model.DefaultNameValidator; | |||||
import org.apache.myrmidon.interfaces.model.NameValidator; | |||||
import org.apache.myrmidon.interfaces.store.PropertyStore; | |||||
/** | |||||
* This is the Default implementation of PropertyStore. It follows | |||||
* the following rules; | |||||
* | |||||
* <ul> | |||||
* <li>The property names must pass DefaultNameValidator checks</li> | |||||
* <li>The store is mutable</li> | |||||
* <li>If the key is TaskContext.NAME then value must be a string.</li> | |||||
* <li>If the key is TaskContext.BASE_DIRECTORY then value must be a key.</li> | |||||
* </ul> | |||||
* | |||||
* @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||||
* @version $Revision$ $Date$ | |||||
* @see PropertyStore | |||||
*/ | |||||
public class DefaultPropertyStore | |||||
implements PropertyStore | |||||
{ | |||||
private final static Resources REZ = | |||||
ResourceManager.getPackageResources( DefaultPropertyStore.class ); | |||||
/** | |||||
* The parent store (may be null). | |||||
*/ | |||||
private final PropertyStore m_parent; | |||||
/** | |||||
* The name validator to check property names against. | |||||
*/ | |||||
private final NameValidator m_validator; | |||||
/** | |||||
* The underlying map where propertys are actually stored. | |||||
*/ | |||||
private final Map m_contextData = new Hashtable(); | |||||
/** | |||||
* Construct a PropertyStore with no parent and | |||||
* default name-validator. | |||||
*/ | |||||
public DefaultPropertyStore() | |||||
{ | |||||
this( null, null ); | |||||
} | |||||
/** | |||||
* Construct a PropertyStore with specified parent. | |||||
* | |||||
* @param parent the parent PropertyStore (may be null) | |||||
*/ | |||||
public DefaultPropertyStore( final PropertyStore parent, | |||||
final NameValidator validator ) | |||||
{ | |||||
m_parent = parent; | |||||
NameValidator candidateValidator = validator; | |||||
if( null == candidateValidator ) | |||||
{ | |||||
candidateValidator = createDefaultNameValidator(); | |||||
} | |||||
m_validator = candidateValidator; | |||||
} | |||||
/** | |||||
* Set the property with specified name to specified value. | |||||
* The specific implementation will apply various rules | |||||
* before setting the property. | |||||
* | |||||
* @param name the name of property | |||||
* @param value the value of property | |||||
* @throws Exception if property can not be set | |||||
*/ | |||||
public void setProperty( final String name, final Object value ) | |||||
throws Exception | |||||
{ | |||||
checkPropertyName( name ); | |||||
checkPropertyValid( name, value ); | |||||
if ( value == null ) | |||||
{ | |||||
m_contextData.remove( name ); | |||||
} | |||||
else | |||||
{ | |||||
m_contextData.put( name, value ); | |||||
} | |||||
} | |||||
/** | |||||
* Return <code>true</code> if the specified property is set. | |||||
* | |||||
* @param name the name of property | |||||
*/ | |||||
public boolean isPropertySet( final String name ) | |||||
{ | |||||
try | |||||
{ | |||||
final Object value = getProperty( name ); | |||||
if( null != value ) | |||||
{ | |||||
return true; | |||||
} | |||||
} | |||||
catch( Exception e ) | |||||
{ | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Retrieve the value of specified property. | |||||
* Will return null if no such property exists. | |||||
* | |||||
* @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 | |||||
*/ | |||||
public Object getProperty( String name ) | |||||
throws Exception | |||||
{ | |||||
Object value = m_contextData.get( name ); | |||||
if( value == null && m_parent != null ) | |||||
{ | |||||
value = m_parent.getProperty( name ); | |||||
} | |||||
return value; | |||||
} | |||||
/** | |||||
* Retrieve a copy of all the properties that are "in-scope" | |||||
* for store. | |||||
* | |||||
* @return a copy of all the properties that are "in-scope" | |||||
* for store. | |||||
* @throws Exception if theres an error retrieving propertys | |||||
*/ | |||||
public Map getProperties() | |||||
throws Exception | |||||
{ | |||||
final Map properties = new HashMap(); | |||||
if( m_parent != null ) | |||||
{ | |||||
properties.putAll( m_parent.getProperties() ); | |||||
} | |||||
properties.putAll( m_contextData ); | |||||
return properties; | |||||
} | |||||
/** | |||||
* Return a child PropertyStore with specified name. | |||||
* This is to allow support for scoped stores. However a | |||||
* store may choose to be unscoped and just return a | |||||
* reference to itself. | |||||
* | |||||
* @param name the name of child store | |||||
* @return the child store | |||||
* @throws Exception if theres an error creating child store | |||||
*/ | |||||
public PropertyStore createChildStore( final String name ) | |||||
throws Exception | |||||
{ | |||||
final DefaultPropertyStore store = new DefaultPropertyStore( this, m_validator ); | |||||
final String newName = getProperty( TaskContext.NAME ) + "." + name; | |||||
store.setProperty( TaskContext.NAME, newName ); | |||||
return store; | |||||
} | |||||
/** | |||||
* Checks that the supplied property name is valid. | |||||
*/ | |||||
private void checkPropertyName( final String name ) | |||||
throws TaskException | |||||
{ | |||||
try | |||||
{ | |||||
m_validator.validate( name ); | |||||
} | |||||
catch( Exception e ) | |||||
{ | |||||
String message = REZ.getString( "bad-property-name.error" ); | |||||
throw new TaskException( message, e ); | |||||
} | |||||
} | |||||
/** | |||||
* Make sure property is valid if it is one of the "magic" properties. | |||||
* | |||||
* @param name the name of property | |||||
* @param value the value of proeprty | |||||
* @exception TaskException if an error occurs | |||||
*/ | |||||
private void checkPropertyValid( final String name, final Object value ) | |||||
throws TaskException | |||||
{ | |||||
if( TaskContext.BASE_DIRECTORY.equals( name ) && !( value instanceof File ) ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "bad-property.error", | |||||
TaskContext.BASE_DIRECTORY, | |||||
File.class.getName() ); | |||||
throw new TaskException( message ); | |||||
} | |||||
else if( TaskContext.NAME.equals( name ) && !( value instanceof String ) ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "bad-property.error", | |||||
TaskContext.NAME, | |||||
String.class.getName() ); | |||||
throw new TaskException( message ); | |||||
} | |||||
} | |||||
/** | |||||
* Create an instance of the default the name validator. | |||||
* | |||||
* @return the default NameValidator | |||||
*/ | |||||
private static NameValidator createDefaultNameValidator() | |||||
{ | |||||
final DefaultNameValidator defaultValidator = new DefaultNameValidator(); | |||||
defaultValidator.setAllowInternalWhitespace( false ); | |||||
defaultValidator.setAdditionalInternalCharacters( "_-.+" ); | |||||
return defaultValidator; | |||||
} | |||||
} |
@@ -0,0 +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. | |||||
null-resolved-value.error=Value "{0}" resolved to null. | |||||
bad-resolve.error=Unable to resolve value "{0}". |
@@ -8,19 +8,18 @@ | |||||
package org.apache.myrmidon.components.workspace; | package org.apache.myrmidon.components.workspace; | ||||
import java.io.File; | import java.io.File; | ||||
import java.util.Hashtable; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.HashMap; | |||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | import org.apache.avalon.excalibur.i18n.ResourceManager; | ||||
import org.apache.avalon.excalibur.i18n.Resources; | import org.apache.avalon.excalibur.i18n.Resources; | ||||
import org.apache.avalon.excalibur.io.FileUtil; | import org.apache.avalon.excalibur.io.FileUtil; | ||||
import org.apache.avalon.framework.logger.Logger; | import org.apache.avalon.framework.logger.Logger; | ||||
import org.apache.avalon.framework.service.DefaultServiceManager; | |||||
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.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.model.DefaultNameValidator; | |||||
import org.apache.myrmidon.interfaces.property.PropertyResolver; | import org.apache.myrmidon.interfaces.property.PropertyResolver; | ||||
import org.apache.myrmidon.interfaces.store.PropertyStore; | |||||
/** | /** | ||||
* Default implementation of TaskContext. | * Default implementation of TaskContext. | ||||
@@ -34,33 +33,35 @@ public class DefaultTaskContext | |||||
private static final Resources REZ = | private static final Resources REZ = | ||||
ResourceManager.getPackageResources( DefaultTaskContext.class ); | ResourceManager.getPackageResources( DefaultTaskContext.class ); | ||||
// Property name validator allows digits, but no internal whitespace. | |||||
private static DefaultNameValidator c_propertyNameValidator = | |||||
new DefaultNameValidator(); | |||||
static | |||||
{ | |||||
c_propertyNameValidator.setAllowInternalWhitespace( false ); | |||||
c_propertyNameValidator.setAdditionalInternalCharacters( "_-.+" ); | |||||
} | |||||
private final Map m_contextData = new Hashtable(); | |||||
private final TaskContext m_parent; | |||||
private final ServiceManager m_serviceManager; | private final ServiceManager m_serviceManager; | ||||
private final Logger m_logger; | private final Logger m_logger; | ||||
private final PropertyStore m_store; | |||||
private PropertyResolver m_propertyResolver; | private PropertyResolver m_propertyResolver; | ||||
/** | /** | ||||
* Constructor that takes both parent context and a service directory. | * Constructor that takes both parent context and a service directory. | ||||
*/ | */ | ||||
public DefaultTaskContext( final TaskContext parent, | |||||
final ServiceManager serviceManager, | |||||
final Logger logger ) | |||||
public DefaultTaskContext( final ServiceManager serviceManager, | |||||
final Logger logger, | |||||
final PropertyStore store ) | |||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
m_parent = parent; | |||||
m_serviceManager = serviceManager; | m_serviceManager = serviceManager; | ||||
m_logger = logger; | m_logger = logger; | ||||
m_store = store; | |||||
if( null == m_serviceManager ) | |||||
{ | |||||
throw new NullPointerException( "serviceManager" ); | |||||
} | |||||
if( null == m_logger ) | |||||
{ | |||||
throw new NullPointerException( "logger" ); | |||||
} | |||||
if( null == m_store ) | |||||
{ | |||||
throw new NullPointerException( "store" ); | |||||
} | |||||
} | } | ||||
/** | /** | ||||
@@ -96,8 +97,8 @@ public class DefaultTaskContext | |||||
public Object getService( final Class serviceClass ) | public Object getService( final Class serviceClass ) | ||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
// Try this context first | |||||
final String name = serviceClass.getName(); | final String name = serviceClass.getName(); | ||||
//Note that this will chain up to parent ServiceManagers (if any) | |||||
if( null != m_serviceManager && m_serviceManager.hasService( name ) ) | if( null != m_serviceManager && m_serviceManager.hasService( name ) ) | ||||
{ | { | ||||
try | try | ||||
@@ -110,12 +111,6 @@ public class DefaultTaskContext | |||||
} | } | ||||
} | } | ||||
// Try parent | |||||
if( null != m_parent ) | |||||
{ | |||||
return m_parent.getService( serviceClass ); | |||||
} | |||||
// Not found | // Not found | ||||
final String message = REZ.getString( "bad-find-service.error", name ); | final String message = REZ.getString( "bad-find-service.error", name ); | ||||
throw new TaskException( message ); | throw new TaskException( message ); | ||||
@@ -179,12 +174,14 @@ public class DefaultTaskContext | |||||
*/ | */ | ||||
public Object getProperty( final String name ) | public Object getProperty( final String name ) | ||||
{ | { | ||||
Object value = m_contextData.get( name ); | |||||
if( value == null && m_parent != null ) | |||||
try | |||||
{ | |||||
return m_store.getProperty( name ); | |||||
} | |||||
catch( final Exception e ) | |||||
{ | { | ||||
value = m_parent.getProperty( name ); | |||||
return null; | |||||
} | } | ||||
return value; | |||||
} | } | ||||
/** | /** | ||||
@@ -193,14 +190,16 @@ public class DefaultTaskContext | |||||
* @return the map of all property names to values | * @return the map of all property names to values | ||||
*/ | */ | ||||
public Map getProperties() | public Map getProperties() | ||||
throws TaskException | |||||
{ | { | ||||
Map props = new HashMap(); | |||||
if( m_parent != null ) | |||||
try | |||||
{ | |||||
return m_store.getProperties(); | |||||
} | |||||
catch( final Exception e ) | |||||
{ | { | ||||
props.putAll( m_parent.getProperties() ); | |||||
throw new TaskException( e.getMessage(), e ); | |||||
} | } | ||||
props.putAll( m_contextData ); | |||||
return props; | |||||
} | } | ||||
/** | /** | ||||
@@ -212,16 +211,13 @@ 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 | ||||
{ | { | ||||
checkPropertyName( name ); | |||||
checkPropertyValid( name, value ); | |||||
if ( value == null ) | |||||
try | |||||
{ | { | ||||
m_contextData.remove( name ); | |||||
m_store.setProperty( name, value ); | |||||
} | } | ||||
else | |||||
catch( final Exception e ) | |||||
{ | { | ||||
m_contextData.put( name, value ); | |||||
throw new TaskException( e.getMessage(), e ); | |||||
} | } | ||||
} | } | ||||
@@ -390,53 +386,19 @@ public class DefaultTaskContext | |||||
*/ | */ | ||||
public TaskContext createSubContext( final String name ) | public TaskContext createSubContext( final String name ) | ||||
throws TaskException | throws TaskException | ||||
{ | |||||
final DefaultTaskContext context = | |||||
new DefaultTaskContext( this, m_serviceManager, m_logger ); | |||||
context.setProperty( TaskContext.NAME, getName() + "." + name ); | |||||
context.setProperty( TaskContext.BASE_DIRECTORY, getBaseDirectory() ); | |||||
return context; | |||||
} | |||||
/** | |||||
* Checks that the supplied property name is valid. | |||||
*/ | |||||
private void checkPropertyName( final String name ) throws TaskException | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
c_propertyNameValidator.validate( name ); | |||||
} | |||||
catch( Exception e ) | |||||
{ | |||||
String message = REZ.getString( "bad-property-name.error" ); | |||||
throw new TaskException( message, e ); | |||||
} | |||||
} | |||||
final PropertyStore store = m_store.createChildStore( name ); | |||||
final DefaultServiceManager serviceManager = | |||||
new DefaultServiceManager( m_serviceManager ); | |||||
final Logger logger = m_logger.getChildLogger( name ); | |||||
/** | |||||
* Make sure property is valid if it is one of the "magic" properties. | |||||
* | |||||
* @param name the name of property | |||||
* @param value the value of proeprty | |||||
* @exception TaskException if an error occurs | |||||
*/ | |||||
private void checkPropertyValid( final String name, final Object value ) | |||||
throws TaskException | |||||
{ | |||||
if( BASE_DIRECTORY.equals( name ) && !( value instanceof File ) ) | |||||
{ | |||||
final String message = | |||||
REZ.getString( "bad-property.error", BASE_DIRECTORY, File.class.getName() ); | |||||
throw new TaskException( message ); | |||||
return new DefaultTaskContext( serviceManager, logger, store ); | |||||
} | } | ||||
else if( NAME.equals( name ) && !( value instanceof String ) ) | |||||
catch( final Exception e ) | |||||
{ | { | ||||
final String message = | |||||
REZ.getString( "bad-property.error", NAME, String.class.getName() ); | |||||
throw new TaskException( message ); | |||||
throw new TaskException( e.getMessage(), e ); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -37,7 +37,9 @@ 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.listeners.ProjectListener; | import org.apache.myrmidon.listeners.ProjectListener; | ||||
import org.apache.myrmidon.components.store.DefaultPropertyStore; | |||||
/** | /** | ||||
* This is the default implementation of Workspace. | * This is the default implementation of Workspace. | ||||
@@ -56,7 +58,7 @@ public class DefaultWorkspace | |||||
private ProjectListenerSupport m_listenerSupport = new ProjectListenerSupport(); | private ProjectListenerSupport m_listenerSupport = new ProjectListenerSupport(); | ||||
private ServiceManager m_serviceManager; | private ServiceManager m_serviceManager; | ||||
private Parameters m_parameters; | private Parameters m_parameters; | ||||
private TaskContext m_baseContext; | |||||
private PropertyStore m_baseStore; | |||||
private HashMap m_entries = new HashMap(); | private HashMap m_entries = new HashMap(); | ||||
private TypeManager m_typeManager; | private TypeManager m_typeManager; | ||||
private Deployer m_deployer; | private Deployer m_deployer; | ||||
@@ -105,7 +107,7 @@ public class DefaultWorkspace | |||||
public void initialize() | public void initialize() | ||||
throws Exception | throws Exception | ||||
{ | { | ||||
m_baseContext = createBaseContext(); | |||||
m_baseStore = createBaseStore(); | |||||
} | } | ||||
/** | /** | ||||
@@ -128,22 +130,22 @@ public class DefaultWorkspace | |||||
m_listenerSupport.projectFinished( project.getProjectName() ); | m_listenerSupport.projectFinished( project.getProjectName() ); | ||||
} | } | ||||
private TaskContext createBaseContext() | |||||
throws TaskException | |||||
private PropertyStore createBaseStore() | |||||
throws Exception | |||||
{ | { | ||||
final TaskContext context = new DefaultTaskContext( null, null, null ); | |||||
final DefaultPropertyStore store = new DefaultPropertyStore(); | |||||
final String[] names = m_parameters.getNames(); | final String[] names = m_parameters.getNames(); | ||||
for( int i = 0; i < names.length; i++ ) | for( int i = 0; i < names.length; i++ ) | ||||
{ | { | ||||
final String value = m_parameters.getParameter( names[ i ], null ); | final String value = m_parameters.getParameter( names[ i ], null ); | ||||
context.setProperty( names[ i ], value ); | |||||
store.setProperty( names[ i ], value ); | |||||
} | } | ||||
//Add system properties so that they overide user-defined properties | //Add system properties so that they overide user-defined properties | ||||
addToContext( context, System.getProperties() ); | |||||
addToStore( store, System.getProperties() ); | |||||
return context; | |||||
return store; | |||||
} | } | ||||
private File findTypeLib( final String libraryName ) | private File findTypeLib( final String libraryName ) | ||||
@@ -250,9 +252,12 @@ public class DefaultWorkspace | |||||
final Logger logger = | final Logger logger = | ||||
new RoutingLogger( getLogger(), m_listenerSupport ); | new RoutingLogger( getLogger(), m_listenerSupport ); | ||||
// Create and configure the context | |||||
//TODO: Put this in Execution Frame | |||||
final PropertyStore store = m_baseStore.createChildStore(""); | |||||
// Create and configure the context | |||||
final DefaultTaskContext context = | final DefaultTaskContext context = | ||||
new DefaultTaskContext( m_baseContext, serviceManager, logger ); | |||||
new DefaultTaskContext( serviceManager, logger, store ); | |||||
context.setProperty( TaskContext.BASE_DIRECTORY, project.getBaseDirectory() ); | context.setProperty( TaskContext.BASE_DIRECTORY, project.getBaseDirectory() ); | ||||
final DefaultExecutionFrame frame = | final DefaultExecutionFrame frame = | ||||
@@ -467,13 +472,13 @@ public class DefaultWorkspace | |||||
} | } | ||||
/** | /** | ||||
* Helper method to add values to a context | |||||
* Helper method to add values to a store. | |||||
* | * | ||||
* @param context the context | |||||
* @param store the store | |||||
* @param map the map of names->values | * @param map the map of names->values | ||||
*/ | */ | ||||
private void addToContext( final TaskContext context, final Map map ) | |||||
throws TaskException | |||||
private void addToStore( final PropertyStore store, final Map map ) | |||||
throws Exception | |||||
{ | { | ||||
final Iterator keys = map.keySet().iterator(); | final Iterator keys = map.keySet().iterator(); | ||||
@@ -481,7 +486,7 @@ public class DefaultWorkspace | |||||
{ | { | ||||
final String key = (String)keys.next(); | final String key = (String)keys.next(); | ||||
final Object value = map.get( key ); | final Object value = map.get( key ); | ||||
context.setProperty( key, value ); | |||||
store.setProperty( key, value ); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -17,8 +17,10 @@ public interface NameValidator | |||||
{ | { | ||||
/** | /** | ||||
* Validates the supplied name, failing if it is not. | * Validates the supplied name, failing if it is not. | ||||
* | |||||
* @param name The name to be validated. | * @param name The name to be validated. | ||||
* @throws Exception is the supplied name is not valid. | * @throws Exception is the supplied name is not valid. | ||||
*/ | */ | ||||
void validate( String name ) throws Exception; | |||||
void validate( String name ) | |||||
throws Exception; | |||||
} | } |
@@ -0,0 +1,86 @@ | |||||
/* | |||||
* 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.txt file. | |||||
*/ | |||||
package org.apache.myrmidon.interfaces.store; | |||||
import java.util.Map; | |||||
/** | |||||
* This component stores and manages properties. It is also | |||||
* responsible for instituting the various policies regarding | |||||
* propertys. ie It will enforce rules regarding | |||||
* | |||||
* <ul> | |||||
* <li>Valid property names?</li> | |||||
* <li>Are propertys mutable?</li> | |||||
* <li>Are propertys scoped?</li> | |||||
* <li>Is mapping between name and value correct?</li> | |||||
* </ul> | |||||
* | |||||
* @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||||
* @version $Revision$ $Date$ | |||||
*/ | |||||
public interface PropertyStore | |||||
{ | |||||
/** Role name for this interface. */ | |||||
String ROLE = PropertyStore.class.getName(); | |||||
/** | |||||
* Set the property with specified name to specified value. | |||||
* The specific implementation will apply various rules | |||||
* before setting the property. | |||||
* | |||||
* @param name the name of property | |||||
* @param value the value of property | |||||
* @throws Exception if property can not be set | |||||
*/ | |||||
void setProperty( String name, Object value ) | |||||
throws Exception; | |||||
/** | |||||
* Return <code>true</code> if the specified property is set. | |||||
* | |||||
* @param name the name of property | |||||
*/ | |||||
boolean isPropertySet( String name ); | |||||
/** | |||||
* Retrieve the value of specified property. | |||||
* Will return null if no such property exists. | |||||
* | |||||
* @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 | |||||
*/ | |||||
Object getProperty( String name ) | |||||
throws Exception; | |||||
/** | |||||
* Retrieve a copy of all the properties that are "in-scope" | |||||
* for store. | |||||
* | |||||
* @return a copy of all the properties that are "in-scope" | |||||
* for store. | |||||
* @throws Exception if theres an error retrieving propertys | |||||
*/ | |||||
Map getProperties() | |||||
throws Exception; | |||||
/** | |||||
* Return a child PropertyStore with specified name. | |||||
* This is to allow support for scoped stores. However a | |||||
* store may choose to be unscoped and just return a | |||||
* reference to itself. | |||||
* | |||||
* @param name the name of child store | |||||
* @return the child store | |||||
* @throws Exception if theres an error creating child store | |||||
*/ | |||||
PropertyStore createChildStore( String name ) | |||||
throws Exception; | |||||
} |
@@ -15,6 +15,7 @@ import org.apache.avalon.framework.configuration.ConfigurationException; | |||||
import org.apache.avalon.framework.configuration.DefaultConfiguration; | import org.apache.avalon.framework.configuration.DefaultConfiguration; | ||||
import org.apache.myrmidon.api.TaskContext; | import org.apache.myrmidon.api.TaskContext; | ||||
import org.apache.myrmidon.components.AbstractComponentTest; | import org.apache.myrmidon.components.AbstractComponentTest; | ||||
import org.apache.myrmidon.components.store.DefaultPropertyStore; | |||||
import org.apache.myrmidon.components.configurer.DefaultConfigurer; | import org.apache.myrmidon.components.configurer.DefaultConfigurer; | ||||
import org.apache.myrmidon.components.configurer.test.data.ConfigTestAttributeConvert; | import org.apache.myrmidon.components.configurer.test.data.ConfigTestAttributeConvert; | ||||
import org.apache.myrmidon.components.configurer.test.data.ConfigTestConfigAdder; | import org.apache.myrmidon.components.configurer.test.data.ConfigTestConfigAdder; | ||||
@@ -76,7 +77,9 @@ public class DefaultConfigurerTestCase | |||||
m_configurer = (Configurer)getServiceManager().lookup( Configurer.ROLE ); | m_configurer = (Configurer)getServiceManager().lookup( Configurer.ROLE ); | ||||
// Setup a context | // Setup a context | ||||
m_context = new DefaultTaskContext( null, getServiceManager(), getLogger() ); | |||||
final DefaultPropertyStore store = new DefaultPropertyStore(); | |||||
m_context = | |||||
new DefaultTaskContext( getServiceManager(), getLogger(), store ); | |||||
final File baseDir = new File( "." ).getAbsoluteFile(); | final File baseDir = new File( "." ).getAbsoluteFile(); | ||||
m_context.setProperty( TaskContext.BASE_DIRECTORY, baseDir ); | m_context.setProperty( TaskContext.BASE_DIRECTORY, baseDir ); | ||||
} | } | ||||
@@ -11,9 +11,11 @@ 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.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.store.DefaultPropertyStore; | |||||
import org.apache.myrmidon.components.workspace.DefaultTaskContext; | import org.apache.myrmidon.components.workspace.DefaultTaskContext; | ||||
import org.apache.myrmidon.interfaces.property.PropertyResolver; | import org.apache.myrmidon.interfaces.property.PropertyResolver; | ||||
@@ -40,7 +42,9 @@ public abstract class AbstractPropertyResolverTestCase | |||||
{ | { | ||||
m_resolver = (PropertyResolver)getServiceManager().lookup( PropertyResolver.ROLE ); | m_resolver = (PropertyResolver)getServiceManager().lookup( PropertyResolver.ROLE ); | ||||
m_context = new DefaultTaskContext( null, null, getLogger() ); | |||||
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( "intProp", new Integer( 333 ) ); | ||||
m_context.setProperty( "stringProp", "String property" ); | m_context.setProperty( "stringProp", "String property" ); | ||||