You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/12/15 15:18:29 UTC

(camel) 01/02: CAMEL-20241: camel-jbang - Pretty print xml body should not have noisy empty lines

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 2726fe92a378508d11ad6e4d53511988f6478b68
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Dec 15 16:03:28 2023 +0100

    CAMEL-20241: camel-jbang - Pretty print xml body should not have noisy empty lines
---
 .../camel/util/xml/pretty/XmlPrettyPrinter.java    | 45 ++++++++++++++--------
 .../util/xml/pretty/XmlPrettyPrinterTest.java      | 36 +++++++++++++++++
 2 files changed, 64 insertions(+), 17 deletions(-)

diff --git a/core/camel-xml-jaxp-util/src/main/java/org/apache/camel/util/xml/pretty/XmlPrettyPrinter.java b/core/camel-xml-jaxp-util/src/main/java/org/apache/camel/util/xml/pretty/XmlPrettyPrinter.java
index 4e5789e0e67..2d004d3192b 100644
--- a/core/camel-xml-jaxp-util/src/main/java/org/apache/camel/util/xml/pretty/XmlPrettyPrinter.java
+++ b/core/camel-xml-jaxp-util/src/main/java/org/apache/camel/util/xml/pretty/XmlPrettyPrinter.java
@@ -107,6 +107,7 @@ public final class XmlPrettyPrinter {
         final StringBuilder sb = new StringBuilder();
         final DefaultHandler handler = new DefaultHandler() {
             int indent;
+            boolean inElement;
 
             @Override
             public void declaration(String version, String encoding, String standalone) throws SAXException {
@@ -132,26 +133,33 @@ public final class XmlPrettyPrinter {
 
             @Override
             public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+                inElement = true;
                 sb.append(XmlPrettyPrinter.padString(indent, blanks));
 
                 StringBuilder lb = new StringBuilder();
                 lb.append("<");
                 lb.append(qName);
+
+                boolean empty = attributes.getLength() == 0;
+                if (empty) {
+                    lb.append(">");
+                }
                 String value = color.color(ColorPrintElement.ELEMENT, lb.toString());
                 sb.append(value);
 
-                lb.setLength(0);
-                for (int i = 0; i < attributes.getLength(); i++) {
-                    String k = color.color(ColorPrintElement.ATTRIBUTE_KEY, attributes.getQName(i));
-                    String v = color.color(ColorPrintElement.ATTRIBUTE_VALUE, attributes.getValue(i));
-                    String eq = color.color(ColorPrintElement.ATTRIBUTE_EQUAL, "=");
-                    String quote = color.color(ColorPrintElement.ATTRIBUTE_QUOTE, "\"");
-                    lb.append(" ").append(k).append(eq).append(quote).append(v).append(quote);
+                if (!empty) {
+                    lb.setLength(0);
+                    for (int i = 0; i < attributes.getLength(); i++) {
+                        String k = color.color(ColorPrintElement.ATTRIBUTE_KEY, attributes.getQName(i));
+                        String v = color.color(ColorPrintElement.ATTRIBUTE_VALUE, attributes.getValue(i));
+                        String eq = color.color(ColorPrintElement.ATTRIBUTE_EQUAL, "=");
+                        String quote = color.color(ColorPrintElement.ATTRIBUTE_QUOTE, "\"");
+                        lb.append(" ").append(k).append(eq).append(quote).append(v).append(quote);
+                    }
+                    sb.append(lb);
+                    value = color.color(ColorPrintElement.ELEMENT, ">");
+                    sb.append(value);
                 }
-                sb.append(lb);
-
-                value = color.color(ColorPrintElement.ELEMENT, ">");
-                sb.append(value);
                 sb.append("\n");
 
                 indent++;
@@ -159,6 +167,7 @@ public final class XmlPrettyPrinter {
 
             @Override
             public void endElement(String uri, String localName, String qName) throws SAXException {
+                inElement = false;
                 --indent;
 
                 StringBuilder lb = new StringBuilder();
@@ -176,13 +185,15 @@ public final class XmlPrettyPrinter {
 
             @Override
             public void characters(char[] ch, int start, int length) throws SAXException {
-                char[] chars = new char[length];
-                System.arraycopy(ch, start, chars, 0, length);
-                String value = color.color(ColorPrintElement.VALUE, new String(chars));
+                if (inElement && indent > 1) {
+                    char[] chars = new char[length];
+                    System.arraycopy(ch, start, chars, 0, length);
+                    String value = color.color(ColorPrintElement.VALUE, new String(chars));
 
-                sb.append(XmlPrettyPrinter.padString(indent, blanks));
-                sb.append(value);
-                sb.append("\n");
+                    sb.append(XmlPrettyPrinter.padString(indent, blanks));
+                    sb.append(value);
+                    sb.append("\n");
+                }
             }
         };
 
diff --git a/core/camel-xml-jaxp-util/src/test/java/org/apache/camel/util/xml/pretty/XmlPrettyPrinterTest.java b/core/camel-xml-jaxp-util/src/test/java/org/apache/camel/util/xml/pretty/XmlPrettyPrinterTest.java
index 1740e3929df..0eb71cf9b61 100644
--- a/core/camel-xml-jaxp-util/src/test/java/org/apache/camel/util/xml/pretty/XmlPrettyPrinterTest.java
+++ b/core/camel-xml-jaxp-util/src/test/java/org/apache/camel/util/xml/pretty/XmlPrettyPrinterTest.java
@@ -50,4 +50,40 @@ public class XmlPrettyPrinterTest {
         Assertions.assertEquals(expected, pretty);
     }
 
+    @Test
+    public void testPrettyPrintColor() throws Exception {
+        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><tag><nested>hello</nested></tag></root>";
+        String expected = "*<?xml version=\"1.0\" encoding=\"UTF-8\"?>*\n"
+                          + "*<root>*\n"
+                          + "  *<tag>*\n"
+                          + "    *<nested>*\n"
+                          + "      *hello*\n"
+                          + "    *</nested>*\n"
+                          + "  *</tag>*\n"
+                          + "*</root>*";
+        String pretty = XmlPrettyPrinter.colorPrint(xml, 2, true, new XmlPrettyPrinter.ColorPrintElement() {
+            @Override
+            public String color(int type, String value) {
+                return "*" + value + "*";
+            }
+        });
+        Assertions.assertEquals(expected, pretty);
+    }
+
+    @Test
+    public void testPrettyPrintBeer() throws Exception {
+        String xml = "<beer alc=\"4.4%\"> <kind>Fosters</kind> <name>Bell Expedition</name> </beer>";
+        String expected = """
+                <beer alc="4.4%">
+                  <kind>
+                    Fosters
+                  </kind>
+                  <name>
+                    Bell Expedition
+                  </name>
+                </beer>""";
+        String pretty = XmlPrettyPrinter.pettyPrint(xml, 2, false);
+        Assertions.assertEquals(expected, pretty);
+    }
+
 }