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

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


The following commit(s) were added to refs/heads/main by this push:
     new f9048eb0a82 (chores) consolidate duplicated code for printing the 
stack traces
f9048eb0a82 is described below

commit f9048eb0a82262e42cd234fe07c653e8159cc8a6
Author: Otavio Rodolfo Piske <[email protected]>
AuthorDate: Fri Aug 23 10:00:05 2024 +0200

    (chores) consolidate duplicated code for printing the stack traces
---
 .../camel/converter/crypto/PGPDataFormatTest.java  | 20 +++-------
 .../camel/component/http/HeaderFilteringTest.java  |  8 +---
 .../jetty/JettyHttpEndpointDisconnectTest.java     | 13 +++----
 .../ncd/NoClassDefFoundErrorWrapExceptionTest.java | 10 +----
 .../knative/http/KnativeHttpConsumer.java          | 33 +++++++---------
 .../health/CamelMicroProfileHealthHelper.java      | 10 ++---
 .../netty/http/DefaultNettyHttpBinding.java        |  9 ++---
 .../platform/http/main/MainHttpServer.java         |  8 +---
 .../http/vertx/VertxPlatformHttpSupport.java       |  9 ++---
 .../undertow/DefaultUndertowHttpBinding.java       |  9 ++---
 .../component/xmlsecurity/XmlSignatureTest.java    | 16 ++------
 .../camel/impl/console/HealthDevConsole.java       | 15 +++-----
 .../camel/impl/console/RouteControllerConsole.java | 13 ++-----
 .../apache/camel/impl/console/RouteDevConsole.java | 15 +++-----
 .../NoClassDefFoundErrorWrapExceptionTest.java     | 10 +----
 .../camel/management/mbean/ManagedCamelHealth.java | 12 +-----
 .../mbean/ManagedSupervisingRouteController.java   |  8 +---
 .../org/apache/camel/support/ExceptionHelper.java  | 44 ++++++++++++++++++++++
 .../org/apache/camel/support/LanguageHelper.java   | 13 +------
 .../org/apache/camel/support/MessageHelper.java    | 11 ++----
 .../processor/DefaultExchangeFormatter.java        |  8 ++--
 21 files changed, 114 insertions(+), 180 deletions(-)

diff --git 
a/components/camel-crypto-pgp/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
 
b/components/camel-crypto-pgp/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
index 2917a09c3a3..0f03b442477 100644
--- 
a/components/camel-crypto-pgp/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
+++ 
b/components/camel-crypto-pgp/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java
@@ -22,8 +22,6 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -38,6 +36,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.util.IOHelper;
 import org.bouncycastle.bcpg.BCPGOutputStream;
 import org.bouncycastle.bcpg.CompressionAlgorithmTags;
@@ -804,17 +803,17 @@ public class PGPDataFormatTest extends 
AbstractPGPDataFormatTest {
         Exception e = (Exception) 
mock.getExchanges().get(0).getProperty(Exchange.EXCEPTION_CAUGHT);
         assertNotNull(e, "Expected excpetion " + cl.getName() + " missing");
         if (e.getClass() != cl) {
-            String stackTrace = getStrackTrace(e);
+            String stackTrace = ExceptionHelper.stackTraceToString(e);
             fail("Exception  " + cl.getName() + " excpected, but was " + 
e.getClass().getName() + ": " + stackTrace);
         }
         if (expectedMessagePart != null) {
             if (e.getMessage() == null) {
-                fail("Expected excption does not contain a message. Stack 
trace: " + getStrackTrace(e));
+                fail("Expected excption does not contain a message. Stack 
trace: " + ExceptionHelper.stackTraceToString(e));
             } else {
                 if (!e.getMessage().contains(expectedMessagePart)) {
                     fail("Expected excption message does not contain a 
expected message part " + expectedMessagePart
                          + ".  Stack trace: "
-                         + getStrackTrace(e));
+                         + ExceptionHelper.stackTraceToString(e));
                 }
             }
         }
@@ -824,18 +823,9 @@ public class PGPDataFormatTest extends 
AbstractPGPDataFormatTest {
             if (expectedCauseClass != cause.getClass()) {
                 fail("Cause exception " + expectedCauseClass.getName() + " 
expected, but was " + cause.getClass().getName()
                      + ": "
-                     + getStrackTrace(e));
+                     + ExceptionHelper.stackTraceToString(e));
             }
         }
     }
 
