You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by el...@apache.org on 2020/10/04 13:38:25 UTC

[maven-stage-plugin] 01/01: fixup and modernize IO

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

elharo pushed a commit to branch MSTAGE-25
in repository https://gitbox.apache.org/repos/asf/maven-stage-plugin.git

commit 82b7157bda9aeda40d16353e310b24b5656304ee
Author: Elliotte Rusty Harold <el...@ibiblio.org>
AuthorDate: Sun Oct 4 09:38:09 2020 -0400

    fixup and modernize IO
---
 .../plugins/stage/DefaultRepositoryCopier.java     | 289 ++++++++-------------
 1 file changed, 114 insertions(+), 175 deletions(-)

diff --git a/src/main/java/org/apache/maven/plugins/stage/DefaultRepositoryCopier.java b/src/main/java/org/apache/maven/plugins/stage/DefaultRepositoryCopier.java
index 0aff2c0..bef1fb2 100644
--- a/src/main/java/org/apache/maven/plugins/stage/DefaultRepositoryCopier.java
+++ b/src/main/java/org/apache/maven/plugins/stage/DefaultRepositoryCopier.java
@@ -19,6 +19,7 @@ package org.apache.maven.plugins.stage;
  * under the License.
  */
 
+import org.apache.commons.io.FileUtils;
 import org.apache.maven.artifact.manager.WagonManager;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.repository.metadata.Metadata;
@@ -26,34 +27,26 @@ import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
 import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
 import org.apache.maven.wagon.CommandExecutor;
 import org.apache.maven.wagon.CommandExecutionException;
-import org.apache.maven.wagon.ConnectionException;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
 import org.apache.maven.wagon.TransferFailedException;
-import org.apache.maven.wagon.UnsupportedProtocolException;
 import org.apache.maven.wagon.Wagon;
 import org.apache.maven.wagon.WagonException;
-import org.apache.maven.wagon.authentication.AuthenticationException;
 import org.apache.maven.wagon.authentication.AuthenticationInfo;
 import org.apache.maven.wagon.authorization.AuthorizationException;
 import org.apache.maven.wagon.repository.Repository;
 import org.codehaus.plexus.logging.LogEnabled;
 import org.codehaus.plexus.logging.Logger;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
 import java.io.Reader;
 import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
@@ -70,9 +63,9 @@ import java.util.zip.ZipOutputStream;
 public class DefaultRepositoryCopier
     implements LogEnabled, RepositoryCopier
 {
-    private MetadataXpp3Reader reader = new MetadataXpp3Reader();
+    private MetadataXpp3Reader metadataReader = new MetadataXpp3Reader();
 
-    private MetadataXpp3Writer writer = new MetadataXpp3Writer();
+    private MetadataXpp3Writer metadataWriter = new MetadataXpp3Writer();
 
     /** @plexus.requirement */
     private WagonManager wagonManager;
@@ -101,8 +94,7 @@ public class DefaultRepositoryCopier
         File basedir = new File( tempdir, prefix + "-" + version );
 
         FileUtils.deleteDirectory( basedir );
-
-        basedir.mkdirs();
+        Files.createDirectories( basedir.toPath() );
 
         Wagon sourceWagon = wagonManager.getWagon( sourceRepository );
         AuthenticationInfo sourceAuth = wagonManager.getAuthenticationInfo( sourceRepository.getId() );
@@ -111,7 +103,7 @@ public class DefaultRepositoryCopier
 
         logger.info( "Looking for files in the source repository." );
 
-        List<String> files = new ArrayList<String>();
+        List<String> files = new ArrayList<>();
 
         scan( sourceWagon, "", files );
 
@@ -127,8 +119,6 @@ public class DefaultRepositoryCopier
 
             File f = new File( basedir, s );
 
-            FileUtils.mkdir( f.getParentFile().getAbsolutePath() );
-
             logger.info( "Downloading file from the source repository: " + s );
 
             sourceWagon.get( s, f );
@@ -154,8 +144,6 @@ public class DefaultRepositoryCopier
 
         targetWagon.connect( targetRepository, targetAuth );
 
-        PrintWriter rw = new PrintWriter( new FileWriter( renameScript ) );
-
         File archive = new File( tempdir, fileName );
 
         for ( String s : files )
@@ -193,52 +181,42 @@ public class DefaultRepositoryCopier
             }
         }
 
