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