HADOOP-14399. Configuration does not correctly XInclude absolute file URIs.
Contributed by Jonathan Eagles
This commit is contained in:
parent
1a56a3db59
commit
1ba9704eec
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
@ -532,6 +545,8 @@ public class TestConfiguration extends TestCase {
|
||||||
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue