Added flush() method to Deployer

SCP delpoyer now creates zip, delpoys and then unzip 
(need to check how portable accross variuos Unixes this code is)


git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@113775 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
michal 2003-08-02 22:51:45 +00:00
parent bcb182e08c
commit 3e02e85271
7 changed files with 395 additions and 55 deletions

View File

@ -1,4 +1,7 @@
package org.apache.maven.deploy.deployers;
import org.apache.maven.deploy.exceptions.TransferFailedException;
/* ====================================================================
* The Apache Software License, Version 1.1
*
@ -60,9 +63,11 @@ package org.apache.maven.deploy.deployers;
*
* @author <a href="mailto:jason@zenplex.com">Jason van Zyl</a>
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: AbstractDeployer.java,v 1.1 2003/06/17 22:05:59 michal Exp $
* @version $Id: AbstractDeployer.java,v 1.2 2003/08/02 22:48:39 michal Exp $
*/
public abstract class AbstractDeployer implements Deployer
{
public void flush() throws TransferFailedException
{
}
}

View File

@ -1,9 +1,6 @@
package org.apache.maven.deploy.deployers;
import org.apache.maven.deploy.RepositoryInfo;
import org.apache.maven.deploy.DeployRequest;
import org.apache.maven.deploy.exceptions.AuthenticationException;
import org.apache.maven.deploy.exceptions.TransferFailedException;
/* ====================================================================
* The Apache Software License, Version 1.1
@ -60,45 +57,53 @@ import org.apache.maven.deploy.exceptions.TransferFailedException;
*
* ====================================================================
*/
import org.apache.maven.deploy.RepositoryInfo;
import org.apache.maven.deploy.exceptions.AuthenticationException;
import org.apache.maven.deploy.exceptions.TransferFailedException;
/**
*
* Common interface for classes capable of uploading a file to remote host
*
* Common interface for classes capable of uploading a file to remote host
*
* @author <a href="mailto:michl.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: Deployer.java,v 1.3 2003/07/17 11:13:16 michal Exp $
* @version $Id: Deployer.java,v 1.4 2003/08/02 22:48:39 michal Exp $
*/
public interface Deployer
{
/**
* Set the information about host to which we will deploy.
* In this method deployer can allocate the resources which will
* In this method deployer can allocate the resources which will
* be needed to perform an upload. E.g. connection to remote host
* can be opened,
* can be opened,
* Resources allocated in this metod should
* be release when deloyer is not needed any more
* @see #release()
* @see #release()
*
* @param repoInfo
* @throws AuthenticationException when connection to remote host cannot be established
*/
public void init(RepositoryInfo repoInfo)
public void init( RepositoryInfo repoInfo )
throws AuthenticationException;
/**
* Release all resources which were allocated
* Release all resources which were allocated
* by this deployer (e.g. a connection to remote host)
*
*/
public void release();
public void release( );
/**
* Perform an upload of single file to remote host
* @param request <code>DeployRequest</code> which should contatin all parameters
* which are necessery to upload a file
* to remote host.
* to remote host.
*/
public void deploy(DeployRequest request) throws TransferFailedException;
public void deploy( DeployRequest request )
throws TransferFailedException;
/**
*
*/
public void flush() throws TransferFailedException;
}

View File