-    public static String getStrackTrace(Exception e) throws 
UnsupportedEncodingException {
-        ByteArrayOutputStream os = new ByteArrayOutputStream();
-        PrintWriter w = new PrintWriter(os);
-        e.printStackTrace(w);
-        w.close();
-        String stackTrace = new String(os.toByteArray(), "UTF-8");
-        return stackTrace;
-    }
-
 }
diff --git 
a/components/camel-http/src/test/java/org/apache/camel/component/http/HeaderFilteringTest.java
 
b/components/camel-http/src/test/java/org/apache/camel/component/http/HeaderFilteringTest.java
index 611387fec5c..c0279264aa5 100644
--- 
a/components/camel-http/src/test/java/org/apache/camel/component/http/HeaderFilteringTest.java
+++ 
b/components/camel-http/src/test/java/org/apache/camel/component/http/HeaderFilteringTest.java
@@ -19,8 +19,6 @@ package org.apache.camel.component.http;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.nio.charset.StandardCharsets;
@@ -34,6 +32,7 @@ import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.support.DefaultExchange;
 import org.apache.camel.support.DefaultMessage;
+import org.apache.camel.support.ExceptionHelper;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -103,10 +102,7 @@ public class HeaderFilteringTest {
 
                 exchange.sendResponseHeaders(200, 0);
             } catch (final AssertionError error) {
-                final StringWriter out = new StringWriter();
-                error.printStackTrace(new PrintWriter(out));
-
-                final String failure = out.toString();
+                final String failure = 
ExceptionHelper.stackTraceToString(error);
                 final byte[] failureBytes = 
failure.getBytes(StandardCharsets.UTF_8);
                 exchange.sendResponseHeaders(500, failureBytes.length);
                 responseBody.write(failureBytes);
diff --git 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/JettyHttpEndpointDisconnectTest.java
 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/JettyHttpEndpointDisconnectTest.java
index c278541bd14..41cb338d569 100644
--- 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/JettyHttpEndpointDisconnectTest.java
+++ 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/JettyHttpEndpointDisconnectTest.java
@@ -16,11 +16,9 @@
  */
 package org.apache.camel.component.jetty;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.jetty12.JettyHttpComponent12;
+import org.apache.camel.support.ExceptionHelper;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.parallel.Isolated;
 
@@ -45,11 +43,10 @@ public class JettyHttpEndpointDisconnectTest extends 
BaseJettyTest {
                         if (t == null) {
                             t = new Throwable("Unable to find connector 
creation");
                         }
-                        StringWriter sw = new StringWriter();
-                        try (PrintWriter pw = new PrintWriter(sw)) {
-                            t.printStackTrace(pw);
-                        }
-                        sb.append(key).append(": ").append(sw);
+
+                        final String stackTrace = 
ExceptionHelper.stackTraceToString(t);
+
+                        sb.append(key).append(": ").append(stackTrace);
                     }
                     return sb.toString();
                 });
diff --git 
a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/error/ncd/NoClassDefFoundErrorWrapExceptionTest.java
 
b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/error/ncd/NoClassDefFoundErrorWrapExceptionTest.java
index f1d48d61b3b..2c8e8d8c122 100644
--- 
a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/error/ncd/NoClassDefFoundErrorWrapExceptionTest.java
+++ 
b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/error/ncd/NoClassDefFoundErrorWrapExceptionTest.java
@@ -16,14 +16,12 @@
  */
 package org.apache.camel.component.jms.issues.error.ncd;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
 import org.apache.camel.CamelContext;
 import org.apache.camel.ConsumerTemplate;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.jms.AbstractJMSTest;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.test.infra.core.CamelContextExtension;
 import org.apache.camel.test.infra.core.DefaultCamelContextExtension;
 import org.junit.jupiter.api.BeforeEach;
