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 2006/06/04 18:46:41 UTC

svn commit: r411583 - in /jakarta/commons/proper/configuration/trunk/src: java/org/apache/commons/configuration/SubnodeConfiguration.java test/org/apache/commons/configuration/TestSubnodeConfiguration.java

Author: oheger
Date: Sun Jun  4 09:46:41 2006
New Revision: 411583

URL: http://svn.apache.org/viewvc?rev=411583&view=rev
Log:
Modified SubnodeConfiguration to be more independend from its parent configuration; the settings are no longer shared. Interpolation will now always be delegated to the parent.

Modified:
    jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/SubnodeConfiguration.java
    jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubnodeConfiguration.java

Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/SubnodeConfiguration.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/SubnodeConfiguration.java?rev=411583&r1=411582&r2=411583&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/SubnodeConfiguration.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/SubnodeConfiguration.java Sun Jun  4 09:46:41 2006
@@ -16,7 +16,6 @@
 package org.apache.commons.configuration;
 
 import org.apache.commons.configuration.tree.ConfigurationNode;
-import org.apache.commons.configuration.tree.ExpressionEngine;
 
 /**
  * <p>
@@ -43,12 +42,13 @@
  * configuration's root node is involved.
  * </p>
  * <p>
- * A subnode configuration and its parent configuration work very close
- * together. For instance, some flags used by configuration objects (e.g. the
+ * When a subnode configuration is created, it inherits the settings of its
+ * parent configuration, e.g. some flags like the
  * <code>throwExceptionOnMissing</code> flag or the settings for handling list
- * delimiters) are shared between both. This means if one of these properties is
- * modified for the subnode configuration, it is also changed for the parent and
- * vice versa.
+ * delimiters) or the expression engine. If these settings are changed later in
+ * either the subnode or the parent configuration, the changes are not visible
+ * for each other. So you could create a subnode configuration, change its
+ * expression engine without affecting the parent configuration.
  * </p>
  * <p>
  * From its purpose this class is quite similar to
@@ -91,6 +91,7 @@
 
         setRootNode(root);
         this.parent = parent;
+        initFromParent(parent);
     }
 
     /**
@@ -104,92 +105,6 @@
     }
 
     /**
-     * Returns the expression engine. This method returns the parent's
-     * expression engine.
-     *
-     * @return the expression engine
-     */
-    public ExpressionEngine getExpressionEngine()
-    {
-        return getParent().getExpressionEngine();
-    }
-
-    /**
-     * Sets the expression engine. This method sets the expression engine at the
-     * parent.
-     *
-     * @param expressionEngine the new expression engine
-     */
-    public void setExpressionEngine(ExpressionEngine expressionEngine)
-    {
-        getParent().setExpressionEngine(expressionEngine);
-    }
-
-    /**
-     * Returns the list delimiter. This method returns the parent's delimiter.
-     *
-     * @return the list delimiter
-     */
-    public char getListDelimiter()
-    {
-        return getParent().getListDelimiter();
-    }
-
-    /**
-     * Sets the list delimiter. The delimiter will also be set for the parent.
-     *
-     * @param listDelimiter the new delimiter
-     */
-    public void setListDelimiter(char listDelimiter)
-    {
-        getParent().setListDelimiter(listDelimiter);
-    }
-
-    /**
-     * Returns a flag if list properties should be splitted when they are added.
-     * This implementation returns the corresponding flag of the parent.
-     *
-     * @return the delimiter parsing flag
-     */
-    public boolean isDelimiterParsingDisabled()
-    {
-        return getParent().isDelimiterParsingDisabled();
-    }
-
-    /**
-     * Sets the delimiter parsing disabled flag. This method will also set this
-     * flag at the parent.
-     *
-     * @param delimiterParsingDisabled the new value of the flag
-     */
-    public void setDelimiterParsingDisabled(boolean delimiterParsingDisabled)
-    {
-        getParent().setDelimiterParsingDisabled(delimiterParsingDisabled);
-    }
-
-    /**
-     * Returns the throw exception on missing flag. This implementation returns
-     * the value of the corresponding flag of the parent.
-     *
-     * @return the throw exception on missing flag
-     */
-    public boolean isThrowExceptionOnMissing()
-    {
-        return getParent().isThrowExceptionOnMissing();
-    }
-
-    /**
-     * Sets the throw exception on missing flag. The value is also set for the
-     * parent.
-     *
-     * @param throwExceptionOnMissing the new value of the flag
-     */
-    public void setThrowExceptionOnMissing(boolean throwExceptionOnMissing)
-    {
-        getParent().setThrowExceptionOnMissing(throwExceptionOnMissing);
-    }
-
-    /**
      * Returns a hierarchical configuration object for the given sub node.
      * This implementation will ensure that the returned
      * <code>SubnodeConfiguration</code> object will have the same parent than
@@ -212,5 +127,32 @@
     protected Node createNode(String name)
     {
         return getParent().createNode(name);
+    }
+
+    /**
+     * Initializes this subnode configuration from the given parent
+     * configuration. This method is called by the constructor. It will copy
+     * many settings from the parent.
+     *
+     * @param parentConfig the parent configuration
+     */
+    protected void initFromParent(HierarchicalConfiguration parentConfig)
+    {
+        setExpressionEngine(parentConfig.getExpressionEngine());
+        setListDelimiter(parentConfig.getListDelimiter());
+        setDelimiterParsingDisabled(parentConfig.isDelimiterParsingDisabled());
+        setThrowExceptionOnMissing(parentConfig.isThrowExceptionOnMissing());
+    }
+
+    /**
+     * Performs interpolation. This implementation will ask the parent
+     * configuration to perform the interpolation so that variables can be
+     * evaluated in the global context.
+     *
+     * @param value the value to be interpolated
+     */
+    protected Object interpolate(Object value)
+    {
+        return getParent().interpolate(value);
     }
 }