-        Set moveCommands = new TreeSet();
-
-        // ----------------------------------------------------------------------------
-        // Create the Zip file that we will deploy to the targetRepositoryUrl stage
-        // ----------------------------------------------------------------------------
-
-        logger.info( "Creating zip file." );
-
-        OutputStream os = new FileOutputStream( archive );
-
-        ZipOutputStream zos = new ZipOutputStream( os );
-
-        scanDirectory( basedir, basedir, zos, version, moveCommands );
-
-        // ----------------------------------------------------------------------------
-        // Create the renameScript script. This is as atomic as we can
-        // ----------------------------------------------------------------------------
-
-        logger.info( "Creating rename script." );
-
-        for ( Object moveCommand : moveCommands )
+        Set<String> moveCommands = new TreeSet<>();
+        
+        try ( Writer rw = Files.newBufferedWriter( renameScript.toPath(), StandardCharsets.UTF_8 ) )
         {
-            String s = (String) moveCommand;
+    
+            // ----------------------------------------------------------------------------
+            // Create the Zip file that we will deploy to the targetRepositoryUrl stage
+            // ----------------------------------------------------------------------------
+    
+            logger.info( "Creating zip file." );
+        
+            try ( ZipOutputStream zos = new ZipOutputStream( new FileOutputStream( archive ) ) )
+            {
+                scanDirectory( basedir, basedir, zos, version, moveCommands );
+        
+                // ----------------------------------------------------------------------------
+                // Create the renameScript script. This is as atomic as we can
+                // ----------------------------------------------------------------------------
+        
+                logger.info( "Creating rename script." );
+        
+                for ( String moveCommand : moveCommands )
+                {
+                    rw.write( moveCommand + "\n" );
+                }
+                ZipEntry e = new ZipEntry( renameScript.getName() );
+    
+                zos.putNextEntry( e );
+    
+                Files.copy( renameScript.toPath(), zos );
+            }
 
-            // We use an explicit unix '\n' line-ending here instead of using the println() method.
-            // Using println() will cause files and folders to have a '\r' at the end if the plugin is run on Windows.
-            rw.print( s + "\n" );
+            sourceWagon.disconnect();
         }
 
-        rw.close();
-
-        ZipEntry e = new ZipEntry( renameScript.getName() );
-
-        zos.putNextEntry( e );
-
-        InputStream is = new FileInputStream( renameScript );
-
-        IOUtil.copy( is, zos );
-
-        zos.close();
-        is.close();
-
-        sourceWagon.disconnect();
-
         // Push the Zip to the target system
-
         logger.info( "Uploading zip file to the target repository." );
 
         targetWagon.put( archive, fileName );
@@ -249,32 +227,32 @@ public class DefaultRepositoryCopier
 
         // We use the super quiet option here as all the noise seems to kill/stall the connection
 
-        String command = "unzip -o -qq -d " + targetRepoBaseDirectory + " " + targetRepoBaseDirectory + "/" + fileName;
+        String unzipCommand = "unzip -o -qq -d " + targetRepoBaseDirectory + " " + targetRepoBaseDirectory + "/" + fileName;
 
-        ( (CommandExecutor) targetWagon ).executeCommand( command );
+        ( (CommandExecutor) targetWagon ).executeCommand( unzipCommand );
 
         logger.info( "Deleting zip file from the target repository." );
 
-        command = "rm -f " + targetRepoBaseDirectory + "/" + fileName;
+        String rmCommand = "rm -f " + targetRepoBaseDirectory + "/" + fileName;
 
-        ( (CommandExecutor) targetWagon ).executeCommand( command );
+        ( (CommandExecutor) targetWagon ).executeCommand( rmCommand );
 
         logger.info( "Running rename script on the target machine." );
 
-        command = "cd " + targetRepoBaseDirectory + "; sh " + renameScriptName;
+        String renameCommand = "cd " + targetRepoBaseDirectory + "; sh " + renameScriptName;
 
-        ( (CommandExecutor) targetWagon ).executeCommand( command );
+        ( (CommandExecutor) targetWagon ).executeCommand( renameCommand );
 
         logger.info( "Deleting rename script from the target repository." );
 
-        command = "rm -f " + targetRepoBaseDirectory + "/" + renameScriptName;
+        String deleteCommand = "rm -f " + targetRepoBaseDirectory + "/" + renameScriptName;
 
-        ( (CommandExecutor) targetWagon ).executeCommand( command );
+        ( (CommandExecutor) targetWagon ).executeCommand( deleteCommand );
 
         targetWagon.disconnect();
     }
 
