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 2013/03/28 17:22:20 UTC

svn commit: r1462202 - in /commons/proper/configuration/trunk/src: main/java/org/apache/commons/configuration/ main/java/org/apache/commons/configuration/builder/ test/java/org/apache/commons/configuration/builder/

Author: oheger
Date: Thu Mar 28 16:22:20 2013
New Revision: 1462202

URL: http://svn.apache.org/r1462202
Log:
FileBasedConfigurationBuilder now allows setting default encodings for
specific configuration classes.

Modified:
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLPropertiesConfiguration.java
    commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/FileBasedConfigurationBuilder.java
    commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestFileBasedConfigurationBuilder.java

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLPropertiesConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLPropertiesConfiguration.java?rev=1462202&r1=1462201&r2=1462202&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLPropertiesConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/XMLPropertiesConfiguration.java Thu Mar 28 16:22:20 2013
@@ -76,7 +76,7 @@ public class XMLPropertiesConfiguration 
     /**
      * The default encoding (UTF-8 as specified by http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html)
      */
-    private static final String DEFAULT_ENCODING = "UTF-8";
+    public static final String DEFAULT_ENCODING = "UTF-8";
 
     /**
      * Default string used when the XML is malformed

Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/FileBasedConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/FileBasedConfigurationBuilder.java?rev=1462202&r1=1462201&r2=1462202&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/FileBasedConfigurationBuilder.java (original)
+++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/builder/FileBasedConfigurationBuilder.java Thu Mar 28 16:22:20 2013
@@ -16,11 +16,17 @@
  */
 package org.apache.commons.configuration.builder;
 
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.FileBasedConfiguration;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.configuration.XMLPropertiesConfiguration;
 import org.apache.commons.configuration.io.FileHandler;
