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