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());
+ }
}