Переглянути джерело

HADOOP-10625. Trim configuration names when putting/getting them

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1598070 13f79535-47bb-0310-9956-ffa450edef68
Xuan Gong 11 роки тому
батько
коміт
5757def1a1

+ 3 - 0
hadoop-common-project/hadoop-common/CHANGES.txt

@@ -150,6 +150,9 @@ Release 2.5.0 - UNRELEASED
     HADOOP-10489. UserGroupInformation#getTokens and UserGroupInformation
     HADOOP-10489. UserGroupInformation#getTokens and UserGroupInformation
     #addToken can lead to ConcurrentModificationException (Robert Kanter via atm)
     #addToken can lead to ConcurrentModificationException (Robert Kanter via atm)
 
 
+    HADOOP-10625. Trim configuration names when putting/getting them
+    to properties. (Wangda Tan via xgong)
+
 Release 2.4.1 - UNRELEASED
 Release 2.4.1 - UNRELEASED
 
 
   INCOMPATIBLE CHANGES
   INCOMPATIBLE CHANGES

+ 11 - 5
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java

@@ -566,6 +566,9 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
    */
    */
   private String[] handleDeprecation(DeprecationContext deprecations,
   private String[] handleDeprecation(DeprecationContext deprecations,
       String name) {
       String name) {
+    if (null != name) {
+      name = name.trim();
+    }
     ArrayList<String > names = new ArrayList<String>();
     ArrayList<String > names = new ArrayList<String>();
 	if (isDeprecated(name)) {
 	if (isDeprecated(name)) {
       DeprecatedKeyInfo keyInfo = deprecations.getDeprecatedKeyMap().get(name);
       DeprecatedKeyInfo keyInfo = deprecations.getDeprecatedKeyMap().get(name);
@@ -837,12 +840,12 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
   /**
   /**
    * Get the value of the <code>name</code> property, <code>null</code> if
    * Get the value of the <code>name</code> property, <code>null</code> if
    * no such property exists. If the key is deprecated, it returns the value of
    * 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
+   * the first key which replaces the deprecated key and is not null.
    * 
    * 
    * Values are processed for <a href="#VariableExpansion">variable expansion</a> 
    * Values are processed for <a href="#VariableExpansion">variable expansion</a> 
    * before being returned. 
    * before being returned. 
    * 
    * 
-   * @param name the property name.
+   * @param name the property name, will be trimmed before get value.
    * @return the value of the <code>name</code> or its replacing property, 
    * @return the value of the <code>name</code> or its replacing property, 
    *         or null if no such property exists.
    *         or null if no such property exists.
    */
    */
@@ -946,7 +949,8 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
   /** 
   /** 
    * Set the <code>value</code> of the <code>name</code> property. If 
    * Set the <code>value</code> of the <code>name</code> property. If 
    * <code>name</code> is deprecated or there is a deprecated name associated to it,
    * <code>name</code> is deprecated or there is a deprecated name associated to it,
-   * it sets the value to both names.
+   * it sets the value to both names. Name will be trimmed before put into
+   * configuration.
    * 
    * 
    * @param name property name.
    * @param name property name.
    * @param value property value.
    * @param value property value.
@@ -958,7 +962,8 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
   /** 
   /** 
    * Set the <code>value</code> of the <code>name</code> property. If 
    * Set the <code>value</code> of the <code>name</code> property. If 
    * <code>name</code> is deprecated, it also sets the <code>value</code> to
    * <code>name</code> is deprecated, it also sets the <code>value</code> to
-   * the keys that replace the deprecated key.
+   * the keys that replace the deprecated key. Name will be trimmed before put
+   * into configuration.
    *
    *
    * @param name property name.
    * @param name property name.
    * @param value property value.
    * @param value property value.
@@ -973,6 +978,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
     Preconditions.checkArgument(
     Preconditions.checkArgument(
         value != null,
         value != null,
         "The value of property " + name + " must not be null");
         "The value of property " + name + " must not be null");
+    name = name.trim();
     DeprecationContext deprecations = deprecationContext.get();
     DeprecationContext deprecations = deprecationContext.get();
     if (deprecations.getDeprecatedKeyMap().isEmpty()) {
     if (deprecations.getDeprecatedKeyMap().isEmpty()) {
       getProps();
       getProps();
@@ -1058,7 +1064,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
    * If no such property exists,
    * If no such property exists,
    * then <code>defaultValue</code> is returned.
    * then <code>defaultValue</code> is returned.
    * 
    * 
-   * @param name property name.
+   * @param name property name, will be trimmed before get value.
    * @param defaultValue default value.
    * @param defaultValue default value.
    * @return property value, or <code>defaultValue</code> if the property 
    * @return property value, or <code>defaultValue</code> if the property 
    *         doesn't exist.                    
    *         doesn't exist.                    

+ 9 - 1
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java

@@ -49,7 +49,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.IOUtils;
 import org.apache.hadoop.io.IOUtils;
 import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.net.NetUtils;
 import static org.apache.hadoop.util.PlatformName.IBM_JAVA;
 import static org.apache.hadoop.util.PlatformName.IBM_JAVA;
-import org.codehaus.jackson.map.ObjectMapper; 
+import org.codehaus.jackson.map.ObjectMapper;
 
 
 public class TestConfiguration extends TestCase {
 public class TestConfiguration extends TestCase {
 
 
@@ -1003,6 +1003,14 @@ public class TestConfiguration extends TestCase {
     String resource;
     String resource;
   }
   }
   
   
+  public void testGetSetTrimmedNames() throws IOException {
+    Configuration conf = new Configuration(false);
+    conf.set(" name", "value");
+    assertEquals("value", conf.get("name"));
+    assertEquals("value", conf.get(" name"));
+    assertEquals("value", conf.getRaw("  name  "));
+  }
+
   public void testDumpConfiguration () throws IOException {
   public void testDumpConfiguration () throws IOException {
     StringWriter outWriter = new StringWriter();
     StringWriter outWriter = new StringWriter();
     Configuration.dumpConfiguration(conf, outWriter);
     Configuration.dumpConfiguration(conf, outWriter);