Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
Loading