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);
+  }
 }

Reply via email to