HADOOP-7287. Configuration deprecation mechanism doesn't work properly for GenericOptionsParser and Tools. Contributed by Aaron T. Myers.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1126719 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Todd Lipcon 2011-05-23 20:30:48 +00:00
parent 18ac8283b6
commit f8841bea4d
4 changed files with 79 additions and 2 deletions

View File

@ -720,6 +720,9 @@ Release 0.22.0 - Unreleased
HADOOP-7318. MD5Hash factory should reset the digester it returns.
(todd via eli)
HADOOP-7287. Configuration deprecation mechanism doesn't work properly for
GenericOptionsParser and Tools. (Aaron T. Myers via todd)
Release 0.21.1 - Unreleased
IMPROVEMENTS

View File

@ -247,8 +247,14 @@ private final String getWarningMessage(String key) {
* and custom message(if any provided).
*/
private static Map<String, DeprecatedKeyInfo> deprecatedKeyMap =
new HashMap<String, DeprecatedKeyInfo>();
new HashMap<String, DeprecatedKeyInfo>();
/**
* Stores a mapping from superseding keys to the keys which they deprecate.
*/
private static Map<String, String> reverseDeprecatedKeyMap =
new HashMap<String, String>();
/**
* Adds the deprecated key to the deprecation map.
* It does not override any existing entries in the deprecation map.
@ -269,6 +275,9 @@ public synchronized static void addDeprecation(String key, String[] newKeys,
DeprecatedKeyInfo newKeyInfo;
newKeyInfo = new DeprecatedKeyInfo(newKeys, customMessage);
deprecatedKeyMap.put(key, newKeyInfo);
for (String newKey : newKeys) {
reverseDeprecatedKeyMap.put(newKey, key);
}
}
}
@ -301,7 +310,11 @@ private static boolean isDeprecated(String key) {
/**
* Checks for the presence of the property <code>name</code> in the
* deprecation map. Returns the first of the list of new keys if present
* in the deprecation map or the <code>name</code> itself.
* in the deprecation map or the <code>name</code> itself. If the property
* is not presently set but the property map contains an entry for the
* deprecated key, the value of the deprecated key is set as the value for
* the provided property name.
*
* @param name the property name
* @return the first property in the list of properties mapping
* the <code>name</code> or the <code>name</code> itself.
@ -319,6 +332,17 @@ private String handleDeprecation(String name) {
}
}
}
String deprecatedKey = reverseDeprecatedKeyMap.get(name);
if (deprecatedKey != null && !getOverlay().containsKey(name) &&
getOverlay().containsKey(deprecatedKey)) {
getProps().setProperty(name, getOverlay().getProperty(deprecatedKey));
getOverlay().setProperty(name, getOverlay().getProperty(deprecatedKey));
DeprecatedKeyInfo keyInfo = deprecatedKeyMap.get(deprecatedKey);
if (!keyInfo.accessed) {
LOG.warn(keyInfo.getWarningMessage(deprecatedKey));
}
}
return name;
}

View File

@ -42,6 +42,10 @@ public class TestConfigurationDeprecation {
final static String CONFIG3 =
new File("./test-config3.xml").getAbsolutePath();
BufferedWriter out;
static {
Configuration.addDefaultResource("test-fake-default.xml");
}
@Before
public void setUp() throws Exception {
@ -249,4 +253,21 @@ public void testDeprecationForFinalParameters() throws IOException {
assertNull(conf.get("I"));
assertNull(conf.get("J"));
}
@Test
public void testSetBeforeAndGetAfterDeprecation() {
Configuration conf = new Configuration();
conf.set("oldkey", "hello");
Configuration.addDeprecation("oldkey", new String[]{"newkey"});
assertEquals("hello", conf.get("newkey"));
}
@Test
public void testSetBeforeAndGetAfterDeprecationAndDefaults() {
Configuration conf = new Configuration();
conf.set("tests.fake-default.old-key", "hello");
Configuration.addDeprecation("tests.fake-default.old-key",
new String[]{ "tests.fake-default.new-key" });
assertEquals("hello", conf.get("tests.fake-default.new-key"));
}
}

View File

@ -0,0 +1,29 @@
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- This file is a fake version of a "default" file like
core-default or mapred-default, used for some of the unit tests.
-->
<configuration>
<property>
<name>tests.fake-default.new-key</name>
<value>tests.fake-default.value</value>
<description>a default value for the "new" key of a deprecated pair.</description>
</property>
</configuration>