+import org.apache.commons.lang3.ClassUtils;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * <p>
@@ -53,6 +59,10 @@ import org.apache.commons.configuration.
 public class FileBasedConfigurationBuilder<T extends FileBasedConfiguration>
         extends BasicConfigurationBuilder<T>
 {
+    /** A map for storing default encodings for specific configuration classes. */
+    private static final Map<Class<?>, String> DEFAULT_ENCODINGS =
+            initializeDefaultEncodings();
+
     /** Stores the FileHandler associated with the current configuration. */
     private FileHandler currentFileHandler;
 
@@ -106,6 +116,76 @@ public class FileBasedConfigurationBuild
     }
 
     /**
+     * Returns the default encoding for the specified configuration class. If an
+     * encoding has been set for the specified class (or one of its super
+     * classes), it is returned. Otherwise, result is <b>null</b>.
+     *
+     * @param configClass the configuration class in question
+     * @return the default encoding for this class (may be <b>null</b>)
+     */
+    public static String getDefaultEncoding(Class<?> configClass)
+    {
+        String enc = DEFAULT_ENCODINGS.get(configClass);
+        if (enc != null || configClass == null)
+        {
+            return enc;
+        }
+
+        List<Class<?>> superclasses =
+                ClassUtils.getAllSuperclasses(configClass);
+        for (Class<?> cls : superclasses)
+        {
+            enc = DEFAULT_ENCODINGS.get(cls);
+            if (enc != null)
+            {
+                return enc;
+            }
+        }
+
+        List<Class<?>> interfaces = ClassUtils.getAllInterfaces(configClass);
+        for (Class<?> cls : interfaces)
+        {
+            enc = DEFAULT_ENCODINGS.get(cls);
+            if (enc != null)
+            {
+                return enc;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Sets a default encoding for a specific configuration class. This encoding
+     * is used if an instance of this configuration class is to be created and
+     * no encoding has been set in the parameters object for this builder. The
+     * encoding passed here not only applies to the specified class but also to
+     * its sub classes. If the encoding is <b>null</b>, it is removed.
+     *
+     * @param configClass the name of the configuration class (must not be
+     *        <b>null</b>)
+     * @param encoding the default encoding for this class
+     * @throws IllegalArgumentException if the class is <b>null</b>
+     */
+    public static void setDefaultEncoding(Class<?> configClass, String encoding)
+    {
+        if (configClass == null)
+        {
+            throw new IllegalArgumentException(
+                    "Configuration class must not be null!");
+        }
+
+        if (encoding == null)
+        {
+            DEFAULT_ENCODINGS.remove(configClass);
+        }
+        else
+        {
+            DEFAULT_ENCODINGS.put(configClass, encoding);
+        }
+    }
+
+    /**
      * Returns the {@code FileHandler} associated with this builder. If already
      * a result object has been created, this {@code FileHandler} can be used to
      * save it. Otherwise, the {@code FileHandler} from the initialization
@@ -213,6 +293,7 @@ public class FileBasedConfigurationBuild
     protected void initFileHandler(FileHandler handler)
             throws ConfigurationException
     {
+        initEncoding(handler);
         if (handler.isLocationDefined())
         {
             handler.load();
@@ -268,4 +349,39 @@ public class FileBasedConfigurationBuild
             autoSaveListener = null;
         }
     }
+
+    /**
+     * Initializes the encoding of the specified file handler. If already an
+     * encoding is set, it is used. Otherwise, the default encoding for the
+     * result configuration class is obtained and set.
+     *
+     * @param handler the handler to be initialized
+     */
+    private void initEncoding(FileHandler handler)
+    {
+        if (StringUtils.isEmpty(handler.getEncoding()))
+        {
+            String encoding = getDefaultEncoding(getResultClass());
+            if (encoding != null)
+            {
+                handler.setEncoding(encoding);
+            }
+        }
+    }
+
+    /**
+     * Creates a map with default encodings for configuration classes and
+     * populates it with default entries.
+     *
+     * @return the map with default encodings
+     */
+    private static Map<Class<?>, String> initializeDefaultEncodings()
+    {
+        Map<Class<?>, String> enc = new ConcurrentHashMap<Class<?>, String>();
+        enc.put(PropertiesConfiguration.class,
+                PropertiesConfiguration.DEFAULT_ENCODING);
+        enc.put(XMLPropertiesConfiguration.class,
+                XMLPropertiesConfiguration.DEFAULT_ENCODING);
+        return enc;
+    }
 }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestFileBasedConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestFileBasedConfigurationBuilder.java?rev=1462202&r1=1462201&r2=1462202&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestFileBasedConfigurationBuilder.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/TestFileBasedConfigurationBuilder.java Thu Mar 28 16:22:20 2013
@@ -19,6 +19,7 @@ package org.apache.commons.configuration
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -30,8 +31,11 @@ import java.io.Writer;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.commons.configuration.XMLPropertiesConfiguration;
 import org.apache.commons.configuration.io.FileHandler;
 import org.junit.Rule;
 import org.junit.Test;
@@ -348,4 +352,109 @@ public class TestFileBasedConfigurationB
         builder.setAutoSave(false); // should have no effect
         checkSavedConfig(file, 1);
     }
+
+    /**
+     * Tries to set a default encoding for a null class.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testSetDefaultEncodingNull()
+    {
+        FileBasedConfigurationBuilder.setDefaultEncoding(null, "UTF-8");
+    }
+
+    /**
+     * Tests whether a default encoding for properties configurations is
+     * defined.
+     */
+    @Test
+    public void testGetDefaultEncodingProperties()
+    {
+        assertEquals("Wrong default encoding",
+                PropertiesConfiguration.DEFAULT_ENCODING,
+                FileBasedConfigurationBuilder
+                        .getDefaultEncoding(PropertiesConfiguration.class));
+    }
+
+    /**
+     * Tests whether a default encoding for XML properties configurations is
+     * defined.
+     */
+    @Test
+    public void testGetDefaultEncodingXmlProperties()
+    {
+        assertEquals("Wrong default encoding",
+                XMLPropertiesConfiguration.DEFAULT_ENCODING,
+                FileBasedConfigurationBuilder
+                        .getDefaultEncoding(XMLPropertiesConfiguration.class));
+    }
+
+    /**
+     * Tests whether a default encoding is find even if a sub class is queried.
+     */
+    @Test
+    public void testGetDefaultEncodingSubClass()
+    {
+        PropertiesConfiguration conf = new PropertiesConfiguration()
+        {
+        };
+        assertEquals("Wrong default encodng",
+                PropertiesConfiguration.DEFAULT_ENCODING,
+                FileBasedConfigurationBuilder.getDefaultEncoding(conf
+                        .getClass()));
+    }
+
+    /**
+     * Tests whether a default encoding can be determined even if it was set for
+     * an interface.
+     */
+    @Test
+    public void testGetDefaultEncodingInterface()
+    {
+        String encoding = "testEncoding";
+        FileBasedConfigurationBuilder.setDefaultEncoding(Configuration.class,
+                encoding);
+        assertEquals("Wrong default encoding", encoding,
+                FileBasedConfigurationBuilder
+                        .getDefaultEncoding(XMLConfiguration.class));
+        FileBasedConfigurationBuilder.setDefaultEncoding(Configuration.class,
+                null);
+        assertNull("Default encoding not removed",
+                FileBasedConfigurationBuilder
+                        .getDefaultEncoding(XMLConfiguration.class));
+    }
+
+    /**
+     * Tests whether the default encoding is set for the file handler if none is
+     * specified.
+     */
+    @Test
+    public void testInitFileHandlerSetDefaultEncoding()
+            throws ConfigurationException
+    {
+        FileBasedConfigurationBuilder<PropertiesConfiguration> builder =
+                new FileBasedConfigurationBuilder<PropertiesConfiguration>(
+                        PropertiesConfiguration.class);
+        FileHandler handler = new FileHandler();
+        builder.initFileHandler(handler);
+        assertEquals("Wrong encoding",
+                PropertiesConfiguration.DEFAULT_ENCODING, handler.getEncoding());
+    }
+
+    /**
+     * Tests whether the default encoding can be overridden when initializing
+     * the file handler.
+     */
+    @Test
+    public void testInitFileHandlerOverrideDefaultEncoding()
+            throws ConfigurationException
+    {
+        FileBasedConfigurationBuilder<PropertiesConfiguration> builder =
+                new FileBasedConfigurationBuilder<PropertiesConfiguration>(
+                        PropertiesConfiguration.class);
+        FileHandler handler = new FileHandler();
+        String encoding = "testEncoding";
+        handler.setEncoding(encoding);
+        builder.initFileHandler(handler);
+        assertEquals("Encoding was changed", encoding, handler.getEncoding());
+    }
 }