You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ep...@apache.org on 2004/03/09 11:31:31 UTC

cvs commit: jakarta-commons/configuration/src/java/org/apache/commons/configuration SubsetConfiguration.java HierarchicalConfiguration.java JNDIConfiguration.java CompositeConfiguration.java AbstractConfiguration.java

epugh       2004/03/09 02:31:31

  Modified:    configuration/src/test/org/apache/commons/configuration
                        TestCompositeConfiguration.java
                        TestHierarchicalConfiguration.java
                        NonStringTestHolder.java
               configuration/xdocs changes.xml
               configuration/src/java/org/apache/commons/configuration
                        HierarchicalConfiguration.java
                        JNDIConfiguration.java CompositeConfiguration.java
                        AbstractConfiguration.java
  Added:       configuration/src/test/org/apache/commons/configuration
                        TestSubsetConfiguration.java
               configuration/src/java/org/apache/commons/configuration
                        SubsetConfiguration.java
  Log:
  SubsetConfiguration refactoring.
  
  Revision  Changes    Path
  1.6       +7 -7      jakarta-commons/configuration/src/test/org/apache/commons/configuration/TestCompositeConfiguration.java
  
  Index: TestCompositeConfiguration.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/configuration/src/test/org/apache/commons/configuration/TestCompositeConfiguration.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TestCompositeConfiguration.java	27 Feb 2004 17:41:34 -0000	1.5
  +++ TestCompositeConfiguration.java	9 Mar 2004 10:31:31 -0000	1.6
  @@ -210,7 +210,7 @@
       }
   
       /**
  -     * Tests retrieving subsets of configuraitions
  +     * Tests retrieving subsets of configurations
        */
       public void testGettingSubset() throws Exception
       {
  @@ -218,14 +218,14 @@
           cc.addConfiguration(dom4jConf);
   
           Configuration subset = null;
  -        subset = cc.subset("test.short");
  +        subset = cc.subset("test");
           assertNotNull(subset);
  -        assertTrue("Shouldn't be empty", !subset.isEmpty());
  -        assertEquals("Make sure the initial loaded configs subset overrides" + "any later add configs subset", "1", subset.getString("test.short"));
  +        assertFalse("Shouldn't be empty", subset.isEmpty());
  +        assertEquals("Make sure the initial loaded configs subset overrides any later add configs subset", "1", subset.getString("short"));
   
           cc.setProperty("test.short", "43");
  -        subset = cc.subset("test.short");
  -        assertEquals("Make sure the initial loaded configs subset overrides" + "any later add configs subset", "43", subset.getString("test.short"));
  +        subset = cc.subset("test");
  +        assertEquals("Make sure the initial loaded configs subset overrides any later add configs subset", "43", subset.getString("short"));
       }
   
       /**
  
  
  
  1.4       +6 -6      jakarta-commons/configuration/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java
  
  Index: TestHierarchicalConfiguration.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/configuration/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TestHierarchicalConfiguration.java	27 Feb 2004 17:41:34 -0000	1.3
  +++ TestHierarchicalConfiguration.java	9 Mar 2004 10:31:31 -0000	1.4
  @@ -235,12 +235,12 @@
               key.append("name");
               assertEquals(fields[0][i], conf.getProperty(key.toString()));
           }  /* for */
  -        
  -        assertNull(config.subset("tables.table(2)"));
  -        
  -        conf = config.subset("tables.table.fields.field.name");
  +
  +        assertTrue("subset is not empty", config.subset("tables.table(2)").isEmpty());
  +
  +        conf = config.subset("tables.table.fields.field");
           prop = conf.getProperty("name");
  -        assertTrue(prop instanceof Collection);
  +        assertTrue("prop is not a collection", prop instanceof Collection);
           assertEquals(10, ((Collection) prop).size());
       }
   }
  
  
  
  1.5       +14 -23    jakarta-commons/configuration/src/test/org/apache/commons/configuration/NonStringTestHolder.java
  
  Index: NonStringTestHolder.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/configuration/src/test/org/apache/commons/configuration/NonStringTestHolder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- NonStringTestHolder.java	27 Feb 2004 17:41:34 -0000	1.4
  +++ NonStringTestHolder.java	9 Mar 2004 10:31:31 -0000	1.5
  @@ -130,39 +130,30 @@
   
       public void testListMissing() throws Exception
       {
  -
  -        Assert.assertEquals(
  -            0,
  -            configuration.getList("missing.list").size());
  +        Assert.assertEquals(0, configuration.getList("missing.list").size());
       }
   
       public void testSubset() throws Exception
       {
  -        String KEY_VALUE = "test.short";
  -        Configuration subset = configuration.subset(KEY_VALUE);
  -		boolean foundKeyValue = false;
  -        for (Iterator i = subset.getKeys(); i.hasNext();)
  -        {
  -            String key = (String) i.next();
  -            if (!key.equals(KEY_VALUE))
  -            {
  +        Configuration subset = configuration.subset("test");
   
  -                Assert.assertTrue(
  -                    "Key is:" + key,
  -                    !key.startsWith("test.short"));
  -            }
  -            else {
  -            	foundKeyValue=true;
  -            }
  +        // search the "short" key in the subset using the key iterator
  +        boolean foundKeyValue = false;
  +        Iterator it = subset.getKeys();
  +        while (it.hasNext() && !foundKeyValue)
  +        {
  +            String key = (String) it.next();
  +            foundKeyValue = "short".equals(key);
           }
  -        Assert.assertTrue("Make sure test.short did show up.  It is valid.",foundKeyValue);
  +
  +        Assert.assertTrue("'short' key not found in the subset key iterator", foundKeyValue);
       }
   
       public void testIsEmpty() throws Exception
       {
  -        Assert.assertTrue("Configuration should not be empty",!configuration.isEmpty());
  -
  +        Assert.assertTrue("Configuration should not be empty", !configuration.isEmpty());
       }
  +
       /**
        * @return
        */
  
  
  
  1.1                  jakarta-commons/configuration/src/test/org/apache/commons/configuration/TestSubsetConfiguration.java
  
  Index: TestSubsetConfiguration.java
  ===================================================================
  /*
   * Copyright 2001-2004 The Apache Software Foundation.
   *
   * Licensed under the Apache License, Version 2.0 (the "License")
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.commons.configuration;
  
  import junit.framework.TestCase;
  
  import java.util.Iterator;
  
  /**
   * Test case for the {@link SubsetConfiguration} class.
   *
   * @author Emmanuel Bourg
   * @version $Revision: 1.1 $, $Date: 2004/03/09 10:31:31 $
   */
  public class TestSubsetConfiguration extends TestCase {
  
      public void testGetProperty() {
          BaseConfiguration conf = new BaseConfiguration();
          conf.setProperty("test.key1", "value1");
          conf.setProperty("testing.key2", "value1");
  
          Configuration subset = new SubsetConfiguration(conf, "test", ".");
          assertFalse("the subset is empty", subset.isEmpty());
          assertTrue("'key1' not found in the subset", subset.containsKey("key1"));
          assertFalse("'ng.key2' found in the subset", subset.containsKey("ng.key2"));
      }
  
      public void testSetProperty() {
          BaseConfiguration conf = new BaseConfiguration();
          Configuration subset = new SubsetConfiguration(conf, "test", ".");
  
          // set a property in the subset and check the parent
          subset.setProperty("key1", "value1");
          assertEquals("key1 in the subset configuration", "value1", subset.getProperty("key1"));
          assertEquals("test.key1 in the parent configuration", "value1", conf.getProperty("test.key1"));
  
          // set a property in the parent and check in the subset
          conf.setProperty("test.key2", "value2");
          assertEquals("test.key2 in the parent configuration", "value2", conf.getProperty("test.key2"));
          assertEquals("key2 in the subset configuration", "value2", subset.getProperty("key2"));
      }
  
      public void testGetParentKey() {
          // subset with delimiter
          SubsetConfiguration subset = new SubsetConfiguration(null, "prefix", ".");
          assertEquals("parent key for \"key\"", "prefix.key", subset.getParentKey("key"));
          assertEquals("parent key for \"\"", "prefix", subset.getParentKey(""));
  
          // subset without delimiter
          subset = new SubsetConfiguration(null, "prefix", null);
          assertEquals("parent key for \"key\"", "prefixkey", subset.getParentKey("key"));
          assertEquals("parent key for \"\"", "prefix", subset.getParentKey(""));
      }
  
      public void testGetChildKey() {
          // subset with delimiter
          SubsetConfiguration subset = new SubsetConfiguration(null, "prefix", ".");
          assertEquals("parent key for \"prefixkey\"", "key", subset.getChildKey("prefix.key"));
          assertEquals("parent key for \"prefix\"", "", subset.getChildKey("prefix"));
  
          // subset without delimiter
          subset = new SubsetConfiguration(null, "prefix", null);
          assertEquals("parent key for \"prefixkey\"", "key", subset.getChildKey("prefixkey"));
          assertEquals("parent key for \"prefix\"", "", subset.getChildKey("prefix"));
      }
  
      public void testGetKeys() {
          BaseConfiguration conf = new BaseConfiguration();
          conf.setProperty("test", "value0");
          conf.setProperty("test.key1", "value1");
          conf.setProperty("testing.key2", "value1");
  
          Configuration subset = new SubsetConfiguration(conf, "test", ".");
  
          Iterator it = subset.getKeys();
          assertEquals("1st key", "", it.next());
          assertEquals("2nd key", "key1", it.next());
          assertFalse("too many elements", it.hasNext());
      }
  
      public void testGetKeysWithPrefix() {
          BaseConfiguration conf = new BaseConfiguration();
          conf.setProperty("test.abc", "value0");
          conf.setProperty("test.abc.key1", "value1");
          conf.setProperty("test.abcdef.key2", "value1");
  
          Configuration subset = new SubsetConfiguration(conf, "test", ".");
  
          Iterator it = subset.getKeys("abc");
          assertEquals("1st key", "abc", it.next());
          assertEquals("2nd key", "abc.key1", it.next());
          assertFalse("too many elements", it.hasNext());
      }
  }
  
  
  
  1.15      +3 -0      jakarta-commons/configuration/xdocs/changes.xml
  
  Index: changes.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/configuration/xdocs/changes.xml,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- changes.xml	8 Mar 2004 23:21:31 -0000	1.14
  +++ changes.xml	9 Mar 2004 10:31:31 -0000	1.15
  @@ -7,6 +7,9 @@
   
     <body>
       <release version="1.0-dev-4" date="">  
  +	 <action dev="ebourg" type="update">
  +        Fixed bug 27427 by refactoring out the subset logic into a SubsetConfiguration.
  +     </action>    	
        <action dev="oheger" type="fix">
         	Reapply the ConfigurationXMLDocument that went missing during migration out of sandbox.
        </action>        	
  
  
  
  1.4       +1 -44     jakarta-commons/configuration/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
  
  Index: HierarchicalConfiguration.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/configuration/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- HierarchicalConfiguration.java	27 Feb 2004 17:41:35 -0000	1.3
  +++ HierarchicalConfiguration.java	9 Mar 2004 10:31:31 -0000	1.4
  @@ -333,49 +333,6 @@
       }
   
       /**
  -     * Creates a new <code>Configuration</code> object containing all keys
  -     * that start with the specified prefix. This implementation will return
  -     * a <code>HierarchicalConfiguration</code> object so that the structure
  -     * of the keys will be saved.
  -     * @param prefix the prefix of the keys for the subset
  -     * @return a new configuration object representing the selected subset
  -     */
  -    public Configuration subset(String prefix)
  -    {
  -        Collection nodes = fetchNodeList(prefix);
  -        if (nodes.isEmpty())
  -        {
  -            return null;
  -        } /* if */
  -
  -        HierarchicalConfiguration result = new HierarchicalConfiguration();
  -        CloneVisitor visitor = new CloneVisitor();
  -
  -        for (Iterator it = nodes.iterator(); it.hasNext();)
  -        {
  -            Node nd = (Node) it.next();
  -            nd.visit(visitor, null);
  -
  -            Container children = visitor.getClone().getChildren();
  -            if (children.size() > 0)
  -            {
  -                for (int i = 0; i < children.size(); i++)
  -                {
  -                    result.getRoot().addChild((Node) children.get(i));
  -                } /* for */
  -            } /* if */
  -            else
  -            {
  -                // In this case we cannot shorten the key because only
  -                // values are found without further child nodes.
  -                result.getRoot().addChild(visitor.getClone());
  -            } /* else */
  -        } /* for */
  -
  -        return (result.isEmpty()) ? null : result;
  -    }
  -
  -    /**
        * Returns the maximum defined index for the given key. This is
        * useful if there are multiple values for this key. They can then be
        * addressed separately by specifying indices from 0 to the return value
  
  
  
  1.8       +1 -60     jakarta-commons/configuration/src/java/org/apache/commons/configuration/JNDIConfiguration.java
  
  Index: JNDIConfiguration.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/configuration/src/java/org/apache/commons/configuration/JNDIConfiguration.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- JNDIConfiguration.java	27 Feb 2004 17:41:35 -0000	1.7
  +++ JNDIConfiguration.java	9 Mar 2004 10:31:31 -0000	1.8
  @@ -285,65 +285,6 @@
               return false;
           }
       }
  -    /**
  -     * Create an ExtendedProperties object that is a subset
  -     * of this one. Take into account duplicate keys
  -     * by using the setProperty() in ExtendedProperties.
  -     *
  -     * @param prefix
  -     */
  -    public Configuration subset(String prefix)
  -    {
  -        BaseConfiguration c = new BaseConfiguration();
  -        Iterator keys = this.getKeys();
  -        boolean validSubset = false;
  -        while (keys.hasNext())
  -        {
  -            Object key = keys.next();
  -            if (key instanceof String && ((String) key).startsWith(prefix))
  -            {
  -                if (!validSubset)
  -                {
  -                    validSubset = true;
  -                }
  -                String newKey = null;
  -                /*
  -                 * Check to make sure that c.subset(prefix) doesn't blow up when
  -                 * there is only a single property with the key prefix. This is
  -                 * not a useful subset but it is a valid subset.
  -                 */
  -                if (((String) key).length() == prefix.length())
  -                {
  -                    newKey = prefix;
  -                }
  -                else
  -                {
  -                    newKey = ((String) key).substring(prefix.length() + 1);
  -                }
  -                /*
  -                 * use addPropertyDirect() - this will plug the data as is into
  -                 * the Map, but will also do the right thing re key accounting
  -                 */
  -                Object value = getValueFromJNDI(key.toString());
  -                if (value instanceof String)
  -                {
  -                    c.addPropertyDirect(newKey, interpolate((String) value));
  -                }
  -                else
  -                {
  -                    c.addPropertyDirect(newKey, value);
  -                }
  -            }
  -        }
  -        if (validSubset)
  -        {
  -            return (Configuration) c;
  -        }
  -        else
  -        {
  -            return null;
  -        }
  -    }
       
       /**
        * Get a boolean associated with the given configuration key.
  
  
  
  1.9       +2 -27     jakarta-commons/configuration/src/java/org/apache/commons/configuration/CompositeConfiguration.java
  
  Index: CompositeConfiguration.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/configuration/src/java/org/apache/commons/configuration/CompositeConfiguration.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- CompositeConfiguration.java	8 Mar 2004 23:27:09 -0000	1.8
  +++ CompositeConfiguration.java	9 Mar 2004 10:31:31 -0000	1.9
  @@ -247,32 +247,7 @@
           }
           return false;
       }
  -    /**
  -     * Create a CompositeConfiguration object that is a subset
  -     * of this one. Cycles over all the config objects, and calls
  -     * their subset method and then just adds that.
  -     *
  -     * @param prefix
  -     */
  -    public Configuration subset(String prefix)
  -    {
  -        CompositeConfiguration subsetCompositeConfiguration =
  -            new CompositeConfiguration();
  -        Configuration subConf = null;
  -        int count = 0;
  -        for (ListIterator i = configList.listIterator(); i.hasNext();)
  -        {
  -            Configuration config = (Configuration) i.next();
  -            Configuration subset = config.subset(prefix);
  -            if (subset != null)
  -            {
  -                subsetCompositeConfiguration.addConfiguration(subset);
  -                subConf = subset;
  -                count++;
  -            }
  -        }
  -        return (count == 1) ? subConf : subsetCompositeConfiguration;
  -    }
  + 
       /**
        * Get a List of strings associated with the given configuration key.
        *
  
  
  
  1.7       +17 -72    jakarta-commons/configuration/src/java/org/apache/commons/configuration/AbstractConfiguration.java
  
  Index: AbstractConfiguration.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/configuration/src/java/org/apache/commons/configuration/AbstractConfiguration.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- AbstractConfiguration.java	27 Feb 2004 17:41:35 -0000	1.6
  +++ AbstractConfiguration.java	9 Mar 2004 10:31:31 -0000	1.7
  @@ -16,6 +16,8 @@
    * limitations under the License.
    */
   
  +import java.math.BigDecimal;
  +import java.math.BigInteger;
   import java.util.ArrayList;
   import java.util.Collection;
   import java.util.Iterator;
  @@ -23,9 +25,9 @@
   import java.util.NoSuchElementException;
   import java.util.Properties;
   import java.util.StringTokenizer;
  -import java.math.BigDecimal;
  -import java.math.BigInteger;
   
  +import org.apache.commons.collections.Predicate;
  +import org.apache.commons.collections.iterators.FilterIterator;
   import org.apache.commons.lang.BooleanUtils;
   
   /**
  @@ -270,63 +272,7 @@
        */
       public Configuration subset(String prefix)
       {
  -        BaseConfiguration c = new BaseConfiguration();
  -        Iterator keys = this.getKeys();
  -        boolean validSubset = false;
  -
  -        while (keys.hasNext())
  -        {
  -            Object key = keys.next();
  -
  -            if (key instanceof String && ((String) key).startsWith(prefix))
  -            {
  -                if (!validSubset)
  -                {
  -                    validSubset = true;
  -                }
  -
  -                String newKey = null;
  -
  -                /*
  -                 * Check to make sure that c.subset(prefix) doesn't blow up when
  -                 * there is only a single property with the key prefix. This is
  -                 * not a useful subset but it is a valid subset.
  -                 */
  -                if (((String) key).length() == prefix.length())
  -                {
  -                    newKey = prefix;
  -                }
  -                else
  -                {
  -                    newKey = ((String) key).substring(prefix.length() + 1);
  -                }
  -
  -                /*
  -                 * use addPropertyDirect() - this will plug the data as is into
  -                 * the Map, but will also do the right thing re key accounting
  -                 *
  -                 * QUESTION: getProperty or getPropertyDirect
  -                 */
  -                Object value = getProperty((String) key);
  -                if (value instanceof String)
  -                {
  -                    c.addPropertyDirect(newKey, interpolate((String) value));
  -                }
  -                else
  -                {
  -                    c.addProperty(newKey, value);
  -                }
  -            }
  -        }
  -
  -        if (validSubset)
  -        {
  -            return c;
  -        }
  -        else
  -        {
  -            return null;
  -        }
  +        return new SubsetConfiguration(this, prefix, ".");
       }
   
       /**
  @@ -384,21 +330,20 @@
        *
        * @return An Iterator of keys that match the prefix.
        */
  -    public Iterator getKeys(String prefix)
  -    {
  -        Iterator keys = getKeys();
  -        ArrayList matchingKeys = new ArrayList();
  +    public Iterator getKeys(final String prefix) {
   
  -        while (keys.hasNext())
  -        {
  -            Object key = keys.next();
  +        return new FilterIterator(getKeys(), new Predicate() {
  +            public boolean evaluate(Object obj) {
  +                boolean matching = false;
  +
  +                if (obj instanceof String) {
  +                    String key = (String) obj;
  +                    matching = key.startsWith(prefix + ".") || key.equals(prefix);
  +                }
   
  -            if (key instanceof String && ((String) key).startsWith(prefix))
  -            {
  -                matchingKeys.add(key);
  +                return matching;
               }
  -        }
  -        return matchingKeys.iterator();
  +        });
       }
   
       /**
  
  
  
  1.1                  jakarta-commons/configuration/src/java/org/apache/commons/configuration/SubsetConfiguration.java
  
  Index: SubsetConfiguration.java
  ===================================================================
  /*
   * Copyright 2004 The Apache Software Foundation.
   *
   * Licensed under the Apache License, Version 2.0 (the "License")
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.commons.configuration;
  
  import java.math.BigDecimal;
  import java.math.BigInteger;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Properties;
  
  import org.apache.commons.collections.Transformer;
  import org.apache.commons.collections.iterators.TransformIterator;
  
  /**
   * A subset of another configuration. The new Configuration object contains
   * every key from the parent Configuration that starts with prefix. The prefix
   * is removed from the keys in the subset.
   *
   * @author Emmanuel Bourg
   * @version $Revision: 1.1 $, $Date: 2004/03/09 10:31:31 $
   */
  public class SubsetConfiguration implements Configuration {
  
      protected Configuration parent;
      protected String prefix;
      protected String delimiter;
  
      /**
       * Create a subset of the specified configuration
       *
       * @param parent The parent configuration
       * @param prefix The prefix used to select the properties.
       */
      public SubsetConfiguration(Configuration parent, String prefix) {
          this.parent = parent;
          this.prefix = prefix;
      }
  
      /**
       * Create a subset of the specified configuration
       *
       * @param parent    The parent configuration
       * @param prefix    The prefix used to select the properties.
       * @param delimiter The prefix delimiter
       */
      public SubsetConfiguration(Configuration parent, String prefix, String delimiter) {
          this.parent = parent;
          this.prefix = prefix;
          this.delimiter = delimiter;
      }
  
      /**
       * Return the key in the parent configuration associated to the specified
       * key in this subset.
       *
       * @param key The key in the subset.
       */
      protected String getParentKey(String key) {
          if ("".equals(key) || key == null) {
              return prefix;
          } else {
              return delimiter == null ? prefix + key : prefix + delimiter + key;
          }
      }
  
      /**
       * Return the key in the subset configuration associated to the specified
       * key in the parent configuration.
       *
       * @param key The key in the parent configuration.
       */
      protected String getChildKey(String key) {
          if (!key.startsWith(prefix)) {
              throw new IllegalArgumentException("The parent key '" + key + "' is not in the subset.");
          } else {
              String modifiedKey = null;
              if (key.length() == prefix.length()) {
                  modifiedKey = "";
              } else {
                  int i = prefix.length() + (delimiter != null ? delimiter.length() : 0);
                  modifiedKey = key.substring(i);
              }
  
              return modifiedKey;
          }
      }
  
      /**
       * Return the parent configuation for this subset.
       */
      public Configuration getParent() {
          return parent;
      }
  
      /**
       * Return the prefix used to select the properties in the parent configuration.
       */
      public String getPrefix() {
          return prefix;
      }
  
      /**
       * Set the prefix used to select the properties in the parent configuration.
       */
      public void setPrefix(String prefix) {
          this.prefix = prefix;
      }
  
      public Configuration subset(String prefix) {
          return parent.subset(getParentKey(prefix));
      }
  
      public boolean isEmpty() {
          return !getKeys().hasNext();
      }
  
      public boolean containsKey(String key) {
          return parent.containsKey(getParentKey(key));
      }
  
      public void addProperty(String key, Object value) {
          parent.addProperty(getParentKey(key), value);
      }
  
      public void setProperty(String key, Object value) {
          parent.setProperty(getParentKey(key), value);
      }
  
      public void clearProperty(String key) {
          parent.clearProperty(getParentKey(key));
      }
  
      public Object getProperty(String key) {
          return parent.getProperty(getParentKey(key));
      }
  
      public Iterator getKeys(String prefix) {
          return new TransformIterator(parent.getKeys(getParentKey(prefix)), new Transformer() {
              public Object transform(Object obj) {
                  return getChildKey((String) obj);
              }
          });
      }
  
      public Iterator getKeys() {
          return new TransformIterator(parent.getKeys(prefix), new Transformer() {
              public Object transform(Object obj) {
                  return getChildKey((String) obj);
              }
          });
      }
  
      public Properties getProperties(String key) {
          return parent.getProperties(getParentKey(key));
      }
  
      public boolean getBoolean(String key) {
          return parent.getBoolean(getParentKey(key));
      }
  
      public boolean getBoolean(String key, boolean defaultValue) {
          return parent.getBoolean(getParentKey(key), defaultValue);
      }
  
      public Boolean getBoolean(String key, Boolean defaultValue) {
          return parent.getBoolean(getParentKey(key), defaultValue);
      }
  
      public byte getByte(String key) {
          return parent.getByte(getParentKey(key));
      }
  
      public byte getByte(String key, byte defaultValue) {
          return parent.getByte(getParentKey(key), defaultValue);
      }
  
      public Byte getByte(String key, Byte defaultValue) {
          return parent.getByte(getParentKey(key), defaultValue);
      }
  
      public double getDouble(String key) {
          return parent.getDouble(getParentKey(key));
      }
  
      public double getDouble(String key, double defaultValue) {
          return parent.getDouble(getParentKey(key), defaultValue);
      }
  
      public Double getDouble(String key, Double defaultValue) {
          return parent.getDouble(getParentKey(key), defaultValue);
      }
  
      public float getFloat(String key) {
          return parent.getFloat(getParentKey(key));
      }
  
      public float getFloat(String key, float defaultValue) {
          return parent.getFloat(getParentKey(key), defaultValue);
      }
  
      public Float getFloat(String key, Float defaultValue) {
          return parent.getFloat(getParentKey(key), defaultValue);
      }
  
      public int getInt(String key) {
          return parent.getInt(getParentKey(key));
      }
  
      public int getInt(String key, int defaultValue) {
          return parent.getInt(getParentKey(key), defaultValue);
      }
  
      public Integer getInteger(String key, Integer defaultValue) {
          return parent.getInteger(getParentKey(key), defaultValue);
      }
  
      public long getLong(String key) {
          return parent.getLong(getParentKey(key));
      }
  
      public long getLong(String key, long defaultValue) {
          return parent.getLong(getParentKey(key), defaultValue);
      }
  
      public Long getLong(String key, Long defaultValue) {
          return parent.getLong(getParentKey(key), defaultValue);
      }
  
      public short getShort(String key) {
          return parent.getShort(getParentKey(key));
      }
  
      public short getShort(String key, short defaultValue) {
          return parent.getShort(getParentKey(key), defaultValue);
      }
  
      public Short getShort(String key, Short defaultValue) {
          return parent.getShort(getParentKey(key), defaultValue);
      }
  
      public BigDecimal getBigDecimal(String key) {
          return parent.getBigDecimal(getParentKey(key));
      }
  
      public BigDecimal getBigDecimal(String key, BigDecimal defaultValue) {
          return parent.getBigDecimal(getParentKey(key), defaultValue);
      }
  
      public BigInteger getBigInteger(String key) {
          return parent.getBigInteger(getParentKey(key));
      }
  
      public BigInteger getBigInteger(String key, BigInteger defaultValue) {
          return parent.getBigInteger(getParentKey(key), defaultValue);
      }
  
      public String getString(String key) {
          return parent.getString(getParentKey(key));
      }
  
      public String getString(String key, String defaultValue) {
          return parent.getString(getParentKey(key), defaultValue);
      }
  
      public String[] getStringArray(String key) {
          return parent.getStringArray(getParentKey(key));
      }
  
      public List getList(String key) {
          return parent.getList(getParentKey(key));
      }
  
      public List getList(String key, List defaultValue) {
          return parent.getList(getParentKey(key), defaultValue);
      }
  
  
  
  }
  
  
  

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