This is an automated email from the ASF dual-hosted git repository.
mgrigorov pushed a commit to branch branch-1.11
in repository https://gitbox.apache.org/repos/asf/avro.git
The following commit(s) were added to refs/heads/branch-1.11 by this push:
new 0a2323fed AVRO-3889: [Java][Build] Maven IDL Generation Modification
Check (#2561)
0a2323fed is described below
commit 0a2323fedffb3b4e63f46fb1e1197f0a547dac4a
Author: Brian Cullen <[email protected]>
AuthorDate: Wed Jan 3 09:54:10 2024 +0100
AVRO-3889: [Java][Build] Maven IDL Generation Modification Check (#2561)
Check if the IDL source file has changed before regenerating the Java
classes to prevent unnecessary recompilation when using maven.
Co-authored-by: Brian Cullen <[email protected]>
---
.../java/org/apache/avro/mojo/IDLProtocolMojo.java | 5 ++-
.../org/apache/avro/mojo/TestIDLProtocolMojo.java | 47 +++++++++++++++++++++-
2 files changed, 48 insertions(+), 4 deletions(-)
diff --git
a/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/IDLProtocolMojo.java
b/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/IDLProtocolMojo.java
index 0c9228c61..92953619b 100644
---
a/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/IDLProtocolMojo.java
+++
b/lang/java/maven-plugin/src/main/java/org/apache/avro/mojo/IDLProtocolMojo.java
@@ -82,7 +82,8 @@ public class IDLProtocolMojo extends AbstractAvroMojo {
URLClassLoader projPathLoader = new
URLClassLoader(runtimeUrls.toArray(new URL[0]),
Thread.currentThread().getContextClassLoader());
- try (Idl parser = new Idl(new File(sourceDirectory, filename),
projPathLoader)) {
+ File sourceFile = new File(sourceDirectory, filename);
+ try (Idl parser = new Idl(sourceFile, projPathLoader)) {
Protocol p = parser.CompilationUnit();
for (String warning : parser.getWarningsAfterParsing()) {
@@ -104,7 +105,7 @@ public class IDLProtocolMojo extends AbstractAvroMojo {
compiler.addCustomConversion(projPathLoader.loadClass(customConversion));
}
compiler.setOutputCharacterEncoding(project.getProperties().getProperty("project.build.sourceEncoding"));
- compiler.compileToDestination(null, outputDirectory);
+ compiler.compileToDestination(sourceFile, outputDirectory);
}
} catch (ParseException | ClassNotFoundException |
DependencyResolutionRequiredException e) {
throw new IOException(e);
diff --git
a/lang/java/maven-plugin/src/test/java/org/apache/avro/mojo/TestIDLProtocolMojo.java
b/lang/java/maven-plugin/src/test/java/org/apache/avro/mojo/TestIDLProtocolMojo.java
index 226ca6de0..315dc3953 100644
---
a/lang/java/maven-plugin/src/test/java/org/apache/avro/mojo/TestIDLProtocolMojo.java
+++
b/lang/java/maven-plugin/src/test/java/org/apache/avro/mojo/TestIDLProtocolMojo.java
@@ -17,6 +17,10 @@
*/
package org.apache.avro.mojo;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.FileTime;
import org.codehaus.plexus.util.FileUtils;
import org.junit.Test;
@@ -37,6 +41,10 @@ public class TestIDLProtocolMojo extends
AbstractAvroMojoTest {
@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 IDLProtocolMojo mojo = (IDLProtocolMojo) lookupMojo("idl-protocol",
testPom);
final TestLog log = new TestLog();
mojo.setLog(log);
@@ -44,7 +52,6 @@ public class TestIDLProtocolMojo extends AbstractAvroMojoTest
{
assertNotNull(mojo);
mojo.execute();
- final File outputDir = new File(getBasedir(),
"target/test-harness/idl/test/");
final Set<String> generatedFiles = new
HashSet<>(Arrays.asList("IdlPrivacy.java", "IdlTest.java", "IdlUser.java",
"IdlUserWrapper.java", "IdlClasspathImportTest.java"));
assertFilesExist(outputDir, generatedFiles);
@@ -60,6 +67,10 @@ public class TestIDLProtocolMojo extends
AbstractAvroMojoTest {
@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 +78,6 @@ public class TestIDLProtocolMojo extends AbstractAvroMojoTest
{
assertNotNull(mojo);
mojo.execute();
- final File outputDir = new File(getBasedir(),
"target/test-harness/idl-inject/test");
final Set<String> generatedFiles = new
HashSet<>(Arrays.asList("IdlPrivacy.java", "IdlTest.java", "IdlUser.java",
"IdlUserWrapper.java", "IdlClasspathImportTest.java"));
@@ -79,4 +89,37 @@ public class TestIDLProtocolMojo extends
AbstractAvroMojoTest {
// The previous test already verifies the warnings.
assertFalse(log.getLogEntries().isEmpty());
}
+
+ @Test
+ public void testIdlProtocolMojoDoesntReplaceUpToDateFiles() throws Exception
{
+ // Ensure that the IDL files have already been compiled once.
+ final IDLProtocolMojo mojo = (IDLProtocolMojo) lookupMojo("idl-protocol",
testPom);
+ 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/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<String> generatedFiles = new
HashSet<>(Arrays.asList("IdlPrivacy.java", "IdlTest.java", "IdlUser.java",
+ "IdlUserWrapper.java", "IdlClasspathImportTest.java"));
+ assertFilesExist(outputDir, generatedFiles);
+
+ assertTrue(idlPrivacyFilePath.toFile().exists());
+ assertEquals(Files.getLastModifiedTime(idlUserFilePath),
idlUserModificationTime);
+
assertTrue(Files.getLastModifiedTime(idlPrivacyFilePath).compareTo(idpPrivacyModificationTime)
> 0);
+ }
}