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


Reply via email to