From cb7191dfff7939026504c169db626b2a2fcbddb2 Mon Sep 17 00:00:00 2001 From: Martijn Dashorst Date: Sun, 27 Sep 2020 14:51:35 +0200 Subject: [PATCH 1/2] Start work on 4.4-SNAPSHOT --- pom.xml | 2 +- processor/pom.xml | 2 +- test/pom.xml | 2 +- utils/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 230cc9c..0031708 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.bsc.maven maven-processor-plugin-parent pom - 4.3 + 4.4-SNAPSHOT MAVEN PROCESSOR PLUGIN PARENT A maven plugin to process annotation for jdk6 at compile time diff --git a/processor/pom.xml b/processor/pom.xml index b798483..0188712 100644 --- a/processor/pom.xml +++ b/processor/pom.xml @@ -13,7 +13,7 @@ This plugin could be considered the 'alter ego' of maven apt plugin http://mojo. org.bsc.maven maven-processor-plugin-parent - 4.3 + 4.4-SNAPSHOT diff --git a/test/pom.xml b/test/pom.xml index 29ffc4b..e459842 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -11,7 +11,7 @@ org.bsc.maven maven-processor-plugin-parent - 4.3 + 4.4-SNAPSHOT diff --git a/utils/pom.xml b/utils/pom.xml index c9552be..eeb16db 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -31,7 +31,7 @@ org.bsc.maven maven-processor-plugin-parent - 4.3 + 4.4-SNAPSHOT From 1f6c708506ea959920f54a7873b82e3fab76bf77 Mon Sep 17 00:00:00 2001 From: Martijn Dashorst Date: Sun, 27 Sep 2020 15:10:57 +0200 Subject: [PATCH 2/2] Detects file additions/deletions for skipping When you remove a file from the source tree, the modification checker doesn't take into account the removed file as an update. Because the file no longer exists, it doesn't have a modification date, and it will not count in determining whether the last generation was older than the modification in the sources. This commit detects source file modifications of the nature of additions and deletions by using a tracking file in the output folder (`.maven-processor-source-files.txt`). This file contains a list of all the files in the source folders, which is checked against the current list of source files. When the file doesn't exist or if the sets of files don't match, it is treated as a change. When they match exactly, the modification time check is still run. A sample run without additions/removals in the source files: ``` [DEBUG] (f) skipSourcesUnchanged = true [DEBUG] (f) sourceDirectory = /Users/dashorst/IdeaProjects/iridium/common/entities/src/main/java [DEBUG] -- end configuration -- [DEBUG] Source directory: /Users/dashorst/IdeaProjects/iridium/common/entities/target/generated-sources/apt added [DEBUG] processing source directory [/Users/dashorst/IdeaProjects/iridium/common/entities/src/main/java] [DEBUG] removed source files: [] [DEBUG] new source files: [] [DEBUG] max source file date: 1601210991895, max output date: 1601211873845 [INFO] no source file(s) change(s) detected! Processor task will be skipped ``` When a file was removed: ``` [DEBUG] (f) skipSourcesUnchanged = true [DEBUG] (f) sourceDirectory = /Users/dashorst/IdeaProjects/iridium/common/entities/src/main/java [DEBUG] -- end configuration -- [DEBUG] Source directory: /Users/dashorst/IdeaProjects/iridium/common/entities/target/generated-sources/apt added [DEBUG] processing source directory [/Users/dashorst/IdeaProjects/iridium/common/entities/src/main/java] [DEBUG] removed source files: [/Users/dashorst/IdeaProjects/iridium/common/entities/src/main/java/nl/topicus/platinum/entities/Afdeling.java] [DEBUG] new source files: [] [WARNING] No processors specified. Using default discovery mechanism. [DEBUG] javac option: -cp ``` When the file is re-added: ``` [DEBUG] (f) skipSourcesUnchanged = true [DEBUG] (f) sourceDirectory = /Users/dashorst/IdeaProjects/iridium/common/entities/src/main/java [DEBUG] -- end configuration -- [DEBUG] Source directory: /Users/dashorst/IdeaProjects/iridium/common/entities/target/generated-sources/apt added [DEBUG] processing source directory [/Users/dashorst/IdeaProjects/iridium/common/entities/src/main/java] [DEBUG] removed source files: [] [DEBUG] new source files: [/Users/dashorst/IdeaProjects/iridium/common/entities/src/main/java/nl/topicus/platinum/entities/Afdeling.java] [WARNING] No processors specified. Using default discovery mechanism. [DEBUG] javac option: -cp ``` Fixes #86 --- .../AbstractAnnotationProcessorMojo.java | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/processor/src/main/java/org/bsc/maven/plugin/processor/AbstractAnnotationProcessorMojo.java b/processor/src/main/java/org/bsc/maven/plugin/processor/AbstractAnnotationProcessorMojo.java index e74f954..39ebebd 100644 --- a/processor/src/main/java/org/bsc/maven/plugin/processor/AbstractAnnotationProcessorMojo.java +++ b/processor/src/main/java/org/bsc/maven/plugin/processor/AbstractAnnotationProcessorMojo.java @@ -64,6 +64,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -573,7 +574,13 @@ private List prepareOptions( JavaCompiler compiler ) { } private boolean isSourcesUnchanged( List allSources ) throws IOException { - long maxSourceDate = allSources.stream().map(JavaFileObject::getLastModified).max(Long::compare).get(); + if (!areSourceFilesSameAsPreviousRun(allSources)) + return false; + + long maxSourceDate = allSources.stream() + .map(JavaFileObject::getLastModified) + .max(Long::compare) + .orElse(Long.MIN_VALUE); // use atomic long for effectively final wrapper around long variable final AtomicLong maxOutputDate = new AtomicLong(Long.MIN_VALUE); @@ -596,7 +603,41 @@ private boolean isSourcesUnchanged( List allSources ) throws IOE } return maxSourceDate <= maxOutputDate.get(); + } + /** + * Checks the list of {@code allSources} against the stored list of source files in a previous run. + * + * @param allSources + * @return {@code true} when the filenames of the previous run matches exactly with the current run. + * @throws IOException + */ + private boolean areSourceFilesSameAsPreviousRun(List allSources) throws IOException { + Path sourceFileList = outputDirectory.toPath().resolve(".maven-processor-source-files.txt"); + try { + if (!Files.exists(sourceFileList)) { + getLog().debug("File with previous sources " + sourceFileList + " not found, treating as first run"); + return false; + } + + Set previousSourceFiles = new HashSet<>(Files.readAllLines(sourceFileList)); + Set currentSourceFiles = allSources.stream().map(JavaFileObject::getName).collect(Collectors.toSet()); + if (getLog().isDebugEnabled()) { + Set removedSourceFiles = previousSourceFiles.stream() + .filter(f -> !currentSourceFiles.contains(f)) + .collect(Collectors.toSet()); + getLog().debug("removed source files: " + removedSourceFiles); + + Set newSourceFiles = currentSourceFiles.stream() + .filter(f -> !previousSourceFiles.contains(f)) + .collect(Collectors.toSet()); + getLog().debug("new source files: " + newSourceFiles); + } + return previousSourceFiles.equals(currentSourceFiles); + } finally { + outputDirectory.mkdirs(); + Files.write(sourceFileList, allSources.stream().map(JavaFileObject::getName).collect(Collectors.toSet())); + } } private void executeWithExceptionsHandled() throws Exception