diff --git a/README.md b/README.md index 59f164f..69f1cd3 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ This plugin was born as the 'alter ego' of maven apt plugin [apt-maven-plugin](h Date | Version | Info --- | --- | --- +**Oct 01, 2020** | [Release 4.4](https://github.com/bsorrentino/maven-annotation-plugin/releases/tag/v4.4) | merge PR #87. Thanks to [Martijn Dashorst](https://github.com/dashorst) **Sep 25, 2020** | [Release 4.3](https://github.com/bsorrentino/maven-annotation-plugin/releases/tag/v4.3) | merge PR #85. Thanks to [Martijn Dashorst](https://github.com/dashorst) **Aug 03, 2020** | [Release 4.2](https://github.com/bsorrentino/maven-annotation-plugin/releases/tag/v4.2) | merge PR #84. Thanks to [DemonicTutor](https://github.com/DemonicTutor) **Aug 03, 2020** | [Release 4.2-jdk8](https://github.com/bsorrentino/maven-annotation-plugin/releases/tag/v4.2-jdk8) | merge PR #84. Thanks to [DemonicTutor](https://github.com/DemonicTutor) diff --git a/pom.xml b/pom.xml index 230cc9c..43a4dde 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.bsc.maven maven-processor-plugin-parent pom - 4.3 + 4.4 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..610734c 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 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..0002bc7 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; @@ -80,7 +81,9 @@ import org.sonatype.aether.util.artifact.DefaultArtifact; */ // 3.1.0 +import static java.lang.String.format; import static java.util.Optional.ofNullable; +import static java.util.stream.Collectors.joining; /** @@ -419,7 +422,7 @@ private String buildModulePath() return getClasspathElements(new java.util.LinkedHashSet<>()) .stream() - .collect(Collectors.joining( File.pathSeparator) ); + .collect(joining( File.pathSeparator) ); } /** @@ -564,7 +567,7 @@ private List prepareOptions( JavaCompiler compiler ) { if( getLog().isDebugEnabled() ) { for (String option : options) { - getLog().debug(String.format("javac option: %s", option)); + getLog().debug(format("javac option: %s", option)); } } @@ -573,7 +576,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 +605,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()) { + final String removedSourceFiles = previousSourceFiles.stream() + .filter(f -> !currentSourceFiles.contains(f)) + .collect(joining("\n")); + getLog().debug(format("removed source files:\n%s", removedSourceFiles)); + + final String newSourceFiles = currentSourceFiles.stream() + .filter(f -> !previousSourceFiles.contains(f)) + .collect(joining("\n")); + getLog().debug(format("new source files:\n%s", newSourceFiles)); + } + return previousSourceFiles.equals(currentSourceFiles); + } finally { + outputDirectory.mkdirs(); + Files.write(sourceFileList, allSources.stream().map(JavaFileObject::getName).collect(Collectors.toSet())); + } } private void executeWithExceptionsHandled() throws Exception @@ -644,14 +687,14 @@ private void executeWithExceptionsHandled() throws Exception continue; } - getLog().debug( String.format( "processing source directory [%s]", sourceDir.getPath()) ); + getLog().debug( format( "processing source directory [%s]", sourceDir.getPath()) ); if( !sourceDir.exists() ) { - getLog().warn( String.format("source directory [%s] doesn't exist! Processor task will be skipped!", sourceDir.getPath())); + getLog().warn( format("source directory [%s] doesn't exist! Processor task will be skipped!", sourceDir.getPath())); continue; } if( !sourceDir.isDirectory() ) { - getLog().warn( String.format("source directory [%s] is invalid! Processor task will be skipped!", sourceDir.getPath())); + getLog().warn( format("source directory [%s] is invalid! Processor task will be skipped!", sourceDir.getPath())); continue; } @@ -669,17 +712,17 @@ private void executeWithExceptionsHandled() throws Exception if (null != kind) switch (kind) { case ERROR: - getLog().error(String.format("diagnostic: %s", diagnostic)); + getLog().error(format("diagnostic: %s", diagnostic)); break; case MANDATORY_WARNING: case WARNING: - getLog().warn(String.format("diagnostic: %s", diagnostic)); + getLog().warn(format("diagnostic: %s", diagnostic)); break; case NOTE: - getLog().info(String.format("diagnostic: %s", diagnostic)); + getLog().info(format("diagnostic: %s", diagnostic)); break; case OTHER: - getLog().info(String.format("diagnostic: %s", diagnostic)); + getLog().info(format("diagnostic: %s", diagnostic)); break; default: break; @@ -691,7 +734,7 @@ private void executeWithExceptionsHandled() throws Exception java.util.Set< Map.Entry> pSet = systemProperties.entrySet(); for ( Map.Entry e : pSet ) { - getLog().debug( String.format("set system property : [%s] = [%s]", e.getKey(), e.getValue() )); + getLog().debug( format("set system property : [%s] = [%s]", e.getKey(), e.getValue() )); System.setProperty(e.getKey(), e.getValue()); } @@ -721,10 +764,10 @@ private void executeWithExceptionsHandled() throws Exception } } - getLog().debug(String.format("** Discovered %d java sources in %s", sourceCount, f.getAbsolutePath())); + getLog().debug(format("** Discovered %d java sources in %s", sourceCount, f.getAbsolutePath())); } catch (Exception ex) { - getLog().warn(String.format("Problem reading source archive [%s]", artifact.getFile().getPath())); + getLog().warn(format("Problem reading source archive [%s]", artifact.getFile().getPath())); getLog().debug(ex); } }); @@ -768,11 +811,11 @@ private void executeWithExceptionsHandled() throws Exception charset = Charset.forName(encoding); } catch( IllegalCharsetNameException ex1 ) { - getLog().warn( String.format("the given charset name [%s] is illegal!. default is used", encoding )); + getLog().warn( format("the given charset name [%s] is illegal!. default is used", encoding )); charset = null; } catch( UnsupportedCharsetException ex2 ) { - getLog().warn( String.format("the given charset name [%s] is unsupported!. default is used", encoding )); + getLog().warn( format("the given charset name [%s] is unsupported!. default is used", encoding )); charset = null; } } @@ -857,7 +900,7 @@ private void addCompilerArguments(List options) { for (String arg : compilerArguments.split(" ")) { if (!StringUtils.isEmpty(arg)) { arg = arg.trim(); - getLog().debug(String.format("Adding compiler arg: %s", arg)); + getLog().debug(format("Adding compiler arg: %s", arg)); options.add(arg); } } @@ -866,9 +909,9 @@ private void addCompilerArguments(List options) { for( java.util.Map.Entry e : optionMap.entrySet() ) { if( !StringUtils.isEmpty(e.getKey()) && e.getValue()!=null ) { - String opt = String.format("-A%s=%s", e.getKey().trim(), e.getValue().toString().trim()); + String opt = format("-A%s=%s", e.getKey().trim(), e.getValue().toString().trim()); options.add( opt ); - getLog().debug(String.format("Adding compiler arg: %s", opt)); + getLog().debug(format("Adding compiler arg: %s", opt)); } } @@ -879,7 +922,7 @@ private void addOutputToSourcesIfNeeded() { final Boolean add = addOutputDirectoryToCompilationSources; if (add == null || add.booleanValue()) { - getLog().debug(String.format("Source directory: %s added", outputDirectory)); + getLog().debug(format("Source directory: %s added", outputDirectory)); addCompileSourceRoot(project, outputDirectory.getAbsolutePath()); } } @@ -950,7 +993,7 @@ private Artifact resolveSourceArtifact( Artifact dep ) throws ArtifactResolution request.setArtifact( artifact ); request.setRepositories(remoteRepos); - getLog().debug( String.format("Resolving artifact %s from %s", artifact, remoteRepos )); + getLog().debug( format("Resolving artifact %s from %s", artifact, remoteRepos )); final ArtifactResult result = repoSystem.resolveArtifact( repoSession, request ); @@ -976,7 +1019,7 @@ private void processSourceArtifacts( Consumer closure ) { } } catch (ArtifactResolutionException ex) { - getLog().warn( String.format(" sources for artifact [%s] not found!", dep.toString())); + getLog().warn( format(" sources for artifact [%s] not found!", dep.toString())); getLog().debug(ex); } diff --git a/test/pom.xml b/test/pom.xml index 29ffc4b..89b26e6 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -11,7 +11,7 @@ org.bsc.maven maven-processor-plugin-parent - 4.3 + 4.4 @@ -76,7 +76,7 @@ PROCESSOR PLUGIN false - org.bsc.maven.plugin.processor.test.TESTWikiProcessor + org.bsc.maven.plugin.processor.test.TestWikiProcessor @@ -99,17 +99,12 @@ PROCESSOR PLUGIN ${basedir}/src/main/java - false + true - org.bsc.maven.plugin.processor.test.TESTWikiProcessor - + org.bsc.maven.plugin.processor.test.TestWikiProcessor diff --git a/test/src/main/java/org/bsc/maven/plugin/processor/test/TESTWikiProcessor.java b/test/src/main/java/org/bsc/maven/plugin/processor/test/TestWikiProcessor.java similarity index 97% rename from test/src/main/java/org/bsc/maven/plugin/processor/test/TESTWikiProcessor.java rename to test/src/main/java/org/bsc/maven/plugin/processor/test/TestWikiProcessor.java index 55a2c6c..3f9d427 100644 --- a/test/src/main/java/org/bsc/maven/plugin/processor/test/TESTWikiProcessor.java +++ b/test/src/main/java/org/bsc/maven/plugin/processor/test/TestWikiProcessor.java @@ -31,7 +31,7 @@ @SupportedAnnotationTypes( "*" ) //@SupportedOptions( {"subfolder", "filepath", "templateUri"}) //@SupportedAnnotationTypes( {"javax.ws.rs.GET", "javax.ws.rs.PUT", "javax.ws.rs.POST", "javax.ws.rs.DELETE"}) -public class TESTWikiProcessor extends BaseAbstractProcessor { +public class TestWikiProcessor extends BaseAbstractProcessor { /** * diff --git a/test/src/main/java/org/bsc/maven/plugin/processor/test/TestWikiProcessorClass.java b/test/src/main/java/org/bsc/maven/plugin/processor/test/TestWikiProcessorClass.java new file mode 100644 index 0000000..e3093d4 --- /dev/null +++ b/test/src/main/java/org/bsc/maven/plugin/processor/test/TestWikiProcessorClass.java @@ -0,0 +1,16 @@ +package org.bsc.maven.plugin.processor.test; + +public class TestWikiProcessorClass { + + @ServiceDocumentation("service1") + public void service1() { + + + } + + @ServiceDocumentation("service2") + public void service2( @ParameterDocumentation("param1") String param1) { + + + } +} diff --git a/test/src/site/.maven-processor-source-files.txt b/test/src/site/.maven-processor-source-files.txt new file mode 100644 index 0000000..6256132 --- /dev/null +++ b/test/src/site/.maven-processor-source-files.txt @@ -0,0 +1,4 @@ +/Users/bsorrentino/WORKSPACES/GITHUB.me/maven-annotation-plugin/test/src/main/java/org/bsc/maven/plugin/processor/test/ParameterDocumentation.java +/Users/bsorrentino/WORKSPACES/GITHUB.me/maven-annotation-plugin/test/src/main/java/org/bsc/maven/plugin/processor/test/TestWikiProcessor.java +/Users/bsorrentino/WORKSPACES/GITHUB.me/maven-annotation-plugin/test/src/main/java/org/bsc/maven/plugin/processor/test/ServiceDocumentation.java +/Users/bsorrentino/WORKSPACES/GITHUB.me/maven-annotation-plugin/test/src/main/java/org/bsc/maven/plugin/processor/test/TestWikiProcessorClass.java diff --git a/utils/pom.xml b/utils/pom.xml index c9552be..56d14d4 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -31,7 +31,7 @@ org.bsc.maven maven-processor-plugin-parent - 4.3 + 4.4