@ -69,9 +69,9 @@ import org.apache.maven.deploy.exceptions.TransferFailedException;
* file system.
*
* @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: FileDeployer.java,v 1.8 2003/07/17 11:13:17 michal Exp $
* @version $Id: FileDeployer.java,v 1.9 2003/08/02 22:48:39 michal Exp $
*/
public class FileDeployer implements Deployer
public class FileDeployer extends AbstractDeployer
{
private RepositoryInfo repoInfo;

View File

@ -79,7 +79,7 @@ import com.jcraft.jsch.UserInfo;
* and if that doesn't work then we fall back
* to using the login and password
*
* @version $Id: GenericSshDeployer.java,v 1.5 2003/07/18 07:37:17 bwalding Exp $
* @version $Id: GenericSshDeployer.java,v 1.6 2003/08/02 22:48:39 michal Exp $
* @todo still have to account for differing setups for people deploying to
* their own sites and to the central repository.
* @todo improve exception handling
@ -108,7 +108,7 @@ public abstract class GenericSshDeployer extends AbstractDeployer
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#getAuthenticationInfo()
*/
public RepositoryInfo getAuthenticationInfo()
public RepositoryInfo getRepositoryInfo()
{
return repoInfo;
}

View File

@ -71,7 +71,7 @@ import com.jcraft.jsch.SftpProgressMonitor;
* An SSH2/SFTP deployer
*
* @author Michal Maczka
* @version $Revision: 1.6 $ $Date: 2003/07/17 11:13:17 $
* @version $Revision: 1.7 $ $Date: 2003/08/02 22:48:39 $
*/
public class SFtpDeployer extends GenericSshDeployer
{
@ -166,7 +166,7 @@ public class SFtpDeployer extends GenericSshDeployer
}
}
if (getAuthenticationInfo().isDebugOn())
if (getRepositoryInfo().isDebugOn())
{
channel.put(
request.getSrcFile(),
@ -182,12 +182,12 @@ public class SFtpDeployer extends GenericSshDeployer
if (groupId != null)
{
if (getAuthenticationInfo().isDebugOn())
if (getRepositoryInfo().isDebugOn())
{
System.out.println("Changing group to: " + groupId);
}
channel.chgrp(groupId.intValue(), request.getDestFile());
if (getAuthenticationInfo().isDebugOn())
if (getRepositoryInfo().isDebugOn())
{
System.out.println("Group successfully changed");
}
@ -204,7 +204,7 @@ public class SFtpDeployer extends GenericSshDeployer
String msg =
"Error occured while deploying to remote host:"
+ getAuthenticationInfo().getHost()
+ getRepositoryInfo().getHost()
+ ":"
+ e.getMessage();
throw new TransferFailedException(msg, e);

View File

@ -1,5 +1,4 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* The Apache Software License, Version 1.1
*
@ -56,22 +55,29 @@ package org.apache.maven.deploy.deployers;
* ====================================================================
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.maven.deploy.DeployRequest;
import org.apache.maven.deploy.exceptions.TransferFailedException;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.Session;
import org.apache.maven.deploy.DeployRequest;
import org.apache.maven.deploy.RepositoryInfo;
import org.apache.maven.deploy.exceptions.AuthenticationException;
import org.apache.maven.deploy.exceptions.TransferFailedException;
import org.apache.maven.deploy.util.Packager;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.LinkedList;
import java.util.List;
/**
* An SSH2/SCP deployer
*
* An SSH2/SCP deployer
*
* @author Michal Maczka
* @version $Revision: 1.5 $ $Date: 2003/07/17 11:13:17 $
* @version $Revision: 1.6 $ $Date: 2003/08/02 22:48:39 $
*/
public class ScpDeployer extends GenericSshDeployer
{
@ -80,54 +86,216 @@ public class ScpDeployer extends GenericSshDeployer
/** SSH2 Channel name used to communicate with the server*/
public final static String EXEC_CHANNEL = "exec";
public final static String COMPRESS = "maven.deployer.scp.compress";
/**
* I want to have compression by default
* so if system property is missing flag will be set to false
* that's why I am using deployNotCompressed variable name instead of
* straight forward deployCompressed
*/
public boolean deployNotCompressed = true;
private List srcFiles = new LinkedList();
private List destFiles = new LinkedList();
/**
* @see org.apache.maven.deploy.deployers.Deployer#release()
*/
public void flush() throws TransferFailedException
{
if (!deployNotCompressed)
{
doDeployCompressed();
}
super.flush();
}
/**
* @return
*/
public boolean isDeployNotCompressed()
{
return deployNotCompressed;
}
/**
* @param deployCompressed
*/
public void setDeployNotCompressed(boolean deployNotCompressed)
{
this.deployNotCompressed = deployNotCompressed;
}
/**
* @todo Find better way to configure deployer
* @see org.apache.maven.deploy.deployers.Deployer#init(org.apache.maven.deploy.RepositoryInfo)
*/
public void init(RepositoryInfo repoInfo) throws AuthenticationException
{
setDeployNotCompressed(Boolean.getBoolean(COMPRESS));
super.init(repoInfo);
}
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#deploy(org.apache.maven.deploy.DeployRequest)
*/
public void deploy(DeployRequest request) throws TransferFailedException
{
if (deployNotCompressed)
{
doDeployNotCompressed(request);
}
else
{
srcFiles.add(request.getSrcFile());
destFiles.add(request.getDestFile());
}
}
/**
* @see Deployer#deploy(DeployRequest)
*
*/
public void deploy(DeployRequest request) throws TransferFailedException
{
public void doDeployNotCompressed(DeployRequest request)
throws TransferFailedException
{
Session session = getSession();
String mkdirCmd =
"mkdir -p "
+ getAuthenticationInfo().getBasedir()
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.dirname()
+ "\n";
executeSimpleCommand(session, mkdirCmd);
doCopy(session, request);
if (getAuthenticationInfo().getGroup() != null)
{
if (getRepositoryInfo().getGroup() != null)
{
String chgrpCmd =
"chgrp "
+ getAuthenticationInfo().getGroup()
+ getRepositoryInfo().getGroup()
+ " "
+ getAuthenticationInfo().getBasedir()
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.getDestFile()
+ "\n";
executeSimpleCommand(session, chgrpCmd);
}
}
/**
* Execute <i>"simple"</i> remote command using exec channel
* @see Deployer#deploy(DeployRequest)
*
*/
public void doDeployCompressed() throws TransferFailedException
{
Session session = getSession();
File zip = null;
try
{
zip = File.createTempFile("maven-deployer-", ".zip");
Packager.createZip(srcFiles, destFiles, zip);
}
catch (IOException e)
{
if ((zip != null) && zip.exists())
{
try
{
zip.delete();
}
catch (Exception ee)
{
// ignore
// file is left in temp directory
// no tragedy
}
}
throw new TransferFailedException("Cannot create ZIP file");
}
try
{
DeployRequest request =
new DeployRequest(zip.getAbsolutePath(), zip.getName());
doCopy(session, request);
String unzipCmd =
"unzip -d -u "
+ getRepositoryInfo().getBasedir()
+ " "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.getDestFile()
+ "\n";
executeSimpleCommand(session, unzipCmd);
//@ this is not working!
String rmCmd =
"rm -f "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.getDestFile()
+ "\n";
executeSimpleCommand(session, rmCmd);
if (getRepositoryInfo().getGroup() != null)
{
String chgrpCmd =
"chgrp -r"
+ getRepositoryInfo().getGroup()
+ " "
+ getRepositoryInfo().getBasedir()
+ "\n";
executeSimpleCommand(session, chgrpCmd);
}
}
finally
{
if ((zip != null) && zip.exists())
{
try
{
zip.delete();
}
catch (Exception ee)
{
// ignore
// file is left in temp directory
// no tragedy
}
}
}
}
/**
* Execute <i>"simple"</i> remote command using exec channel
*/
private void executeSimpleCommand(Session session, String command)
throws TransferFailedException
{
System.out.println("Executing command: " + command);
ChannelExec channel = null;
try
{
channel = (ChannelExec) session.openChannel(EXEC_CHANNEL);
channel.setCommand(command);
OutputStream out = channel.getOutputStream();
InputStream in = channel.getInputStream();
channel.connect();
}
catch (Exception e)
@ -151,23 +319,25 @@ public class ScpDeployer extends GenericSshDeployer
private void doCopy(Session session, DeployRequest request)
throws TransferFailedException
{
ChannelExec channel = null;
try
{
String srcFile = request.getSrcFile();
String destFile =
getAuthenticationInfo().getBasedir()
+ "/"
+ request.getDestFile();
getRepositoryInfo().getBasedir() + "/" + request.getDestFile();
// exec 'scp -t rfile' remotely
String command = "scp -t " + destFile;
System.out.println("Executing command: " + command);
channel = (ChannelExec) session.openChannel(EXEC_CHANNEL);
channel.setCommand(command);
// get I/O streams for remote scp
OutputStream out = channel.getOutputStream();
InputStream in = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1];
@ -181,7 +351,9 @@ public class ScpDeployer extends GenericSshDeployer
// send "C0644 filesize filename", where filename should not include '/'
int filesize = (int) (new File(srcFile)).length();
command = "C0644 " + filesize + " ";
if (srcFile.lastIndexOf('/') > 0)
{
command += srcFile.substring(srcFile.lastIndexOf('/') + 1);
@ -190,6 +362,7 @@ public class ScpDeployer extends GenericSshDeployer
{
command += srcFile;
}
command += "\n";
out.write(command.getBytes());
@ -205,11 +378,16 @@ public class ScpDeployer extends GenericSshDeployer
// send a content of inputFile
FileInputStream fis = new FileInputStream(srcFile);
byte[] buf = new byte[1024];
while (true)
{
int len = fis.read(buf, 0, buf.length);
if (len <= 0)
{
break;
}
out.write(buf, 0, len);
out.flush();
}
@ -230,7 +408,8 @@ public class ScpDeployer extends GenericSshDeployer
{
String msg =
"Error occured while deploying to remote host:"
+ getAuthenticationInfo().getHost();
+ getRepositoryInfo().getHost();
throw new TransferFailedException(msg, e);
}
finally
@ -241,5 +420,4 @@ public class ScpDeployer extends GenericSshDeployer
}
}
}
}

View File

@ -0,0 +1,152 @@
package org.apache.maven.deploy.util;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
*
* @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: Packager.java,v 1.1 2003/08/02 22:51:45 michal Exp $
*/
public class Packager
{
/**
*
* @param inputFiles
* @param outputFiles
* @param archive
* @throws IOException
*/
public static void createZip( List srcFiles, List destFiles, String archive )
throws IOException
{
createZip( srcFiles, destFiles, new File( archive ) );
}
/**
*
* @param inputFiles
* @param outputFiles
* @param archive
* @throws IOException
*/
public static void createZip( List srcFiles, List destFiles, File archive )
throws IOException
{
byte[] buf = new byte[1024];
ZipOutputStream out = null;
try
{
out = new ZipOutputStream( new FileOutputStream( archive ) );
out.setLevel( Deflater.BEST_COMPRESSION );
out.setMethod( ZipOutputStream.DEFLATED );
Iterator iter1 = srcFiles.iterator( );
Iterator iter2 = destFiles.iterator( );
while ( iter1.hasNext( ) )
{
String inputFilename = ( String ) iter1.next( );
String outputFilename = ( String ) iter2.next( );
FileInputStream in = new FileInputStream( inputFilename );
// Add ZIP entry to output stream.
out.putNextEntry( new ZipEntry( outputFilename ) );
// Transfer bytes from the file to the ZIP file
int len;
while ( ( len = in.read( buf ) ) > 0 )
{
out.write( buf, 0, len );
}
// Complete the entry
out.closeEntry( );
in.close( );
}
}
// Complete the ZIP file
finally
{
if ( out != null )
{
try
{
out.close( );
}
catch ( Exception e )
{
}
}
}
}
}