HDFS-14522. Allow compact property description in xml in httpfs. (#1737)
This commit is contained in:
parent
dc66de7448
commit
4dffd81bb7
|
@ -20,17 +20,7 @@
|
||||||
|
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.w3c.dom.DOMException;
|
|
||||||
import org.w3c.dom.Document;
|
|
||||||
import org.w3c.dom.Element;
|
|
||||||
import org.w3c.dom.Node;
|
|
||||||
import org.w3c.dom.NodeList;
|
|
||||||
import org.w3c.dom.Text;
|
|
||||||
import org.xml.sax.SAXException;
|
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -98,62 +88,6 @@ public static Configuration resolve(Configuration conf) {
|
||||||
* @throws IOException thrown if the configuration could not be read.
|
* @throws IOException thrown if the configuration could not be read.
|
||||||
*/
|
*/
|
||||||
public static void load(Configuration conf, InputStream is) throws IOException {
|
public static void load(Configuration conf, InputStream is) throws IOException {
|
||||||
try {
|
conf.addResource(is);
|
||||||
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
|
|
||||||
// ignore all comments inside the xml file
|
|
||||||
docBuilderFactory.setIgnoringComments(true);
|
|
||||||
DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
|
|
||||||
Document doc = builder.parse(is);
|
|
||||||
parseDocument(conf, doc);
|
|
||||||
} catch (SAXException e) {
|
|
||||||
throw new IOException(e);
|
|
||||||
} catch (ParserConfigurationException e) {
|
|
||||||
throw new IOException(e);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Canibalized from FileSystemAccess <code>Configuration.loadResource()</code>.
|
|
||||||
private static void parseDocument(Configuration conf, Document doc) throws IOException {
|
|
||||||
try {
|
|
||||||
Element root = doc.getDocumentElement();
|
|
||||||
if (!"configuration".equals(root.getTagName())) {
|
|
||||||
throw new IOException("bad conf file: top-level element not <configuration>");
|
|
||||||
}
|
|
||||||
NodeList props = root.getChildNodes();
|
|
||||||
for (int i = 0; i < props.getLength(); i++) {
|
|
||||||
Node propNode = props.item(i);
|
|
||||||
if (!(propNode instanceof Element)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Element prop = (Element) propNode;
|
|
||||||
if (!"property".equals(prop.getTagName())) {
|
|
||||||
throw new IOException("bad conf file: element not <property>");
|
|
||||||
}
|
|
||||||
NodeList fields = prop.getChildNodes();
|
|
||||||
String attr = null;
|
|
||||||
String value = null;
|
|
||||||
for (int j = 0; j < fields.getLength(); j++) {
|
|
||||||
Node fieldNode = fields.item(j);
|
|
||||||
if (!(fieldNode instanceof Element)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Element field = (Element) fieldNode;
|
|
||||||
if ("name".equals(field.getTagName()) && field.hasChildNodes()) {
|
|
||||||
attr = ((Text) field.getFirstChild()).getData().trim();
|
|
||||||
}
|
|
||||||
if ("value".equals(field.getTagName()) && field.hasChildNodes()) {
|
|
||||||
value = ((Text) field.getFirstChild()).getData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (attr != null && value != null) {
|
|
||||||
conf.set(attr, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (DOMException e) {
|
|
||||||
throw new IOException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,11 +44,13 @@ public void constructors() throws Exception {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test(expected = IOException.class)
|
@Test
|
||||||
public void constructorsFail3() throws Exception {
|
public void constructors3() throws Exception {
|
||||||
InputStream is = new ByteArrayInputStream("<xonfiguration></xonfiguration>".getBytes());
|
InputStream is = new ByteArrayInputStream(
|
||||||
|
"<xxx><property name=\"key1\" value=\"val1\"/></xxx>".getBytes());
|
||||||
Configuration conf = new Configuration(false);
|
Configuration conf = new Configuration(false);
|
||||||
ConfigurationUtils.load(conf, is);
|
ConfigurationUtils.load(conf, is);
|
||||||
|
assertEquals("val1", conf.get("key1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -124,4 +126,16 @@ public void testVarResolutionAndSysProps() {
|
||||||
assertEquals(conf.get("user.name"), "foo");
|
assertEquals(conf.get("user.name"), "foo");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCompactFormatProperty() throws IOException {
|
||||||
|
final String testfile = "test-compact-format-property.xml";
|
||||||
|
Configuration conf = new Configuration(false);
|
||||||
|
assertEquals(0, conf.size());
|
||||||
|
ConfigurationUtils.load(conf,
|
||||||
|
Thread.currentThread()
|
||||||
|
.getContextClassLoader().getResource(testfile).openStream());
|
||||||
|
assertEquals(2, conf.size());
|
||||||
|
assertEquals("val1", conf.get("key.1"));
|
||||||
|
assertEquals("val2", conf.get("key.2"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<configuration>
|
||||||
|
<property name="key.1" value="val1" />
|
||||||
|
<property name="key.2" value="val2" />
|
||||||
|
</configuration>
|
Loading…
Reference in New Issue