-    private void scanDirectory( File basedir, File dir, ZipOutputStream zos, String version, Set moveCommands )
+    private void scanDirectory( File basedir, File dir, ZipOutputStream zos, String version, Set<String> moveCommands )
         throws IOException
     {
         if ( dir == null )
@@ -296,7 +274,7 @@ public class DefaultRepositoryCopier
                 if ( f.getName().endsWith( version ) )
                 {
                     String s = f.getAbsolutePath().substring( basedir.getAbsolutePath().length() + 1 );
-                    s = StringUtils.replace( s, "\\", "/" );
+                    s = s.replace( "\\", "/" );
 
                     moveCommands.add( "mv " + s + IN_PROCESS_MARKER + " " + s );
                 }
@@ -305,26 +283,22 @@ public class DefaultRepositoryCopier
             }
             else
             {
-                InputStream is = new FileInputStream( f );
-
                 String s = f.getAbsolutePath().substring( basedir.getAbsolutePath().length() + 1 );
-                s = StringUtils.replace( s, "\\", "/" );
+                s = s.replace( "\\", "/" );
 
                 // We are marking any version directories with the in-process flag so that
-                // anything being unpacked on the target side will not be recogized by Maven
+                // anything being unpacked on the target side will not be recognized by Maven
                 // and so users cannot download partially uploaded files.
 
                 String vtag = "/" + version;
 
-                s = StringUtils.replace( s, vtag + "/", vtag + IN_PROCESS_MARKER + "/" );
+                s = s.replace( vtag + "/", vtag + IN_PROCESS_MARKER + "/" );
 
                 ZipEntry e = new ZipEntry( s );
 
                 zos.putNextEntry( e );
 
-                IOUtil.copy( is, zos );
-
-                is.close();
+                Files.copy( f.toPath(), zos );
 
                 int idx = s.indexOf( IN_PROCESS_MARKER );
 
@@ -342,83 +316,72 @@ public class DefaultRepositoryCopier
         throws IOException, XmlPullParserException
     {
         // Existing Metadata in target stage
-
-        Reader existingMetadataReader = new FileReader( existingMetadata );
-
-        Metadata existing = reader.read( existingMetadataReader );
-
-        // Staged Metadata
-
-        File stagedMetadataFile = new File( existingMetadata.getParentFile(), MAVEN_METADATA );
-
-        Reader stagedMetadataReader = new FileReader( stagedMetadataFile );
-
-        Metadata staged = reader.read( stagedMetadataReader );
-
-        // Merge
-
-        existing.merge( staged );
-
-        Writer writer = new FileWriter( existingMetadata );
-
-        this.writer.write( writer, existing );
-
-        writer.close();
-        stagedMetadataReader.close();
-        existingMetadataReader.close();
-
-
-        // Mark all metadata as in-process and regenerate the checksums as they will be different
-        // after the merger
-
-        try
-        {
-            File newMd5 = new File( existingMetadata.getParentFile(), MAVEN_METADATA + ".md5" + IN_PROCESS_MARKER );
-
-            FileUtils.fileWrite( newMd5.getAbsolutePath(), checksum( existingMetadata, MD5 ) );
-
-            File oldMd5 = new File( existingMetadata.getParentFile(), MAVEN_METADATA + ".md5" );
-
-            oldMd5.delete();
-
-            File newSha1 = new File( existingMetadata.getParentFile(), MAVEN_METADATA + ".sha1" + IN_PROCESS_MARKER );
-
-            FileUtils.fileWrite( newSha1.getAbsolutePath(), checksum( existingMetadata, SHA1 ) );
-
-            File oldSha1 = new File( existingMetadata.getParentFile(), MAVEN_METADATA + ".sha1" );
-
-            oldSha1.delete();
-        }
-        catch ( NoSuchAlgorithmException e )
+        try ( Reader existingMetadataReader = Files.newBufferedReader( 
+                existingMetadata.toPath(), StandardCharsets.UTF_8 ) )
         {
-            throw new RuntimeException( e );
+            Metadata existing = metadataReader.read( existingMetadataReader );
+    
+            // Staged Metadata  
+            File stagedMetadataFile = new File( existingMetadata.getParentFile(), MAVEN_METADATA );
+    
+            try ( Reader stagedMetadataReader = Files.newBufferedReader( stagedMetadataFile.toPath(), StandardCharsets.UTF_8 ) )
+            {
+                Metadata staged = metadataReader.read( stagedMetadataReader );
+                existing.merge( staged );
+            }
+            
+            try ( Writer writer = Files.newBufferedWriter( existingMetadata.toPath(), StandardCharsets.UTF_8 ) )
+            {
+                metadataWriter.write( writer, existing );
+            }
+            
+            // Mark all metadata as in-process and regenerate the checksums as they will be different
+            // after the merger
+            try
+            {
+                File newMd5 = new File( existingMetadata.getParentFile(), MAVEN_METADATA + ".md5" + IN_PROCESS_MARKER );
+    
+                FileUtils.write( newMd5, checksum( existingMetadata, MD5 ), StandardCharsets.UTF_8 );
+    
+                File oldMd5 = new File( existingMetadata.getParentFile(), MAVEN_METADATA + ".md5" );
+    
+                oldMd5.delete();
+    
+                File newSha1 = new File( existingMetadata.getParentFile(), MAVEN_METADATA + ".sha1" + IN_PROCESS_MARKER );
+    
+                FileUtils.write( newSha1, checksum( existingMetadata, SHA1 ), StandardCharsets.UTF_8 );
+    
+                File oldSha1 = new File( existingMetadata.getParentFile(), MAVEN_METADATA + ".sha1" );
+    
+                oldSha1.delete();
+            }
+            catch ( NoSuchAlgorithmException e )
+            {
+                throw new RuntimeException( e );
+            }
+    
+            // We have the new merged copy so we're good
+            stagedMetadataFile.delete();
         }
-
-        // We have the new merged copy so we're good
-
-        stagedMetadataFile.delete();
     }
 
     private String checksum( File file, String type )
         throws IOException, NoSuchAlgorithmException
     {
         MessageDigest md5 = MessageDigest.getInstance( type );
-
-        InputStream is = new FileInputStream( file );
-
         // CHECKSTYLE_OFF: MagicNumber
         byte[] buf = new byte[8192];
         // CHECKSTYLE_ON: MagicNumber
 
-        int i;
-
-        while ( ( i = is.read( buf ) ) >= 0 )
+        try ( InputStream is = new FileInputStream( file ) )
         {
-            md5.update( buf, 0, i );
+            int i;
+            while ( ( i = is.read( buf ) ) >= 0 )
+            {
+                md5.update( buf, 0, i );
+            }
         }
 
-        is.close();
-
         return encode( md5.digest() );
     }
 
@@ -454,6 +417,7 @@ public class DefaultRepositoryCopier
     }
 
     private void scan( Wagon wagon, String basePath, List<String> collected )
