Updated Branches:
  refs/heads/master 5761250c7 -> 2183730cf

CAMEL-6933 Support Xerces global features configuration


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/3f10f610
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3f10f610
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3f10f610

Branch: refs/heads/master
Commit: 3f10f610cd4421e403bdd00ffca1245688e7ce5c
Parents: 5761250
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 15:44:58 2013 +0800

----------------------------------------------------------------------
 .../camel/converter/jaxp/XmlConverter.java      | 26 +++++++++
 .../camel/builder/xml/XPathFeatureTest.java     | 57 ++++++++++++++++++++
 2 files changed, 83 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/3f10f610/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 994a724..79e71b9 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
@@ -27,6 +27,7 @@ import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.nio.ByteBuffer;
+import java.util.Map;
 import java.util.Properties;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -60,9 +61,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}
  *
@@ -75,8 +80,11 @@ 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");
 
+    private static final Logger LOG = 
LoggerFactory.getLogger(XPathBuilder.class);
+    
     private DocumentBuilderFactory documentBuilderFactory;
     private TransformerFactory transformerFactory;
 
@@ -886,12 +894,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/3f10f610/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;
+    }
+
+
+}

Reply via email to