This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-configuration.git


The following commit(s) were added to refs/heads/master by this push:
     new f33137fe CONFIGURATION-844: Add support for empty sections (#408)
f33137fe is described below

commit f33137fe24103abe0317353b993a4026b40d9d15
Author: Thomas Steiner <47025493+steinertho...@users.noreply.github.com>
AuthorDate: Tue Apr 23 23:59:58 2024 +0200

    CONFIGURATION-844: Add support for empty sections (#408)
    
    * Add support for empty sections
    
    * Add documentation
    
    * Add test
    
    * Remove trailing whitespaces
---
 .../org/apache/commons/configuration2/INIConfiguration.java   | 11 ++++++++++-
 .../apache/commons/configuration2/TestINIConfiguration.java   | 10 ++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git 
a/src/main/java/org/apache/commons/configuration2/INIConfiguration.java 
b/src/main/java/org/apache/commons/configuration2/INIConfiguration.java
index 4749d930..f0a3280d 100644
--- a/src/main/java/org/apache/commons/configuration2/INIConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/INIConfiguration.java
@@ -134,6 +134,9 @@ import 
org.apache.commons.configuration2.tree.TrackedNodeModel;
  *  [sectionSeparators]
  *  passwd : abc=def
  *  a:b = "value"
+ *
+ *  []
+ *  var = emptySection
  * </pre>
  * <p>
  * This ini file will be parsed without error. Note:
@@ -155,6 +158,8 @@ import 
org.apache.commons.configuration2.tree.TrackedNodeModel;
  * {@code abc=def}. This default behavior can be changed by using quotes. If 
there is a separator character before the
  * first quote character (ignoring whitespace), this character is used as 
separator. Thus the second property definition
  * in the section has the key {@code a:b} and the value {@code value}.</li>
+ * <li>The empty section is added using a key consisting of a single space 
character. The parameters can be accessed
+ * using {@code getProperty(" .var")}</li>
  * </ul>
  * <p>
  * Internally, this configuration maps the content of the represented ini file 
to its node structure in the following
@@ -480,7 +485,11 @@ public class INIConfiguration extends 
BaseHierarchicalConfiguration implements F
             if (!isCommentLine(line)) {
                 if (isSectionLine(line)) {
                     final int length = sectionInLineCommentsAllowed ? 
line.indexOf("]") : line.length() - 1;
-                    final String section = line.substring(1, length);
+                    String section = line.substring(1, length);
+                    if (section.isEmpty()) {
+                        // use space for sections with no key
+                        section = " ";
+                    }
                     sectionBuilder = sectionBuilders.computeIfAbsent(section, 
k -> new ImmutableNode.Builder());
                 } else {
                     String key;
diff --git 
a/src/test/java/org/apache/commons/configuration2/TestINIConfiguration.java 
b/src/test/java/org/apache/commons/configuration2/TestINIConfiguration.java
index f9b19764..c78969f8 100644
--- a/src/test/java/org/apache/commons/configuration2/TestINIConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/TestINIConfiguration.java
@@ -1031,6 +1031,16 @@ public class TestINIConfiguration {
         assertEquals(Arrays.asList("1", "2", "3"), list);
     }
 
+    /**
+     * Tests correct handling of empty sections "[ ]".
+     */
+    @Test
+    public void testEmptySection() throws ConfigurationException {
+        final INIConfiguration config = setUpConfig("[]" + LINE_SEPARATOR + 
"key=value" + LINE_SEPARATOR);
+        final String value = config.getString(" .key");
+        assertEquals("value", value);
+    }
+
     /**
      * Tests whether a value which contains a semicolon can be loaded 
successfully. This test is related to
      * CONFIGURATION-434.

Reply via email to