Author: sgoeschl Date: Fri May 4 07:38:12 2007 New Revision: 535262 URL: http://svn.apache.org/viewvc?view=rev&rev=535262 Log: Added support for componentConfiguration.properties to provide values to be expanded in the componentConfiguration.xml. This allows to simplify the configuration if a few highly volatile configuration values are put into a separate configuration file.
Added: jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolver.java jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverBaseImpl.java jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverImpl.java jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/ConfigurationUtil.java jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestComponentConfig.properties Modified: jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceConstants.java jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceContainerImpl.java jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/StringUtils.java jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestYaafiContainerConfig.xml jakarta/turbine/fulcrum/trunk/yaafi/xdocs/changes.xml jakarta/turbine/fulcrum/trunk/yaafi/xdocs/index.xml jakarta/turbine/fulcrum/trunk/yaafi/xdocs/specification/container.xml Added: jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolver.java URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolver.java?view=auto&rev=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolver.java (added) +++ jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolver.java Fri May 4 07:38:12 2007 @@ -0,0 +1,41 @@ +/* + * Copyright 2002-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.fulcrum.yaafi.framework.configuration; + +import java.util.Properties; + +/** + * This interface allows to resolve component configuration properties. These + * properties are used to expand variables found in the componentConfiguration.xml. + * The main motivation for this interface is to allow users to hook up + * commons-configuration to resolve global parameters easily without + * coupling this implementation to any external libraries. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Siegfried Goeschl</a> + */ +public interface ComponentConfigurationPropertiesResolver +{ + /** default file name of the component config property file */ + String COMPONENT_CONFIG_PROPERTIES_VALUE = "/componentConfiguration.properties"; + + /** + * Resolve custom properties + * + * @param defaults the default properties + * @return the custom properties + */ + Properties resolve(Properties defaults) throws Exception; +} Added: jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverBaseImpl.java URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverBaseImpl.java?view=auto&rev=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverBaseImpl.java (added) +++ jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverBaseImpl.java Fri May 4 07:38:12 2007 @@ -0,0 +1,186 @@ +/* + * Copyright 2002-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.fulcrum.yaafi.framework.configuration; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.apache.avalon.framework.configuration.Configurable; +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.configuration.ConfigurationException; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; +import org.apache.avalon.framework.context.Contextualizable; +import org.apache.avalon.framework.logger.LogEnabled; +import org.apache.avalon.framework.logger.Logger; +import org.apache.fulcrum.yaafi.framework.constant.AvalonYaafiConstants; +import org.apache.fulcrum.yaafi.framework.util.InputStreamLocator; + +/** + * Base class to expand the value and all attributes. This class is intentend + * to be sub-classed if you hook up your own configuration mechanism. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Siegfried Goeschl</a> + */ +public abstract class ComponentConfigurationPropertiesResolverBaseImpl + implements ComponentConfigurationPropertiesResolver, LogEnabled, Contextualizable, Configurable +{ + /** the logger of the container */ + private Logger logger; + + /** the Avalon context */ + private Context context; + + /** the container configuration */ + private Configuration configuration; + + /* + * @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(org.apache.avalon.framework.logger.Logger) + */ + public void enableLogging(Logger logger) + { + this.logger = logger; + } + + /* + * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context) + */ + public void contextualize(Context context) throws ContextException + { + this.context = context; + } + + /** + * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration) + */ + public void configure(Configuration configuration) throws ConfigurationException + { + this.configuration = configuration; + } + + /** + * @return Returns the logger. + */ + protected Logger getLogger() + { + return logger; + } + + /** + * @return Returns the context. + */ + protected Context getContext() + { + return context; + } + + /** + * @return the home directory of the application + */ + protected File getApplicationRootDir() + { + try + { + return (File) this.getContext().get(AvalonYaafiConstants.URN_AVALON_HOME); + } + catch(Exception e) + { + throw new RuntimeException(e.getMessage()); + } + } + + /** + * @return Returns the configuration. + */ + protected Configuration getConfiguration() + { + return configuration; + } + + /** + * @return Returns the componentConfigurationPropertiesLocation. + */ + protected String getLocation() + { + return configuration.getChild("location").getValue(COMPONENT_CONFIG_PROPERTIES_VALUE ); + } + + /** + * Creates an InputStream using a Locator. + * @return the InputStrem or null if the resource was not found + */ + protected InputStream createInputStream(String location) throws IOException + { + InputStreamLocator locator = new InputStreamLocator(this.getApplicationRootDir(), this.getLogger()); + return locator.locate(location); + } + + /** + * Add the Avalon context variables. + */ + protected void addAvalonContext(Properties properties) throws ContextException + { + properties.put( + AvalonYaafiConstants.URN_AVALON_NAME, + this.getContext().get(AvalonYaafiConstants.URN_AVALON_NAME) + ); + + properties.put( + AvalonYaafiConstants.URN_AVALON_PARTITION, + this.getContext().get(AvalonYaafiConstants.URN_AVALON_PARTITION) + ); + + properties.put( + AvalonYaafiConstants.URN_AVALON_HOME, + this.getContext().get(AvalonYaafiConstants.URN_AVALON_HOME) + ); + + properties.put( + AvalonYaafiConstants.URN_AVALON_TEMP, + this.getContext().get(AvalonYaafiConstants.URN_AVALON_TEMP) + ); + } + + protected Properties loadProperties(String location) throws Exception + { + Properties result = new Properties(); + InputStream is = this.createInputStream(location); + + try + { + if(is != null) + { + result.load(is); + is.close(); + is = null; + } + else + { + this.getLogger().debug("Unable to load the following optional file :" + location); + } + + return result; + } + catch ( Exception e ) + { + String msg = "Unable to parse the following file : " + location; + this.getLogger().error( msg , e ); + throw e; + } + } +} Added: jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverImpl.java URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverImpl.java?view=auto&rev=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverImpl.java (added) +++ jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/configuration/ComponentConfigurationPropertiesResolverImpl.java Fri May 4 07:38:12 2007 @@ -0,0 +1,53 @@ +/* + * Copyright 2002-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.fulcrum.yaafi.framework.configuration; + +import java.util.Properties; + +/** + * A implementation to provide out-of-the-box component configuration properties + * using the following algorithm: + * + * <ul> + * <li>add the user-supplied defaults to the result<li> + * <li>add the system properties to the result<li> + * <li>add the Merlin context entries to the result<li> + * </ul> + * + * @author <a href="mailto:[EMAIL PROTECTED]">Siegfried Goeschl</a> + */ +public class ComponentConfigurationPropertiesResolverImpl + extends ComponentConfigurationPropertiesResolverBaseImpl +{ + /** + * @see org.apache.fulcrum.yaafi.framework.configuration.ComponentConfigurationPropertiesResolver#resolve(java.util.Properties) + */ + public Properties resolve(Properties defaults) throws Exception + { + String location = this.getLocation(); + Properties result = this.loadProperties(location); + + if(defaults != null) + { + result.putAll(defaults); + } + + result.putAll(System.getProperties()); + this.addAvalonContext(result); + + return result; + } +} Modified: jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceConstants.java URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceConstants.java?view=diff&rev=535262&r1=535261&r2=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceConstants.java (original) +++ jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceConstants.java Fri May 4 07:38:12 2007 @@ -45,6 +45,9 @@ /** property to lookup the component config file */ String COMPONENT_CONFIG_KEY = "componentConfiguration"; + /** property to lookup the component config property file */ + String COMPONENT_CONFIG_PROPERTIES_KEY = "componentConfigurationProperties"; + /** property to lookup the component role file */ String COMPONENT_ROLE_KEYS = "componentRoles"; Modified: jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceContainerImpl.java URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceContainerImpl.java?view=diff&rev=535262&r1=535261&r2=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceContainerImpl.java (original) +++ jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/container/ServiceContainerImpl.java Fri May 4 07:38:12 2007 @@ -28,7 +28,9 @@ import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; +import org.apache.avalon.framework.configuration.DefaultConfiguration; import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; +import org.apache.avalon.framework.container.ContainerUtil; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.context.DefaultContext; @@ -40,12 +42,15 @@ import org.apache.fulcrum.jce.crypto.CryptoStreamFactoryImpl; import org.apache.fulcrum.yaafi.framework.component.AvalonServiceComponentImpl; import org.apache.fulcrum.yaafi.framework.component.ServiceComponent; +import org.apache.fulcrum.yaafi.framework.configuration.ComponentConfigurationPropertiesResolver; +import org.apache.fulcrum.yaafi.framework.configuration.ComponentConfigurationPropertiesResolverImpl; import org.apache.fulcrum.yaafi.framework.constant.AvalonYaafiConstants; import org.apache.fulcrum.yaafi.framework.context.AvalonToYaafiContextMapper; import org.apache.fulcrum.yaafi.framework.context.YaafiToAvalonContextMapper; import org.apache.fulcrum.yaafi.framework.role.RoleConfigurationParser; import org.apache.fulcrum.yaafi.framework.role.RoleConfigurationParserImpl; import org.apache.fulcrum.yaafi.framework.role.RoleEntry; +import org.apache.fulcrum.yaafi.framework.util.ConfigurationUtil; import org.apache.fulcrum.yaafi.framework.util.InputStreamLocator; import org.apache.fulcrum.yaafi.framework.util.ReadWriteLock; import org.apache.fulcrum.yaafi.framework.util.StringUtils; @@ -136,6 +141,9 @@ /** Read/Write lock to synchronize acess to services */ private ReadWriteLock readWriteLock; + /** the configuration for running the ComponentConfigurationPropertiesResolver */ + private Configuration componentConfigurationPropertiesResolverConfig; + ///////////////////////////////////////////////////////////////////////// // Avalon Service Lifecycle ///////////////////////////////////////////////////////////////////////// @@ -289,7 +297,14 @@ currComponentConfiguration.getChild(COMPONENT_ISENCRYPTED_KEY).getValue( "false" ) ); - + + + // get the configuration for componentConfigurationPropertiesResolver + + this.componentConfigurationPropertiesResolverConfig = configuration.getChild( + COMPONENT_CONFIG_PROPERTIES_KEY + ); + // evaluate parameters Configuration currParameters = configuration.getChild(COMPONENT_PARAMETERS_KEY); @@ -373,6 +388,18 @@ this.isComponentConfigurationEncrypted() ); + // create the configuration properties + + Properties componentConfigurationProperties = this.loadComponentConfigurationProperties(); + + // expand the componentConfiguration using the componentConfigurationProperties + + ConfigurationUtil.expand( + this.getLogger(), + (DefaultConfiguration) this.serviceConfiguration, + componentConfigurationProperties + ); + // create the default parameters if( this.getParameters() == null ) @@ -492,9 +519,17 @@ lock = this.getWriteLock(); // 2) store the new configuration - + this.serviceConfiguration = configuration; - + + Properties componentConfigurationProperties = this.loadComponentConfigurationProperties(); + + ConfigurationUtil.expand( + this.getLogger(), + (DefaultConfiguration) this.serviceConfiguration, + componentConfigurationProperties + ); + // 3) reconfigure the services for( int i=0; i<this.getServiceList().size(); i++ ) @@ -1208,6 +1243,44 @@ this.getLogger().error( msg , e ); throw e; } + } + + return result; + } + + /** + * Load a configuration property file either from a file or using the class loader. + * @param location the location of the file + * @return The loaded proeperty file + * @throws ConfigurationException Something went wrong + */ + private Properties loadComponentConfigurationProperties() + throws ConfigurationException + { + Properties result = new Properties(); + ComponentConfigurationPropertiesResolver resolver = null; + + String className = this.componentConfigurationPropertiesResolverConfig.getChild("resolver").getValue( + ComponentConfigurationPropertiesResolverImpl.class.getName() + ); + + try + { + Class resolverClass = this.getClassLoader().loadClass( className ); + resolver = (ComponentConfigurationPropertiesResolver) resolverClass.newInstance(); + ContainerUtil.enableLogging(resolver, this.getLogger()); + ContainerUtil.contextualize(resolver, this.getContext()); + ContainerUtil.configure(resolver, this.componentConfigurationPropertiesResolverConfig); + + result = resolver.resolve(null); + + this.getLogger().debug("Using the following componentConfigurationProperties: " + result); + } + catch (Exception e) + { + String msg = "Resolving componentConfigurationProperties failed using the following class : " + className; + this.getLogger().error(msg, e); + throw new ConfigurationException(msg, e); } return result; Added: jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/ConfigurationUtil.java URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/ConfigurationUtil.java?view=auto&rev=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/ConfigurationUtil.java (added) +++ jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/ConfigurationUtil.java Fri May 4 07:38:12 2007 @@ -0,0 +1,113 @@ +/* + * Copyright 2002-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.fulcrum.yaafi.framework.util; + +import java.util.Map; + +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.configuration.ConfigurationException; +import org.apache.avalon.framework.configuration.DefaultConfiguration; +import org.apache.avalon.framework.logger.Logger; + +/** + * Helper class to expand the value and all attributes. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Siegfried Goeschl</a> + */ +public class ConfigurationUtil +{ + /** + * Expand place holders found in values or attrbute values with the + * content of the given variables. The implementation assumes that + * the given configuration can be cast to a DefaultConfiguration + * otherwise we can't use any setters. + * + * @param logger the logger to write diagnostic messages + * @param defaultConfiguration the configuration + * @param vars the map holding the variables + * @throws ConfigurationException parsing the configuration failed + */ + public static void expand(Logger logger, DefaultConfiguration defaultConfiguration, Map vars) throws ConfigurationException + { + if((vars == null) || (vars.size() == 0)) + { + return; + } + + // update the value of the configuration element + + if(defaultConfiguration.getValue(null) != null) + { + String oldValue = defaultConfiguration.getValue(); + String newValue = ConfigurationUtil.expand(oldValue, vars); + defaultConfiguration.setValue(newValue); + + if(oldValue.equals(newValue) == false) + { + logger.debug("Changed element <" + + defaultConfiguration.getName() + + "> from '" + + oldValue + + "' ==> '" + + newValue + + "'" + ); + } + } + + // update all attributes + + String attributeName = null; + String[] attributeNames = defaultConfiguration.getAttributeNames(); + + for(int i=0; i<attributeNames.length; i++) + { + attributeName = attributeNames[i]; + String oldAttributeValue = defaultConfiguration.getAttribute(attributeName); + String newAttributeValue = ConfigurationUtil.expand(oldAttributeValue, vars); + defaultConfiguration.setAttribute(attributeName, newAttributeValue); + + if(oldAttributeValue.equals(newAttributeValue) == false) + { + logger.debug("Changed attribute '" + + defaultConfiguration.getName() + "@" + attributeName + + "' from '" + + oldAttributeValue + + "' ==> '" + + newAttributeValue + + "'" + ); + } + } + + // and now recurse through all children (children are in general a lot of work) + + Configuration[] children = defaultConfiguration.getChildren(); + + for(int i=0; i<children.length; i++) + { + ConfigurationUtil.expand(logger, ((DefaultConfiguration) children[i]), vars); + } + } + + /** + * @return the expand a string + */ + private static String expand(String value, Map vars) + { + return StringUtils.stringSubstitution(value, vars, true).toString(); + } +} Modified: jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/StringUtils.java URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/StringUtils.java?view=diff&rev=535262&r1=535261&r2=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/StringUtils.java (original) +++ jakarta/turbine/fulcrum/trunk/yaafi/src/java/org/apache/fulcrum/yaafi/framework/util/StringUtils.java Fri May 4 07:38:12 2007 @@ -16,6 +16,8 @@ package org.apache.fulcrum.yaafi.framework.util; +import java.util.Map; + /** * A subset of the utilities available in commons-lang-2.1 StringUtils. @@ -252,5 +254,88 @@ public static boolean isEmpty(String str) { return str == null || str.length() == 0; + } + + /** + * Perform a series of substitutions. The substitions + * are performed by replacing ${variable} in the target + * string with the value of provided by the key "variable" + * in the provided hashtable. + * + * @param argStr target string + * @param vars name/value pairs used for substitution + * @param isLenient ignore failures + * @return String target string with replacements. + */ + public static StringBuffer stringSubstitution(String argStr, Map vars, boolean isLenient) + { + StringBuffer argBuf = new StringBuffer(); + int argStrLength = argStr.length(); + + for (int cIdx = 0 ; cIdx < argStrLength;) + { + char ch = argStr.charAt(cIdx); + char del = ' '; + + switch (ch) + { + case '$': + StringBuffer nameBuf = new StringBuffer(); + del = argStr.charAt(cIdx+1); + if( del == '{') + { + cIdx++; + + for (++cIdx ; cIdx < argStr.length(); ++cIdx) + { + ch = argStr.charAt(cIdx); + if (ch != '}') + nameBuf.append(ch); + else + break; + } + + if (nameBuf.length() > 0) + { + Object value = vars.get(nameBuf.toString()); + + if (value != null) + { + argBuf.append(value.toString()); + } + else + { + if (!isLenient) + { + throw new RuntimeException("No value found for : " + nameBuf ); + } + } + + del = argStr.charAt(cIdx); + + if( del != '}') + { + throw new RuntimeException("Delimineter not found for : " + nameBuf ); + } + } + + cIdx++; + } + else + { + argBuf.append(ch); + ++cIdx; + } + + break; + + default: + argBuf.append(ch); + ++cIdx; + break; + } + } + + return argBuf; } } Added: jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestComponentConfig.properties URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestComponentConfig.properties?view=auto&rev=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestComponentConfig.properties (added) +++ jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestComponentConfig.properties Fri May 4 07:38:12 2007 @@ -0,0 +1,2 @@ +testComponent.FOO=FOO +reconfigurationService.interval=5000 Modified: jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestYaafiContainerConfig.xml URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestYaafiContainerConfig.xml?view=diff&rev=535262&r1=535261&r2=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestYaafiContainerConfig.xml (original) +++ jakarta/turbine/fulcrum/trunk/yaafi/src/test/TestYaafiContainerConfig.xml Fri May 4 07:38:12 2007 @@ -8,6 +8,10 @@ <componentConfiguration> <location>./src/test/TestComponentConfig.xml</location> </componentConfiguration> + <componentConfigurationProperties> + <resolver>org.apache.fulcrum.yaafi.framework.configuration.ComponentConfigurationPropertiesResolverImpl</resolver> + <location>./src/test/TestComponentConfig.properties</location> + </componentConfigurationProperties> <parameters> <location>./src/test/TestParameters.properties</location> </parameters> Modified: jakarta/turbine/fulcrum/trunk/yaafi/xdocs/changes.xml URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/xdocs/changes.xml?view=diff&rev=535262&r1=535261&r2=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/xdocs/changes.xml (original) +++ jakarta/turbine/fulcrum/trunk/yaafi/xdocs/changes.xml Fri May 4 07:38:12 2007 @@ -8,6 +8,11 @@ <body> <release version="1.0.5-dev" date="as in SVN"> <action dev="sgoeschl" type="add"> + Added componentConfiguration.properties to resolve custom properties + used for expanding the componentConfiguration.xml. Furthermore added + a resolver functionality to allow to use commons-configuration. + </action> + <action dev="sgoeschl" type="add"> Added JamonInterceptorService to capture statistical performance data </action> <action dev="sgoeschl" type="update"> Modified: jakarta/turbine/fulcrum/trunk/yaafi/xdocs/index.xml URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/xdocs/index.xml?view=diff&rev=535262&r1=535261&r2=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/xdocs/index.xml (original) +++ jakarta/turbine/fulcrum/trunk/yaafi/xdocs/index.xml Fri May 4 07:38:12 2007 @@ -50,6 +50,7 @@ <li>support for early or on-demand initialization</li> <li>support for encrypted configuration files</li> <li>dynamic proxies and service interceptors</li> + <li>dynamic expansion of variables found in the component configuration file</li> </ul> </p> </subsection> Modified: jakarta/turbine/fulcrum/trunk/yaafi/xdocs/specification/container.xml URL: http://svn.apache.org/viewvc/jakarta/turbine/fulcrum/trunk/yaafi/xdocs/specification/container.xml?view=diff&rev=535262&r1=535261&r2=535262 ============================================================================== --- jakarta/turbine/fulcrum/trunk/yaafi/xdocs/specification/container.xml (original) +++ jakarta/turbine/fulcrum/trunk/yaafi/xdocs/specification/container.xml Fri May 4 07:38:12 2007 @@ -87,6 +87,32 @@ </td> </tr> <tr> + <td>componentConfigurationProperties</td> + <td>Tree</td> + <td>[0|1]</td> + <td> + Information about the component configuration proeprties used + to resolve variables in the componentConfiguration + </td> + </tr> + <tr> + <td>componentConfigurationProperties/location</td> + <td>String</td> + <td>[0|1]</td> + <td> + The location of the component configuration property file. The + default value is "/componentConfiguration.properties" + </td> + </tr> + <tr> + <td>componentConfigurationProperties/resolver</td> + <td>String</td> + <td>[0|1]</td> + <td> + The resolver class name to load the componentConfiguration.properties. + </td> + </tr> + <tr> <td>parameters</td> <td>Tree</td> <td>[0|1]</td> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]