From 092174186fcb542adf47dd6a0cf880b5ca19b772 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Fri, 10 Mar 2023 16:43:45 +0100 Subject: [PATCH] fixed - impl new XMLUtil class Issue #212 --- .../java/org/openbpmn/bpmn/BPMNModel.java | 9 +- .../org/openbpmn/bpmn/util/BPMNXMLUtil.java | 98 +++++++++++++++++++ .../org/openbpmn/output/TestCleanCDATA.java | 22 +++++ 3 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 open-bpmn.metamodel/src/main/java/org/openbpmn/bpmn/util/BPMNXMLUtil.java create mode 100644 open-bpmn.metamodel/src/test/java/org/openbpmn/output/TestCleanCDATA.java diff --git a/open-bpmn.metamodel/src/main/java/org/openbpmn/bpmn/BPMNModel.java b/open-bpmn.metamodel/src/main/java/org/openbpmn/bpmn/BPMNModel.java index dd35a0ab..acd7b985 100644 --- a/open-bpmn.metamodel/src/main/java/org/openbpmn/bpmn/BPMNModel.java +++ b/open-bpmn.metamodel/src/main/java/org/openbpmn/bpmn/BPMNModel.java @@ -44,6 +44,7 @@ import org.openbpmn.bpmn.exceptions.BPMNInvalidTypeException; import org.openbpmn.bpmn.exceptions.BPMNMissingElementException; import org.openbpmn.bpmn.exceptions.BPMNModelException; +import org.openbpmn.bpmn.util.BPMNXMLUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; @@ -1687,9 +1688,13 @@ private void writeXml(Document doc, OutputStream output) throws TransformerExcep transformer.transform(source, dest); String xmlString = w.toString(); // No indentation (whitespace) for elements with a CDATA section. - // See. + // See // https://stackoverflow.com/questions/55853220/handling-change-in-newlines-by-xml-transformation-for-cdata-from-java-8-to-java/75568933 - xmlString = xmlString.replaceAll(">\\s*(<\\!\\[CDATA\\[(.|\\n|\\r\\n)*?]\\]>)\\s*$1\\s*+(<\\!\\[CDATA\\[(.|\\n|\\r\\n)*?]\\]>)\\s*$1 + * + * + * + * results in: + * + * + * + * We can not use regex (replaceAll) here + * + * xmlString = + * xmlString.replaceAll(">\\s*+(<\\!\\[CDATA\\[(.|\\n|\\r\\n)*?]\\]>)\\s*$1' + int backwardTagPos = xml.lastIndexOf(">", pos); + // do we have whitespace? + if (pos > backwardTagPos - 1) { + xml = xml.substring(0, backwardTagPos + 1) + xml.substring(pos); + } + lastPos = pos + 1; + /** + * next search for + * CDATA end ']]>' + */ + pos = xml.indexOf("]]>", lastPos); + if (pos == -1) { + // wrong CDATA! + System.out.println("WRONG CDATA ELEMENT - unexpected end at: " + lastPos); + completed = true; + break; + } + pos = pos + 3; + // find upper '>' + int forwardTagPos = xml.indexOf("<", pos); + // do we have whitespace? + if (forwardTagPos > pos) { + xml = xml.substring(0, pos) + xml.substring(forwardTagPos); + } + lastPos = pos + 1; + } + + return xml; + } + +} diff --git a/open-bpmn.metamodel/src/test/java/org/openbpmn/output/TestCleanCDATA.java b/open-bpmn.metamodel/src/test/java/org/openbpmn/output/TestCleanCDATA.java new file mode 100644 index 00000000..bef88ce9 --- /dev/null +++ b/open-bpmn.metamodel/src/test/java/org/openbpmn/output/TestCleanCDATA.java @@ -0,0 +1,22 @@ +package org.openbpmn.output; + +import org.junit.jupiter.api.Test; +import org.openbpmn.bpmn.util.BPMNXMLUtil; + +/** + * Test Class to test clean up of cdata whitespace + */ +public class TestCleanCDATA { + + @Test + public void testSimple() { + + String xml = " \n \n "; + + System.out.println(xml); + String result = BPMNXMLUtil.cleanCDATAWhiteSpace(xml); + + System.out.println(result); + + } +}