You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by su...@apache.org on 2016/11/21 17:18:42 UTC

knox git commit: KNOX-767 Fix for CDATA handling (Jeffrey E Rodriguez via Sumit Gupta)

Repository: knox
Updated Branches:
  refs/heads/master 6eb0a6e5b -> 3a394adb1


KNOX-767 Fix for CDATA handling (Jeffrey E Rodriguez via Sumit Gupta)


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

Branch: refs/heads/master
Commit: 3a394adb19573ecff255b1b8858f4586e2d88457
Parents: 6eb0a6e
Author: Sumit Gupta <su...@apache.org>
Authored: Mon Nov 21 12:17:57 2016 -0500
Committer: Sumit Gupta <su...@apache.org>
Committed: Mon Nov 21 12:17:57 2016 -0500

----------------------------------------------------------------------
 .../rewrite/impl/xml/XmlFilterReader.java       | 45 ++++++++++++++------
 .../rewrite/impl/xml/XmlFilterReaderTest.java   | 36 +++++++++++++---
 2 files changed, 60 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/knox/blob/3a394adb/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReader.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReader.java b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReader.java
index cfaebd2..4b06540 100644
--- a/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReader.java
+++ b/gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReader.java
@@ -35,7 +35,6 @@ import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.Text;
 
-import javax.xml.XMLConstants;
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
@@ -63,7 +62,6 @@ import javax.xml.xpath.XPathExpression;
 import javax.xml.xpath.XPathExpressionException;
 import javax.xml.xpath.XPathFactory;
 import java.io.IOException;
-import java.io.PrintWriter;
 import java.io.Reader;
 import java.io.StringWriter;
 import java.io.Writer;
