Author: oheger Date: Mon Jun 23 13:36:37 2008 New Revision: 670739 URL: http://svn.apache.org/viewvc?rev=670739&view=rev Log: CONFIGURATION-331: Added a factory method to XMLBeanDeclaration for creating the declarations for complex nested properties.
Modified: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/beanutils/XMLBeanDeclaration.java commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/beanutils/TestXMLBeanDeclaration.java commons/proper/configuration/trunk/xdocs/changes.xml Modified: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/beanutils/XMLBeanDeclaration.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/beanutils/XMLBeanDeclaration.java?rev=670739&r1=670738&r2=670739&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/beanutils/XMLBeanDeclaration.java (original) +++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/beanutils/XMLBeanDeclaration.java Mon Jun 23 13:36:37 2008 @@ -310,8 +310,7 @@ ConfigurationNode child = (ConfigurationNode) it.next(); if (!isReservedNode(child)) { - nested.put(child.getName(), new XMLBeanDeclaration( - getConfiguration().configurationAt(child.getName()), child)); + nested.put(child.getName(), createBeanDeclaration(child)); } } @@ -351,6 +350,26 @@ } /** + * Creates a new <code>BeanDeclaration</code> for a child node of the + * current configuration node. This method is called by + * <code>getNestedBeanDeclarations()</code> for all complex sub properties + * detected by this method. Derived classes can hook in if they need a + * specific initialization. This base implementation creates a + * <code>XMLBeanDeclaration</code> that is properly initialized from the + * passed in node. + * + * @param node the child node, for which a <code>BeanDeclaration</code> is + * to be created + * @return the <code>BeanDeclaration</code> for this child node + * @since 1.6 + */ + protected BeanDeclaration createBeanDeclaration(ConfigurationNode node) + { + return new XMLBeanDeclaration(getConfiguration().configurationAt( + node.getName()), node); + } + + /** * Initializes the internally managed subnode configuration. This method * will set some default values for some properties. * Modified: commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/beanutils/TestXMLBeanDeclaration.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/beanutils/TestXMLBeanDeclaration.java?rev=670739&r1=670738&r2=670739&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/beanutils/TestXMLBeanDeclaration.java (original) +++ commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/beanutils/TestXMLBeanDeclaration.java Mon Jun 23 13:36:37 2008 @@ -19,6 +19,7 @@ import java.util.Map; import org.apache.commons.configuration.HierarchicalConfiguration; +import org.apache.commons.configuration.SubnodeConfiguration; import org.apache.commons.configuration.tree.ConfigurationNode; import junit.framework.TestCase; @@ -242,9 +243,10 @@ } /** - * Tests fetching nested bean declarations. + * Creates a configuration with data for testing nested bean declarations. + * @return the initialized test configuration */ - public void testGetNestedBeanDeclarations() + private HierarchicalConfiguration prepareNestedBeanDeclarations() { HierarchicalConfiguration config = new HierarchicalConfiguration(); setupBeanDeclaration(config, KEY, TEST_PROPS, TEST_VALUES); @@ -256,7 +258,15 @@ KEY + '.' + COMPLEX_PROPS[i] + "[EMAIL PROTECTED]", COMPLEX_CLASSES[i]); } + return config; + } + /** + * Tests fetching nested bean declarations. + */ + public void testGetNestedBeanDeclarations() + { + HierarchicalConfiguration config = prepareNestedBeanDeclarations(); decl = new XMLBeanDeclaration(config, KEY); checkProperties(decl, TEST_PROPS, TEST_VALUES); @@ -275,6 +285,31 @@ } /** + * Tests whether the factory method for creating nested bean declarations + * gets called. + */ + public void testGetNestedBeanDeclarationsFactoryMethod() + { + HierarchicalConfiguration config = prepareNestedBeanDeclarations(); + decl = new XMLBeanDeclaration(config, KEY) + { + protected BeanDeclaration createBeanDeclaration( + ConfigurationNode node) + { + return new XMLBeanDeclarationTestImpl(getConfiguration() + .configurationAt(node.getName()), node); + } + }; + Map nested = decl.getNestedBeanDeclarations(); + for (int i = 0; i < COMPLEX_PROPS.length; i++) + { + Object d = nested.get(COMPLEX_PROPS[i]); + assertTrue("Wrong class for bean declaration: " + d, + d instanceof XMLBeanDeclarationTestImpl); + } + } + + /** * Tests fetching nested bean declarations if none are defined. */ public void testGetNestedBeanDeclarationsEmpty() @@ -395,4 +430,17 @@ props.get(names[i])); } } + + /** + * A helper class used for testing the createBeanDeclaration() factory + * method. + */ + private static class XMLBeanDeclarationTestImpl extends XMLBeanDeclaration + { + public XMLBeanDeclarationTestImpl(SubnodeConfiguration config, + ConfigurationNode node) + { + super(config, node); + } + } } Modified: commons/proper/configuration/trunk/xdocs/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/xdocs/changes.xml?rev=670739&r1=670738&r2=670739&view=diff ============================================================================== --- commons/proper/configuration/trunk/xdocs/changes.xml (original) +++ commons/proper/configuration/trunk/xdocs/changes.xml Mon Jun 23 13:36:37 2008 @@ -23,6 +23,12 @@ <body> <release version="1.6" date="in SVN" description=""> + <action dev="oheger" type="add" issue="CONFIGURATION-331"> + XMLBeanDeclaration now defines a factory method createBeanDeclaration() + for creating the declarations for complex nested properties. This + method can be overridden by derived classes for injecting custom + BeanDeclaration implementations. + </action> <action dev="oheger" type="fix" issue="CONFIGURATION-307"> XMLConfiguration now supports the xml:space attribute. This attribute can be used to preserve whitespace in the content of XML elements.