You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by oh...@apache.org on 2006/05/06 17:05:55 UTC
svn commit: r400319 - in /jakarta/commons/proper/configuration/trunk:
src/java/org/apache/commons/configuration/
src/test/org/apache/commons/configuration/ xdocs/
Author: oheger
Date: Sat May 6 08:05:54 2006
New Revision: 400319
URL: http://svn.apache.org/viewcvs?rev=400319&view=rev
Log:
Added support for new configuration-tag to DefaultConfigurationBuilder for including other configuration definition files; added support for the optional-attribute for other configuration types than file-based configurations
Modified:
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java
jakarta/commons/proper/configuration/trunk/xdocs/howto_configurationbuilder.xml
Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java?rev=400319&r1=400318&r2=400319&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/DefaultConfigurationBuilder.java Sat May 6 08:05:54 2006
@@ -256,14 +256,17 @@
XMLPropertyListConfiguration.class,
PropertyListConfiguration.class, EXT_XML);
+ /** Constant for the provider for configuration definition files.*/
+ private static final ConfigurationProvider BUILDER_PROVIDER = new ConfigurationBuilderProvider();
+
/** An array with the names of the default tags. */
private static final String[] DEFAULT_TAGS =
- { "properties", "xml", "hierarchicalXml", "jndi", "system", "plist" };
+ { "properties", "xml", "hierarchicalXml", "jndi", "system", "plist", "configuration" };
/** An array with the providers for the default tags. */
private static final ConfigurationProvider[] DEFAULT_PROVIDERS =
{ PROPERTIES_PROVIDER, XML_PROVIDER, XML_PROVIDER, JNDI_PROVIDER,
- SYSTEM_PROVIDER, PLIST_PROVIDER };
+ SYSTEM_PROVIDER, PLIST_PROVIDER, BUILDER_PROVIDER };
/** Stores a map with the registered configuration providers. */
private Map providers;
@@ -506,8 +509,12 @@
.next();
ConfigurationDeclaration decl = new ConfigurationDeclaration(this,
conf);
- config.addConfiguration(createConfigurationAt(decl), decl
- .attributeValueStr(ATTR_NAME), decl.getAt());
+ AbstractConfiguration newConf = createConfigurationAt(decl);
+ if (newConf != null)
+ {
+ config.addConfiguration(newConf, decl
+ .attributeValueStr(ATTR_NAME), decl.getAt());
+ }
}
}
@@ -681,7 +688,8 @@
*/
public String getAt()
{
- return attributeValueStr(ATTR_AT);
+ String result = attributeValueStr(RESERVED_PREFIX + ATTR_AT);
+ return (result == null) ? attributeValueStr(ATTR_AT) : result;
}
/**
@@ -692,7 +700,12 @@
*/
public boolean isOptional()
{
- Object value = attributeValue(ATTR_OPTIONAL);
+ Object value = attributeValue(RESERVED_PREFIX + ATTR_OPTIONAL);
+ if (value == null)
+ {
+ value = attributeValue(ATTR_OPTIONAL);
+ }
+
try
{
return (value != null) ? PropertyConverter.toBoolean(value)
@@ -786,7 +799,9 @@
* Creates an instance of a bean class. This implementation expects that
* the passed in bean declaration is a declaration for a configuration.
* It will determine the responsible configuration provider and delegate
- * the call to this instance.
+ * the call to this instance. If creation of the configuration fails
+ * and the <code>optional</code> attribute is set, the exception will
+ * be ignored and <b>null</b> will be returned.
*
* @param beanClass the bean class (will be ignored)
* @param data the declaration
@@ -808,7 +823,22 @@
+ tagName);
}
- return provider.getConfiguration(decl);
+ try
+ {
+ return provider.getConfiguration(decl);
+ }
+ catch (Exception ex)
+ {
+ // If this is an optional configuration, ignore the exception
+ if (!decl.isOptional())
+ {
+ throw ex;
+ }
+ else
+ {
+ return null;
+ }
+ }
}
/**
@@ -864,17 +894,7 @@
{
FileConfiguration config = (FileConfiguration) super
.getConfiguration(decl);
- try
- {
- config.load();
- }
- catch (ConfigurationException cex)
- {
- if (!decl.isOptional())
- {
- throw cex;
- }
- }
+ config.load();
return (AbstractConfiguration) config;
}
@@ -961,6 +981,37 @@
{
return super.createBeanInstance(defaultClass, data);
}
+ }
+ }
+
+ /**
+ * A specialized configuration provider class that allows to include other
+ * configuration definition files.
+ */
+ static class ConfigurationBuilderProvider extends ConfigurationProvider
+ {
+ /**
+ * Creates a new instance of <code>ConfigurationBuilderProvider</code>.
+ */
+ public ConfigurationBuilderProvider()
+ {
+ super(DefaultConfigurationBuilder.class);
+ }
+
+ /**
+ * Creates the configuration. First creates a configuration builder
+ * object. Then returns the configuration created by this builder.
+ *
+ * @param decl the configuration declaration
+ * @return the configuration
+ * @exception Exception if an error occurs
+ */
+ public AbstractConfiguration getConfiguration(
+ ConfigurationDeclaration decl) throws Exception
+ {
+ DefaultConfigurationBuilder builder = (DefaultConfigurationBuilder) super
+ .getConfiguration(decl);
+ return builder.getConfiguration(true);
}
}
Modified: jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java?rev=400319&r1=400318&r2=400319&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestDefaultConfigurationBuilder.java Sat May 6 08:05:54 2006
@@ -72,7 +72,6 @@
*/
public void testConfigurationDeclarationIsReserved()
{
- factory = new DefaultConfigurationBuilder();
DefaultConfigurationBuilder.ConfigurationDeclaration decl = new DefaultConfigurationBuilder.ConfigurationDeclaration(
factory, factory);
DefaultConfigurationNode parent = new DefaultConfigurationNode();
@@ -121,7 +120,6 @@
*/
private void checkOldReservedAttribute(String name)
{
- factory = new DefaultConfigurationBuilder();
DefaultConfigurationBuilder.ConfigurationDeclaration decl = new DefaultConfigurationBuilder.ConfigurationDeclaration(
factory, factory);
DefaultConfigurationNode parent = new DefaultConfigurationNode();
@@ -144,16 +142,24 @@
*/
public void testConfigurationDeclarationGetAttributes()
{
- factory = new DefaultConfigurationBuilder();
factory.addProperty("/ xml/fileName", "test.xml");
DefaultConfigurationBuilder.ConfigurationDeclaration decl = new DefaultConfigurationBuilder.ConfigurationDeclaration(
factory, factory.configurationAt("xml"));
assertNull("Found an at attribute", decl.getAt());
assertFalse("Found an optional attribute", decl.isOptional());
- factory.addProperty("/xml @at", "test1");
+ factory.addProperty("/xml @config-at", "test1");
assertEquals("Wrong value of at attribute", "test1", decl.getAt());
- factory.addProperty("/xml @optional", "true");
+ factory.addProperty("/xml @at", "test2");
+ assertEquals("Wrong value of config-at attribute", "test1", decl.getAt());
+ factory.clearProperty("/xml/@config-at");
+ assertEquals("Old at attribute not detected", "test2", decl.getAt());
+ factory.addProperty("/xml @config-optional", "true");
assertTrue("Wrong value of optional attribute", decl.isOptional());
+ factory.addProperty("/xml @optional", "false");
+ assertTrue("Wrong value of config-optional attribute", decl.isOptional());
+ factory.clearProperty("/xml/@config-optional");
+ factory.setProperty("/xml/@optional", Boolean.TRUE);
+ assertTrue("Old optional attribute not detected", decl.isOptional());
factory.setProperty("/xml/@optional", "invalid value");
try
{
@@ -328,6 +334,16 @@
.getFileName());
// check some properties
+ checkProperties(compositeConfiguration);
+ }
+
+ /**
+ * Checks if the passed in configuration contains the expected properties.
+ *
+ * @param compositeConfiguration the configuration to check
+ */
+ private void checkProperties(Configuration compositeConfiguration)
+ {
assertTrue("Make sure we have loaded our key", compositeConfiguration
.getBoolean("test.boolean"));
assertEquals("I'm complex!", compositeConfiguration
@@ -410,6 +426,25 @@
}
/**
+ * Tries to load a configuration file with an optional, non file-based
+ * configuration. The optional attribute should work for other configuration
+ * classes, too.
+ */
+ public void testLoadOptionalNonFileBased() throws ConfigurationException
+ {
+ factory.addProperty("/ override/configuration@fileName",
+ "nonExisting.xml");
+ factory.addProperty("/override/configuration[1] @config-optional",
+ Boolean.TRUE);
+ factory.addProperty("/override/configuration[1] @config-name",
+ "optionalConfig");
+ CombinedConfiguration config = factory.getConfiguration(false);
+ assertTrue("Configuration not empty", config.isEmpty());
+ assertEquals("Wrong number of configurations", 0, config
+ .getNumberOfConfigurations());
+ }
+
+ /**
* Tests loading a definition file with multiple different sources.
*/
public void testLoadDifferentSources() throws ConfigurationException
@@ -543,5 +578,20 @@
listNodes = cca.getNodeCombiner().getListNodes();
assertTrue("Found list nodes for additional combiner", listNodes
.isEmpty());
+ }
+
+ /**
+ * Tests whether a configuration builder can itself be declared in a
+ * configuration definition file.
+ */
+ public void testConfigurationBuilderProvider()
+ throws ConfigurationException
+ {
+ factory.addProperty("/ override/configuration@fileName", TEST_FILE
+ .getAbsolutePath());
+ CombinedConfiguration cc = factory.getConfiguration(false);
+ assertEquals("Wrong number of configurations", 1, cc
+ .getNumberOfConfigurations());
+ checkProperties(cc);
}
}
Modified: jakarta/commons/proper/configuration/trunk/xdocs/howto_configurationbuilder.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/xdocs/howto_configurationbuilder.xml?rev=400319&r1=400318&r2=400319&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/xdocs/howto_configurationbuilder.xml (original)
+++ jakarta/commons/proper/configuration/trunk/xdocs/howto_configurationbuilder.xml Sat May 6 08:05:54 2006
@@ -132,6 +132,23 @@
are also allowed for <code>ConfigurationFactory</code>. A list of all
supported tags can be found
<a href="howto_configurationfactory.html#Configuration definition file reference">here</a>.
+ In addition to the default tags provided by <code>ConfigurationFactory</code>
+ <code>DefaultConfigurationBuilder</code> knows the following tags:
+ </p>
+ <p>
+ <dl>
+ <dt>configuration</dt>
+ <dd>The <code>configuration</code> tag allows to include other
+ configuration definition files. This makes it possible to nest these
+ definition files up to an arbitrary depth. In fact, this tag will
+ create another <code>DefaultConfigurationBuilder</code> object,
+ initialize it, and obtain the <code>CombinedConfiguation</code> from it.
+ This combined configuration will then be added to the resulting
+ combined configuration. Like for other file-based configurations the
+ <code>fileName</code> attribute can be used to specify the configuration
+ definition file to be loaded. This file must be an XML document that
+ conforms to the format described here.</dd>
+ </dl>
</p>
<p>
In the declaration of a configuration source it is possible to set
@@ -193,7 +210,13 @@
<tr>
<td valign="top"><code>config-optional</code></td>
<td>Declares a configuration as optional. This means that errors that
- occur when creating the configuration are silently ignored.</td>
+ occur when creating the configuration are silently ignored. Note that in
+ case of an error no configuration is added to the resulting combined
+ configuration. This fact can be used to find out whether an optional
+ configuration could be successfully created or not: If you specify a name
+ for the optional configuration (using the <code>config-name</code>
+ attribute), you can later check the combined configuration whether it
+ contains a configuration with this name.</td>
</tr>
</table>
</p>
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org