@@ -90,6 +88,7 @@ public abstract class XmlFilterReader extends Reader {
   private XMLEventReader parser;
   private Document document;
   private Stack<Level> stack;
+  private boolean isEmptyElement;
 
   protected XmlFilterReader( Reader reader, UrlRewriteFilterContentDescriptor config ) throws IOException, XMLStreamException {
     this.reader = reader;
@@ -99,10 +98,13 @@ public abstract class XmlFilterReader extends Reader {
     offset = 0;
     document = null;
     stack = new Stack<Level>();
+    isEmptyElement = false;
     factory = XMLInputFactory.newFactory();
     //KNOX-620 factory.setProperty( XMLConstants.ACCESS_EXTERNAL_DTD, "false" );
     //KNOX-620 factory.setProperty( XMLConstants.ACCESS_EXTERNAL_SCHEMA, "false" );
     factory.setProperty( "javax.xml.stream.isReplacingEntityReferences", Boolean.FALSE );
+    factory.setProperty("http://java.sun.com/xml/stream/"
+                + "properties/report-cdata-event", Boolean.TRUE);
     parser = factory.createXMLEventReader( reader );
   }
 
@@ -145,7 +147,7 @@ public abstract class XmlFilterReader extends Reader {
     return count;
   }
 
-  private void processEvent( XMLEvent event ) throws ParserConfigurationException, XPathExpressionException, IOException {
+  private void processEvent( XMLEvent event ) throws ParserConfigurationException, XPathExpressionException, IOException, XMLStreamException {
     int type = event.getEventType();
     switch( type ) {
       case XMLEvent.START_DOCUMENT:
@@ -155,10 +157,13 @@ public abstract class XmlFilterReader extends Reader {
         processEndDocument();
         break;
       case XMLEvent.START_ELEMENT:
-        processStartElement( event.asStartElement() );
+        if( parser.peek().getEventType() == XMLEvent.END_ELEMENT )
+          isEmptyElement = true;
+        processStartElement( event.asStartElement());
         break;
       case XMLEvent.END_ELEMENT:
         processEndElement( event.asEndElement() );
+        isEmptyElement = false;
         break;
       case XMLEvent.CHARACTERS:
       case XMLEvent.CDATA:
@@ -267,15 +272,17 @@ public abstract class XmlFilterReader extends Reader {
         processBufferedElement( child );
       }
     } else {
-      QName n = event.getName();
-      writer.write( "</" );
-      String p = n.getPrefix();
-      if( p != null && !p.isEmpty() ) {
-        writer.write( p );
-        writer.write( ":" );
+      if( ! isEmptyElement ) {
+        QName n = event.getName();
+        writer.write( "</" );
+        String p = n.getPrefix();
+        if( p != null && !p.isEmpty() ) {
+          writer.write( p );
+          writer.write( ":" );
+        }
+        writer.write( n.getLocalPart() );
+        writer.write( ">" );
       }
-      writer.write( n.getLocalPart() );
-      writer.write( ">" );
       child.node.getParentNode().removeChild( child.node );
     }
   }
@@ -322,7 +329,11 @@ public abstract class XmlFilterReader extends Reader {
     writer.write( qname.getLocalPart() );
     streamNamespaces( event );
     streamAttributes( event, element );
-    writer.write( ">" );
+    if( isEmptyElement ) {
+      writer.write("/>");
+    } else {
+      writer.write(">");
+    }
   }
 
   private void processBufferedElement( Level level, UrlRewriteFilterGroupDescriptor config ) throws XPathExpressionException {
@@ -519,7 +530,13 @@ public abstract class XmlFilterReader extends Reader {
           }
         }
       }
-      writer.write( StringEscapeUtils.escapeXml( value ) );
+      if( event.isCData() ) {
+        writer.write( "<![CDATA[" );
+        writer.write( value );
+        writer.write( "]]>" );
+      } else {
+        writer.write( StringEscapeUtils.escapeXml( value ) );
+      }  
     }
   }
 

http://git-wip-us.apache.org/repos/asf/knox/blob/3a394adb/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java
----------------------------------------------------------------------
diff --git a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java
index 0894abe..a345dcf 100644
--- a/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java
+++ b/gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/impl/xml/XmlFilterReaderTest.java
@@ -931,18 +931,17 @@ public class XmlFilterReaderTest {
     StringReader reader;
     XmlFilterReader filter;
 
-    // Ideally this should work but currently does not.
-    //input = "<tag/>";
-    //reader = new StringReader( input );
-    //filter = new NoopXmlFilterReader( reader, null );
-    //output = IOUtils.toString( filter );
-    //assertThat( output, containsString( "<tag/>" ) );
+    input = "<tag/>";
+    reader = new StringReader( input );
+    filter = new NoopXmlFilterReader( reader, null );
+    output = IOUtils.toString( filter );
+    assertThat( output, containsString( "<tag/>" ) );
 
     input = "<tag></tag>";
     reader = new StringReader( input );
     filter = new NoopXmlFilterReader( reader, null );
     output = IOUtils.toString( filter );
-    assertThat( output, containsString( "<tag></tag>" ) );
+    assertThat( output, containsString( "<tag/>" ) );
 
     input = "<tag>&lt;</tag>";
     reader = new StringReader( input );
@@ -956,6 +955,29 @@ public class XmlFilterReaderTest {
     filter = new NoopXmlFilterReader( reader, null );
     output = IOUtils.toString( filter );
     assertThat( output, containsString( "<tag>&amp;</tag>" ) );
+
+    input = "<document><empty/><![CDATA[<xyz>wibble</xyz>]]></document>";
+    reader = new StringReader( input );
+    filter = new NoopXmlFilterReader( reader, null );
+    output = IOUtils.toString( filter );
+    assertThat( output, containsString( "<?xml version=\"1.0\" standalone=\"no\"?><document><empty/><![CDATA[<xyz>wibble</xyz>]]></document>" ));
+
+    input="<?xml version=\"1.0\" standalone=\"no\"?>"+
+"<document>" +
+"   <noempty test=\"a\"> </noempty>"+
+"  <!-- This is the first comment -->"+
+"   <empty/>"+
+"   <![CDATA[<xyz>wibble</xyz>]]>"+
+"   <here>"+
+"      <moreempty/>"+
+"       <!-- This is the second comment -->"+
+"      <![CDATA[<xyz>noop</xyz>]]>"+
+"   </here>"+
+"</document>";
+    reader = new StringReader( input );
+    filter = new NoopXmlFilterReader( reader, null );
+    output = IOUtils.toString( filter );
+    assertThat( output, containsString( "<?xml version=\"1.0\" standalone=\"no\"?><document>   <noempty test=\"a\"> </noempty>  <!-- This is the first comment -->   <empty/>   <![CDATA[<xyz>wibble</xyz>]]>   <here>      <moreempty/>       <!-- This is the second comment -->      <![CDATA[<xyz>noop</xyz>]]>   </here></document>"));
   }
 
   @Test