HADOOP-14399. Configuration does not correctly XInclude absolute file URIs.

Contributed by Jonathan Eagles
This commit is contained in:
Steve Loughran 2017-05-25 14:59:33 +01:00
parent 1a56a3db59
commit 1ba9704eec
No known key found for this signature in database
GPG Key ID: 950CC3E032B79CA2
2 changed files with 42 additions and 18 deletions

View File

@ -2714,6 +2714,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
StringBuilder token = new StringBuilder(); StringBuilder token = new StringBuilder();
String confName = null; String confName = null;
String confValue = null; String confValue = null;
String confInclude = null;
boolean confFinal = false; boolean confFinal = false;
boolean fallbackAllowed = false; boolean fallbackAllowed = false;
boolean fallbackEntered = false; boolean fallbackEntered = false;
@ -2757,7 +2758,7 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
break; break;
case "include": case "include":
// Determine href for xi:include // Determine href for xi:include
String confInclude = null; confInclude = null;
attrCount = reader.getAttributeCount(); attrCount = reader.getAttributeCount();
for (int i = 0; i < attrCount; i++) { for (int i = 0; i < attrCount; i++) {
String attrName = reader.getAttributeLocalName(i); String attrName = reader.getAttributeLocalName(i);
@ -2776,18 +2777,25 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
Resource classpathResource = new Resource(include, name); Resource classpathResource = new Resource(include, name);
loadResource(properties, classpathResource, quiet); loadResource(properties, classpathResource, quiet);
} else { } else {
File href = new File(confInclude); URL url;
if (!href.isAbsolute()) { try {
// Included resources are relative to the current resource url = new URL(confInclude);
File baseFile = new File(name).getParentFile(); url.openConnection().connect();
href = new File(baseFile, href.getPath()); } catch (IOException ioe) {
File href = new File(confInclude);
if (!href.isAbsolute()) {
// Included resources are relative to the current resource
File baseFile = new File(name).getParentFile();
href = new File(baseFile, href.getPath());
}
if (!href.exists()) {
// Resource errors are non-fatal iff there is 1 xi:fallback
fallbackAllowed = true;
break;
}
url = href.toURI().toURL();
} }
if (!href.exists()) { Resource uriResource = new Resource(url, name);
// Resource errors are non-fatal iff there is 1 xi:fallback
fallbackAllowed = true;
break;
}
Resource uriResource = new Resource(href.toURI().toURL(), name);
loadResource(properties, uriResource, quiet); loadResource(properties, uriResource, quiet);
} }
break; break;
@ -2828,8 +2836,9 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
break; break;
case "include": case "include":
if (fallbackAllowed && !fallbackEntered) { if (fallbackAllowed && !fallbackEntered) {
throw new IOException("Fetch fail on include with no " throw new IOException("Fetch fail on include for '"
+ "fallback while loading '" + name + "'"); + confInclude + "' with no fallback while loading '"
+ name + "'");
} }
fallbackAllowed = false; fallbackAllowed = false;
fallbackEntered = false; fallbackEntered = false;

View File

@ -29,6 +29,7 @@ import java.io.OutputStreamWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.URI;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -61,6 +62,9 @@ public class TestConfiguration extends TestCase {
final static String CONFIG = new File("./test-config-TestConfiguration.xml").getAbsolutePath(); final static String CONFIG = new File("./test-config-TestConfiguration.xml").getAbsolutePath();
final static String CONFIG2 = new File("./test-config2-TestConfiguration.xml").getAbsolutePath(); final static String CONFIG2 = new File("./test-config2-TestConfiguration.xml").getAbsolutePath();
final static String CONFIG_FOR_ENUM = new File("./test-config-enum-TestConfiguration.xml").getAbsolutePath(); final static String CONFIG_FOR_ENUM = new File("./test-config-enum-TestConfiguration.xml").getAbsolutePath();
final static String CONFIG_FOR_URI = "file://"
+ new File("./test-config-uri-TestConfiguration.xml").getAbsolutePath();
private static final String CONFIG_MULTI_BYTE = new File( private static final String CONFIG_MULTI_BYTE = new File(
"./test-config-multi-byte-TestConfiguration.xml").getAbsolutePath(); "./test-config-multi-byte-TestConfiguration.xml").getAbsolutePath();
private static final String CONFIG_MULTI_BYTE_SAVED = new File( private static final String CONFIG_MULTI_BYTE_SAVED = new File(
@ -85,6 +89,7 @@ public class TestConfiguration extends TestCase {
new File(CONFIG).delete(); new File(CONFIG).delete();
new File(CONFIG2).delete(); new File(CONFIG2).delete();
new File(CONFIG_FOR_ENUM).delete(); new File(CONFIG_FOR_ENUM).delete();
new File(new URI(CONFIG_FOR_URI)).delete();
new File(CONFIG_MULTI_BYTE).delete(); new File(CONFIG_MULTI_BYTE).delete();
new File(CONFIG_MULTI_BYTE_SAVED).delete(); new File(CONFIG_MULTI_BYTE_SAVED).delete();
} }
@ -516,13 +521,21 @@ public class TestConfiguration extends TestCase {
appendProperty("a","b"); appendProperty("a","b");
appendProperty("c","d"); appendProperty("c","d");
endConfig(); endConfig();
File fileUri = new File(new URI(CONFIG_FOR_URI));
out=new BufferedWriter(new FileWriter(fileUri));
startConfig();
appendProperty("e", "f");
appendProperty("g", "h");
endConfig();
out=new BufferedWriter(new FileWriter(CONFIG)); out=new BufferedWriter(new FileWriter(CONFIG));
startConfig(); startConfig();
startInclude(CONFIG2); startInclude(CONFIG2);
endInclude(); endInclude();
appendProperty("e","f"); startInclude(CONFIG_FOR_URI);
appendProperty("g","h"); endInclude();
appendProperty("i", "j");
appendProperty("k", "l");
endConfig(); endConfig();
// verify that the includes file contains all properties // verify that the includes file contains all properties
@ -530,8 +543,10 @@ public class TestConfiguration extends TestCase {
conf.addResource(fileResource); conf.addResource(fileResource);
assertEquals(conf.get("a"), "b"); assertEquals(conf.get("a"), "b");
assertEquals(conf.get("c"), "d"); assertEquals(conf.get("c"), "d");
assertEquals(conf.get("e"), "f"); assertEquals(conf.get("e"), "f");
assertEquals(conf.get("g"), "h"); assertEquals(conf.get("g"), "h");
assertEquals(conf.get("i"), "j");
assertEquals(conf.get("k"), "l");
tearDown(); tearDown();
} }