Modified: jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubnodeConfiguration.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubnodeConfiguration.java?rev=411583&r1=411582&r2=411583&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubnodeConfiguration.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestSubnodeConfiguration.java Sun Jun  4 09:46:41 2006
@@ -183,8 +183,8 @@
      */
     public void testSetThrowExceptionOnMissing()
     {
-        setUpSubnodeConfig();
         parent.setThrowExceptionOnMissing(true);
+        setUpSubnodeConfig();
         assertTrue("Exception flag not fetchted from parent", config
                 .isThrowExceptionOnMissing());
         try
@@ -198,7 +198,7 @@
         }
 
         config.setThrowExceptionOnMissing(false);
-        assertFalse("Exception flag not set on parent", parent
+        assertTrue("Exception flag reset on parent", parent
                 .isThrowExceptionOnMissing());
     }
 
@@ -208,33 +208,36 @@
      */
     public void testSetDelimiterParsingDisabled()
     {
-        setUpSubnodeConfig();
         parent.setDelimiterParsingDisabled(true);
+        setUpSubnodeConfig();
+        parent.setDelimiterParsingDisabled(false);
         assertTrue("Delimiter parsing flag was not received from parent",
                 config.isDelimiterParsingDisabled());
         config.addProperty("newProp", "test1,test2,test3");
         assertEquals("New property was splitted", "test1,test2,test3", parent
                 .getString("tables.table(0).newProp"));
+        parent.setDelimiterParsingDisabled(true);
         config.setDelimiterParsingDisabled(false);
-        assertFalse("Delimiter parsing flag was not set on parent", parent
+        assertTrue("Delimiter parsing flag was reset on parent", parent
                 .isDelimiterParsingDisabled());
     }
 
     /**
-     * Tests manipulating the list delimiter. This piece of data is used by both
-     * the parent and the subnode.
+     * Tests manipulating the list delimiter. This piece of data is derived from
+     * the parent.
      */
     public void testSetListDelimiter()
     {
-        setUpSubnodeConfig();
         parent.setListDelimiter('/');
+        setUpSubnodeConfig();
+        parent.setListDelimiter(';');
         assertEquals("List delimiter not obtained from parent", '/', config
                 .getListDelimiter());
         config.addProperty("newProp", "test1,test2/test3");
         assertEquals("List was incorrectly splitted", "test1,test2", parent
                 .getString("tables.table(0).newProp"));
         config.setListDelimiter(',');
-        assertEquals("List delimiter not set at parent", ',', parent
+        assertEquals("List delimiter changed on parent", ';', parent
                 .getListDelimiter());
     }
 
@@ -243,8 +246,8 @@
      */
     public void testSetExpressionEngine()
     {
-        setUpSubnodeConfig();
         parent.setExpressionEngine(new XPathExpressionEngine());
+        setUpSubnodeConfig();
         assertEquals("Wrong field name", TABLE_FIELDS[0][1], config
                 .getString("fields/field[2]/name"));
         Set keys = new HashSet();
@@ -253,23 +256,42 @@
         assertTrue("Key 1 not contained", keys.contains("name"));
         assertTrue("Key 2 not contained", keys.contains("fields/field/name"));
         config.setExpressionEngine(null);
-        assertSame("Expression engine not set on parent",
-                HierarchicalConfiguration.getDefaultExpressionEngine(), parent
-                        .getExpressionEngine());
+        assertTrue("Expression engine reset on parent", parent
+                .getExpressionEngine() instanceof XPathExpressionEngine);
     }
-    
+
     /**
      * Tests the configurationAt() method.
      */
     public void testConfiguarationAt()
     {
         setUpSubnodeConfig();
-        SubnodeConfiguration sub2 = (SubnodeConfiguration) config.configurationAt("fields.field(1)");
-        assertEquals("Wrong value of property", TABLE_FIELDS[0][1], sub2.getString("name"));
+        SubnodeConfiguration sub2 = (SubnodeConfiguration) config
+                .configurationAt("fields.field(1)");
+        assertEquals("Wrong value of property", TABLE_FIELDS[0][1], sub2
+                .getString("name"));
         assertEquals("Wrong parent", config.getParent(), sub2.getParent());
     }
 
     /**
+     * Tests interpolation features. The subnode config should use its parent
+     * for interpolation.
+     */
+    public void testInterpolation()
+    {
+        parent.addProperty("tablespaces.tablespace.name", "default");
+        parent.addProperty("tablespaces.tablespace(-1).name", "test");
+        parent.addProperty("tables.table(0).tablespace",
+                "${tablespaces.tablespace(0).name}");
+        assertEquals("Wrong interpolated tablespace", "default", parent
+                .getString("tables.table(0).tablespace"));
+
+        setUpSubnodeConfig();
+        assertEquals("Wrong interpolated tablespace in subnode", "default",
+                config.getString("tablespace"));
+    }
+
+    /**
      * Initializes the parent configuration. This method creates the typical
      * structure of tables and fields nodes.
      *
@@ -286,7 +308,6 @@
                 nodeCounter++;
                 return super.createNode(name);
             }
-
         };
         for (int i = 0; i < TABLE_NAMES.length; i++)
         {



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