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;
+ }
}