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 78a2e9f0f1..f1e2a9d5d6 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 @@ -2869,15 +2869,12 @@ public Iterator> iterator() { */ public Map getPropsWithPrefix(String confPrefix) { Properties props = getProps(); - Enumeration e = props.propertyNames(); Map configMap = new HashMap<>(); - String name = null; - while (e.hasMoreElements()) { - name = (String) e.nextElement(); + for (String name : props.stringPropertyNames()) { if (name.startsWith(confPrefix)) { - String value = props.getProperty(name); - name = name.substring(confPrefix.length()); - configMap.put(name, value); + String value = get(name); + String keyName = name.substring(confPrefix.length()); + configMap.put(keyName, value); } } return configMap; 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 b0bb0d7b21..33a98808e7 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 @@ -2320,19 +2320,33 @@ public void testGetPasswordByDeprecatedKey() throws Exception { FileUtil.fullyDelete(tmpDir); } + @Test public void testGettingPropertiesWithPrefix() throws Exception { Configuration conf = new Configuration(); for (int i = 0; i < 10; i++) { - conf.set("prefix" + ".name" + i, "value"); + conf.set("prefix." + "name" + i, "value" + i); } conf.set("different.prefix" + ".name", "value"); - Map props = conf.getPropsWithPrefix("prefix"); - assertEquals(props.size(), 10); + Map prefixedProps = conf.getPropsWithPrefix("prefix."); + assertEquals(prefixedProps.size(), 10); + for (int i = 0; i < 10; i++) { + assertEquals("value" + i, prefixedProps.get("name" + i)); + } + // Repeat test with variable substitution + conf.set("foo", "bar"); + for (int i = 0; i < 10; i++) { + conf.set("subprefix." + "subname" + i, "value_${foo}" + i); + } + prefixedProps = conf.getPropsWithPrefix("subprefix."); + assertEquals(prefixedProps.size(), 10); + for (int i = 0; i < 10; i++) { + assertEquals("value_bar" + i, prefixedProps.get("subname" + i)); + } // test call with no properties for a given prefix - props = conf.getPropsWithPrefix("none"); - assertNotNull(props.isEmpty()); - assertTrue(props.isEmpty()); + prefixedProps = conf.getPropsWithPrefix("none"); + assertNotNull(prefixedProps.isEmpty()); + assertTrue(prefixedProps.isEmpty()); } public static void main(String[] argv) throws Exception {