Author: oheger
Date: Wed Mar  1 20:58:32 2017
New Revision: 1785035

URL: http://svn.apache.org/viewvc?rev=1785035&view=rev
Log:
[CONFIGURATION-647] Separator for ini files can now be set.

INIConfiguration can now be configured to use a custom separator
between properties and values when writing an ini file.

Thanks to vladimir dot martinek at cenarion dot com for the patch.

Added:
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderParametersImpl.java
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderProperties.java
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/INIBuilderParameters.java
Modified:
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/INIConfiguration.java
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/Parameters.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=1785035&r1=1785034&r2=1785035&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
 Wed Mar  1 20:58:32 2017
@@ -248,6 +248,11 @@ public class INIConfiguration extends Ba
     private static final String LINE_CONT = "\\";
 
     /**
+     * The separator used when writing an INI file.
+     */
+    private String separatorUsedInOutput = " = ";
+
+    /**
      * Create a new empty INI Configuration.
      */
     public INIConfiguration()
@@ -268,6 +273,46 @@ public class INIConfiguration extends Ba
     }
 
     /**
+     * Get separator used in INI output. see {@code setSeparatorUsedInOutput}
+     * for further explanation
+     *
+     * @return the current separator for writing the INI output
+     * @since 2.2
+     */
+    public String getSeparatorUsedInOutput()
+    {
+        beginRead(false);
+        try
+        {
+            return separatorUsedInOutput;
+        }
+        finally
+        {
+            endRead();
+        }
+    }
+
+    /**
+     * Allows setting the key and value separator which is used for the 
creation
+     * of the resulting INI output
+     *
+     * @param separator String of the new separator for INI output
+     * @since 2.2
+     */
+    public void setSeparatorUsedInOutput(String separator)
+    {
+        beginWrite(false);
+        try
+        {
+            this.separatorUsedInOutput = separator;
+        }
+        finally
+        {
+            endWrite();
+        }
+    }
+
+    /**
      * Save the configuration to the specified writer.
      *
      * @param writer - The writer to save the configuration to.
@@ -280,6 +325,7 @@ public class INIConfiguration extends Ba
     {
         PrintWriter out = new PrintWriter(writer);
         boolean first = true;
+        final String separator = getSeparatorUsedInOutput();
 
         beginRead(false);
         try
@@ -301,12 +347,12 @@ public class INIConfiguration extends Ba
                     for (ImmutableNode child : node.getChildren())
                     {
                         writeProperty(out, child.getNodeName(),
-                                child.getValue());
+                                child.getValue(), separator);
                     }
                 }
                 else
                 {
-                    writeProperty(out, node.getNodeName(), node.getValue());
+                    writeProperty(out, node.getNodeName(), node.getValue(), 
separator);
                 }
                 first = false;
             }
@@ -451,10 +497,10 @@ public class INIConfiguration extends Ba
      * @param key the key
      * @param value the value
      */
-    private void writeProperty(PrintWriter out, String key, Object value)
+    private void writeProperty(PrintWriter out, String key, Object value, 
String separator)
     {
         out.print(key);
-        out.print(" = ");
+        out.print(separator);
         out.print(escapeValue(value.toString()));
         out.println();
     }

Added: 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderParametersImpl.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderParametersImpl.java?rev=1785035&view=auto
==============================================================================
--- 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderParametersImpl.java
 (added)
+++ 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderParametersImpl.java
 Wed Mar  1 20:58:32 2017
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.configuration2.builder;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * A specialized parameters class for INI configuration.
+ * </p>
+ * <p>
+ * This parameters class defines some properties which allow customizing the
+ * parsing and writing of INI documents.
+ * </p>
+ * <p>
+ * This class is not thread-safe. It is intended that an instance is 
constructed
+ * and initialized by a single thread during configuration of a
+ * {@code ConfigurationBuilder}.
+ * </p>
+ *
+ * @since 2.2
+ */
+public class INIBuilderParametersImpl extends HierarchicalBuilderParametersImpl
+        implements INIBuilderProperties<INIBuilderParametersImpl>
+{
+    /** The key for the separatorUsedInINIOutput property. */
+    private static final String PROP_SEPARATOR_USED_IN_INI_OUTPUT
+       = "separatorUsedInOutput";
+
+    @Override
+    public void inheritFrom(Map<String, ?> source)
+    {
+        super.inheritFrom(source);
+        copyPropertiesFrom(source, PROP_SEPARATOR_USED_IN_INI_OUTPUT);
+    }
+
+       @Override
+       public INIBuilderParametersImpl setSeparatorUsedInOutput(String 
separator) {
+               storeProperty(PROP_SEPARATOR_USED_IN_INI_OUTPUT, separator);
+               return this;
+       }
+}

Added: 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderProperties.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderProperties.java?rev=1785035&view=auto
==============================================================================
--- 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderProperties.java
 (added)
+++ 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/INIBuilderProperties.java
 Wed Mar  1 20:58:32 2017
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.configuration2.builder;
+
+/**
+ * <p>
+ * Definition of a parameters interface for INI configurations.
+ * </p>
+ * <p>
+ * The {@code INIConfiguration} class defines a bunch of additional properties
+ * related to INI processing.
+ * </p>
+ * <p>
+ * <strong>Important note:</strong> This interface is not intended to be
+ * implemented by client code! It defines a set of available properties and may
+ * be extended even in minor releases.
+ * </p>
+ *
+ * @since 2.2
+ * @param <T> the type of the result of all set methods for method chaining
+ */
+public interface INIBuilderProperties<T>
+{
+    /**
+     * Allows setting the separator between key and value to be used when
+     * writing an INI file.
+     *
+     * @param separator the new separator for INI output
+     * @return a reference to this object for method chaining
+     */
+    T setSeparatorUsedInOutput(String separator);
+}

