You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2016/04/16 17:02:02 UTC

svn commit: r1739471 - in /commons/proper/configuration/trunk/src: main/java/org/apache/commons/configuration2/INIConfiguration.java test/java/org/apache/commons/configuration2/TestINIConfiguration.java

Author: oheger
Date: Sat Apr 16 15:02:02 2016
New Revision: 1739471

URL: http://svn.apache.org/viewvc?rev=1739471&view=rev
Log:
[CONFIGURATION-622] Fixed handling of escaped keys in INIConfiguration.write.

Separator characters contained in keys were duplicated when the
configuration was saved.

Modified:
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/INIConfiguration.java
    commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestINIConfiguration.java

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/INIConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/INIConfiguration.java?rev=1739471&r1=1739470&r2=1739471&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/INIConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/INIConfiguration.java Sat Apr 16 15:02:02 2016
@@ -23,7 +23,6 @@ import java.io.Reader;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -280,47 +279,44 @@ public class INIConfiguration extends Ba
     public void write(Writer writer) throws ConfigurationException, IOException
     {
         PrintWriter out = new PrintWriter(writer);
-        for (String section : getSections())
-        {
-            if (section != null)
-            {
-                out.print("[");
-                out.print(section);
-                out.print("]");
-                out.println();
-            }
-            Configuration subset = getSection(section);
+        boolean first = true;
 
-            Iterator<String> keys = subset.getKeys();
-            while (keys.hasNext())
+        beginRead(false);
+        try
+        {
+            for (ImmutableNode node : getModel().getNodeHandler().getRootNode()
+                    .getChildren())
             {
-                String key = keys.next();
-                Object value = subset.getProperty(key);
-                if (value instanceof Collection)
+                if (isSectionNode(node))
                 {
-                    Iterator<?> values = ((Collection<?>) value).iterator();
-                    while (values.hasNext())
+                    if (!first)
                     {
-                        value = values.next();
-                        out.print(key);
-                        out.print(" = ");
-                        out.print(escapeValue(value.toString()));
                         out.println();
                     }
+                    out.print("[");
+                    out.print(node.getNodeName());
+                    out.print("]");
+                    out.println();
+
+                    for (ImmutableNode child : node.getChildren())
+                    {
+                        writeProperty(out, child.getNodeName(),
+                                child.getValue());
+                    }
                 }
                 else
                 {
-                    out.print(key);
-                    out.print(" = ");
-                    out.print(escapeValue(value.toString()));
-                    out.println();
+                    writeProperty(out, node.getNodeName(), node.getValue());
                 }
+                first = false;
             }
-
             out.println();
+            out.flush();
+        }
+        finally
+        {
+            endRead();
         }
-
-        out.flush();
     }
 
     /**
@@ -449,6 +445,21 @@ public class INIConfiguration extends Ba
     }
 
     /**
+     * Writes data about a property into the given stream.
+     *
+     * @param out the output stream
+     * @param key the key
+     * @param value the value
+     */
+    private void writeProperty(PrintWriter out, String key, Object value)
+    {
+        out.print(key);
+        out.print(" = ");
+        out.print(escapeValue(value.toString()));
+        out.println();
+    }
+
+    /**
      * Parse the value to remove the quotes and ignoring the comment. Example:
      *
      * <pre>

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestINIConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestINIConfiguration.java?rev=1739471&r1=1739470&r2=1739471&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestINIConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/TestINIConfiguration.java Sat Apr 16 15:02:02 2016
@@ -17,8 +17,10 @@
 
 package org.apache.commons.configuration2;
 
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -831,6 +833,23 @@ public class TestINIConfiguration
     }
 
     /**
+     * Tests that loading and saving a configuration that contains keys with
+     * delimiter characters works correctly. This test is related to
+     * CONFIGURATION-622.
+     */
+    @Test
+    public void testPropertyWithDelimiter() throws ConfigurationException
+    {
+        String data = INI_DATA + "key.dot = dotValue";
+        INIConfiguration conf = new INIConfiguration();
+        load(conf, data);
+        assertEquals("Wrong property value", "dotValue",
+                conf.getString("section3.key..dot"));
+        String output = saveToString(conf);
+        assertThat(output, containsString("key.dot = dotValue"));
+    }
+
+    /**
      * Tests whether a value which contains a semicolon can be loaded
      * successfully. This test is related to CONFIGURATION-434.
      */