Author: oheger
Date: Sat Jul 30 08:28:01 2005
New Revision: 226535

URL: http://svn.apache.org/viewcvs?rev=226535&view=rev
Log:
Fixed some issues with XMLConfiguration and comma delimited lists; see BZ 35938

Modified:
    jakarta/commons/proper/configuration/trunk/conf/test.xml
    
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
    
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/PropertyConverter.java
    
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java
    jakarta/commons/proper/configuration/trunk/xdocs/changes.xml

Modified: jakarta/commons/proper/configuration/trunk/conf/test.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/conf/test.xml?rev=226535&r1=226534&r2=226535&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/conf/test.xml (original)
+++ jakarta/commons/proper/configuration/trunk/conf/test.xml Sat Jul 30 
08:28:01 2005
@@ -38,6 +38,14 @@
                        <item>six</item>
                </sublist>
        </list>
+    
+    <!-- Comma delimited lists -->
+    <split>
+      <list1>a,b,c</list1>
+      <list2>a\,b\,c</list2>
+      <list3 values="a,b,c"/>
+      <list4 values="a\,b\,c"/>
+    </split>
 
        <!-- clear tests -->
        <clear>

Modified: 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java?rev=226535&r1=226534&r2=226535&view=diff
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
 (original)
+++ 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
 Sat Jul 30 08:28:01 2005
@@ -1367,6 +1367,7 @@
                             {
                                 insertNode.setReference(ref);
                             }
+                            sibling1 = insertNode;
                         }
                     }
                 }

Modified: 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/PropertyConverter.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/PropertyConverter.java?rev=226535&r1=226534&r2=226535&view=diff
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/PropertyConverter.java
 (original)
+++ 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/PropertyConverter.java
 Sat Jul 30 08:28:01 2005
