diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index e60f05b0fe1..4ca2ce31ee7 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -473,6 +473,9 @@ Branch-2 ( Unreleased changes ) HADOOP-8766. FileContextMainOperationsBaseTest should randomize the root dir. (Colin Patrick McCabe via atm) + HADOOP-8749. HADOOP-8031 changed the way in which relative xincludes are handled in + Configuration. (ahmed via tucu) + BREAKDOWN OF HDFS-3042 SUBTASKS HADOOP-8220. ZKFailoverController doesn't handle failure to become active 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 55d53da13af..1605501ca71 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 @@ -1871,11 +1871,11 @@ public class Configuration implements Iterable>, if (url == null) { return null; } - return parse(builder, url.openStream()); + return parse(builder, url.openStream(), url.toString()); } - private Document parse(DocumentBuilder builder, InputStream is) - throws IOException, SAXException { + private Document parse(DocumentBuilder builder, InputStream is, + String systemId) throws IOException, SAXException { if (!quietmode) { LOG.info("parsing input stream " + is); } @@ -1883,7 +1883,8 @@ public class Configuration implements Iterable>, return null; } try { - return builder.parse(is); + return (systemId == null) ? builder.parse(is) : builder.parse(is, + systemId); } finally { is.close(); } @@ -1951,10 +1952,11 @@ public class Configuration implements Iterable>, if (!quiet) { LOG.info("parsing File " + file); } - doc = parse(builder, new BufferedInputStream(new FileInputStream(file))); + doc = parse(builder, new BufferedInputStream( + new FileInputStream(file)), ((Path)resource).toString()); } } else if (resource instanceof InputStream) { - doc = parse(builder, (InputStream) resource); + doc = parse(builder, (InputStream) resource, null); returnCachedProperties = true; } else if (resource instanceof Properties) { overlay(properties, (Properties)resource); 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 27842be427b..8f5963c22cb 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 @@ -358,6 +358,36 @@ public class TestConfiguration extends TestCase { tearDown(); } + public void testRelativeIncludes() throws Exception { + tearDown(); + String relConfig = new File("./tmp/test-config.xml").getAbsolutePath(); + String relConfig2 = new File("./tmp/test-config2.xml").getAbsolutePath(); + + new File(new File(relConfig).getParent()).mkdirs(); + out = new BufferedWriter(new FileWriter(relConfig2)); + startConfig(); + appendProperty("a", "b"); + endConfig(); + + out = new BufferedWriter(new FileWriter(relConfig)); + startConfig(); + // Add the relative path instead of the absolute one. + addInclude(new File(relConfig2).getName()); + appendProperty("c", "d"); + endConfig(); + + // verify that the includes file contains all properties + Path fileResource = new Path(relConfig); + conf.addResource(fileResource); + assertEquals(conf.get("a"), "b"); + assertEquals(conf.get("c"), "d"); + + // Cleanup + new File(relConfig).delete(); + new File(relConfig2).delete(); + new File(new File(relConfig).getParent()).delete(); + } + BufferedWriter out; public void testIntegerRanges() {