You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wagon-commits@maven.apache.org by br...@apache.org on 2008/05/27 08:42:19 UTC

svn commit: r660403 - in /maven/wagon/trunk/wagon-providers/wagon-ssh/src: main/java/org/apache/maven/wagon/providers/ssh/jsch/ test/java/org/apache/maven/wagon/providers/ssh/jsch/

Author: brett
Date: Mon May 26 23:42:08 2008
New Revision: 660403

URL: http://svn.apache.org/viewvc?rev=660403&view=rev
Log:
[WAGON-179] convert directory copy in SFTP to use all SFTP operations

Modified:
    maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java
    maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonTest.java
    maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonWithSshPrivateKeySearchTest.java
    maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagonTest.java

Modified: maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java?rev=660403&r1=660402&r2=660403&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagon.java Mon May 26 23:42:08 2008
@@ -19,10 +19,8 @@
  * under the License.
  */
 
-import com.jcraft.jsch.ChannelSftp;
-import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.SftpATTRS;
-import com.jcraft.jsch.SftpException;
+import java.io.File;
+
 import org.apache.maven.wagon.PathUtils;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
 import org.apache.maven.wagon.TransferFailedException;
@@ -31,7 +29,10 @@
 import org.apache.maven.wagon.repository.RepositoryPermissions;
 import org.apache.maven.wagon.resource.Resource;
 
