This is an automated email from the ASF dual-hosted git repository.
Abacn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git
The following commit(s) were added to refs/heads/master by this push:
new 37cac0603bc Fix DataflowV1 test failure by fixing getSimpleName access
(#39330)
37cac0603bc is described below
commit 37cac0603bc69b5a9c4f643a0a6ea842fc9f0096
Author: Yi Hu <[email protected]>
AuthorDate: Wed Jul 15 08:02:11 2026 -0400
Fix DataflowV1 test failure by fixing getSimpleName access (#39330)
---
.../beam_PostCommit_Java_DataflowV1.json | 2 +-
.../beam/sdk/transforms/display/DisplayData.java | 7 ++++---
.../sdk/transforms/reflect/DoFnSignatures.java | 3 ++-
.../beam/sdk/util/common/ReflectHelpers.java | 22 ++++++++++++++++++++--
4 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json
b/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json
index ae6cb268ff6..aff502e1962 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/transforms/display/DisplayData.java
b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/display/DisplayData.java
index 3be59e55615..dcc84ad8e1a 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.Objects;
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 @@ public class DisplayData implements Serializable {
@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 @@ public class DisplayData implements Serializable {
// 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 9f3491bca7b..6d28f934386 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 @@ public class DoFnSignatures {
}
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 c2d945bbaac..7d5964cb83c 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,29 @@ 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) {
+ 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;
+ }
+ }
+
/** 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 +118,7 @@ public class ReflectHelpers {
}
private static void formatClass(StringBuilder builder, Class<?> clazz) {
- builder.append(clazz.getSimpleName());
+ builder.append(getSimpleName(clazz));
}
private static void formatTypeVariable(StringBuilder builder,
TypeVariable<?> t) {