From 6b807d0c7b83583adace7d9def294a4cc09e7f47 Mon Sep 17 00:00:00 2001 From: Alejandro Abdelnur Date: Thu, 6 Sep 2012 18:17:04 +0000 Subject: [PATCH] HADOOP-8749. HADOOP-8031 changed the way in which relative xincludes are handled in Configuration. (ahmed via tucu) git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1381704 13f79535-47bb-0310-9956-ffa450edef68 --- .../hadoop-common/CHANGES.txt | 3 ++ .../org/apache/hadoop/conf/Configuration.java | 14 +++++---- .../apache/hadoop/conf/TestConfiguration.java | 30 +++++++++++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 7fb1c9d5156..0d80d0fe67c 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -260,6 +260,9 @@ Release 2.0.1-alpha - UNRELEASED 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 17fde2b3671..9fc5c028bf7 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 @@ -1833,11 +1833,11 @@ private Document parse(DocumentBuilder builder, URL url) 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); } @@ -1845,7 +1845,8 @@ private Document parse(DocumentBuilder builder, InputStream is) return null; } try { - return builder.parse(is); + return (systemId == null) ? builder.parse(is) : builder.parse(is, + systemId); } finally { is.close(); } @@ -1913,10 +1914,11 @@ private Resource loadResource(Properties properties, Resource wrapper, boolean q 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 333cf2c8bf3..5c121220db2 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 void testIncludes() throws Exception { 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() {