-import java.io.File;
+import com.jcraft.jsch.ChannelSftp;
+import com.jcraft.jsch.JSchException;
+import com.jcraft.jsch.SftpATTRS;
+import com.jcraft.jsch.SftpException;
 
 /**
  * SFTP protocol wagon.
@@ -59,8 +60,6 @@
         String resourceName = resource.getName();
         String dir = getResourceDirectory( resourceName );
 
-        String filename = getResourceFilename( resourceName );
-
         ChannelSftp channel = null;
 
         try
@@ -73,29 +72,13 @@
 
             int directoryMode = getDirectoryMode( permissions );
 
-            mkdirs( channel, basedir, directoryMode );
-
+            mkdir( channel, basedir, directoryMode );
+            
             channel.cd( basedir );
-
+            
             mkdirs( channel, resourceName, directoryMode );
 
-            firePutStarted( resource, source );
-
-            channel.put( source.getAbsolutePath(), filename );
-
-            postProcessListeners( resource, source, TransferEvent.REQUEST_PUT );
-
-            if ( permissions != null && permissions.getGroup() != null )
-            {
-                setGroup( channel, filename, permissions );
-            }
-
-            if ( permissions != null && permissions.getFileMode() != null )
-            {
-                setFileMode( channel, filename, permissions );
-            }
-
-            firePutCompleted( resource, source );
+            putFile( channel, source, resource, permissions );
 
             String[] dirs = PathUtils.dirnames( dir );
             for ( int i = 0; i < dirs.length; i++ )
@@ -126,6 +109,34 @@
         }
     }
 
+    private void putFile( ChannelSftp channel, File source, Resource resource, RepositoryPermissions permissions )
+        throws SftpException, TransferFailedException
+    {
+        resource.setContentLength( source.length() );
+        
+        resource.setLastModified( source.lastModified() );
+        
+        String filename = getResourceFilename( resource.getName() );
+
+        firePutStarted( resource, source );
+
+        channel.put( source.getAbsolutePath(), filename );
+
+        postProcessListeners( resource, source, TransferEvent.REQUEST_PUT );
+
+        if ( permissions != null && permissions.getGroup() != null )
+        {
+            setGroup( channel, filename, permissions );
+        }
+
+        if ( permissions != null && permissions.getFileMode() != null )
+        {
+            setFileMode( channel, filename, permissions );
+        }
+
+        firePutCompleted( resource, source );
+    }
+
     private void setGroup( ChannelSftp channel, String filename, RepositoryPermissions permissions )
         throws SftpException
     {
@@ -220,8 +231,13 @@
 
             SftpATTRS attrs = changeToRepositoryDirectory( channel, dir, filename );
 
-            if ( timestamp <= 0 || attrs.getMTime() * MILLIS_PER_SEC > timestamp )
+            long lastModified = attrs.getMTime() * MILLIS_PER_SEC;
+            if ( timestamp <= 0 || lastModified > timestamp )
             {
+                resource.setContentLength( attrs.getSize() );
+                
+                resource.setLastModified( lastModified );
+                
                 fireGetStarted( resource, destination );
 
                 channel.get( filename, destination.getAbsolutePath() );
@@ -315,4 +331,95 @@
 
         return getIfNewer( resource, destination, timestamp );
     }
+
+    public void putDirectory( File sourceDirectory, String destinationDirectory )
+        throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException
+    {
+        final RepositoryPermissions permissions = repository.getPermissions();
+
+        ChannelSftp channel = null;
+
+        try
+        {
+            channel = (ChannelSftp) session.openChannel( SFTP_CHANNEL );
+
+            channel.connect();
+
+            channel.cd( "/" );
+            
+            mkdirs( channel, getRepository().getBasedir(), getDirectoryMode( permissions ) );
+
+            fireTransferDebug( "Recursively uploading directory " + sourceDirectory.getAbsolutePath() + " as "
+                + destinationDirectory );
+            ftpRecursivePut( channel, sourceDirectory, destinationDirectory );
+        }
+        catch ( SftpException e )
+        {
+            String msg =
+                "Error occured while deploying '" + sourceDirectory.getAbsolutePath() + "' " + "to remote repository: "
+                    + getRepository().getUrl();
+
+            throw new TransferFailedException( msg, e );
+        }
+        catch ( JSchException e )
+        {
+            String msg =
+                "Error occured while deploying '" + sourceDirectory.getAbsolutePath() + "' " + "to remote repository: "
+                    + getRepository().getUrl();
+
+            throw new TransferFailedException( msg, e );
+        }
+        finally
+        {
+            if ( channel != null )
+            {
+                channel.disconnect();
+            }
+        }
+    }
+
+    private void ftpRecursivePut( ChannelSftp channel, File sourceFile, String fileName )
+        throws TransferFailedException, SftpException
+    {
+        final RepositoryPermissions permissions = repository.getPermissions();
+
+        if ( sourceFile.isDirectory() )
+        {
+            if ( !fileName.equals( "." ) )
+            {
+                mkdirs( channel, fileName, getDirectoryMode( permissions ) );
+            }
+
+            File[] files = sourceFile.listFiles();
+            if ( files != null && files.length > 0 )
+            {
+                // Directories first, then files. Let's go deep early.
+                for ( int i = 0; i < files.length; i++ )
+                {
+                    if ( files[i].isDirectory() )
+                    {
+                        ftpRecursivePut( channel, files[i], fileName + "/" + files[i].getName() );
+                    }
+                }
+                for ( int i = 0; i < files.length; i++ )
+                {
+                    if ( !files[i].isDirectory() )
+                    {
+                        ftpRecursivePut( channel, files[i], fileName + "/" + files[i].getName() );
+                    }
+                }
+            }
+
+            // Step back up a directory once we're done with the contents of this one.
+            channel.cd( ".." );
+        }
+        else
+        {
+            Resource resource = getResource( fileName );
+
+            firePutInitiated( resource, sourceFile );
+
+            putFile( channel, sourceFile, resource, permissions );
+        }
+    }
 }

Modified: maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonTest.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonTest.java?rev=660403&r1=660402&r2=660403&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonTest.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonTest.java Mon May 26 23:42:08 2008
@@ -22,6 +22,8 @@
 import org.apache.maven.wagon.WagonTestCase;
 import org.apache.maven.wagon.authentication.AuthenticationInfo;
 import org.apache.maven.wagon.providers.ssh.TestData;
+import org.apache.maven.wagon.repository.Repository;
+import org.apache.maven.wagon.resource.Resource;
 
 import java.io.File;
 
@@ -60,4 +62,9 @@
         return authInfo;
     }
 
+    protected long getExpectedLastModifiedOnGet( Repository repository, Resource resource )
+    {
+        return 0;
+    }
+
 }

Modified: maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonWithSshPrivateKeySearchTest.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonWithSshPrivateKeySearchTest.java?rev=660403&r1=660402&r2=660403&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonWithSshPrivateKeySearchTest.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/ScpWagonWithSshPrivateKeySearchTest.java Mon May 26 23:42:08 2008
@@ -22,6 +22,8 @@
 import org.apache.maven.wagon.WagonTestCase;
 import org.apache.maven.wagon.authentication.AuthenticationInfo;
 import org.apache.maven.wagon.providers.ssh.TestData;
+import org.apache.maven.wagon.repository.Repository;
+import org.apache.maven.wagon.resource.Resource;
 
 /**
  * @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
@@ -52,5 +54,8 @@
         return authInfo;
     }
 
-
+    protected long getExpectedLastModifiedOnGet( Repository repository, Resource resource )
+    {
+        return 0;
+    }
 }

Modified: maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagonTest.java
URL: http://svn.apache.org/viewvc/maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagonTest.java?rev=660403&r1=660402&r2=660403&view=diff
==============================================================================
--- maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagonTest.java (original)
+++ maven/wagon/trunk/wagon-providers/wagon-ssh/src/test/java/org/apache/maven/wagon/providers/ssh/jsch/SftpWagonTest.java Mon May 26 23:42:08 2008
@@ -19,9 +19,13 @@
  * under the License.
  */
 
+import java.io.File;
+
 import org.apache.maven.wagon.WagonTestCase;
 import org.apache.maven.wagon.authentication.AuthenticationInfo;
 import org.apache.maven.wagon.providers.ssh.TestData;
+import org.apache.maven.wagon.repository.Repository;
+import org.apache.maven.wagon.resource.Resource;
 
 /**
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
@@ -49,4 +53,8 @@
         return authInfo;
     }
 
+    protected long getExpectedLastModifiedOnGet( Repository repository, Resource resource )
+    {
+        return new File( repository.getBasedir(), resource.getName() ).lastModified();
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: wagon-commits-unsubscribe@maven.apache.org
For additional commands, e-mail: wagon-commits-help@maven.apache.org