HADOOP-6578. Configuration should trim whitespace around a lot of value types. Contributed by Michele Catasta
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1054903 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
93f2dfcdb4
commit
168bf7b71d
|
@ -249,6 +249,9 @@ Release 0.22.0 - Unreleased
|
||||||
HADOOP-6864. Provide a JNI-based implementation of ShellBasedUnixGroupsNetgroupMapping
|
HADOOP-6864. Provide a JNI-based implementation of ShellBasedUnixGroupsNetgroupMapping
|
||||||
(implementation of GroupMappingServiceProvider) (Erik Seffl via boryas)
|
(implementation of GroupMappingServiceProvider) (Erik Seffl via boryas)
|
||||||
|
|
||||||
|
HADOOP-6578. Configuration should trim whitespace around a lot of value
|
||||||
|
types. (Michele Catasta via eli)
|
||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
HADOOP-6884. Add LOG.isDebugEnabled() guard for each LOG.debug(..).
|
HADOOP-6884. Add LOG.isDebugEnabled() guard for each LOG.debug(..).
|
||||||
|
|
|
@ -545,6 +545,29 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
||||||
return substituteVars(getProps().getProperty(name));
|
return substituteVars(getProps().getProperty(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of the <code>name</code> property as a trimmed <code>String</code>,
|
||||||
|
* <code>null</code> if no such property exists.
|
||||||
|
* If the key is deprecated, it returns the value of
|
||||||
|
* the first key which replaces the deprecated key and is not null
|
||||||
|
*
|
||||||
|
* Values are processed for <a href="#VariableExpansion">variable expansion</a>
|
||||||
|
* before being returned.
|
||||||
|
*
|
||||||
|
* @param name the property name.
|
||||||
|
* @return the value of the <code>name</code> or its replacing property,
|
||||||
|
* or null if no such property exists.
|
||||||
|
*/
|
||||||
|
public String getTrimmed(String name) {
|
||||||
|
String value = get(name);
|
||||||
|
|
||||||
|
if (null == value) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return value.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the value of the <code>name</code> property, without doing
|
* Get the value of the <code>name</code> property, without doing
|
||||||
* <a href="#VariableExpansion">variable expansion</a>.If the key is
|
* <a href="#VariableExpansion">variable expansion</a>.If the key is
|
||||||
|
@ -644,7 +667,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
||||||
* or <code>defaultValue</code>.
|
* or <code>defaultValue</code>.
|
||||||
*/
|
*/
|
||||||
public int getInt(String name, int defaultValue) {
|
public int getInt(String name, int defaultValue) {
|
||||||
String valueString = get(name);
|
String valueString = getTrimmed(name);
|
||||||
if (valueString == null)
|
if (valueString == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
try {
|
try {
|
||||||
|
@ -680,7 +703,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
||||||
* or <code>defaultValue</code>.
|
* or <code>defaultValue</code>.
|
||||||
*/
|
*/
|
||||||
public long getLong(String name, long defaultValue) {
|
public long getLong(String name, long defaultValue) {
|
||||||
String valueString = get(name);
|
String valueString = getTrimmed(name);
|
||||||
if (valueString == null)
|
if (valueString == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
try {
|
try {
|
||||||
|
@ -733,7 +756,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
||||||
* or <code>defaultValue</code>.
|
* or <code>defaultValue</code>.
|
||||||
*/
|
*/
|
||||||
public float getFloat(String name, float defaultValue) {
|
public float getFloat(String name, float defaultValue) {
|
||||||
String valueString = get(name);
|
String valueString = getTrimmed(name);
|
||||||
if (valueString == null)
|
if (valueString == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
try {
|
try {
|
||||||
|
@ -763,7 +786,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
||||||
* or <code>defaultValue</code>.
|
* or <code>defaultValue</code>.
|
||||||
*/
|
*/
|
||||||
public boolean getBoolean(String name, boolean defaultValue) {
|
public boolean getBoolean(String name, boolean defaultValue) {
|
||||||
String valueString = get(name);
|
String valueString = getTrimmed(name);
|
||||||
if ("true".equals(valueString))
|
if ("true".equals(valueString))
|
||||||
return true;
|
return true;
|
||||||
else if ("false".equals(valueString))
|
else if ("false".equals(valueString))
|
||||||
|
@ -1079,7 +1102,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Class clazz = map.get(name);
|
Class<?> clazz = map.get(name);
|
||||||
if (clazz == null) {
|
if (clazz == null) {
|
||||||
clazz = Class.forName(name, true, classLoader);
|
clazz = Class.forName(name, true, classLoader);
|
||||||
if (clazz != null) {
|
if (clazz != null) {
|
||||||
|
@ -1104,7 +1127,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
||||||
* or <code>defaultValue</code>.
|
* or <code>defaultValue</code>.
|
||||||
*/
|
*/
|
||||||
public Class<?>[] getClasses(String name, Class<?> ... defaultValue) {
|
public Class<?>[] getClasses(String name, Class<?> ... defaultValue) {
|
||||||
String[] classnames = getStrings(name);
|
String[] classnames = getTrimmedStrings(name);
|
||||||
if (classnames == null)
|
if (classnames == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
try {
|
try {
|
||||||
|
@ -1129,7 +1152,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
||||||
* or <code>defaultValue</code>.
|
* or <code>defaultValue</code>.
|
||||||
*/
|
*/
|
||||||
public Class<?> getClass(String name, Class<?> defaultValue) {
|
public Class<?> getClass(String name, Class<?> defaultValue) {
|
||||||
String valueString = get(name);
|
String valueString = getTrimmed(name);
|
||||||
if (valueString == null)
|
if (valueString == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -29,6 +29,7 @@ import java.util.Random;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
|
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.codehaus.jackson.map.ObjectMapper;
|
import org.codehaus.jackson.map.ObjectMapper;
|
||||||
|
@ -337,6 +338,7 @@ public class TestConfiguration extends TestCase {
|
||||||
appendProperty("test.int1", "20");
|
appendProperty("test.int1", "20");
|
||||||
appendProperty("test.int2", "020");
|
appendProperty("test.int2", "020");
|
||||||
appendProperty("test.int3", "-20");
|
appendProperty("test.int3", "-20");
|
||||||
|
appendProperty("test.int4", " -20 ");
|
||||||
endConfig();
|
endConfig();
|
||||||
Path fileResource = new Path(CONFIG);
|
Path fileResource = new Path(CONFIG);
|
||||||
conf.addResource(fileResource);
|
conf.addResource(fileResource);
|
||||||
|
@ -346,6 +348,78 @@ public class TestConfiguration extends TestCase {
|
||||||
assertEquals(20, conf.getLong("test.int2", 0));
|
assertEquals(20, conf.getLong("test.int2", 0));
|
||||||
assertEquals(-20, conf.getInt("test.int3", 0));
|
assertEquals(-20, conf.getInt("test.int3", 0));
|
||||||
assertEquals(-20, conf.getLong("test.int3", 0));
|
assertEquals(-20, conf.getLong("test.int3", 0));
|
||||||
|
assertEquals(-20, conf.getInt("test.int4", 0));
|
||||||
|
assertEquals(-20, conf.getLong("test.int4", 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testBooleanValues() throws IOException {
|
||||||
|
out=new BufferedWriter(new FileWriter(CONFIG));
|
||||||
|
startConfig();
|
||||||
|
appendProperty("test.bool1", "true");
|
||||||
|
appendProperty("test.bool2", "false");
|
||||||
|
appendProperty("test.bool3", " true ");
|
||||||
|
appendProperty("test.bool4", " false ");
|
||||||
|
appendProperty("test.bool5", "foo");
|
||||||
|
endConfig();
|
||||||
|
Path fileResource = new Path(CONFIG);
|
||||||
|
conf.addResource(fileResource);
|
||||||
|
assertEquals(true, conf.getBoolean("test.bool1", false));
|
||||||
|
assertEquals(false, conf.getBoolean("test.bool2", true));
|
||||||
|
assertEquals(true, conf.getBoolean("test.bool3", false));
|
||||||
|
assertEquals(false, conf.getBoolean("test.bool4", true));
|
||||||
|
assertEquals(true, conf.getBoolean("test.bool5", true));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testFloatValues() throws IOException {
|
||||||
|
out=new BufferedWriter(new FileWriter(CONFIG));
|
||||||
|
startConfig();
|
||||||
|
appendProperty("test.float1", "3.1415");
|
||||||
|
appendProperty("test.float2", "003.1415");
|
||||||
|
appendProperty("test.float3", "-3.1415");
|
||||||
|
appendProperty("test.float4", " -3.1415 ");
|
||||||
|
endConfig();
|
||||||
|
Path fileResource = new Path(CONFIG);
|
||||||
|
conf.addResource(fileResource);
|
||||||
|
assertEquals(3.1415f, conf.getFloat("test.float1", 0.0f));
|
||||||
|
assertEquals(3.1415f, conf.getFloat("test.float2", 0.0f));
|
||||||
|
assertEquals(-3.1415f, conf.getFloat("test.float3", 0.0f));
|
||||||
|
assertEquals(-3.1415f, conf.getFloat("test.float4", 0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testGetClass() throws IOException {
|
||||||
|
out=new BufferedWriter(new FileWriter(CONFIG));
|
||||||
|
startConfig();
|
||||||
|
appendProperty("test.class1", "java.lang.Integer");
|
||||||
|
appendProperty("test.class2", " java.lang.Integer ");
|
||||||
|
endConfig();
|
||||||
|
Path fileResource = new Path(CONFIG);
|
||||||
|
conf.addResource(fileResource);
|
||||||
|
assertEquals("java.lang.Integer", conf.getClass("test.class1", null).getCanonicalName());
|
||||||
|
assertEquals("java.lang.Integer", conf.getClass("test.class2", null).getCanonicalName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testGetClasses() throws IOException {
|
||||||
|
out=new BufferedWriter(new FileWriter(CONFIG));
|
||||||
|
startConfig();
|
||||||
|
appendProperty("test.classes1", "java.lang.Integer,java.lang.String");
|
||||||
|
appendProperty("test.classes2", " java.lang.Integer , java.lang.String ");
|
||||||
|
endConfig();
|
||||||
|
Path fileResource = new Path(CONFIG);
|
||||||
|
conf.addResource(fileResource);
|
||||||
|
String[] expectedNames = {"java.lang.Integer", "java.lang.String"};
|
||||||
|
Class<?>[] defaultClasses = {};
|
||||||
|
Class<?>[] classes1 = conf.getClasses("test.classes1", defaultClasses);
|
||||||
|
Class<?>[] classes2 = conf.getClasses("test.classes2", defaultClasses);
|
||||||
|
assertArrayEquals(expectedNames, extractClassNames(classes1));
|
||||||
|
assertArrayEquals(expectedNames, extractClassNames(classes2));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] extractClassNames(Class<?>[] classes) {
|
||||||
|
String[] classNames = new String[classes.length];
|
||||||
|
for (int i = 0; i < classNames.length; i++) {
|
||||||
|
classNames[i] = classes[i].getCanonicalName();
|
||||||
|
}
|
||||||
|
return classNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Dingo { FOO, BAR };
|
enum Dingo { FOO, BAR };
|
||||||
|
|
Loading…
Reference in New Issue