From 9395c7669714845a51e464ab7a2214168bf03a36 Mon Sep 17 00:00:00 2001 From: Akira Ajisaka Date: Thu, 12 Feb 2015 15:50:48 -0800 Subject: [PATCH] HADOOP-9869. Configuration.getSocketAddr()/getEnum() should use getTrimmed(). Contributed by Tsuyoshi Ozawa. --- .../hadoop-common/CHANGES.txt | 3 ++ .../org/apache/hadoop/conf/Configuration.java | 6 ++-- .../apache/hadoop/conf/TestConfiguration.java | 29 ++++++++++++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 7078d42ed32..c11e3409816 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -597,6 +597,9 @@ Release 2.7.0 - UNRELEASED HADOOP-11586. Update use of Iterator to Iterable in AbstractMetricsContext.java. (Ray Chiang via aajisaka) + HADOOP-9869. Configuration.getSocketAddr()/getEnum() should use + getTrimmed(). (Tsuyoshi Ozawa via aajisaka) + OPTIMIZATIONS HADOOP-11323. WritableComparator#compare keeps reference to byte array. diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java index ea0d3a65880..02654b77b57 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java @@ -1491,13 +1491,14 @@ public class Configuration implements Iterable>, /** * Return value matching this enumerated type. + * Note that the returned value is trimmed by this method. * @param name Property name * @param defaultValue Value returned if no mapping exists * @throws IllegalArgumentException If mapping is illegal for the type * provided */ public > T getEnum(String name, T defaultValue) { - final String val = get(name); + final String val = getTrimmed(name); return null == val ? defaultValue : Enum.valueOf(defaultValue.getDeclaringClass(), val); @@ -1594,6 +1595,7 @@ public class Configuration implements Iterable>, * Get the value of the name property as a Pattern. * If no such property is specified, or if the specified value is not a valid * Pattern, then DefaultValue is returned. + * Note that the returned value is NOT trimmed by this method. * * @param name property name * @param defaultValue default value @@ -2044,7 +2046,7 @@ public class Configuration implements Iterable>, */ public InetSocketAddress getSocketAddr( String name, String defaultAddress, int defaultPort) { - final String address = get(name, defaultAddress); + final String address = getTrimmed(name, defaultAddress); return NetUtils.createSocketAddr(address, defaultPort, name); } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java index b84045d25eb..a3675537bf0 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java @@ -56,6 +56,7 @@ public class TestConfiguration extends TestCase { private Configuration conf; final static String CONFIG = new File("./test-config-TestConfiguration.xml").getAbsolutePath(); final static String CONFIG2 = new File("./test-config2-TestConfiguration.xml").getAbsolutePath(); + final static String CONFIG_FOR_ENUM = new File("./test-config-enum-TestConfiguration.xml").getAbsolutePath(); private static final String CONFIG_MULTI_BYTE = new File( "./test-config-multi-byte-TestConfiguration.xml").getAbsolutePath(); private static final String CONFIG_MULTI_BYTE_SAVED = new File( @@ -76,6 +77,7 @@ public class TestConfiguration extends TestCase { super.tearDown(); new File(CONFIG).delete(); new File(CONFIG2).delete(); + new File(CONFIG_FOR_ENUM).delete(); new File(CONFIG_MULTI_BYTE).delete(); new File(CONFIG_MULTI_BYTE_SAVED).delete(); } @@ -792,6 +794,7 @@ public class TestConfiguration extends TestCase { conf.setEnum("test.enum", Dingo.FOO); assertSame(Dingo.FOO, conf.getEnum("test.enum", Dingo.BAR)); assertSame(Yak.FOO, conf.getEnum("test.enum", Yak.RAB)); + conf.setEnum("test.enum", Dingo.FOO); boolean fail = false; try { conf.setEnum("test.enum", Dingo.BAR); @@ -802,6 +805,26 @@ public class TestConfiguration extends TestCase { assertTrue(fail); } + public void testEnumFromXml() throws IOException { + out=new BufferedWriter(new FileWriter(CONFIG_FOR_ENUM)); + startConfig(); + appendProperty("test.enum"," \t \n FOO \t \n"); + appendProperty("test.enum2"," \t \n Yak.FOO \t \n"); + endConfig(); + + Configuration conf = new Configuration(); + Path fileResource = new Path(CONFIG_FOR_ENUM); + conf.addResource(fileResource); + assertSame(Yak.FOO, conf.getEnum("test.enum", Yak.FOO)); + boolean fail = false; + try { + conf.getEnum("test.enum2", Yak.FOO); + } catch (IllegalArgumentException e) { + fail = true; + } + assertTrue(fail); + } + public void testTimeDuration() { Configuration conf = new Configuration(false); conf.setTimeDuration("test.time.a", 7L, SECONDS); @@ -918,7 +941,11 @@ public class TestConfiguration extends TestCase { conf.set("myAddress", "host2:3"); addr = conf.getSocketAddr("myAddress", defaultAddr, defaultPort); assertEquals("host2:3", NetUtils.getHostPortString(addr)); - + + conf.set("myAddress", " \n \t host4:5 \t \n "); + addr = conf.getSocketAddr("myAddress", defaultAddr, defaultPort); + assertEquals("host4:5", NetUtils.getHostPortString(addr)); + boolean threwException = false; conf.set("myAddress", "bad:-port"); try {