Author: oheger Date: Tue Apr 2 19:09:43 2013 New Revision: 1463694 URL: http://svn.apache.org/r1463694 Log: Reworked PatternSubtreeConfigurationWrapper.
The class no longer extends AbstractHierarchicalFileConfiguration. Rather, it wraps a plain hierarchical configuration which also has to implement the FileBased interface. Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestPatternSubtreeConfiguration.java Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java?rev=1463694&r1=1463693&r2=1463694&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java (original) +++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/PatternSubtreeConfigurationWrapper.java Tue Apr 2 19:09:43 2013 @@ -16,6 +16,7 @@ */ package org.apache.commons.configuration; +import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.math.BigDecimal; @@ -27,11 +28,12 @@ import java.util.Properties; import org.apache.commons.configuration.event.ConfigurationErrorListener; import org.apache.commons.configuration.event.ConfigurationListener; +import org.apache.commons.configuration.io.FileBased; import org.apache.commons.configuration.tree.ConfigurationNode; import org.apache.commons.configuration.tree.ExpressionEngine; /** - * Wraps a BaseHierarchicalConfiguration and allows subtrees to be access via a configured path with + * Wraps a BaseHierarchicalConfiguration and allows subtrees to be accessed via a configured path with * replaceable tokens derived from the ConfigurationInterpolator. When used with injection frameworks * such as Spring it allows components to be injected with subtrees of the configuration. * @since 1.6 @@ -40,7 +42,8 @@ import org.apache.commons.configuration. * Configuration team</a> * @version $Id$ */ -public class PatternSubtreeConfigurationWrapper extends AbstractHierarchicalFileConfiguration +public class PatternSubtreeConfigurationWrapper extends BaseHierarchicalConfiguration + implements FileBasedConfiguration { /** * Prevent recursion while resolving unprefixed properties. @@ -55,7 +58,7 @@ public class PatternSubtreeConfiguration }; /** The wrapped configuration */ - private final AbstractHierarchicalFileConfiguration config; + private final HierarchicalConfiguration config; /** The path to the subtree */ private final String path; @@ -71,7 +74,7 @@ public class PatternSubtreeConfiguration * @param config The Configuration to be wrapped. * @param path The base path pattern. */ - public PatternSubtreeConfigurationWrapper(AbstractHierarchicalFileConfiguration config, String path) + public PatternSubtreeConfigurationWrapper(HierarchicalConfiguration config, String path) { this.config = config; this.path = path; @@ -80,12 +83,6 @@ public class PatternSubtreeConfiguration } @Override - public Object getReloadLock() - { - return config.getReloadLock(); - } - - @Override public void addProperty(String key, Object value) { config.addProperty(makePath(key), value); @@ -453,14 +450,14 @@ public class PatternSubtreeConfiguration getConfig().clearErrorListeners(); } - public void save(Writer writer) throws ConfigurationException + public void write(Writer writer) throws ConfigurationException, IOException { - config.save(writer); + fetchFileBased().write(writer); } - public void load(Reader reader) throws ConfigurationException + public void read(Reader reader) throws ConfigurationException, IOException { - config.load(reader); + fetchFileBased().read(reader); } @Override @@ -532,4 +529,23 @@ public class PatternSubtreeConfiguration Object value = getInterpolator().interpolate(pattern); return (value != null) ? value.toString() : null; } + + /** + * Returns the wrapped configuration as a {@code FileBased} object. If this + * cast is not possible, an exception is thrown. + * + * @return the wrapped configuration as {@code FileBased} + * @throws ConfigurationException if the wrapped configuration does not + * implement {@code FileBased} + */ + private FileBased fetchFileBased() throws ConfigurationException + { + if (!(config instanceof FileBased)) + { + throw new ConfigurationException( + "Wrapped configuration does not implement FileBased!" + + " No I/O operations are supported."); + } + return (FileBased) config; + } } Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestPatternSubtreeConfiguration.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestPatternSubtreeConfiguration.java?rev=1463694&r1=1463693&r2=1463694&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestPatternSubtreeConfiguration.java (original) +++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestPatternSubtreeConfiguration.java Tue Apr 2 19:09:43 2013 @@ -20,8 +20,9 @@ package org.apache.commons.configuration import static org.junit.Assert.assertTrue; import java.io.File; +import java.io.StringWriter; -import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy; +import org.apache.commons.configuration.io.FileHandler; import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine; import org.junit.Before; import org.junit.Test; @@ -33,7 +34,7 @@ import org.junit.Test; */ public class TestPatternSubtreeConfiguration { - private static String CONFIG_FILE = "target/test-classes/testPatternSubtreeConfig.xml"; + private static File CONFIG_FILE = ConfigurationAssert.getTestFile("testPatternSubtreeConfig.xml"); private static String PATTERN = "BusinessClient[@name='${sys:Id}']"; private XMLConfiguration conf; @@ -41,8 +42,7 @@ public class TestPatternSubtreeConfigura public void setUp() throws Exception { conf = new XMLConfiguration(); - conf.setFile(new File(CONFIG_FILE)); - conf.load(); + new FileHandler(conf).load(CONFIG_FILE); } /** @@ -51,12 +51,7 @@ public class TestPatternSubtreeConfigura @Test public void testMultiConfiguration() { - //set up a reloading strategy - FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy(); - strategy.setRefreshDelay(10000); - PatternSubtreeConfigurationWrapper config = new PatternSubtreeConfigurationWrapper(this.conf, PATTERN); - config.setReloadingStrategy(strategy); config.setExpressionEngine(new XPathExpressionEngine()); System.setProperty("Id", "1001"); @@ -68,4 +63,30 @@ public class TestPatternSubtreeConfigura System.setProperty("Id", "1003"); assertTrue(config.getInt("rowsPerPage") == 35); } -} \ No newline at end of file + + /** + * Tests a read operation if the wrapped configuration does not implement + * FileBased. + */ + @Test(expected = ConfigurationException.class) + public void testReadNotFileBased() throws ConfigurationException + { + HierarchicalConfiguration hc = new BaseHierarchicalConfiguration(); + PatternSubtreeConfigurationWrapper config = + new PatternSubtreeConfigurationWrapper(hc, PATTERN); + new FileHandler(config).load(CONFIG_FILE); + } + + /** + * Tests a write operation if the wrapped configuration does not implement + * FileBased. + */ + @Test(expected = ConfigurationException.class) + public void testSaveNotFileBased() throws ConfigurationException + { + HierarchicalConfiguration hc = new BaseHierarchicalConfiguration(); + PatternSubtreeConfigurationWrapper config = + new PatternSubtreeConfigurationWrapper(hc, PATTERN); + new FileHandler(config).save(new StringWriter()); + } +}