From 4ac37eb0d61877d79dda7cded86f36002302d914 Mon Sep 17 00:00:00 2001 From: Yi Hu Date: Tue, 14 Jul 2026 14:37:32 -0400 Subject: [PATCH 1/2] Attempt to fix DataflowV1 test failure by fixing getSimpleName access --- .../sdk/transforms/display/DisplayData.java | 7 ++++--- .../transforms/reflect/DoFnSignatures.java | 3 ++- .../beam/sdk/util/common/ReflectHelpers.java | 19 +++++++++++++++++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/display/DisplayData.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/display/DisplayData.java index 3be59e556158..dcc84ad8e1a0 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/display/DisplayData.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/display/DisplayData.java @@ -33,6 +33,7 @@ import java.util.Set; import org.apache.beam.sdk.options.ValueProvider; import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.util.common.ReflectHelpers; import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Joiner; import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableList; import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableMap; @@ -617,7 +618,7 @@ FormattedItemValue format(Object value) { @Override FormattedItemValue format(Object value) { Class clazz = checkType(value, Class.class, JAVA_CLASS); - return new FormattedItemValue(clazz.getName(), clazz.getSimpleName()); + return new FormattedItemValue(clazz.getName(), ReflectHelpers.getSimpleName(clazz)); } }; @@ -753,10 +754,10 @@ private Builder include(Path path, HasDisplayData subComponent) { // Common case: AutoValue classes such as AutoValue_FooIO_Read. It's more useful // to show the user the FooIO.Read class, which is the direct superclass of the AutoValue // generated class. - if (namespace.getSimpleName().startsWith("AutoValue_")) { + if (ReflectHelpers.getSimpleName(namespace).startsWith("AutoValue_")) { namespace = namespace.getSuperclass(); } - if (namespace.isSynthetic() && namespace.getSimpleName().contains("$$Lambda")) { + if (namespace.isSynthetic() && ReflectHelpers.getSimpleName(namespace).contains("$$Lambda")) { try { String className = namespace.getCanonicalName(); // A local class, local interface, or anonymous class does not have a canonical name. diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignatures.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignatures.java index 9f3491bca7b9..6d28f9343866 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignatures.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignatures.java @@ -2421,7 +2421,8 @@ private static String format(TypeDescriptor t) { } private static String format(Class kls) { - return kls.getSimpleName().isEmpty() ? kls.getName() : kls.getSimpleName(); + String simpleName = ReflectHelpers.getSimpleName(kls); + return simpleName.isEmpty() ? kls.getName() : simpleName; } static class ErrorReporter { diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java index c2d945bbaac1..0da32ab6b4c5 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java @@ -52,11 +52,26 @@ public class ReflectHelpers { private static final Joiner COMMA_SEPARATOR = Joiner.on(", "); + /** + * Returns the simple name of the given class, or a fallback simple name derived from the class + * name if {@link Class#getSimpleName()} throws an exception (such as an {@link + * IllegalAccessError} on Java 17+ for non-public inner classes). + */ + public static String getSimpleName(Class clazz) { + try { + return clazz.getSimpleName(); + } catch (Throwable t) { + String name = clazz.getName(); + int idx = Math.max(name.lastIndexOf('.'), name.lastIndexOf('$')); + return idx != -1 ? name.substring(idx + 1) : name; + } + } + /** Returns a string representation of the signature of a {@link Method}. */ public static String formatMethod(Method input) { String parameterTypes = FluentIterable.from(asList(input.getParameterTypes())) - .transform(Class::getSimpleName) + .transform(ReflectHelpers::getSimpleName) .join(COMMA_SEPARATOR); return String.format("%s(%s)", input.getName(), parameterTypes); } @@ -100,7 +115,7 @@ private static void format(StringBuilder builder, Type t) { } private static void formatClass(StringBuilder builder, Class clazz) { - builder.append(clazz.getSimpleName()); + builder.append(getSimpleName(clazz)); } private static void formatTypeVariable(StringBuilder builder, TypeVariable t) { From 2c4caccc478f9a0f196ae41402b8c5b36d6fd633 Mon Sep 17 00:00:00 2001 From: Yi Hu Date: Tue, 14 Jul 2026 20:37:10 -0400 Subject: [PATCH 2/2] Address comments --- .github/trigger_files/beam_PostCommit_Java_DataflowV1.json | 2 +- .../java/org/apache/beam/sdk/util/common/ReflectHelpers.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json b/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json index ae6cb268ff68..aff502e19620 100644 --- a/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json +++ b/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json @@ -1,5 +1,5 @@ { - "https://github.com/apache/beam/pull/36138": "Cleanly separating v1 worker and v2 sdk harness container image handling", + "https://github.com/apache/beam/pull/39330": "Fix DataflowV1 test failure by fixing getSimpleName access", "https://github.com/apache/beam/pull/34902": "Introducing OutputBuilder", "https://github.com/apache/beam/pull/35177": "Introducing WindowedValueReceiver to runners", "comment": "Modify this file in a trivial way to cause this test suite to run", diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java index 0da32ab6b4c5..7d5964cb83ca 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java @@ -61,6 +61,9 @@ public static String getSimpleName(Class clazz) { try { return clazz.getSimpleName(); } catch (Throwable t) { + if (clazz.isArray()) { + return getSimpleName(clazz.getComponentType()) + "[]"; + } String name = clazz.getName(); int idx = Math.max(name.lastIndexOf('.'), name.lastIndexOf('$')); return idx != -1 ? name.substring(idx + 1) : name;