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

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


The following commit(s) were added to refs/heads/master by this push:
     new 3f6f3e1  [MWRAPPER-131] Make downloader not stream into final target 
file (#128)
3f6f3e1 is described below

commit 3f6f3e1d02056b2ef79a7556c5dc705153411117
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Wed Apr 17 20:33:06 2024 +0200

    [MWRAPPER-131] Make downloader not stream into final target file (#128)
    
    Stream into temp file in same dir, and at the end move the stuff into file 
place.
    
    ---
    
    https://issues.apache.org/jira/browse/MWRAPPER-131
---
 .../mvn/wrapper/MavenWrapperDownloader.java        | 90 ++++++++++------------
 .../apache/maven/wrapper/DefaultDownloader.java    | 10 ++-
 2 files changed, 51 insertions(+), 49 deletions(-)

diff --git 
a/maven-wrapper-distribution/src/resources/mvn/wrapper/MavenWrapperDownloader.java
 
b/maven-wrapper-distribution/src/resources/mvn/wrapper/MavenWrapperDownloader.java
index a21f42b..08817f1 100644
--- 
a/maven-wrapper-distribution/src/resources/mvn/wrapper/MavenWrapperDownloader.java
+++ 
b/maven-wrapper-distribution/src/resources/mvn/wrapper/MavenWrapperDownloader.java
@@ -27,72 +27,66 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
+import java.util.concurrent.ThreadLocalRandom;
 
-public final class MavenWrapperDownloader
-{
+public final class MavenWrapperDownloader {
     private static final String WRAPPER_VERSION = "@@project.version@@";
 
-    private static final boolean VERBOSE = Boolean.parseBoolean( 
System.getenv( "MVNW_VERBOSE" ) );
+    private static final boolean VERBOSE = 
Boolean.parseBoolean(System.getenv("MVNW_VERBOSE"));
 
-    public static void main( String[] args )
-    {
-        log( "Apache Maven Wrapper Downloader " + WRAPPER_VERSION );
+    public static void main(String[] args) {
+        log("Apache Maven Wrapper Downloader " + WRAPPER_VERSION);
 
-        if ( args.length != 2 )
-        {
-            System.err.println( " - ERROR wrapperUrl or wrapperJarPath 
parameter missing" );
-            System.exit( 1 );
+        if (args.length != 2) {
+            System.err.println(" - ERROR wrapperUrl or wrapperJarPath 
parameter missing");
+            System.exit(1);
         }
 
-        try
-        {
-            log( " - Downloader started" );
-            final URL wrapperUrl = URI.create( args[0] ).toURL();
-            final String jarPath = args[1].replace( "..", "" ); // Sanitize 
path
-            final Path wrapperJarPath = Paths.get( jarPath 
).toAbsolutePath().normalize();
-            downloadFileFromURL( wrapperUrl, wrapperJarPath );
-            log( "Done" );
-        }
-        catch ( IOException e )
-        {
-            System.err.println( "- Error downloading: " + e.getMessage() );
-            if ( VERBOSE )
-            {
+        try {
+            log(" - Downloader started");
+            final URL wrapperUrl = URI.create(args[0]).toURL();
+            final String jarPath = args[1].replace("..", ""); // Sanitize path
+            final Path wrapperJarPath = 
Paths.get(jarPath).toAbsolutePath().normalize();
+            downloadFileFromURL(wrapperUrl, wrapperJarPath);
+            log("Done");
+        } catch (IOException e) {
+            System.err.println("- Error downloading: " + e.getMessage());
+            if (VERBOSE) {
                 e.printStackTrace();
             }
-            System.exit( 1 );
+            System.exit(1);
         }
     }
 
-    private static void downloadFileFromURL( URL wrapperUrl, Path 
wrapperJarPath )
-        throws IOException
-    {
-        log( " - Downloading to: " + wrapperJarPath );
-        if ( System.getenv( "MVNW_USERNAME" ) != null && System.getenv( 
"MVNW_PASSWORD" ) != null )
-        {
-            final String username = System.getenv( "MVNW_USERNAME" );
-            final char[] password = System.getenv( "MVNW_PASSWORD" 
).toCharArray();
-            Authenticator.setDefault( new Authenticator()
-            {
+    private static void downloadFileFromURL(URL wrapperUrl, Path 
wrapperJarPath)
+            throws IOException {
+        log(" - Downloading to: " + wrapperJarPath);
+        if (System.getenv("MVNW_USERNAME") != null && 
System.getenv("MVNW_PASSWORD") != null) {
+            final String username = System.getenv("MVNW_USERNAME");
+            final char[] password = 
System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
                 @Override
-                protected PasswordAuthentication getPasswordAuthentication()
-                {
-                    return new PasswordAuthentication( username, password );
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
                 }
-            } );
+            });
         }
-        try ( InputStream inStream = wrapperUrl.openStream() )
-        {
-            Files.copy( inStream, wrapperJarPath, 
StandardCopyOption.REPLACE_EXISTING );
+        Path temp = wrapperJarPath
+                .getParent()
+                .resolve(wrapperJarPath.getFileName() + "."
+                        + 
Long.toUnsignedString(ThreadLocalRandom.current().nextLong()) + ".tmp");
+        try (InputStream inStream = wrapperUrl.openStream()) {
+            Files.copy(inStream, temp, StandardCopyOption.REPLACE_EXISTING);
+            Files.move(temp, wrapperJarPath, 
StandardCopyOption.REPLACE_EXISTING);
+        } finally {
+            Files.deleteIfExists(temp);
         }
-        log( " - Downloader complete" );
+        log(" - Downloader complete");
     }
 
-    private static void log( String msg )
-    {
-        if ( VERBOSE )
-        {
-            System.out.println( msg );
+    private static void log(String msg) {
+        if (VERBOSE) {
+            System.out.println(msg);
         }
     }
 
diff --git 
a/maven-wrapper/src/main/java/org/apache/maven/wrapper/DefaultDownloader.java 
b/maven-wrapper/src/main/java/org/apache/maven/wrapper/DefaultDownloader.java
index 753a2dd..f4219f9 100644
--- 
a/maven-wrapper/src/main/java/org/apache/maven/wrapper/DefaultDownloader.java
+++ 
b/maven-wrapper/src/main/java/org/apache/maven/wrapper/DefaultDownloader.java
@@ -31,6 +31,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
 import java.util.Locale;
+import java.util.concurrent.ThreadLocalRandom;
 
 import static org.apache.maven.wrapper.MavenWrapperMain.MVNW_PASSWORD;
 import static org.apache.maven.wrapper.MavenWrapperMain.MVNW_USERNAME;
@@ -92,8 +93,15 @@ public class DefaultDownloader implements Downloader {
         final String userAgentValue = calculateUserAgent();
         conn.setRequestProperty("User-Agent", userAgentValue);
 
+        Path temp = destination
+                .getParent()
+                .resolve(destination.getFileName() + "."
+                        + 
Long.toUnsignedString(ThreadLocalRandom.current().nextLong()) + ".tmp");
         try (InputStream inStream = conn.getInputStream()) {
-            Files.copy(inStream, destination, 
StandardCopyOption.REPLACE_EXISTING);
+            Files.copy(inStream, temp, StandardCopyOption.REPLACE_EXISTING);
+            Files.move(temp, destination, StandardCopyOption.REPLACE_EXISTING);
+        } finally {
+            Files.deleteIfExists(temp);
         }
     }
 

Reply via email to