Repository: knox
Updated Branches:
  refs/heads/master 59c45d3a3 -> 632a6b64f


KNOX-1686 - XmlFilterReader - Ensure XPath and XPathFactory thread safety

Signed-off-by: Kevin Risden <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/knox/repo
Commit: http://git-wip-us.apache.org/repos/asf/knox/commit/632a6b64
Tree: http://git-wip-us.apache.org/repos/asf/knox/tree/632a6b64
Diff: http://git-wip-us.apache.org/repos/asf/knox/diff/632a6b64

Branch: refs/heads/master
Commit: 632a6b64f8794c602f0c3f86bd3cdd990a5fbe58
Parents: 59c45d3
Author: Kevin Risden <[email protected]>
Authored: Tue Dec 18 12:54:07 2018 -0500
Committer: Kevin Risden <[email protected]>
Committed: Tue Dec 18 13:07:10 2018 -0500

----------------------------------------------------------------------
 .../rewrite/impl/xml/XmlFilterReader.java       | 62 ++++++++++----------
 1 file changed, 30 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/knox/blob/632a6b64/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/xml/XmlFilterReader.java
----------------------------------------------------------------------
diff --git 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/xml/XmlFilterReader.java
 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/xml/XmlFilterReader.java
index 95b9746..1944d7e 100644
--- 
a/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/xml/XmlFilterReader.java
+++ 
b/gateway-provider-rewrite/src/main/java/org/apache/knox/gateway/filter/rewrite/impl/xml/XmlFilterReader.java
@@ -52,11 +52,11 @@ import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
-import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpression;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
+import javax.xml.xpath.XPathFactoryConfigurationException;
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringWriter;
@@ -66,7 +66,6 @@ import java.util.Stack;
 import java.util.regex.Pattern;
 
 public abstract class XmlFilterReader extends Reader {
-
   private static final UrlRewriteResources RES = ResourcesFactory.get( 
UrlRewriteResources.class );
 
   private static final String DEFAULT_XML_VERSION = "1.0";
@@ -95,12 +94,12 @@ public abstract class XmlFilterReader extends Reader {
     stack = new Stack<>();
     isEmptyElement = false;
     factory = XMLInputFactory.newFactory();
-    //KNOX-620 factory.setProperty( XMLConstants.ACCESS_EXTERNAL_DTD, "false" 
);
-    //KNOX-620 factory.setProperty( XMLConstants.ACCESS_EXTERNAL_SCHEMA, 
"false" );
+    //KNOX-620 factory.setProperty( XMLConstants.ACCESS_EXTERNAL_DTD, 
Boolean.FALSE );
+    //KNOX-620 factory.setProperty( XMLConstants.ACCESS_EXTERNAL_SCHEMA, 
Boolean.FALSE );
     /* This disables DTDs entirely for that factory */
-    factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
+    factory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE);
     /* disable external entities */
