From 0e2f6a816bda7107707f1b7f20a13c186980445b Mon Sep 17 00:00:00 2001 From: Steven Aerts Date: Tue, 20 May 2025 14:58:34 +0000 Subject: [PATCH] AVRO-3731 [java/gradle-plugin] retry on any schema parse failure With the introduction of the new SchemaParser in 1.12 the variety of errors which can be thrown when an unresolved type is found increased significantly. In the past unresolved type errors were tracked with a brittle regexp. In the newly proposed logic we propose to retry failed parse steps on any AvroRuntimeException. So this works for all past and future avro library versions. --- .../gradle/plugin/avro/SchemaResolver.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lang/java/gradle-plugin/src/main/java/com/github/davidmc24/gradle/plugin/avro/SchemaResolver.java b/lang/java/gradle-plugin/src/main/java/com/github/davidmc24/gradle/plugin/avro/SchemaResolver.java index 59f60def7ea..9280f3135dc 100644 --- a/lang/java/gradle-plugin/src/main/java/com/github/davidmc24/gradle/plugin/avro/SchemaResolver.java +++ b/lang/java/gradle-plugin/src/main/java/com/github/davidmc24/gradle/plugin/avro/SchemaResolver.java @@ -6,14 +6,13 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.avro.AvroRuntimeException; import org.apache.avro.Schema; -import org.apache.avro.SchemaParseException; import org.gradle.api.GradleException; import org.gradle.api.file.ProjectLayout; import org.gradle.api.logging.Logger; class SchemaResolver { - private static Pattern ERROR_UNKNOWN_TYPE = Pattern.compile("(?i).*(undefined name|not a defined name|type not supported).*"); private static Pattern ERROR_DUPLICATE_TYPE = Pattern.compile("Can't redefine: (.*)"); private final ProjectLayout projectLayout; @@ -58,15 +57,10 @@ private void processSchemaFile(ProcessingState processingState, FileState fileSt } else { logger.info("Processed {}", path); } - } catch (SchemaParseException ex) { + } catch (AvroRuntimeException ex) { String errorMessage = ex.getMessage(); - Matcher unknownTypeMatcher = ERROR_UNKNOWN_TYPE.matcher(errorMessage); Matcher duplicateTypeMatcher = ERROR_DUPLICATE_TYPE.matcher(errorMessage); - if (unknownTypeMatcher.matches()) { - fileState.setError(ex); - processingState.queueForDelayedProcessing(fileState); - logger.debug("Found undefined name in {} ({}); will try again", path, errorMessage); - } else if (duplicateTypeMatcher.matches()) { + if (duplicateTypeMatcher.matches()) { String typeName = duplicateTypeMatcher.group(1); if (fileState.containsDuplicateTypeName(typeName)) { throw new GradleException( @@ -79,7 +73,9 @@ private void processSchemaFile(ProcessingState processingState, FileState fileSt logger.debug("Identified duplicate type {} in {}; will re-process excluding it", typeName, path); } } else { - throw new GradleException(String.format("Failed to resolve schema definition file %s", path), ex); + fileState.setError(ex); + processingState.queueForDelayedProcessing(fileState); + logger.debug("Found error in {} ({}); will try again", path, errorMessage); } } catch (IOException ex) { throw new GradleException(String.format("Failed to resolve schema definition file %s", path), ex);