From 04619ae33e79ea06ed644948276df342e4119f49 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Sat, 23 May 2020 06:47:07 -0400 Subject: [PATCH 1/2] Fix path provider bug on CI Previous path sorting logic failed on CI due to one or more files in the cpp-qt5 script being associated with different path providers. This caused a ClassCastException from Path#compareTo This change uses Apache Commons PathFileComparator to sort by full path. --- .../codegen/DefaultGenerator.java | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index aa7956728f0f..5ebc1fd2cc1e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -30,6 +30,7 @@ import io.swagger.v3.oas.models.security.*; import io.swagger.v3.oas.models.tags.Tag; import org.apache.commons.io.IOUtils; +import org.apache.commons.io.comparator.PathFileComparator; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.config.GlobalSettings; @@ -1062,23 +1063,20 @@ public List generate() { System.err.println(sb.toString()); } else { if (generateMetadata) { - StringBuilder sb = new StringBuilder(); - File outDir = new File(this.config.getOutputDir()); - Optional.of(files) - .map(Collection::stream) - .orElseGet(Stream::empty) - .filter(Objects::nonNull) - .map(File::toPath) - .sorted(Path::compareTo) - .forEach(f -> { - String relativePath = java.nio.file.Paths.get(outDir.toURI()).relativize(f).toString(); - if (!relativePath.equals(METADATA_DIR + File.separator + "VERSION")) { - sb.append(relativePath).append(System.lineSeparator()); - } - }); - - String targetFile = config.outputFolder() + File.separator + METADATA_DIR + File.separator + "FILES"; try { + StringBuilder sb = new StringBuilder(); + File outDir = new File(this.config.getOutputDir()); + + files.sort(PathFileComparator.PATH_COMPARATOR); + + files.forEach(f -> { + String relativePath = outDir.toPath().relativize(f.toPath()).toString(); + if (!relativePath.equals(METADATA_DIR + File.separator + "VERSION")) { + sb.append(relativePath).append(System.lineSeparator()); + } + }); + + String targetFile = config.outputFolder() + File.separator + METADATA_DIR + File.separator + "FILES"; File filesFile = writeToFile(targetFile, sb.toString().getBytes(StandardCharsets.UTF_8)); files.add(filesFile); } catch (IOException e) { From 92406b6cc87b95269356df7dbeb33b047a11dc5f Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Sat, 23 May 2020 09:31:36 -0400 Subject: [PATCH 2/2] Avoid sort side effects and log on all exception --- .../openapitools/codegen/DefaultGenerator.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 5ebc1fd2cc1e..b0a2317df410 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -54,7 +54,6 @@ import java.nio.file.Path; import java.time.ZonedDateTime; import java.util.*; -import java.util.stream.Stream; import static org.openapitools.codegen.utils.OnceLogger.once; @@ -1067,9 +1066,19 @@ public List generate() { StringBuilder sb = new StringBuilder(); File outDir = new File(this.config.getOutputDir()); - files.sort(PathFileComparator.PATH_COMPARATOR); + List filesToSort = new ArrayList<>(); + // Avoid side-effecting sort in this path when generateMetadata=true files.forEach(f -> { + // We have seen NPE on CI for getPath() returning null, so guard against this (to be fixed in 5.0 template management refactor) + //noinspection ConstantConditions + if (f != null && f.getPath() != null) { + filesToSort.add(f); + } + }); + + filesToSort.sort(PathFileComparator.PATH_COMPARATOR); + filesToSort.forEach(f -> { String relativePath = outDir.toPath().relativize(f.toPath()).toString(); if (!relativePath.equals(METADATA_DIR + File.separator + "VERSION")) { sb.append(relativePath).append(System.lineSeparator()); @@ -1079,7 +1088,7 @@ public List generate() { String targetFile = config.outputFolder() + File.separator + METADATA_DIR + File.separator + "FILES"; File filesFile = writeToFile(targetFile, sb.toString().getBytes(StandardCharsets.UTF_8)); files.add(filesFile); - } catch (IOException e) { + } catch (Exception e) { LOGGER.warn("Failed to write FILES metadata to track generated files."); } }