-    factory.setProperty("javax.xml.stream.isSupportingExternalEntities", 
false);
+    factory.setProperty("javax.xml.stream.isSupportingExternalEntities", 
Boolean.FALSE);
 
     factory.setProperty( "javax.xml.stream.isReplacingEntityReferences", 
Boolean.FALSE );
     factory.setProperty("http://java.sun.com/xml/stream/";
@@ -186,7 +185,6 @@ public abstract class XmlFilterReader extends Reader {
   }
 
   private void processStartDocument( StartDocument event ) throws 
ParserConfigurationException {
-    //System.out.println( "SD=" + event );
     String s;
 
     document = XmlUtils.createDocument( false );
@@ -222,8 +220,6 @@ public abstract class XmlFilterReader extends Reader {
   }
 
   private void processStartElement( StartElement event ) throws 
XPathExpressionException {
-    //System.out.println( "SE=" + event );
-
     // Create a new "empty" element and add it to the document.
     Element element = bufferElement( event );
     Level parent = stack.peek();
@@ -263,7 +259,6 @@ public abstract class XmlFilterReader extends Reader {
   }
 
   private void processEndElement( EndElement event ) throws 
XPathExpressionException, IOException {
-    //System.out.println( "EE=" + event );
     boolean buffering = currentlyBuffering();
     Level child = stack.pop();
     if( buffering ) {
@@ -489,8 +484,6 @@ public abstract class XmlFilterReader extends Reader {
       }
     }
 
-    //dump( document );
-
     if( prefix == null || prefix.isEmpty() ) {
       writer.write( " " );
       writer.write( name.getLocalPart() );
@@ -506,8 +499,7 @@ public abstract class XmlFilterReader extends Reader {
     element.removeAttributeNode( node );
   }
 
-  private void processCharacters( Characters event ) throws 
XPathExpressionException {
-    //System.out.println( "T[" + event.isCData() + "," + event.isWhiteSpace() 
+ "," + event.isIgnorableWhiteSpace() + "]=" + event );
+  private void processCharacters( Characters event ) {
     Level level = stack.peek();
     Node node = stack.peek().node;
     if( event.isCData() ) {
@@ -539,7 +531,6 @@ public abstract class XmlFilterReader extends Reader {
   }
 
   private void processComment( Comment event ) {
-    //System.out.println( "C=" + event );
     if( currentlyBuffering() ) {
       stack.peek().node.appendChild( document.createComment( event.getText() ) 
);
     } else {
@@ -600,30 +591,38 @@ public abstract class XmlFilterReader extends Reader {
       this.node = node;
       this.scopeConfig = scopeConfig;
       this.scopeNode = scopeNode;
-      this.buffered = ( ( parent != null ) && parent.buffered ) ||
-                      ( ( scopeConfig != null ) && ( scopeConfig instanceof 
UrlRewriteFilterBufferDescriptor ) );
+      this.buffered = ( parent != null && parent.buffered ) ||
+                      (scopeConfig instanceof 
UrlRewriteFilterBufferDescriptor);
     }
   }
 
   private static class XmlPathCompiler implements 
UrlRewriteFilterPathDescriptor.Compiler<XPathExpression> {
-    private static XPath XPATH;
+    private static final XPathFactory xpathFactory = getXpathFactory();
 
-    static {
-        XPathFactory xpathFactory = XPathFactory.newInstance();
-        try {
-            xpathFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, 
Boolean.TRUE);
-        } catch (javax.xml.xpath.XPathFactoryConfigurationException ex) {
-            // ignore
-        }
-        XPATH = xpathFactory.newXPath();
+    private static synchronized XPathFactory getXpathFactory() {
+      XPathFactory xPathFactory = XPathFactory.newInstance();
+      try {
+        xPathFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, 
Boolean.TRUE);
+      } catch (XPathFactoryConfigurationException ex) {
+        // ignore
+      }
+      return xPathFactory;
+    }
+
+    private synchronized XPathExpression getXPathExpression(String expression) 
{
+      try {
+        return xpathFactory.newXPath().compile(expression);
+      } catch (XPathExpressionException e) {
+        throw new IllegalArgumentException(e);
+      }
     }
 
     @Override
     public XPathExpression compile( String expression, XPathExpression 
compiled ) {
-      try {
-        return XPATH.compile( expression );
-      } catch( XPathExpressionException e ) {
-        throw new IllegalArgumentException( e );
+      if(compiled != null) {
+        return compiled;
+      } else {
+        return getXPathExpression(expression);
       }
     }
   }
@@ -631,7 +630,7 @@ public abstract class XmlFilterReader extends Reader {
   private static class RegexCompiler implements 
UrlRewriteFilterPathDescriptor.Compiler<Pattern> {
     @Override
     public Pattern compile( String expression, Pattern compiled ) {
-      if( compiled != null ) {
+      if(compiled != null) {
         return compiled;
       } else {
         return Pattern.compile( expression );
@@ -647,5 +646,4 @@ public abstract class XmlFilterReader extends Reader {
       throw new IOException( e );
     }
   }
-
 }

Reply via email to