OPENWIRE-75 - convert javax to jakarta jms exception

This allows properly translating jms exceptions received when connection
to an old 5.x broker that is using javax namespace
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/codec/BaseDataStreamMarshaller.java b/openwire-core/src/main/java/org/apache/activemq/openwire/codec/BaseDataStreamMarshaller.java
index 8267538..751e8fb 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/codec/BaseDataStreamMarshaller.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/codec/BaseDataStreamMarshaller.java
@@ -16,6 +16,8 @@
  */
 package org.apache.activemq.openwire.codec;
 
+import static org.apache.activemq.openwire.utils.OpenWireValidationSupport.convertJmsPackage;
+
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
@@ -191,7 +193,7 @@
                     StackTraceElement ss[] = new StackTraceElement[dataIn.readShort()];
                     for (int i = 0; i < ss.length; i++) {
                         try {
-                            ss[i] = STACK_TRACE_ELEMENT_CONSTRUCTOR.newInstance(new Object[] { tightUnmarshalString(dataIn, bs),
+                            ss[i] = STACK_TRACE_ELEMENT_CONSTRUCTOR.newInstance(new Object[] { convertJmsPackage(tightUnmarshalString(dataIn, bs)),
                                 tightUnmarshalString(dataIn, bs), tightUnmarshalString(dataIn, bs), Integer.valueOf(dataIn.readInt()) });
                         } catch (IOException e) {
                             throw e;
@@ -219,6 +221,7 @@
 
     private Throwable createThrowable(String className, String message) {
         try {
+            className = convertJmsPackage(className);
             Class<?> clazz = Class.forName(className, false, BaseDataStreamMarshaller.class.getClassLoader());
             OpenWireValidationSupport.validateIsThrowable(clazz);
             Constructor<?> constructor = clazz.getConstructor(String.class);
@@ -502,7 +505,7 @@
                     StackTraceElement ss[] = new StackTraceElement[dataIn.readShort()];
                     for (int i = 0; i < ss.length; i++) {
                         try {
-                            ss[i] = STACK_TRACE_ELEMENT_CONSTRUCTOR.newInstance(new Object[] { looseUnmarshalString(dataIn),
+                            ss[i] = STACK_TRACE_ELEMENT_CONSTRUCTOR.newInstance(new Object[] { convertJmsPackage(looseUnmarshalString(dataIn)),
                                 looseUnmarshalString(dataIn), looseUnmarshalString(dataIn), Integer.valueOf(dataIn.readInt()) });
                         } catch (IOException e) {
                             throw e;
diff --git a/openwire-core/src/main/java/org/apache/activemq/openwire/utils/OpenWireValidationSupport.java b/openwire-core/src/main/java/org/apache/activemq/openwire/utils/OpenWireValidationSupport.java
index 95e5f62..252f145 100644
--- a/openwire-core/src/main/java/org/apache/activemq/openwire/utils/OpenWireValidationSupport.java
+++ b/openwire-core/src/main/java/org/apache/activemq/openwire/utils/OpenWireValidationSupport.java
@@ -18,6 +18,9 @@
 
 public class OpenWireValidationSupport {
 
+    private static final String jmsPackageToReplace = "javax.jms";
+    private static final String jmsPackageToUse = "jakarta.jms";
+
     /**
      * Verify that the provided class extends {@link Throwable} and throw an
      * {@link IllegalArgumentException} if it does not.
@@ -29,4 +32,18 @@
             throw new IllegalArgumentException("Class " + clazz + " is not assignable to Throwable");
         }
     }
+
+    /**
+     * This method can be used to convert from javax -> jakarta or
+     * vice versa depending on the version used by the client
+     *
+     * @param className
+     * @return
+     */
+    public static String convertJmsPackage(String className) {
+        if (className != null && className.startsWith(jmsPackageToReplace)) {
+            return className.replace(jmsPackageToReplace, jmsPackageToUse);
+        }
+        return className;
+    }
 }