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());
+ }
+}