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 2007/05/26 21:30:55 UTC

svn commit: r541932 - in /jakarta/commons/proper/configuration/trunk: src/java/org/apache/commons/configuration/CompositeConfiguration.java src/test/org/apache/commons/configuration/TestCompositeConfiguration.java xdocs/changes.xml

Author: oheger
Date: Sat May 26 12:30:54 2007
New Revision: 541932

URL: http://svn.apache.org/viewvc?view=rev&rev=541932
Log:
CONFIGURATION-215: Added a getSource() method to CompositeConfiguration

Modified:
    jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CompositeConfiguration.java
    jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCompositeConfiguration.java
    jakarta/commons/proper/configuration/trunk/xdocs/changes.xml

Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CompositeConfiguration.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CompositeConfiguration.java?view=diff&rev=541932&r1=541931&r2=541932
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CompositeConfiguration.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CompositeConfiguration.java Sat May 26 12:30:54 2007
@@ -421,4 +421,52 @@
                 .setListDelimiter(listDelimiter);
         super.setListDelimiter(listDelimiter);
     }
+
+    /**
+     * Returns the configuration source, in which the specified key is defined.
+     * This method will iterate over all existing child configurations and check
+     * whether they contain the specified key. The following constellations are
+     * possible:
+     * <ul>
+     * <li>If exactly one child configuration contains the key, this
+     * configuration is returned as the source configuration. This may be the
+     * <em>in memory configuration</em> (this has to be explicitly checked by
+     * the calling application).</li>
+     * <li>If none of the child configurations contain the key, <b>null</b> is
+     * returned.</li>
+     * <li>If the key is contained in multiple child configurations or if the
+     * key is <b>null</b>, a <code>IllegalArgumentException</code> is thrown.
+     * In this case the source configuration cannot be determined.</li>
+     * </ul>
+     *
+     * @param key the key to be checked
+     * @return the source configuration of this key
+     * @throws IllegalArgumentException if the source configuration cannot be
+     * determined
+     * @since 1.5
+     */
+    public Configuration getSource(String key)
+    {
+        if (key == null)
+        {
+            throw new IllegalArgumentException("Key must not be null!");
+        }
+
+        Configuration source = null;
+        for (Iterator it = configList.iterator(); it.hasNext();)
+        {
+            Configuration conf = (Configuration) it.next();
+            if (conf.containsKey(key))
+            {
+                if (source != null)
+                {
+                    throw new IllegalArgumentException("The key " + key
+                            + " is defined by multiple sources!");
+                }
+                source = conf;
+            }
+        }
+
+        return source;
+    }
 }

Modified: jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCompositeConfiguration.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCompositeConfiguration.java?view=diff&rev=541932&r1=541931&r2=541932
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCompositeConfiguration.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCompositeConfiguration.java Sat May 26 12:30:54 2007
@@ -40,6 +40,9 @@
  */
 public class TestCompositeConfiguration extends TestCase
 {
+    /** Constant for a test property to be checked.*/
+    private static final String TEST_PROPERTY = "test.source.property";
+
     protected PropertiesConfiguration conf1;
     protected PropertiesConfiguration conf2;
     protected XMLConfiguration xmlConf;
@@ -504,7 +507,7 @@
 
     /**
      * Writes a test properties file containing a single property definition.
-     * 
+     *
      * @param f the file to write
      * @param prop the property name
      * @param value the property value
@@ -681,6 +684,85 @@
         cc.addProperty("test.property", "a,b,c");
         assertEquals("Wrong value of property", "a,b,c", cc
                 .getString("test.property"));
+    }
+
+    /**
+     * Prepares a test of the getSource() method.
+     */
+    private void setUpSourceTest()
+    {
+        cc.addConfiguration(conf1);
+        cc.addConfiguration(conf2);
+    }
+
+    /**
+     * Tests the getSource() method if the property is defined in a single child
+     * configuration.
+     */
+    public void testGetSourceSingle()
+    {
+        setUpSourceTest();
+        conf1.addProperty(TEST_PROPERTY, Boolean.TRUE);
+        assertSame("Wrong source configuration", conf1, cc
+                .getSource(TEST_PROPERTY));
+    }
+
+    /**
+     * Tests the getSource() method for an unknown property key.
+     */
+    public void testGetSourceUnknown()
+    {
+        setUpSourceTest();
+        assertNull("Wrong source for unknown key", cc.getSource(TEST_PROPERTY));
+    }
+
+    /**
+     * Tests the getSource() method for a property contained in the in memory
+     * configuration.
+     */
+    public void testGetSourceInMemory()
+    {
+        setUpSourceTest();
+        cc.addProperty(TEST_PROPERTY, Boolean.TRUE);
+        assertSame("Source not found in in-memory config", cc
+                .getInMemoryConfiguration(), cc.getSource(TEST_PROPERTY));
+    }
+
+    /**
+     * Tests the getSource() method if the property is defined by multiple child
+     * configurations. In this case an exception should be thrown.
+     */
+    public void testGetSourceMultiple()
+    {
+        setUpSourceTest();
+        conf1.addProperty(TEST_PROPERTY, Boolean.TRUE);
+        cc.addProperty(TEST_PROPERTY, "a value");
+        try
+        {
+            cc.getSource(TEST_PROPERTY);
+            fail("Property in multiple configurations did not cause an error!");
+        }
+        catch (IllegalArgumentException iex)
+        {
+            // ok
+        }
+    }
+
+    /**
+     * Tests the getSource() method for a null key. This should cause an
+     * exception.
+     */
+    public void testGetSourceNull()
+    {
+        try
+        {
+            cc.getSource(null);
+            fail("Could pass null key to getSource()!");
+        }
+        catch (IllegalArgumentException iex)
+        {
+            // ok
+        }
     }
 
     /**

Modified: jakarta/commons/proper/configuration/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/xdocs/changes.xml?view=diff&rev=541932&r1=541931&r2=541932
==============================================================================
--- jakarta/commons/proper/configuration/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/configuration/trunk/xdocs/changes.xml Sat May 26 12:30:54 2007
@@ -23,6 +23,11 @@
 
   <body>
     <release version="1.5-SNAPSHOT" date="in SVN" description="">
+      <action dev="oheger" type="add" issue="CONFIGURATION-215">
+        A new getSource() method was added to CompositeConfiguration and
+        CombinedConfiguration, which returns the child configuration, in which
+        a given property is defined.
+      </action>
       <action dev="oheger" type="fix" issue="CONFIGURATION-274">
         PropertiesConfiguration now supports escaping the escape character for
         list delimiters.



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org