HDFS-14522. Allow compact property description in xml in httpfs. (#1737)
This commit is contained in:
parent
dc66de7448
commit
4dffd81bb7
|
@ -20,17 +20,7 @@ package org.apache.hadoop.lib.util;
|
|||
|
||||
import org.apache.hadoop.classification.InterfaceAudience;
|
||||
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.InputStream;
|
||||
import java.util.Map;
|
||||
|
@ -98,62 +88,6 @@ public abstract class ConfigurationUtils {
|
|||
* @throws IOException thrown if the configuration could not be read.
|
||||
*/
|
||||
public static void load(Configuration conf, InputStream is) throws IOException {
|
||||
try {
|
||||
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);
|
||||
}
|
||||
conf.addResource(is);
|
||||
}
|
||||
|
||||
// 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 class TestConfigurationUtils {
|
|||
}
|
||||
|
||||
|
||||
@Test(expected = IOException.class)
|
||||
public void constructorsFail3() throws Exception {
|
||||
InputStream is = new ByteArrayInputStream("<xonfiguration></xonfiguration>".getBytes());
|
||||
@Test
|
||||
public void constructors3() throws Exception {
|
||||
InputStream is = new ByteArrayInputStream(
|
||||
"<xxx><property name=\"key1\" value=\"val1\"/></xxx>".getBytes());
|
||||
Configuration conf = new Configuration(false);
|
||||
ConfigurationUtils.load(conf, is);
|
||||
assertEquals("val1", conf.get("key1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -124,4 +126,16 @@ public class TestConfigurationUtils {
|
|||
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