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