diff --git a/modules/hivemq/src/main/java/org/testcontainers/hivemq/HiveMQExtension.java b/modules/hivemq/src/main/java/org/testcontainers/hivemq/HiveMQExtension.java index 91e984835d6..75dbdd28306 100644 --- a/modules/hivemq/src/main/java/org/testcontainers/hivemq/HiveMQExtension.java +++ b/modules/hivemq/src/main/java/org/testcontainers/hivemq/HiveMQExtension.java @@ -152,11 +152,13 @@ private void putSubclassesIntoJar( for (final String subClassName : subClassNames) { final String className = subClassName.replaceAll("/", "."); - if (!className.startsWith("[L")) { + // Array descriptors from the constant pool (e.g. "[B", "[Lcom.example.Foo;", + // "[[Ljava.lang.String;") do not name classes that can be added to the archive. + if (!className.startsWith("[")) { LOGGER.debug("Trying to package subclass '{}' into extension '{}'.", className, extensionId); javaArchive.addClass(className); } else { - LOGGER.debug("Class '{}' will be ignored.", className); + LOGGER.debug("Array descriptor '{}' will be ignored.", className); } } } diff --git a/modules/hivemq/src/test/java/org/testcontainers/hivemq/HiveMQExtensionArrayDescriptorTest.java b/modules/hivemq/src/test/java/org/testcontainers/hivemq/HiveMQExtensionArrayDescriptorTest.java new file mode 100644 index 00000000000..a5272c69138 --- /dev/null +++ b/modules/hivemq/src/test/java/org/testcontainers/hivemq/HiveMQExtensionArrayDescriptorTest.java @@ -0,0 +1,63 @@ +package org.testcontainers.hivemq; + +import com.hivemq.extension.sdk.api.ExtensionMain; +import com.hivemq.extension.sdk.api.parameter.ExtensionStartInput; +import com.hivemq.extension.sdk.api.parameter.ExtensionStartOutput; +import com.hivemq.extension.sdk.api.parameter.ExtensionStopInput; +import com.hivemq.extension.sdk.api.parameter.ExtensionStopOutput; +import org.junit.jupiter.api.Test; + +import java.io.File; + +import static org.assertj.core.api.Assertions.assertThat; + +class HiveMQExtensionArrayDescriptorTest { + + @Test + void createExtension_ignoresArrayDescriptorsInConstantPool() throws Exception { + final HiveMQExtension extension = HiveMQExtension + .builder() + .id("my-extension") + .name("My Extension") + .version("1.0.0") + .mainClass(NoopExtension.class) + .addAdditionalClass(ArrayHolder.class) + .build(); + + final File extensionDir = extension.createExtension(extension); + + assertThat(new File(extensionDir, "extension.jar")).exists(); + } + + public static class NoopExtension implements ExtensionMain { + + @Override + public void extensionStart( + final ExtensionStartInput extensionStartInput, + final ExtensionStartOutput extensionStartOutput + ) {} + + @Override + public void extensionStop( + final ExtensionStopInput extensionStopInput, + final ExtensionStopOutput extensionStopOutput + ) {} + } + + /** + * Referencing array classes forces their descriptors ([B, [J, [[Ljava/lang/String;) into the + * constant pool of this class, which previously made {@link HiveMQExtension#createExtension} fail + * with a {@link java.util.regex.PatternSyntaxException}. + */ + public static class ArrayHolder { + + @SuppressWarnings("unused") + private static final Class BYTE_ARRAY_CLASS = byte[].class; + + @SuppressWarnings("unused") + private static final Class LONG_ARRAY_CLASS = long[].class; + + @SuppressWarnings("unused") + private static final Class MULTIDIMENSIONAL_OBJECT_ARRAY_CLASS = String[][].class; + } +}