@@ -46,6 +46,9 @@
  */
 public final class PropertyConverter
 {
+    /** Constant for the list delimiter escaping character.*/
+    static final String LIST_ESCAPE = "\\";
+    
     /**
      * Convert the specified object into a Boolean.
      *
@@ -443,7 +446,7 @@
             // extract the chunk
             String chunk = s.substring(begin , end);
 
-            if (chunk.endsWith("\\") && end != s.length())
+            if (chunk.endsWith(LIST_ESCAPE) && end != s.length())
             {
                 token.append(chunk.substring(0, chunk.length() - 1));
                 token.append(delimiter);
@@ -466,6 +469,23 @@
         }
 
         return list;
+    }
+    
+    /**
+     * Escapes the delimiters that might be contained in the given string. This
+     * method ensures that list delimiter characters that are part of a
+     * property's value are correctly escaped when a configuration is saved to 
a
+     * file. Otherwise when loaded again the property will be treated as a list
+     * property.
+     * 
+     * @param s the string with the value
+     * @param delimiter the list delimiter to use
+     * @return the correctly esaped string
+     */
+    public static String escapeDelimiters(String s, char delimiter)
+    {
+        return StringUtils.replace(s, String.valueOf(delimiter), LIST_ESCAPE
+                + delimiter);
     }
 
     /**

Modified: 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java?rev=226535&r1=226534&r2=226535&view=diff
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
 (original)
+++ 
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
 Sat Jul 30 08:28:01 2005
@@ -296,6 +296,7 @@
                         (elemRefs) ? child : null);
                 constructHierarchy(childNode, child, elemRefs);
                 node.addChild(childNode);
+                handleDelimiters(node, childNode);
             }
             else if (w3cNode instanceof Text)
             {
@@ -339,6 +340,40 @@
     }
     
     /**
+     * Deals with elements whose value is a list. In this case multiple child
+     * elements must be added.
+     * 
+     * @param parent the parent element
+     * @param child the child element
+     */
+    private void handleDelimiters(Node parent, Node child)
+    {
+        if (child.getValue() != null)
+        {
+            List values = PropertyConverter.split(child.getValue().toString(),
+                    getDelimiter());
+            if (values.size() > 1)
+            {
+                // remove the original child
+                parent.remove(child);
+                // add multiple new children
+                for (Iterator it = values.iterator(); it.hasNext();)
+                {
+                    Node c = new XMLNode(child.getName(), null);
+                    c.setValue(it.next());
+                    parent.addChild(c);
+                }
+            }
+            else if (values.size() == 1)
+            {
+                // we will have to replace the value because it might
+                // contain escaped delimiters
+                child.setValue(values.get(0));
+            }
+        }
+    }
+    
+    /**
      * Creates the <code>DocumentBuilder</code> to be used for loading files.
      * This implementation checks whether a specific
      * <code>DocumentBuilder</code> has been set. If this is the case, this
@@ -752,10 +787,13 @@
             {
                 if (txtNode == null)
                 {
-                    txtNode = document.createTextNode(value.toString());
+                    txtNode = document
+                            .createTextNode(PropertyConverter.escapeDelimiters(
+                                    value.toString(), getDelimiter()));
                     if (((Element) getReference()).getFirstChild() != null)
                     {
-                        ((Element) getReference()).insertBefore(txtNode, 
((Element) getReference()).getFirstChild());
+                        ((Element) getReference()).insertBefore(txtNode,
+                                ((Element) getReference()).getFirstChild());
                     }
                     else
                     {
@@ -764,7 +802,8 @@
                 }
                 else
                 {
-                    txtNode.setNodeValue(value.toString());
+                    txtNode.setNodeValue(PropertyConverter.escapeDelimiters(
+                            value.toString(), getDelimiter()));
                 }
             }
         }
@@ -870,7 +909,7 @@
                 Element elem = document.createElement(newNode.getName());
                 if (newNode.getValue() != null)
                 {
-                    
elem.appendChild(document.createTextNode(newNode.getValue().toString()));
+                    
elem.appendChild(document.createTextNode(PropertyConverter.escapeDelimiters(newNode.getValue().toString(),
 getDelimiter())));
                 }
                 if (sibling2 == null)
                 {
@@ -911,18 +950,21 @@
                         {
                             buf.append(getDelimiter());
                         }
-                        buf.append(attr.getValue());
+                        buf.append(PropertyConverter.escapeDelimiters(attr
+                                .getValue().toString(), getDelimiter()));
                     }
                     attr.setReference(elem);
                 }
 
                 if (buf.length() < 1)
                 {
-                    
elem.removeAttribute(ConfigurationKey.removeAttributeMarkers(name));
+                    elem.removeAttribute(ConfigurationKey
+                            .removeAttributeMarkers(name));
                 }
                 else
                 {
-                    
elem.setAttribute(ConfigurationKey.removeAttributeMarkers(name), 
buf.toString());
+                    elem.setAttribute(ConfigurationKey
+                            .removeAttributeMarkers(name), buf.toString());
                 }
             }
         }

Modified: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java?rev=226535&r1=226534&r2=226535&view=diff
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java
 (original)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java
 Sat Jul 30 08:28:01 2005
@@ -208,8 +208,6 @@
         // test single attribute
         conf.load();
         key = "[EMAIL PROTECTED]";
-        Object p = conf.getProperty(key);
-        p = conf.getProperty("clear.element2");
         conf.clearProperty(key);
         assertNull(key, conf.getProperty(key));
         assertNull(key, conf.getProperty(key));
@@ -367,6 +365,11 @@
         {
            conf.addProperty("[EMAIL PROTECTED]", "value" + i);
         }
+        
+        // add comma delimited lists with escaped delimiters
+        conf.addProperty("split.list5", "a\\,b\\,c");
+        conf.setProperty("element3", "value\\,value1\\,value2");
+        conf.setProperty("[EMAIL PROTECTED]", "foo\\,bar");
 
         // save the configuration
         conf.save(testSaveConf.getAbsolutePath());
@@ -554,6 +557,10 @@
         assertEquals("foo", copy.getString("[EMAIL PROTECTED]"));
     }
     
+    /**
+     * Tests the subset() method. There was a bug that calling subset() had
+     * undesired side effects.
+     */
     public void testSubset() throws ConfigurationException
     {
         conf = new XMLConfiguration();
@@ -567,5 +574,18 @@
         
         conf = new XMLConfiguration(testSaveConf);
         assertEquals("users", conf.getString("tables.table(0).name"));
+    }
+    
+    /**
+     * Tests string properties with list delimiters and escaped delimiters.
+     */
+    public void testSplitLists()
+    {
+        assertEquals("a", conf.getString("[EMAIL PROTECTED]"));
+        assertEquals(2, conf.getMaxIndex("[EMAIL PROTECTED]"));
+        assertEquals("a,b,c", conf.getString("[EMAIL PROTECTED]"));
+        assertEquals("a", conf.getString("split.list1"));
+        assertEquals(2, conf.getMaxIndex("split.list1"));
+        assertEquals("a,b,c", conf.getString("split.list2"));
     }
 }

Modified: jakarta/commons/proper/configuration/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/xdocs/changes.xml?rev=226535&r1=226534&r2=226535&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/configuration/trunk/xdocs/changes.xml Sat Jul 30 
08:28:01 2005
@@ -23,6 +23,11 @@
   <body>
 
     <release version="1.2-dev" date="in SVN">
+      <action dev="oheger" type="update" issue="35938">
+        Resolved some issues with XMLConfiguration and properties containing
+        the delimiter character. These properties are now correctly treated,
+        escaping the delimiter will work, too.
+      </action>
       <action dev="ebourg" type="add">
         Added support for XMLPropertiesConfiguration in ConfigurationFactory.
         A &lt;properties> element will generate a XMLPropertiesConfiguration



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to