@@ -49,11 +47,7 @@ public class NoClassDefFoundErrorWrapExceptionTest extends 
AbstractJMSTest {
             
template.requestBody("activemq:NoClassDefFoundErrorWrapExceptionTest?transferException=true",
 "Hello World");
             fail("Should throw exception");
         } catch (Exception e) {
-            StringWriter sw = new StringWriter();
-            PrintWriter pw = new PrintWriter(sw);
-            e.printStackTrace(pw);
-
-            String s = sw.toString();
+            final String s = ExceptionHelper.stackTraceToString(e);
             assertTrue(s.contains("java.lang.LinkageError"));
             assertTrue(s.contains("Cannot do this"));
             
assertTrue(s.contains("org.apache.camel.component.jms.issues.error.ncd.ProcessorFail.process"));
diff --git 
a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java
 
b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java
index c77df64579f..a8ee6485f61 100644
--- 
a/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java
+++ 
b/components/camel-knative/camel-knative-http/src/main/java/org/apache/camel/component/knative/http/KnativeHttpConsumer.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.component.knative.http;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.math.BigInteger;
 import java.nio.charset.StandardCharsets;
 import java.util.Locale;
@@ -45,9 +43,9 @@ import org.apache.camel.component.knative.spi.KnativeResource;
 import org.apache.camel.component.knative.spi.KnativeTransportConfiguration;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.support.DefaultConsumer;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.MessageHelper;
-import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -331,23 +329,18 @@ public class KnativeHttpConsumer extends DefaultConsumer {
 
         if (exception != null) {
             // we failed due an exception so print it as plain text
-            StringWriter sw = new StringWriter();
-            PrintWriter pw = new PrintWriter(sw);
-
-            try {
-                exception.printStackTrace(pw);
-
-                // the body should then be the stacktrace
-                body = sw.toString().getBytes(StandardCharsets.UTF_8);
-                // force content type to be text/plain as that is what the 
stacktrace is
-                message.setHeader(Exchange.CONTENT_TYPE, "text/plain");
-
-                // and mark the exception as failure handled, as we handled it 
by returning
-                // it as the response
-                ExchangeHelper.setFailureHandled(message.getExchange());
-            } finally {
-                IOHelper.close(pw, sw);
-            }
+
+            final String stackTrace = 
ExceptionHelper.stackTraceToString(exception);
+
+            // the body should then be the stacktrace
+            body = stackTrace.getBytes(StandardCharsets.UTF_8);
+            // force content type to be text/plain as that is what the 
stacktrace is
+            message.setHeader(Exchange.CONTENT_TYPE, "text/plain");
+
+            // and mark the exception as failure handled, as we handled it by 
returning
+            // it as the response
+            ExchangeHelper.setFailureHandled(message.getExchange());
+
         }
 
         return body != null
diff --git 
a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthHelper.java
 
b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthHelper.java
index aa86fbdc428..4ab85f35432 100644
--- 
a/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthHelper.java
+++ 
b/components/camel-microprofile/camel-microprofile-health/src/main/java/org/apache/camel/microprofile/health/CamelMicroProfileHealthHelper.java
@@ -16,12 +16,11 @@
  */
 package org.apache.camel.microprofile.health;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.Set;
 
 import org.apache.camel.health.HealthCheck;
 import org.apache.camel.health.HealthCheck.Result;
+import org.apache.camel.support.ExceptionHelper;
 import org.eclipse.microprofile.health.HealthCheckResponseBuilder;
 
 /**
@@ -61,11 +60,8 @@ final class CamelMicroProfileHealthHelper {
             result.getError().ifPresent(error -> {
                 builder.withData("error.message", error.getMessage());
 
-                final StringWriter stackTraceWriter = new StringWriter();
-                try (final PrintWriter pw = new PrintWriter(stackTraceWriter, 
true)) {
-                    error.printStackTrace(pw);
-                    builder.withData("error.stacktrace", 
stackTraceWriter.toString());
-                }
+                final String s = ExceptionHelper.stackTraceToString(error);
+                builder.withData("error.stacktrace", s);
             });
         }
     }
diff --git 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java
 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java
index 0b99bd8e22e..2139fcf27f6 100644
--- 
a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java
+++ 
b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java
@@ -19,8 +19,6 @@ package org.apache.camel.component.netty.http;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.io.ObjectOutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URLDecoder;
@@ -52,6 +50,7 @@ import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.component.netty.NettyConverter;
 import org.apache.camel.spi.HeaderFilterStrategy;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.MessageHelper;
 import org.apache.camel.support.ObjectHelper;
@@ -461,12 +460,10 @@ public class DefaultNettyHttpBinding implements 
NettyHttpBinding, Cloneable {
                 message.setHeader(NettyHttpConstants.CONTENT_TYPE, 
NettyHttpConstants.CONTENT_TYPE_JAVA_SERIALIZED_OBJECT);
             } else {
                 // we failed due an exception so print it as plain text
-                StringWriter sw = new StringWriter();
-                PrintWriter pw = new PrintWriter(sw);
-                cause.printStackTrace(pw);
+                final String stackTrace = 
ExceptionHelper.stackTraceToString(cause);
 
                 // the body should then be the stacktrace
-                body = NettyConverter.toByteBuffer(sw.toString().getBytes());
+                body = NettyConverter.toByteBuffer(stackTrace.getBytes());
                 // force content type to be text/plain as that is what the 
stacktrace is
                 message.setHeader(NettyHttpConstants.CONTENT_TYPE, 
"text/plain");
             }
diff --git 
a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java
 
b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java
index d53aa48d101..94a03fcf682 100644
--- 
a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java
+++ 
b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java
@@ -19,8 +19,6 @@ package org.apache.camel.component.platform.http.main;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.lang.management.ManagementFactory;
 import java.lang.management.RuntimeMXBean;
 import java.util.ArrayList;
@@ -71,6 +69,7 @@ import org.apache.camel.spi.ReloadStrategy;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.ResourceLoader;
 import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.LoggerHelper;
 import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.ResolverHelper;
@@ -743,10 +742,7 @@ public class MainHttpServer extends ServiceSupport 
implements CamelContextAware,
     }
 
     private static String errorStackTrace(Throwable e) {
-        StringWriter sw = new StringWriter();
-        e.printStackTrace(new PrintWriter(sw));
-
-        String trace = sw.toString();
+        String trace = ExceptionHelper.stackTraceToString(e);
         // because the stacktrace is printed in json we need to make it safe
         trace = trace.replace('"', '\'');
         trace = trace.replace('\t', ' ');
diff --git 
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
 
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
index 96c8d893d0b..6ef9d71e958 100644
--- 
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
+++ 
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
@@ -17,8 +17,6 @@
 package org.apache.camel.component.platform.http.vertx;
 
 import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.Iterator;
@@ -42,6 +40,7 @@ import org.apache.camel.Message;
 import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.spi.HeaderFilterStrategy;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.MessageHelper;
 import org.apache.camel.support.ObjectHelper;
@@ -115,12 +114,10 @@ public final class VertxPlatformHttpSupport {
             message.setHeader(Exchange.CONTENT_TYPE, 
DEFAULT_CONTENT_TYPE_ON_EXCEPTION);
         } else {
             // we failed due an exception so print it as plain text
-            final StringWriter sw = new StringWriter();
-            final PrintWriter pw = new PrintWriter(sw);
-            exception.printStackTrace(pw);
+            final String stackTrace = 
ExceptionHelper.stackTraceToString(exception);
 
             // the body should then be the stacktrace
-            body = 
ByteBuffer.wrap(sw.toString().getBytes(StandardCharsets.UTF_8));
+            body = 
ByteBuffer.wrap(stackTrace.getBytes(StandardCharsets.UTF_8));
             // force content type to be text/plain as that is what the 
stacktrace is
             message.setHeader(Exchange.CONTENT_TYPE, 
DEFAULT_CONTENT_TYPE_ON_EXCEPTION);
         }
diff --git 
a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
 
b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
index 1c411f399f3..114a9e95be6 100644
--- 
a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
+++ 
b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
@@ -19,8 +19,6 @@ package org.apache.camel.component.undertow;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.ObjectOutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.nio.Buffer;
 import java.nio.ByteBuffer;
 import java.nio.channels.ReadableByteChannel;
@@ -51,6 +49,7 @@ import org.apache.camel.attachment.AttachmentMessage;
 import org.apache.camel.attachment.DefaultAttachment;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.support.DefaultMessage;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.MessageHelper;
 import org.apache.camel.support.ObjectHelper;
@@ -372,12 +371,10 @@ public class DefaultUndertowHttpBinding implements 
UndertowHttpBinding {
                 message.setHeader(UndertowConstants.CONTENT_TYPE, 
"application/x-java-serialized-object");
             } else {
                 // we failed due an exception so print it as plain text
-                StringWriter sw = new StringWriter();
-                PrintWriter pw = new PrintWriter(sw);
-                exception.printStackTrace(pw);
+                final String stackTrace = 
ExceptionHelper.stackTraceToString(exception);
 
                 // the body should then be the stacktrace
-                body = ByteBuffer.wrap(sw.toString().getBytes());
+                body = ByteBuffer.wrap(stackTrace.getBytes());
                 // force content type to be text/plain as that is what the 
stacktrace is
                 message.setHeader(UndertowConstants.CONTENT_TYPE, 
"text/plain");
             }
diff --git 
a/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/XmlSignatureTest.java
 
b/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/XmlSignatureTest.java
index 52386b6424a..a48395a6f7b 100644
--- 
a/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/XmlSignatureTest.java
+++ 
b/components/camel-xmlsecurity/src/test/java/org/apache/camel/component/xmlsecurity/XmlSignatureTest.java
@@ -16,10 +16,8 @@
  */
 package org.apache.camel.component.xmlsecurity;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
 import java.security.Key;
@@ -99,6 +97,7 @@ import 
org.apache.camel.component.xmlsecurity.util.ValidationFailedHandlerIgnore
 import 
org.apache.camel.component.xmlsecurity.util.XmlSignature2Message2MessageWithTimestampProperty;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.spi.Registry;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.processor.validation.SchemaValidationException;
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.junit.jupiter.api.Disabled;
@@ -1341,7 +1340,7 @@ public class XmlSignatureTest extends CamelTestSupport {
         Exception e = (Exception) 
mock.getExchanges().get(0).getProperty(Exchange.EXCEPTION_CAUGHT);
         assertNotNull(e, "Expected excpetion " + cl.getName() + " missing");
         if (e.getClass() != cl) {
-            String stackTrace = getStrackTrace(e);
+            String stackTrace = ExceptionHelper.stackTraceToString(e);
             fail("Exception  " + cl.getName() + " excpected, but was " + 
e.getClass().getName() + ": " + stackTrace);
         }
         if (expectedMessage != null) {
@@ -1353,20 +1352,11 @@ public class XmlSignatureTest extends CamelTestSupport {
             if (expectedCauseClass != cause.getClass()) {
                 fail("Cause exception " + expectedCauseClass.getName() + " 
expected, but was " + cause.getClass().getName()
                      + ": "
-                     + getStrackTrace(e));
+                     + ExceptionHelper.stackTraceToString(e));
             }
         }
     }
 
-    private static String getStrackTrace(Exception e) throws 
UnsupportedEncodingException {
-        ByteArrayOutputStream os = new ByteArrayOutputStream();
-        PrintWriter w = new PrintWriter(os);
-        e.printStackTrace(w);
-        w.close();
-        String stackTrace = new String(os.toByteArray(), "UTF-8");
-        return stackTrace;
-    }
-
     private MockEndpoint setupExceptionMock() {
         MockEndpoint mock = getMockEndpoint("mock:exception");
         mock.setExpectedMessageCount(1);
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/HealthDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/HealthDevConsole.java
index b71b44322e6..1ec502746cc 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/HealthDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/HealthDevConsole.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.impl.console;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
@@ -26,6 +24,7 @@ import java.util.stream.Stream;
 import org.apache.camel.health.HealthCheck;
 import org.apache.camel.health.HealthCheckHelper;
 import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.console.AbstractDevConsole;
 import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
@@ -61,11 +60,10 @@ public class HealthDevConsole extends AbstractDevConsole {
                 if ("full".equals(exposureLevel)) {
                     if (res.getError().isPresent()) {
                         Throwable cause = res.getError().get();
-                        StringWriter sw = new StringWriter();
-                        PrintWriter pw = new PrintWriter(sw);
-                        cause.printStackTrace(pw);
+                        final String stackTrace = 
ExceptionHelper.stackTraceToString(cause);
+
                         sb.append("\n\n");
-                        sb.append(sw);
+                        sb.append(stackTrace);
                         sb.append("\n\n");
                     }
                 }
@@ -116,10 +114,7 @@ public class HealthDevConsole extends AbstractDevConsole {
                 Throwable cause = res.getError().orElse(null);
                 if (cause != null) {
                     JsonArray arr2 = new JsonArray();
-                    StringWriter writer = new StringWriter();
-                    cause.printStackTrace(new PrintWriter(writer));
-                    writer.flush();
-                    String trace = writer.toString();
+                    final String trace = 
ExceptionHelper.stackTraceToString(cause);
                     jo.put("stackTrace", arr2);
                     Collections.addAll(arr2, trace.split("\n"));
                 }
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteControllerConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteControllerConsole.java
index 2aa91770f0a..6555d865ca4 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteControllerConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteControllerConsole.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.impl.console;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -30,6 +28,7 @@ import org.apache.camel.Route;
 import org.apache.camel.spi.RouteController;
 import org.apache.camel.spi.SupervisingRouteController;
 import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.console.AbstractDevConsole;
 import org.apache.camel.util.TimeUtils;
 import org.apache.camel.util.URISupport;
@@ -112,10 +111,7 @@ public class RouteControllerConsole extends 
AbstractDevConsole {
                 if (includeError && cause != null) {
                     error = cause.getMessage();
                     if (includeStacktrace) {
-                        StringWriter writer = new StringWriter();
-                        cause.printStackTrace(new PrintWriter(writer));
-                        writer.flush();
-                        stacktrace = writer.toString();
+                        stacktrace = ExceptionHelper.stackTraceToString(cause);
                     }
                 }
 
@@ -226,10 +222,7 @@ public class RouteControllerConsole extends 
AbstractDevConsole {
                         jo.put("error", Jsoner.escape(error));
                         if (includeStacktrace) {
                             JsonArray arr2 = new JsonArray();
-                            StringWriter writer = new StringWriter();
-                            cause.printStackTrace(new PrintWriter(writer));
-                            writer.flush();
-                            String trace = writer.toString();
+                            final String trace = 
ExceptionHelper.stackTraceToString(cause);
                             jo.put("stackTrace", arr2);
                             Collections.addAll(arr2, trace.split("\n"));
                         }
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
index 57df94a720f..749c4060f99 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.impl.console;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -35,6 +33,7 @@ import org.apache.camel.api.management.ManagedCamelContext;
 import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
 import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.LoggerHelper;
 import org.apache.camel.support.PatternHelper;
 import org.apache.camel.support.console.AbstractDevConsole;
@@ -108,11 +107,10 @@ public class RouteDevConsole extends AbstractDevConsole {
                 Throwable cause = mrb.getLastError().getException();
                 if (cause != null) {
                     sb.append(String.format("\n    Error Message: %s", 
cause.getMessage()));
-                    StringWriter sw = new StringWriter();
-                    PrintWriter pw = new PrintWriter(sw);
-                    cause.printStackTrace(pw);
+
+                    final String stackTrace = 
ExceptionHelper.stackTraceToString(cause);
                     sb.append("\n\n");
-                    sb.append(sw);
+                    sb.append(stackTrace);
                     sb.append("\n\n");
                 }
             }
@@ -273,10 +271,7 @@ public class RouteDevConsole extends AbstractDevConsole {
                 if (cause != null) {
                     eo.put("message", cause.getMessage());
                     JsonArray arr2 = new JsonArray();
-                    StringWriter writer = new StringWriter();
-                    cause.printStackTrace(new PrintWriter(writer));
-                    writer.flush();
-                    String trace = writer.toString();
+                    final String trace = 
ExceptionHelper.stackTraceToString(cause);
                     eo.put("stackTrace", arr2);
                     Collections.addAll(arr2, trace.split("\n"));
                 }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/util/NoClassDefFoundErrorWrapExceptionTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/util/NoClassDefFoundErrorWrapExceptionTest.java
index a3085df0873..82157aff870 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/util/NoClassDefFoundErrorWrapExceptionTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/util/NoClassDefFoundErrorWrapExceptionTest.java
@@ -16,11 +16,9 @@
  */
 package org.apache.camel.util;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.support.ExceptionHelper;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -34,11 +32,7 @@ public class NoClassDefFoundErrorWrapExceptionTest extends 
ContextTestSupport {
             template.requestBody("seda:start", "Hello World");
             fail("Should throw exception");
         } catch (Exception e) {
-            StringWriter sw = new StringWriter();
-            PrintWriter pw = new PrintWriter(sw);
-            e.printStackTrace(pw);
-
-            String s = sw.toString();
+            final String s = ExceptionHelper.stackTraceToString(e);
             assertTrue(s.contains("java.lang.LinkageError"));
             assertTrue(s.contains("Cannot do this"));
             
assertTrue(s.contains("org.apache.camel.util.ProcessorFail.process"));
diff --git 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelHealth.java
 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelHealth.java
index 88add644506..088d83f1c79 100644
--- 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelHealth.java
+++ 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedCamelHealth.java
@@ -16,9 +16,6 @@
  */
 package org.apache.camel.management.mbean;
 
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Optional;
@@ -38,6 +35,7 @@ import org.apache.camel.health.HealthCheckHelper;
 import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.health.HealthCheckRepository;
 import org.apache.camel.spi.ManagementStrategy;
+import org.apache.camel.support.ExceptionHelper;
 
 public class ManagedCamelHealth implements ManagedCamelHealthMBean {
     private final CamelContext context;
@@ -111,13 +109,7 @@ public class ManagedCamelHealth implements 
ManagedCamelHealthMBean {
 
                 String stacktrace = "";
                 if (result.getError().isPresent()) {
-                    try (StringWriter stackTraceWriter = new StringWriter();
-                         PrintWriter pw = new PrintWriter(stackTraceWriter, 
true)) {
-                        result.getError().get().printStackTrace(pw);
-                        stacktrace = stackTraceWriter.getBuffer().toString();
-                    } catch (IOException exception) {
-                        // ignore
-                    }
+                    stacktrace = 
ExceptionHelper.stackTraceToString(result.getError().get());
                 }
 
                 CompositeData data = new CompositeDataSupport(
diff --git 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedSupervisingRouteController.java
 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedSupervisingRouteController.java
index 504b498d764..004eeb28be9 100644
--- 
a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedSupervisingRouteController.java
+++ 
b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedSupervisingRouteController.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.management.mbean;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -37,6 +35,7 @@ import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.api.management.mbean.CamelOpenMBeanTypes;
 import 
org.apache.camel.api.management.mbean.ManagedSupervisingRouteControllerMBean;
 import org.apache.camel.spi.SupervisingRouteController;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.util.TimeUtils;
 import org.apache.camel.util.backoff.BackOffTimer;
 
@@ -224,10 +223,7 @@ public class ManagedSupervisingRouteController extends 
ManagedService implements
                 if (cause != null) {
                     error = cause.getMessage();
                     if (includeStacktrace) {
-                        StringWriter writer = new StringWriter();
-                        cause.printStackTrace(new PrintWriter(writer));
-                        writer.flush();
-                        stacktrace = writer.toString();
+                        stacktrace = ExceptionHelper.stackTraceToString(cause);
                     }
                 }
 
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/ExceptionHelper.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/ExceptionHelper.java
new file mode 100644
index 00000000000..d1e6849546b
--- /dev/null
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/ExceptionHelper.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.camel.support;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * Utilities for handling with Exception objects
+ */
+public class ExceptionHelper {
+
+    private ExceptionHelper() {
+
+    }
+
+    /**
+     * Dumps the stack trace from the given exception to a String
+     *
+     * @param  e the exception to print the stack trace
+     * @return   A string instance with the stack trace for the given exception
+     */
+    public static String stackTraceToString(Throwable e) {
+        final StringWriter writer = new StringWriter();
+        final PrintWriter printWriter = new PrintWriter(writer, true);
+        e.printStackTrace(printWriter);
+        return writer.toString();
+    }
+}
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/LanguageHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/LanguageHelper.java
index 7725136bb95..e2e37bf38f8 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/LanguageHelper.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/LanguageHelper.java
@@ -17,8 +17,6 @@
 
 package org.apache.camel.support;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
@@ -34,7 +32,6 @@ import org.apache.camel.ExchangePropertyKey;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.ExchangeFormatter;
 import org.apache.camel.support.processor.DefaultExchangeFormatter;
-import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.TimeUtils;
 
 public final class LanguageHelper {
@@ -79,15 +76,7 @@ public final class LanguageHelper {
      */
     public static String exceptionStacktrace(Exchange exchange) {
         Exception exception = exception(exchange);
-        if (exception != null) {
-            StringWriter sw = new StringWriter();
-            PrintWriter pw = new PrintWriter(sw);
-            exception.printStackTrace(pw);
-            IOHelper.close(pw, sw);
-            return sw.toString();
-        } else {
-            return null;
-        }
+        return ExceptionHelper.stackTraceToString(exception);
     }
 
     /**
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
index 876f4f970fa..e0254811abe 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
@@ -20,9 +20,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.PrintWriter;
 import java.io.Reader;
-import java.io.StringWriter;
 import java.io.Writer;
 import java.lang.reflect.Array;
 import java.util.Collection;
@@ -1119,9 +1117,7 @@ public final class MessageHelper {
                 sb.append(" message=\"").append(msg).append("\"");
             }
             sb.append(">\n");
-            StringWriter sw = new StringWriter();
-            exception.printStackTrace(new PrintWriter(sw));
-            String trace = sw.toString();
+            final String trace = ExceptionHelper.stackTraceToString(exception);
             // must always xml encode
             sb.append(StringHelper.xmlEncode(trace));
             sb.append(prefix).append("</exception>");
@@ -1168,9 +1164,8 @@ public final class MessageHelper {
         }
         String msg = exception.getMessage();
         jo.put("message", msg);
-        StringWriter sw = new StringWriter();
-        exception.printStackTrace(new PrintWriter(sw));
-        String trace = sw.toString();
+
+        final String trace = ExceptionHelper.stackTraceToString(exception);
         try {
             jo.put("stackTrace", Jsoner.escape(trace));
         } catch (Exception e) {
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/processor/DefaultExchangeFormatter.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/processor/DefaultExchangeFormatter.java
index e9f919d5b45..7b1b8fa453f 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/processor/DefaultExchangeFormatter.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/processor/DefaultExchangeFormatter.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.support.processor;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.concurrent.Future;
@@ -30,6 +28,7 @@ import org.apache.camel.spi.Configurer;
 import org.apache.camel.spi.ExchangeFormatter;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriParams;
+import org.apache.camel.support.ExceptionHelper;
 import org.apache.camel.support.ExchangeHelper;
 import org.apache.camel.support.MessageHelper;
 import org.apache.camel.util.ObjectHelper;
@@ -235,9 +234,8 @@ public class DefaultExchangeFormatter implements 
ExchangeFormatter {
                     style(sb, 
"ExceptionMessage").append(exception.getMessage());
                 }
                 if (showAll || showStackTrace) {
-                    StringWriter sw = new StringWriter();
-                    exception.printStackTrace(new PrintWriter(sw));
-                    style(sb, "StackTrace").append(sw);
+                    final String stackTrace = 
ExceptionHelper.stackTraceToString(exception);
+                    style(sb, "StackTrace").append(stackTrace);
                 }
             }
         }


Reply via email to