Added: 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/INIBuilderParameters.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/INIBuilderParameters.java?rev=1785035&view=auto
==============================================================================
--- 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/INIBuilderParameters.java
 (added)
+++ 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/INIBuilderParameters.java
 Wed Mar  1 20:58:32 2017
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.configuration2.builder.fluent;
+
+import org.apache.commons.configuration2.builder.BasicBuilderProperties;
+import org.apache.commons.configuration2.builder.BuilderParameters;
+import org.apache.commons.configuration2.builder.FileBasedBuilderProperties;
+import org.apache.commons.configuration2.builder.HierarchicalBuilderProperties;
+import org.apache.commons.configuration2.builder.INIBuilderProperties;
+
+/**
+ * <p>
+ * Definition of a parameters interface providing a fluent API for setting all
+ * properties for a INI configuration.
+ * </p>
+ * <p>
+ * <strong>Important note:</strong> This interface is not intended to be
+ * implemented by client code! It defines a set of available properties and may
+ * be extended even in minor releases.
+ * </p>
+ *
+ * @since 2.2
+ */
+public interface INIBuilderParameters extends
+        BasicBuilderProperties<INIBuilderParameters>,
+        FileBasedBuilderProperties<INIBuilderParameters>,
+        HierarchicalBuilderProperties<INIBuilderParameters>,
+        INIBuilderProperties<INIBuilderParameters>, BuilderParameters
+{
+}

Modified: 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/Parameters.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/Parameters.java?rev=1785035&r1=1785034&r2=1785035&view=diff
==============================================================================
--- 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/Parameters.java
 (original)
+++ 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/fluent/Parameters.java
 Wed Mar  1 20:58:32 2017
@@ -27,6 +27,7 @@ import org.apache.commons.configuration2
 import org.apache.commons.configuration2.builder.DefaultParametersManager;
 import 
org.apache.commons.configuration2.builder.FileBasedBuilderParametersImpl;
 import 
org.apache.commons.configuration2.builder.HierarchicalBuilderParametersImpl;
+import org.apache.commons.configuration2.builder.INIBuilderParametersImpl;
 import org.apache.commons.configuration2.builder.JndiBuilderParametersImpl;
 import 
org.apache.commons.configuration2.builder.PropertiesBuilderParametersImpl;
 import org.apache.commons.configuration2.builder.XMLBuilderParametersImpl;
@@ -272,6 +273,18 @@ public final class Parameters
     }
 
     /**
+     * Creates a new instance of a parameters object for INI configurations.
+     *
+     * @return the new parameters object
+     */
+    public INIBuilderParameters ini()
+    {
+        return createParametersProxy(new INIBuilderParametersImpl(),
+                INIBuilderParameters.class, FileBasedBuilderParameters.class,
+                HierarchicalBuilderParameters.class);
+    }
+
+    /**
      * Creates a proxy object for a given parameters interface based on the
      * given implementation object. The newly created object is initialized
      * with default values if there are matching {@link 
DefaultParametersHandler}

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=1785035&r1=1785034&r2=1785035&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
 Wed Mar  1 20:58:32 2017
@@ -31,6 +31,7 @@ import java.io.PrintWriter;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.text.MessageFormat;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -40,6 +41,7 @@ import java.util.Set;
 import org.apache.commons.configuration2.SynchronizerTestImpl.Methods;
 import 
org.apache.commons.configuration2.builder.FileBasedBuilderParametersImpl;
 import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
+import org.apache.commons.configuration2.builder.fluent.Parameters;
 import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.sync.ReadWriteSynchronizer;
@@ -95,6 +97,12 @@ public class TestINIConfiguration
             + "  line 2" + LINE_SEPARATOR
             + "continueNoLine = one \\" + LINE_SEPARATOR;
 
+    private static final String INI_DATA4 = "[section6]" + LINE_SEPARATOR
+               + "key1{0}value1" + LINE_SEPARATOR
+               + "key2{0}value2" + LINE_SEPARATOR + LINE_SEPARATOR
+               + "[section7]" + LINE_SEPARATOR
+               + "key3{0}value3" + LINE_SEPARATOR;
+
     private static final String INI_DATA_SEPARATORS = "[section]"
             + LINE_SEPARATOR + "var1 = value1" + LINE_SEPARATOR
             + "var2 : value2" + LINE_SEPARATOR
@@ -223,6 +231,29 @@ public class TestINIConfiguration
     }
 
     /**
+     * Test of save method with changed separator
+     */
+    @Test
+    public void testSeparatorUsedInINIOutput() throws Exception
+    {
+       final String outputSeparator = ": ";
+       String input = MessageFormat.format(INI_DATA4, "=").trim();
+       String expectedOutput = MessageFormat.format(INI_DATA4, 
outputSeparator).trim();
+
+       INIConfiguration instance = new 
FileBasedConfigurationBuilder<INIConfiguration>(
+               INIConfiguration.class)
+                .configure(new 
Parameters().ini().setSeparatorUsedInOutput(outputSeparator))
+                .getConfiguration();
+        load(instance, input);
+
+        Writer writer = new StringWriter();
+        instance.write(writer);
+        String result = writer.toString().trim();
+
+        assertEquals("Wrong content of ini file", expectedOutput, result);
+    }
+
+    /**
      * Helper method for testing a save operation. This method constructs a
      * configuration from the specified content string. Then it saves this
      * configuration and checks whether the result matches the original 
content.


Reply via email to