AMQ-9418 - Support converting jakarta jms exceptions to javax

This fixes the OpenWire v12 marshaller so that if an exception is
received by a jakarta based broker the client will convert back to a
javax jms exception type.

This commit also updates activemq-client-jakarta to do the proper
mapping in the reverse.
This commit is contained in:
Christopher L. Shannon (cshannon) 2024-01-16 09:17:58 -05:00
parent 10b7c62631
commit b92479cd2e
3 changed files with 65 additions and 12 deletions

View File

@ -108,18 +108,50 @@
<goals>
<goal>replace</goal>
</goals>
<configuration>
<includes>
<include>${project.build.directory}/copied-sources/activemq-client/**/*.java</include>
</includes>
<excludes>
<exclude>${project.build.directory}/copied-sources/activemq-client/**/openwire/OpenWireUtil.java</exclude>
</excludes>
<token>javax.jms</token>
<value>jakarta.jms</value>
<regexFlags>
<regexFlag>MULTILINE</regexFlag>
</regexFlags>
</configuration>
</execution>
<!-- Special case to handle OpenWireUtil which will do conversions for JMS exception types -->
<execution>
<id>jms-package-to-replace</id>
<phase>initialize</phase>
<goals>
<goal>replace</goal>
</goals>
<configuration>
<includes>
<include>${project.build.directory}/copied-sources/activemq-client/**/openwire/OpenWireUtil.java</include>
</includes>
<token>jmsPackageToReplace = "jakarta.jms"</token>
<value>jmsPackageToReplace = "javax.jms"</value>
</configuration>
</execution>
<execution>
<id>jms-package-to-use</id>
<phase>initialize</phase>
<goals>
<goal>replace</goal>
</goals>
<configuration>
<includes>
<include>${project.build.directory}/copied-sources/activemq-client/**/openwire/OpenWireUtil.java</include>
</includes>
<token>jmsPackageToUse = "javax.jms"</token>
<value>jmsPackageToUse = "jakarta.jms"</value>
</configuration>
</execution>
</executions>
<configuration>
<includes>
<include>${project.build.directory}/copied-sources/activemq-client/**/*.java</include>
</includes>
<token>javax.jms</token>
<value>jakarta.jms</value>
<regexFlags>
<regexFlag>MULTILINE</regexFlag>
</regexFlags>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>

View File

@ -18,6 +18,9 @@ package org.apache.activemq.openwire;
public class OpenWireUtil {
private static final String jmsPackageToReplace = "jakarta.jms";
private static final String jmsPackageToUse = "javax.jms";
/**
* Verify that the provided class extends {@link Throwable} and throw an
* {@link IllegalArgumentException} if it does not.
@ -29,4 +32,19 @@ public class OpenWireUtil {
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;
}
}

View File

@ -16,6 +16,8 @@
*/
package org.apache.activemq.openwire.v12;
import static org.apache.activemq.openwire.OpenWireUtil.convertJmsPackage;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
@ -197,7 +199,7 @@ public abstract class BaseDataStreamMarshaller implements DataStreamMarshaller {
for (int i = 0; i < ss.length; i++) {
try {
ss[i] = (StackTraceElement)STACK_TRACE_ELEMENT_CONSTRUCTOR
.newInstance(new Object[] {tightUnmarshalString(dataIn, bs),
.newInstance(new Object[] {convertJmsPackage(tightUnmarshalString(dataIn, bs)),
tightUnmarshalString(dataIn, bs),
tightUnmarshalString(dataIn, bs),
Integer.valueOf(dataIn.readInt())});
@ -227,6 +229,7 @@ public abstract class BaseDataStreamMarshaller implements DataStreamMarshaller {
private Throwable createThrowable(String className, String message) {
try {
className = convertJmsPackage(className);
Class clazz = Class.forName(className, false, BaseDataStreamMarshaller.class.getClassLoader());
OpenWireUtil.validateIsThrowable(clazz);
Constructor constructor = clazz.getConstructor(new Class[] {String.class});
@ -521,7 +524,7 @@ public abstract class BaseDataStreamMarshaller implements DataStreamMarshaller {
for (int i = 0; i < ss.length; i++) {
try {
ss[i] = (StackTraceElement)STACK_TRACE_ELEMENT_CONSTRUCTOR
.newInstance(new Object[] {looseUnmarshalString(dataIn),
.newInstance(new Object[] {convertJmsPackage(looseUnmarshalString(dataIn)),
looseUnmarshalString(dataIn),
looseUnmarshalString(dataIn),
Integer.valueOf(dataIn.readInt())});