From 2d78c10211272a264712e86192c4dfc59c6a5521 Mon Sep 17 00:00:00 2001 From: Chesnay Schepler Date: Fri, 23 Feb 2024 10:26:45 +0100 Subject: [PATCH] [FLINK-34496] Break circular dependency in static initialization --- .../plan/utils/ExecNodeMetadataUtil.java | 19 +++++++++++++++++-- .../plan/utils/ExecNodeMetadataUtilTest.java | 3 +-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/utils/ExecNodeMetadataUtil.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/utils/ExecNodeMetadataUtil.java index efded08a82ee3..a7e1d2840ad5d 100644 --- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/utils/ExecNodeMetadataUtil.java +++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/plan/utils/ExecNodeMetadataUtil.java @@ -28,7 +28,6 @@ import org.apache.flink.table.planner.plan.nodes.exec.ExecNode; import org.apache.flink.table.planner.plan.nodes.exec.ExecNodeMetadata; import org.apache.flink.table.planner.plan.nodes.exec.MultipleExecNodeMetadata; -import org.apache.flink.table.planner.plan.nodes.exec.serde.JsonSerdeUtil; import org.apache.flink.table.planner.plan.nodes.exec.stream.StreamExecAsyncCalc; import org.apache.flink.table.planner.plan.nodes.exec.stream.StreamExecCalc; import org.apache.flink.table.planner.plan.nodes.exec.stream.StreamExecChangelogNormalize; @@ -79,8 +78,12 @@ import org.apache.flink.table.planner.plan.nodes.exec.stream.StreamExecWindowRank; import org.apache.flink.table.planner.plan.nodes.exec.stream.StreamExecWindowTableFunction; +import org.apache.flink.shaded.jackson2.com.fasterxml.jackson.annotation.JsonCreator; + import javax.annotation.Nullable; +import java.lang.annotation.Annotation; +import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; @@ -232,7 +235,7 @@ public static > List extractMetadataFrom } private static void addToLookupMap(Class> execNodeClass) { - if (!JsonSerdeUtil.hasJsonCreatorAnnotation(execNodeClass)) { + if (!hasJsonCreatorAnnotation(execNodeClass)) { throw new IllegalStateException( String.format( "ExecNode: %s does not implement @JsonCreator annotation on " @@ -366,4 +369,16 @@ public int hashCode() { return Objects.hash(name, version); } } + + /** Return true if the given class's constructors have @JsonCreator annotation, else false. */ + static boolean hasJsonCreatorAnnotation(Class clazz) { + for (Constructor constructor : clazz.getDeclaredConstructors()) { + for (Annotation annotation : constructor.getAnnotations()) { + if (annotation instanceof JsonCreator) { + return true; + } + } + } + return false; + } } diff --git a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/utils/ExecNodeMetadataUtilTest.java b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/utils/ExecNodeMetadataUtilTest.java index 323a037f310d5..3e2a8c3275b9d 100644 --- a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/utils/ExecNodeMetadataUtilTest.java +++ b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/plan/utils/ExecNodeMetadataUtilTest.java @@ -32,7 +32,6 @@ import org.apache.flink.table.planner.plan.nodes.exec.ExecNodeMetadata; import org.apache.flink.table.planner.plan.nodes.exec.InputProperty; import org.apache.flink.table.planner.plan.nodes.exec.MultipleExecNodeMetadata; -import org.apache.flink.table.planner.plan.nodes.exec.serde.JsonSerdeUtil; import org.apache.flink.table.planner.plan.nodes.exec.stream.StreamExecNode; import org.apache.flink.table.types.logical.LogicalType; @@ -239,7 +238,7 @@ void testStreamExecNodeJsonSerdeCoverage() { List>> classesWithJsonCreatorInUnsupportedList = new ArrayList<>(); for (Class> clazz : subClasses) { - boolean hasJsonCreator = JsonSerdeUtil.hasJsonCreatorAnnotation(clazz); + boolean hasJsonCreator = ExecNodeMetadataUtil.hasJsonCreatorAnnotation(clazz); if (hasJsonCreator && UNSUPPORTED_JSON_SERDE_CLASSES.contains(clazz)) { classesWithJsonCreatorInUnsupportedList.add(clazz); }