+        throws TransferFailedException, AuthorizationException
     {
         try
         {
@@ -473,49 +437,24 @@ public class DefaultRepositoryCopier
                 }
             }
         }
-        catch ( TransferFailedException e )
-        {
-            throw new RuntimeException( e );
-        }
         catch ( ResourceDoesNotExistException e )
         {
-            // is thrown when calling getFileList on a file
+            // thrown when calling getFileList on a file
             collected.add( basePath );
         }
-        catch ( AuthorizationException e )
-        {
-            throw new RuntimeException( e );
-        }
-
     }
 
     protected List<String> scanForArtifactPaths( ArtifactRepository repository )
+        throws WagonException
     {
-        List<String> collected;
-        try
-        {
-            Wagon wagon = wagonManager.getWagon( repository.getProtocol() );
-            Repository artifactRepository = new Repository( repository.getId(), repository.getUrl() );
-            wagon.connect( artifactRepository );
-            collected = new ArrayList<String>();
-            scan( wagon, "/", collected );
-            wagon.disconnect();
-
-            return collected;
-
-        }
-        catch ( UnsupportedProtocolException e )
-        {
-            throw new RuntimeException( e );
-        }
-        catch ( ConnectionException e )
-        {
-            throw new RuntimeException( e );
-        }
-        catch ( AuthenticationException e )
-        {
-            throw new RuntimeException( e );
-        }
+        Wagon wagon = wagonManager.getWagon( repository.getProtocol() );
+        Repository artifactRepository = new Repository( repository.getId(), repository.getUrl() );
+        wagon.connect( artifactRepository );
+        List<String> collected = new ArrayList<>();
+        scan( wagon, "/", collected );
+        wagon.disconnect();
+
+        return collected;
     }
 
     public void enableLogging( Logger logger )