Skip to content

Commit 2d17f31

Browse files
committed
#5275 Add option to XMLWriter to prevent char 0 disabling output escaping
1 parent 3676db5 commit 2d17f31

14 files changed

Lines changed: 151 additions & 20 deletions

File tree

stroom-app/src/test/java/stroom/pipeline/TestXmlWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void testUnicodeHandling() throws Exception {
5050
attributes.addAttribute("", "att", "att", "string", text);
5151

5252
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
53-
final TransformerHandler th = XMLUtil.createTransformerHandler(new FatalErrorListener(), true);
53+
final TransformerHandler th = XMLUtil.createTransformerHandler(new FatalErrorListener(), true, true);
5454
th.setResult(new StreamResult(baos));
5555

5656
th.startDocument();

stroom-importexport/stroom-importexport-impl/src/main/java/stroom/importexport/impl/Config.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void handleAttribute(final String property, final Object value) {
7272

7373
public void write(final Writer writer, final String entityType) throws IOException {
7474
try {
75-
final SAXTransformerFactory stf = (SAXTransformerFactory) TransformerFactoryFactory.newInstance();
75+
final SAXTransformerFactory stf = (SAXTransformerFactory) TransformerFactoryFactory.newInstance(true);
7676
final TransformerHandler th = stf.newTransformerHandler();
7777
final Transformer transformer = th.getTransformer();
7878

stroom-kafka/stroom-kafka-impl/src/main/java/stroom/kafka/pipeline/StandardKafkaProducer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ public void fatalError(final TransformerException exception) {
232232
};
233233

234234
try {
235-
this.xmlValueHandler = XMLUtil.createTransformerHandler(errorListener, false);
235+
this.xmlValueHandler = XMLUtil.createTransformerHandler(errorListener, false, true);
236236
outputStream = new ByteArrayOutputStream();
237237
xmlValueHandler.setResult(new StreamResult(outputStream));
238238
xmlValueHandler.startDocument();

stroom-pipeline/src/main/java/stroom/pipeline/filter/AbstractSamplingFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void startProcessing() {
6868
errorListener = new ErrorListenerAdaptor(getElementId(), locationFactory, errorReceiverProxy);
6969

7070
try {
71-
this.handler = XMLUtil.createTransformerHandler(errorListener, false);
71+
this.handler = XMLUtil.createTransformerHandler(errorListener, false, true);
7272

7373
} catch (final TransformerConfigurationException e) {
7474
errorReceiverProxy.log(Severity.FATAL_ERROR,

stroom-pipeline/src/main/java/stroom/pipeline/record/XMLRecordEmitter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
public class XMLRecordEmitter extends XMLFilterAdaptor implements HasElementId {
5757

5858
private final SAXTransformerFactory transformerFactory = (SAXTransformerFactory) TransformerFactoryFactory
59-
.newInstance();
59+
.newInstance(true);
6060
private final MyWriter outputStreamWriter = new MyWriter(1000);
6161
private final List<DestinationProvider> appenders;
6262
private final List<StartPrefixMapping> prefixList = new ArrayList<>();

stroom-pipeline/src/main/java/stroom/pipeline/writer/XMLWriter.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ public class XMLWriter extends AbstractWriter implements XMLFilter {
103103
private String rootElement;
104104

105105
private boolean indentOutput = false;
106+
private boolean preventEscapeSwitching = false;
106107

107108
//XSL related props in order to support <xsl:output>
108109
private final XsltStore xsltStore;
@@ -186,7 +187,8 @@ public void startProcessing() {
186187

187188
final ErrorListener errorListener = new ErrorListenerAdaptor(getElementId(), locationFactory,
188189
getErrorReceiver());
189-
final TransformerHandler th = XMLUtil.createTransformerHandler(errorListener, indentOutput);
190+
final TransformerHandler th = XMLUtil
191+
.createTransformerHandler(errorListener, indentOutput, preventEscapeSwitching);
190192

191193
if (outputProperties != null) {
192194
th.getTransformer().setOutputProperties(outputProperties);
@@ -569,6 +571,15 @@ public void setSuppressXSLTNotFoundWarnings(final boolean suppressXSLTNotFoundWa
569571
this.suppressXSLTNotFoundWarnings = suppressXSLTNotFoundWarnings;
570572
}
571573

574+
@PipelineProperty(
575+
description = "Some inputs might contain control character 0 which turns off output escaping. " +
576+
"Set this to true to prevent that behaviour.",
577+
defaultValue = "false",
578+
displayPriority = 4)
579+
public void setPreventEscapeSwitching(final boolean preventEscapeSwitching) {
580+
this.preventEscapeSwitching = preventEscapeSwitching;
581+
}
582+
572583
/**
573584
* Used when XSLT is supplied (for xsl:output)
574585
*/

stroom-pipeline/src/test/java/stroom/pipeline/xml/converter/json/TestJSONParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ void testMulti() throws IOException {
8080
positiveTest("Multi");
8181
}
8282

83+
@Test
84+
void testEmbeddedXml() throws IOException {
85+
positiveTest("EmbeddedXml");
86+
}
87+
8388
private void negativeTest(final String stem, final String type) throws IOException {
8489
test(stem, "~" + type, true);
8590
}
@@ -299,6 +304,7 @@ private void test(final String stem, final String testType, final boolean expect
299304

300305
final XMLWriter xmlWriter = new XMLWriter(errorReceiverProxy, null, null, null, null, null, null, null);
301306
xmlWriter.setIndentOutput(true);
307+
xmlWriter.setPreventEscapeSwitching(true);
302308
xmlWriter.setTarget(xmlAppender);
303309

304310
final JSONWriter jsonWriter = new JSONWriter(errorReceiverProxy);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"data" :
3+
{
4+
"structure" :
5+
{
6+
"values" :
7+
{
8+
"content" : "<XXXX>_aa_\u0000_bb_</XXXX>"
9+
}
10+
}
11+
}
12+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"data" : {
3+
"structure" : {
4+
"values" : {
5+
"content" : "<XXXX>_aa_\u0000_bb_</XXXX>"
6+
}
7+
}
8+
}
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.1" encoding="UTF-8"?>
2+
<map xmlns="http://www.w3.org/2013/XSL/json">
3+
<map key="data">
4+
<map key="structure">
5+
<map key="values">
6+
<string key="content">&lt;XXXX&gt;_aa_&#x0;_bb_&lt;/XXXX&gt;</string>
7+
</map>
8+
</map>
9+
</map>
10+
</map>

0 commit comments

Comments
 (0)