CAMEL-6933 Support Xerces global features configuration Conflicts: camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8c3eae2e Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8c3eae2e Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8c3eae2e Branch: refs/heads/camel-2.11.x Commit: 8c3eae2e046320c1f82372f1b617c18da3b7de5c Parents: f50a618 Author: Willem Jiang <willem.ji...@gmail.com> Authored: Tue Nov 5 15:41:27 2013 +0800 Committer: Willem Jiang <willem.ji...@gmail.com> Committed: Tue Nov 5 17:29:53 2013 +0800 ---------------------------------------------------------------------- .../camel/converter/jaxp/XmlConverter.java | 27 ++++++++++ .../camel/builder/xml/XPathFeatureTest.java | 57 ++++++++++++++++++++ 2 files changed, 84 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/8c3eae2e/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java b/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java index ac5c2fc..b596eef 100644 --- a/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java +++ b/camel-core/src/main/java/org/apache/camel/converter/jaxp/XmlConverter.java @@ -28,6 +28,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.lang.reflect.Constructor; import java.nio.ByteBuffer; +import java.util.Map; import java.util.Properties; import javax.xml.parsers.DocumentBuilder; @@ -62,9 +63,13 @@ import org.apache.camel.BytesSource; import org.apache.camel.Converter; import org.apache.camel.Exchange; import org.apache.camel.StringSource; +import org.apache.camel.builder.xml.XPathBuilder; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * A helper class to transform to and from various JAXB types such as {@link Source} and {@link Document} * @@ -77,6 +82,7 @@ public class XmlConverter { public static final String DEFAULT_CHARSET_PROPERTY = "org.apache.camel.default.charset"; public static final String OUTPUT_PROPERTIES_PREFIX = "org.apache.camel.xmlconverter.output."; + public static final String DOCUMENT_BUILDER_FACTORY_FEATURE = "org.apache.camel.xmlconverter.documentBuilderFactory.feature"; public static String defaultCharset = ObjectHelper.getSystemProperty(Exchange.DEFAULT_CHARSET_PROPERTY, "UTF-8"); /* @@ -85,6 +91,8 @@ public class XmlConverter { */ private static final Class<?> DOM_TO_SAX_CLASS; + private static final Logger LOG = LoggerFactory.getLogger(XPathBuilder.class); + private DocumentBuilderFactory documentBuilderFactory; private TransformerFactory transformerFactory; @@ -905,11 +913,30 @@ public class XmlConverter { // Helper methods //------------------------------------------------------------------------- + + protected void setupFeatures(DocumentBuilderFactory factory) { + Properties properties = System.getProperties(); + for (Map.Entry<Object, Object> prop : properties.entrySet()) { + String key = (String) prop.getKey(); + if (key.startsWith(XmlConverter.DOCUMENT_BUILDER_FACTORY_FEATURE)) { + String uri = ObjectHelper.after(key, ":"); + Boolean value = Boolean.valueOf((String)prop.getValue()); + try { + factory.setFeature(uri, value); + } catch (ParserConfigurationException e) { + LOG.warn("DocumentBuilderFactory doesn't support the feature {0} with value {1}, due to {2}.", new Object[]{uri, value, e}); + } + } + } + } + public DocumentBuilderFactory createDocumentBuilderFactory() { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); factory.setIgnoringElementContentWhitespace(true); factory.setIgnoringComments(true); + // setup the feature from the system property + setupFeatures(factory); return factory; } http://git-wip-us.apache.org/repos/asf/camel/blob/8c3eae2e/camel-core/src/test/java/org/apache/camel/builder/xml/XPathFeatureTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/builder/xml/XPathFeatureTest.java b/camel-core/src/test/java/org/apache/camel/builder/xml/XPathFeatureTest.java new file mode 100644 index 0000000..2a3f947 --- /dev/null +++ b/camel-core/src/test/java/org/apache/camel/builder/xml/XPathFeatureTest.java @@ -0,0 +1,57 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.camel.builder.xml; + + +import javax.xml.parsers.SAXParserFactory; + +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Exchange; +import org.apache.camel.converter.jaxp.XmlConverter; + +import static org.apache.camel.builder.xml.XPathBuilder.xpath; + +public class XPathFeatureTest extends ContextTestSupport { + public static final String DOM_BUILER_FACTORY_FEATRUE = XmlConverter.DOCUMENT_BUILDER_FACTORY_FEATURE; + + public static final String XML_DATA = " <!DOCTYPE foo [ " + + " <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM \"file:///bin/test.sh\" >]> <test> &xxe; </test>"; + + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + public void testXPathResult() throws Exception { + // Set this feature will disable the external general entities + System.setProperty(DOM_BUILER_FACTORY_FEATRUE + ":" + + "http://xml.org/sax/features/external-general-entities", "false"); + + String result = (String)xpath("/").stringResult().evaluate(createExchange(XML_DATA)); + assertEquals("Get a wrong result", " ", result); + System.clearProperty(DOM_BUILER_FACTORY_FEATRUE + ":" + + "http://xml.org/sax/features/external-general-entities"); + } + + protected Exchange createExchange(Object xml) { + Exchange exchange = createExchangeWithBody(context, xml); + return exchange; + } + + +}