diff --git a/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/IDLMojo.java b/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/IDLMojo.java index d6db625d1de..54f49b04fb5 100644 --- a/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/IDLMojo.java +++ b/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/IDLMojo.java @@ -29,6 +29,7 @@ import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -84,7 +85,8 @@ protected void doCompile(String filename, File sourceDirectory, File outputDirec Thread.currentThread().setContextClassLoader(projPathLoader); try { IdlReader parser = new IdlReader(); - IdlFile idlFile = parser.parse(sourceDirectory.toPath().resolve(filename)); + Path sourceFilePath = sourceDirectory.toPath().resolve(filename); + IdlFile idlFile = parser.parse(sourceFilePath); for (String warning : idlFile.getWarnings()) { getLog().warn(warning); } @@ -109,7 +111,7 @@ protected void doCompile(String filename, File sourceDirectory, File outputDirec compiler.addCustomConversion(projPathLoader.loadClass(customConversion)); } compiler.setOutputCharacterEncoding(project.getProperties().getProperty("project.build.sourceEncoding")); - compiler.compileToDestination(null, outputDirectory); + compiler.compileToDestination(sourceFilePath.toFile(), outputDirectory); } finally { Thread.currentThread().setContextClassLoader(contextClassLoader); } diff --git a/lang/java/maven-plugin/src/test/java/org/apache/avro/mojo/TestIDLMojo.java b/lang/java/maven-plugin/src/test/java/org/apache/avro/mojo/TestIDLMojo.java index 94cc5b29e52..ab6cd7c9668 100644 --- a/lang/java/maven-plugin/src/test/java/org/apache/avro/mojo/TestIDLMojo.java +++ b/lang/java/maven-plugin/src/test/java/org/apache/avro/mojo/TestIDLMojo.java @@ -18,7 +18,10 @@ package org.apache.avro.mojo; import java.io.File; -import java.util.Collections; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.FileTime; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -37,8 +40,15 @@ public class TestIDLMojo extends AbstractAvroMojoTest { private File injectingVelocityToolsTestPom = new File(getBasedir(), "src/test/resources/unit/idl/pom-injecting-velocity-tools.xml"); + private File incrementalCompilationTestPom = new File(getBasedir(), + "src/test/resources/unit/idl/pom-incremental-compilation.xml"); + @Test public void testIdlProtocolMojo() throws Exception { + // Clear output directory to ensure files are recompiled. + final File outputDir = new File(getBasedir(), "target/test-harness/idl/test/"); + FileUtils.deleteDirectory(outputDir); + final IDLMojo mojo = (IDLMojo) lookupMojo("idl", testPom); final TestLog log = new TestLog(); mojo.setLog(log); @@ -46,7 +56,6 @@ public void testIdlProtocolMojo() throws Exception { assertNotNull(mojo); mojo.execute(); - final File outputDir = new File(getBasedir(), "target/test-harness/idl/test/"); final Set generatedFiles = new HashSet<>( asList("IdlPrivacy.java", "IdlTest.java", "IdlUser.java", "IdlUserWrapper.java")); assertFilesExist(outputDir, generatedFiles); @@ -60,6 +69,10 @@ public void testIdlProtocolMojo() throws Exception { @Test public void testSetCompilerVelocityAdditionalTools() throws Exception { + // Clear output directory to ensure files are recompiled. + final File outputDir = new File(getBasedir(), "target/test-harness/idl-inject/test/"); + FileUtils.deleteDirectory(outputDir); + final IDLProtocolMojo mojo = (IDLProtocolMojo) lookupMojo("idl-protocol", injectingVelocityToolsTestPom); final TestLog log = new TestLog(); mojo.setLog(log); @@ -67,7 +80,6 @@ public void testSetCompilerVelocityAdditionalTools() throws Exception { assertNotNull(mojo); mojo.execute(); - final File outputDir = new File(getBasedir(), "target/test-harness/idl-inject/test"); final Set generatedFiles = new HashSet<>( asList("IdlPrivacy.java", "IdlTest.java", "IdlUser.java", "IdlUserWrapper.java")); @@ -79,4 +91,37 @@ public void testSetCompilerVelocityAdditionalTools() throws Exception { // The previous test already verifies the warnings. assertFalse(log.getLogEntries().isEmpty()); } + + @Test + public void testIDLProtocolMojoSupportsIncrementalCompilation() throws Exception { + // Ensure that the IDL files have already been compiled once. + final IDLMojo mojo = (IDLMojo) lookupMojo("idl", incrementalCompilationTestPom); + final TestLog log = new TestLog(); + mojo.setLog(log); + + assertNotNull(mojo); + mojo.execute(); + + // Remove one file to ensure it is recreated and the others are not. + final Path outputDirPath = Paths.get(getBasedir(), "target/test-harness/idl-incremental/test/"); + final File outputDir = outputDirPath.toFile(); + + final Path idlPrivacyFilePath = outputDirPath.resolve("IdlPrivacy.java"); + final FileTime idpPrivacyModificationTime = Files.getLastModifiedTime(idlPrivacyFilePath); + Files.delete(idlPrivacyFilePath); + + final Path idlUserFilePath = outputDirPath.resolve("IdlUser.java"); + final FileTime idlUserModificationTime = Files.getLastModifiedTime(idlUserFilePath); + + mojo.execute(); + + // Asserting contents is done in previous tests so just assert existence. + final Set generatedFiles = new HashSet<>( + asList("IdlPrivacy.java", "IdlTest.java", "IdlUser.java", "IdlUserWrapper.java")); + assertFilesExist(outputDir, generatedFiles); + + assertTrue(idlPrivacyFilePath.toFile().exists()); + assertEquals(Files.getLastModifiedTime(idlUserFilePath), idlUserModificationTime); + assertTrue(Files.getLastModifiedTime(idlPrivacyFilePath).compareTo(idpPrivacyModificationTime) > 0); + } } diff --git a/lang/java/maven-plugin/src/test/resources/unit/idl/pom-incremental-compilation.xml b/lang/java/maven-plugin/src/test/resources/unit/idl/pom-incremental-compilation.xml new file mode 100644 index 00000000000..ddf8ff0bd08 --- /dev/null +++ b/lang/java/maven-plugin/src/test/resources/unit/idl/pom-incremental-compilation.xml @@ -0,0 +1,67 @@ + + + + 4.0.0 + + + avro-parent + org.apache.avro + 1.12.0-SNAPSHOT + ../../../../../../../../../pom.xml + + + avro-maven-plugin-test + jar + + testproject + + + + + avro-maven-plugin + + + idl + + idl-protocol + + + + + ${basedir}/src/test + ${basedir}/target/test-harness/idl-incremental + String + + + + + + + + org.apache.avro + avro + ${parent.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + +