This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git


The following commit(s) were added to refs/heads/master by this push:
     new 5f45ecf  [MSHADE-431] Use a caching output stream (#158)
5f45ecf is described below

commit 5f45ecf5854d335bcf6d3aec14775df76200527e
Author: Guillaume Nodet <gno...@gmail.com>
AuthorDate: Thu Oct 20 14:44:43 2022 +0200

    [MSHADE-431] Use a caching output stream (#158)
    
    Use a caching output stream to avoid overwriting the file if not needed
---
 .../apache/maven/plugins/shade/DefaultShader.java  |  5 +--
 .../maven/plugins/shade/DefaultShaderTest.java     | 41 ++++++++++++++++++++++
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java 
b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
index e8505c5..defa123 100644
--- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
+++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
@@ -22,7 +22,6 @@ package org.apache.maven.plugins.shade;
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -62,6 +61,7 @@ import 
org.apache.maven.plugins.shade.resource.ManifestResourceTransformer;
 import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer;
 import org.apache.maven.plugins.shade.resource.ResourceTransformer;
 import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.io.CachingOutputStream;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
@@ -116,7 +116,8 @@ public class DefaultShader
         shadeRequest.getUberJar().getParentFile().mkdirs();
 
         try ( JarOutputStream out  =
-                  new JarOutputStream( new BufferedOutputStream( new 
FileOutputStream( shadeRequest.getUberJar() ) ) ) )
+                  new JarOutputStream( new BufferedOutputStream(
+                          new CachingOutputStream( shadeRequest.getUberJar() ) 
) ) )
         {
             goThroughAllJarEntriesForManifestTransformer( shadeRequest, 
resources, manifestTransformer, out );
 
diff --git 
a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java 
b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java
index a709018..ace65a0 100644
--- a/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java
+++ b/src/test/java/org/apache/maven/plugins/shade/DefaultShaderTest.java
@@ -28,6 +28,9 @@ import java.lang.reflect.Field;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.attribute.FileTime;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -343,6 +346,44 @@ public class DefaultShaderTest
 
         final String innerJarFileName = "inner.jar";
 
+        temporaryFolder.create();
+        File innerJar = temporaryFolder.newFile( innerJarFileName );
+        try ( JarOutputStream jos = new JarOutputStream( 
Files.newOutputStream( innerJar.toPath() ) ) )
+        {
+            jos.putNextEntry( new JarEntry( "foo.txt" ) );
+            jos.write( "c1".getBytes( StandardCharsets.UTF_8 ) );
+            jos.closeEntry();
+        }
+
+        ShadeRequest shadeRequest = new ShadeRequest();
+        shadeRequest.setJars( new LinkedHashSet<>( Collections.singleton( 
innerJar ) ) );
+        shadeRequest.setFilters( Collections.emptyList() );
+        shadeRequest.setRelocators( Collections.emptyList() );
+        shadeRequest.setResourceTransformers( Collections.emptyList() );
+        File shadedFile = temporaryFolder.newFile( "shaded.jar" );
+        shadeRequest.setUberJar( shadedFile );
+
+        DefaultShader shader = newShader();
+        shader.shade( shadeRequest );
+
+        FileTime lastModified = FileTime.from( Files.getLastModifiedTime( 
shadedFile.toPath() ).toInstant()
+                .minus( 5, ChronoUnit.SECONDS ) );
+
+        Files.setLastModifiedTime( shadedFile.toPath(), lastModified );
+
+        shader.shade(shadeRequest);
+        assertEquals( lastModified, Files.getLastModifiedTime( 
shadedFile.toPath() ) );
+
+        temporaryFolder.delete();
+    }
+
+    @Test
+    public void testShaderNoOverwrite() throws Exception
+    {
+        TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+        final String innerJarFileName = "inner.jar";
+
         temporaryFolder.create();
         File innerJar = temporaryFolder.newFile( innerJarFileName );
         try ( JarOutputStream jos = new JarOutputStream( new FileOutputStream( 
innerJar ) ) )

Reply via email to