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><</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>&</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