PR: MAVEN-1396

swap out all the old crufty code for Wagon


git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@153328 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
brett committed 2005-02-11 03:11:57 +00:00
1 parent 9b6891b63c
commit 7ada12b288
25 files changed
+411 -3063

No files matched your search

+28 -3
View File
@@ -25,7 +25,7 @@
<name>Maven Artifact Plugin</name>
<!-- WARNING: some dependency checks will break if we get to 1.10, need to go to 2.0 from there -->
<currentVersion>1.4.2-SNAPSHOT</currentVersion>
<currentVersion>1.5-SNAPSHOT</currentVersion>
<description>Tools to manage artifacts and deployment.</description>
<shortDescription>Tools to manage artifacts and deployment</shortDescription>
<url>http://maven.apache.org/reference/plugins/artifact/</url>
@@ -104,7 +104,7 @@
<dependency>
<groupId>jsch</groupId>
<artifactId>jsch</artifactId>
<version>0.1.5</version>
<version>0.1.14</version>
<type>jar</type>
</dependency>
<dependency>
@@ -123,8 +123,33 @@
<dependency>
<groupId>velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.4-dev</version>
<version>1.4</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>maven</groupId>
<artifactId>wagon-provider-api</artifactId>
<version>1.0-alpha-2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>maven</groupId>
<artifactId>wagon-http</artifactId>
<version>1.0-alpha-2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>maven</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>maven</groupId>
<artifactId>wagon-ssh</artifactId>
<version>1.0-alpha-2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>maven</groupId>
<artifactId>wagon-file</artifactId>
<version>1.0-alpha-2-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
@@ -17,28 +17,39 @@ package org.apache.maven.artifact.deployer;
* ====================================================================
*/
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.maven.MavenConstants;
import org.apache.maven.MavenException;
import org.apache.maven.deploy.DeployTool;
import org.apache.maven.deploy.RepositoryInfo;
import org.apache.maven.project.Project;
import org.apache.maven.repository.ArtifactTypeHandler;
import org.apache.maven.repository.DefaultArtifactTypeHandler;
import org.apache.maven.util.MD5Sum;
import org.apache.maven.wagon.ConnectionException;
import org.apache.maven.wagon.ResourceDoesNotExistException;
import org.apache.maven.wagon.TransferFailedException;
import org.apache.maven.wagon.Wagon;
import org.apache.maven.wagon.authentication.AuthenticationException;
import org.apache.maven.wagon.authorization.AuthorizationException;
import org.apache.maven.wagon.providers.file.FileWagon;
import org.apache.maven.wagon.providers.ftp.FtpWagon;
import org.apache.maven.wagon.providers.http.HttpWagon;
import org.apache.maven.wagon.providers.ssh.ScpWagon;
import org.apache.maven.wagon.repository.Repository;
import org.codehaus.plexus.util.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.TimeZone;
/**
*
* Default implementation of Artifact Deployer interface.
@@ -108,8 +119,8 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
handler.constructRepositoryFullPath(type, project, project.getCurrentVersion());
List srcFiles = new ArrayList();
srcFiles.add(file.getAbsolutePath());
srcFiles.add(md5File.getAbsolutePath());
srcFiles.add(file);
srcFiles.add(md5File);
List destFiles = new ArrayList();
destFiles.add(repositoryPath);
@@ -150,10 +161,10 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
createSnapshotVersionFile(file, snapshotSignature, project, type);
try {
List srcFiles = new ArrayList();
srcFiles.add(file.getAbsolutePath());
srcFiles.add(md5File.getAbsolutePath());
srcFiles.add(file.getAbsolutePath());
srcFiles.add(md5File.getAbsolutePath());
srcFiles.add(file);
srcFiles.add(md5File);
srcFiles.add(file);
srcFiles.add(md5File);
String snapshotFilename =
handler.constructRepositoryFullPath(
@@ -169,7 +180,7 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
destFiles.add(timestampedFilename);
destFiles.add(timestampedFilename + ".md5");
srcFiles.add(snapshotVersionFile.getAbsolutePath());
srcFiles.add(snapshotVersionFile);
String snapshotVersionsFilename =
handler.constructRepositoryDirectoryPath(type, project)
@@ -254,7 +265,7 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
/**
* Install given file in local repository
* @param artifact the artifact file to install
* @param file the artifact file to install
* @param type The type of the artiafct
* @param project
* @param version String denominating the version of the artifact
@@ -331,18 +342,9 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
return null;
}
/**
* @param artifact
* @param type
* @param project
* @param snapshot
*/
private void doDeploy(List srcFiles, List destFiles, Project project)
throws MavenException
{
DeployTool deployTool = new DeployTool();
// trick add special values to context for default repository;
String repoStr =
@@ -381,24 +383,20 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
String repo = repos[i].trim();
LOG.info("Deploying to repository: " + repo);
RepositoryInfo repoInfo = null;
Repository repository = RepositoryBuilder.getRepository(project, repo);
try
{
repoInfo =
RepositoryInfoBuilder.getRepositoryInfo(project, repo);
deployTool.deploy(repoInfo, srcFiles, destFiles);
deployFiles( repository, srcFiles, destFiles );
success = true;
}
catch (Exception e)
{
String msg =
"Failed to deploy to: "
+ repoInfo.getRepositoryAlias()
+ repository.getId()
+ " Reason: "
+ e.getMessage();
LOG.warn(msg);
LOG.debug(e);
+ e;
LOG.warn(msg, e);
// deploy to next repository
continue;
}
@@ -409,6 +407,71 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
}
}
private void deployFiles( Repository repository, List srcFiles, List destFiles )
throws ConnectionException, AuthenticationException, ResourceDoesNotExistException, TransferFailedException,
AuthorizationException, MalformedURLException
{
if (srcFiles.size() != destFiles.size())
{
String msg = "Lengths of the lists should be the same";
throw new IllegalArgumentException(msg);
}
Wagon wagon = getWagon( repository.getProtocol() );
wagon.addTransferListener( new UploadMeter());
try
{
wagon.connect( repository );
Iterator srcIterator = srcFiles.iterator();
Iterator destIterator = destFiles.iterator();
while (srcIterator.hasNext())
{
File srcFile = (File) srcIterator.next();
String destFile = (String) destIterator.next();
wagon.put( srcFile, destFile );
}
}
finally
{
try
{
wagon.disconnect();
}
catch (Exception e)
{
LOG.error("Error cleaning up from the deployer", e);
}
}
}
private Wagon getWagon( String protocol )
throws MalformedURLException
{
// TODO: implement others (SFTP, SCPEXE)
if ( protocol.equals( "http" ) )
{
return new HttpWagon();
}
else if ( protocol.equals( "ftp" ) )
{
return new FtpWagon();
}
else if ( protocol.equals( "file" ) )
{
return new FileWagon();
}
else if ( protocol.equals( "scp" ) )
{
return new ScpWagon();
}
else
{
throw new MalformedURLException( "Unknown Wagon protocol: " + protocol );
}
}
/**
* Return the local repository path form given project
* @param project
@@ -491,7 +554,7 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
/**
* Create MD5 checksum file for given file. File is created
* in the same folder
* @param File
* @param file
* @return The <code>File</code> which contatins MD5 checksum
* @throws MavenException when opertaion failed
*/
@@ -18,8 +18,6 @@ package org.apache.maven.artifact.deployer;
*/
import org.apache.maven.MavenException;
import org.apache.maven.artifact.deployer.ArtifactDeployer;
import org.apache.maven.artifact.deployer.DefaultArtifactDeployer;
import org.apache.maven.project.Project;
import org.apache.maven.repository.ArtifactTypeHandler;
import org.apache.maven.repository.DefaultArtifactTypeHandler;
@@ -30,7 +28,7 @@ import org.apache.maven.repository.DefaultArtifactTypeHandler;
* from jelly scripts.
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: DeployBean.java,v 1.6 2004/06/23 13:04:28 brett Exp $
* @version $Id$
*/
public class DeployBean
{
@@ -0,0 +1,180 @@
package org.apache.maven.artifact.deployer;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import org.apache.maven.project.Project;
import org.apache.maven.wagon.repository.Repository;
import org.apache.maven.wagon.repository.RepositoryPermissions;
import org.apache.maven.wagon.authentication.AuthenticationInfo;
import org.apache.maven.wagon.proxy.ProxyInfo;
import org.apache.maven.MavenConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.net.MalformedURLException;
/**
* Perform mapping between project's properties and attributes of Wagon Repository class.
*
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @version $Id$
*/
public class RepositoryBuilder
{
private static final Log LOG = LogFactory.getLog( RepositoryBuilder.class );
public static Repository getRepository( Project project, String id )
{
String url = (String) project.getContext().getVariable( "maven.repo." + id );
Repository repository = new Repository( id, url );
String username = (String) project.getContext().getVariable( "maven.repo." + id + ".username" );
String password = (String) project.getContext().getVariable( "maven.repo." + id + ".password" );
String passphrase = (String) project.getContext().getVariable( "maven.repo." + id + ".passphrase" );
String privateKey = (String) project.getContext().getVariable( "maven.repo." + id + ".privatekey" );
if ( username == null )
{
username = (String) project.getContext().getVariable( "maven.username" );
}
AuthenticationInfo authenticationInfo = new AuthenticationInfo();
authenticationInfo.setUserName( username );
authenticationInfo.setPassword( password );
authenticationInfo.setPrivateKey( privateKey );
authenticationInfo.setPassphrase( passphrase );
repository.setAuthenticationInfo( authenticationInfo );
String dir = (String) project.getContext().getVariable( "maven.repo." + id + ".directory" );
repository.setBasedir( dir );
String port = (String) project.getContext().getVariable( "maven.repo." + id + ".port" );
if ( port != null )
{
try
{
repository.setPort( Integer.valueOf( port ).intValue() );
}
catch ( NumberFormatException e )
{
LOG.warn("Invalid format for port: " + port);
}
}
String remoteGroup = (String) project.getContext().getVariable( "maven.repo." + id + ".group" );
String remoteMode = (String) project.getContext().getVariable( "maven.repo." + id + ".mode" );
String remoteDirectoryMode = (String) project.getContext().getVariable( "maven.repo." + id + ".directory.mode" );
if ( remoteMode == null )
{
remoteMode = "g+w";
}
if ( remoteDirectoryMode == null )
{
remoteDirectoryMode = remoteMode;
}
RepositoryPermissions permissions = new RepositoryPermissions();
permissions.setDirectoryMode( remoteDirectoryMode );
permissions.setFileMode( remoteMode );
permissions.setGroup( remoteGroup );
repository.setPermissions( permissions );
// TODO: provider specific settings
/*
String passiveModeOn = (String) project.getContext().getVariable( "maven.repo." + id + ".passiveModeOn" );
String compress = (String) project.getContext().getVariable( "maven.repo." + id + ".compress" );
String scpExe = (String) project.getContext().getVariable( "maven.repo." + id + ".scp.executable" );
if ( scpExe == null )
{
scpExe = (String) project.getContext().getVariable( "maven.scp.executable" );
}
String scpArgs = (String) project.getContext().getVariable( "maven.repo." + id + ".scp.args" );
if ( scpArgs == null )
{
scpArgs = (String) project.getContext().getVariable( "maven.scp.args" );
}
String sshExe = (String) project.getContext().getVariable( "maven.repo." + id + ".ssh.executable" );
if ( sshExe == null )
{
sshExe = (String) project.getContext().getVariable( "maven.ssh.executable" );
}
String sshArgs = (String) project.getContext().getVariable( "maven.repo." + id + ".ssh.args" );
if ( sshArgs == null )
{
sshArgs = (String) project.getContext().getVariable( "maven.ssh.args" );
}
if ( passiveModeOn != null )
{
if ( "false".equalsIgnoreCase( passiveModeOn ) )
{
repoInfo.setPassiveModeOn( false );
}
}
if ( compress != null )
{
try
{
repoInfo.setCompress( new Boolean( compress ).booleanValue() );
}
catch ( Exception e )
{
throw new MalformedURLException( "maven.repo." + id + ".compress should be a boolean" );
}
}
*/
return repository;
}
public static void getProxyInfo( Project project )
{
ProxyInfo proxyInfo = new ProxyInfo();
String proxyHost = (String) project.getContext().getProxyHost();
String proxyUser = (String) project.getContext().getProxyUserName();
String proxyPassword = (String) project.getContext().getProxyPassword();
String proxyPort = (String) project.getContext().getProxyPort();
if ( proxyPort != null )
{
try
{
proxyInfo.setPort( Integer.valueOf( proxyPort ).intValue() );
}
catch ( NumberFormatException e )
{
LOG.warn("Invalid format for port: " + proxyPort);
}
}
proxyInfo.setType( "http" );
proxyInfo.setHost( proxyHost );
proxyInfo.setNonProxyHosts( (String) project.getContext().getVariable( "maven.proxy.nonProxyHosts" ));
proxyInfo.setNtlmDomain( (String) project.getContext().getVariable( "maven.proxy.ntlm.domain" ));
proxyInfo.setNtlmHost( (String) project.getContext().getVariable( "maven.proxy.ntlm.host" ));
proxyInfo.setUserName( proxyUser );
proxyInfo.setPassword( proxyPassword );
}
}
@@ -1,202 +0,0 @@
package org.apache.maven.artifact.deployer;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import java.net.MalformedURLException;
import org.apache.maven.deploy.RepositoryInfo;
import org.apache.maven.project.Project;
/**
*
* Perform mapping between project's properties and attributes of DeployRequest class.
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: RepositoryInfoBuilder.java,v 1.9 2004/09/29 10:56:03 brett Exp $
*/
public class RepositoryInfoBuilder
{
/**
*
* @param project. Will lookup the properties in the context of this project
* @param repository The name (alias) of the repository
* like </i>repo1</i> taken from property: <i>maven.deploy.repos= repo1, repo2</i>
* @return Deploy request
* @throws WrongParameterException
*/
public static RepositoryInfo getRepositoryInfo(
Project project,
String repository)
throws MalformedURLException
{
RepositoryInfo repoInfo = new RepositoryInfo();
repoInfo.setRepositoryAlias(repository);
String url =
(String) project.getContext().getVariable(
"maven.repo." + repository);
String username =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".username");
String password =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".password");
String passphrase =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".passphrase");
String privateKey =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".privatekey");
String compress =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".compress");
String dir =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".directory");
String port =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".port");
String remoteGroup =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".group");
String remoteMode =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".mode");
String remoteDirectoryMode =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".directory.mode");
String passiveModeOn =
(String) project.getContext().getVariable(
"maven.repo." + repository + ".passiveModeOn");
String proxyHost = (String) project.getContext().getProxyHost();
String proxyUser = (String) project.getContext().getProxyUserName();
String proxyPassword = (String) project.getContext().getProxyPassword();
String proxyPort = (String) project.getContext().getProxyPort();
String scpExe = (String) project.getContext().getVariable("maven.repo." + repository + ".scp.executable");
if (scpExe == null) {
scpExe = (String) project.getContext().getVariable("maven.scp.executable");
}
String scpArgs = (String) project.getContext().getVariable("maven.repo." + repository + ".scp.args");
if (scpArgs == null) {
scpArgs = (String) project.getContext().getVariable("maven.scp.args");
}
String sshExe = (String) project.getContext().getVariable("maven.repo." + repository + ".ssh.executable");
if (sshExe == null) {
sshExe = (String) project.getContext().getVariable("maven.ssh.executable");
}
String sshArgs = (String) project.getContext().getVariable("maven.repo." + repository + ".ssh.args");
if (sshArgs == null) {
sshArgs = (String) project.getContext().getVariable("maven.ssh.args");
}
if (username == null) {
username = (String) project.getContext().getVariable("maven.username");
}
if (remoteMode == null) {
remoteMode = "g+w";
}
if (remoteDirectoryMode == null) {
remoteDirectoryMode = remoteMode;
}
repoInfo.setUserName(username);
repoInfo.setPassword(password);
repoInfo.setPassphrase(passphrase);
repoInfo.setPrivateKey(privateKey);
repoInfo.setGroup(remoteGroup);
repoInfo.setMode(remoteMode);
repoInfo.setDirectoryMode(remoteDirectoryMode);
repoInfo.setUrl(url);
repoInfo.setProxyHost(proxyHost);
repoInfo.setProxyUserName(proxyUser);
repoInfo.setProxyPassword(proxyPassword);
repoInfo.setScpExe(scpExe);
repoInfo.setScpArgs(scpArgs);
repoInfo.setSshExe(sshExe);
repoInfo.setSshArgs(sshArgs);
if (passiveModeOn != null)
{
if ("false".equalsIgnoreCase(passiveModeOn))
{
repoInfo.setPassiveModeOn(false);
}
}
if (compress != null)
{
try
{
repoInfo.setCompress(new Boolean(compress).booleanValue());
}
catch (Exception e)
{
throw new MalformedURLException(
"maven.repo." + repository + ".compress should be a boolean");
}
}
if (port != null)
{
try
{
repoInfo.setPort(Integer.parseInt(port));
}
catch (Exception e)
{
throw new MalformedURLException(
"maven.repo." + repository + ".port should be an integer");
}
}
if (proxyPort != null)
{
try
{
repoInfo.setProxyPort(
Integer.parseInt(proxyPort.trim()));
}
catch (Exception e)
{
throw new MalformedURLException(
"maven.repo."
+ repository
+ ".proxy.port should be an integer");
}
}
repoInfo.setBasedir(dir);
return repoInfo;
}
}
@@ -0,0 +1,98 @@
package org.apache.maven.artifact.deployer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.maven.wagon.events.TransferEvent;
import org.apache.maven.wagon.events.TransferListener;
import org.apache.maven.util.BootstrapDownloadMeter;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
/**
* Bootstrap download progress meter.
*
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @version $Id$
*/
public class UploadMeter implements TransferListener
{
/** log for debug output */
private static final Log log = LogFactory.getLog(UploadMeter.class);
private int shownSoFar = 0;
private final int numHashes;
private final char hashChar;
private long complete = 0;
private long total;
public UploadMeter()
{
this( 20, '.' );
}
public UploadMeter(int numHashes, char hashChar)
{
this.numHashes = numHashes;
this.hashChar = hashChar;
}
public void transferStarted( TransferEvent transferEvent )
{
shownSoFar = 0;
complete = 0;
System.out.println( "Uploading " + transferEvent.getLocalFile().getName() + ": " );
total = transferEvent.getLocalFile().length();
}
public void transferProgress( TransferEvent transferEvent, byte[] buffer, int length )
{
// TODO: fix
// long total = transferEvent.getResource().getContentLength();
complete += length;
if (total > 0)
{
int numToShow = (int) ( ( complete * numHashes ) / total );
for ( int i = shownSoFar + 1; i <= numToShow; i++ )
{
System.out.print( hashChar );
}
shownSoFar = numToShow;
}
}
public void transferCompleted( TransferEvent transferEvent )
{
// TODO: fix
// long total = transferEvent.getResource().getContentLength();
System.out.println(" (" + (total/1024) + "K)");
}
public void transferError( TransferEvent transferEvent )
{
log.error( transferEvent.getException().getMessage() );
}
public void debug( String message )
{
log.debug( message );
}
}
@@ -1,95 +0,0 @@
package org.apache.maven.deploy;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
/**
* Holder of the variables which are used by deployers for
* establishing connection to remote hosts and to
* deploy the file to correct location in remote file system
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: DeployRequest.java,v 1.10 2004/05/02 15:04:34 vmassol Exp $
*/
public class DeployRequest
{
/** The filename in target file system */
private String destFile;
/** The file name in local file system */
private String srcFile;
public DeployRequest(String srcFile, String destFile)
{
this.srcFile = srcFile;
this.destFile = destFile;
}
/**
* @return
*/
public String getDestFile()
{
return destFile;
}
/**
* @param destFile
*/
public void setDestFile(String destFile)
{
this.destFile = destFile;
}
/**
* @return
*/
public String getSrcFile()
{
return srcFile;
}
/**
* @param srcFile
*/
public void setSrcFile(String srcFile)
{
this.srcFile = srcFile;
}
/**
* Returns the directory path portion of a file specification string.
* Matches the equally named unix command.
* @return The directory portion excluding the ending file separator.
*/
public String dirname()
{
int i = destFile.lastIndexOf("/");
return (i >= 0 ? destFile.substring(0, i) : "");
}
/**
* Returns the filename portion of a file specification string.
* @return The filename string with extension.
*/
public String filename()
{
int i = destFile.lastIndexOf("/");
return (i >= 0 ? destFile.substring(i + 1) : destFile);
}
}
@@ -1,158 +0,0 @@
package org.apache.maven.deploy;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.maven.deploy.deployers.Deployer;
import org.apache.maven.deploy.deployers.ExternalDeployer;
import org.apache.maven.deploy.deployers.FileDeployer;
import org.apache.maven.deploy.deployers.FtpDeployer;
import org.apache.maven.deploy.deployers.HttpDeployer;
import org.apache.maven.deploy.deployers.SFtpDeployer;
import org.apache.maven.deploy.deployers.ScpDeployer;
import org.apache.maven.deploy.deployers.ScpExeDeployer;
import org.apache.maven.deploy.exceptions.AuthenticationException;
import org.apache.maven.deploy.exceptions.TransferFailedException;
import org.apache.maven.deploy.exceptions.UnsupportedProtocolException;
/**
* Utility class
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: DeployTool.java,v 1.13 2004/07/06 13:42:25 brett Exp $
*/
public class DeployTool
{
/** Current Version **/
public static final String VERSION = "1.0-dev";
private static final Log LOG = LogFactory.getLog(DeployTool.class);
/**
* Returns deployer which is able to deploy to repository
* described by host info.
* @param repoInfo
* @throws DeployException When no deployer is supporting given protocol
*/
public Deployer getDeployer(RepositoryInfo repoInfo)
throws IllegalArgumentException, UnsupportedProtocolException
{
String url = repoInfo.getUrl();
Deployer deployer = null;
if (url == null || url.length() == 1)
{
throw new UnsupportedProtocolException(
"No URL was provided repository: "
+ repoInfo.getRepositoryAlias());
}
if (url.startsWith(HttpDeployer.PROTOCOL))
{
deployer = new HttpDeployer();
}
if (url.startsWith(FileDeployer.PROTOCOL))
{
deployer = new FileDeployer();
}
if (url.startsWith(FtpDeployer.PROTOCOL))
{
deployer = new FtpDeployer();
}
if (url.startsWith(SFtpDeployer.PROTOCOL))
{
deployer = new SFtpDeployer();
}
if (url.startsWith(ScpDeployer.PROTOCOL))
{
deployer = new ScpDeployer();
}
if (url.startsWith(ExternalDeployer.PROTOCOL))
{
deployer = new ExternalDeployer();
}
if (url.startsWith(ScpExeDeployer.PROTOCOL))
{
deployer = new ScpExeDeployer();
}
if (deployer == null)
{
throw new UnsupportedProtocolException(url);
}
return deployer;
}
/**
* Deploy given list of files to remote repository
* @param repoInfo the
* @param srcFiles the list containing local filenames which will be deployed to remote host
* @param destFiles the list contating the remote filenames. The size of this list
* must match the size of srcFiles list
* @throws TransferFailedException when copying operation fails
* @throws UnsupportedProtocolException when no deployer is capable to deploy to given host
* @throws AuthenticationException when authentication related problem occures
*/
public void deploy(
RepositoryInfo repoInfo,
List srcFiles,
List destFiles)
throws
TransferFailedException,
UnsupportedProtocolException,
AuthenticationException
{
if (srcFiles.size() != destFiles.size())
{
String msg = "Lengths of the lists should be the same";
throw new IllegalArgumentException(msg);
}
Deployer deployer = getDeployer(repoInfo);
try
{
deployer.init(repoInfo);
Iterator srcIterator = srcFiles.iterator();
Iterator destIterator = destFiles.iterator();
while (srcIterator.hasNext())
{
String srcFile = (String) srcIterator.next();
String destFile = (String) destIterator.next();
DeployRequest request = new DeployRequest(srcFile, destFile);
LOG.info("Deploying: " + srcFile + "-->" + destFile);
deployer.deploy(request);
}
}
finally
{
try
{
deployer.release();
}
catch (Exception e)
{
LOG.error("Error cleaning up from the deployer", e);
}
}
}
}
@@ -1,442 +0,0 @@
package org.apache.maven.deploy;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
/**
* Contatins the set of poperties which are necessery
* for esatblishing connection to remote hosts and to
* perform a deployment.
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: RepositoryInfo.java,v 1.8 2004/09/29 10:56:04 brett Exp $
*/
public class RepositoryInfo
{
/** Idicates that port has not been set */
public final static int UNKNOWN_PORT = -1;
/** The nickname (alias) of the repository*/
private String repositoryAlias;
/** Indicates if Passive Mode should be used.
* Use passive mode as default because most of us are
* behind firewalls these days.
*/
private boolean passiveModeOn = true;
/** URL of the remote host*/
private String url;
/** Port of remote host */
private int port = UNKNOWN_PORT;
/** The login name of the user in @ remote host*/
private String userName;
/** Password */
private String password;
/** Remote group name */
private String group;
/** File mode. */
private String mode;
/** Directory mode. */
private String directoryMode;
/** The passpharse of the user's private key file */
private String passphrase;
/** The absoluth path to private key file */
private String privateKey;
/** Proxy Server host*/
private String proxyHost = null;
/** the login name of the user @ Proxy Server host*/
private String proxyUserName = null;
/** the password user @ Proxy Server host*/
private String proxyPassword = null;
/** Proxy server port */
private int proxyPort = UNKNOWN_PORT;
/** Indicates if debug mode should be used*/
private boolean debugOn = true;
/** basedir */
private String basedir;
/** compress */
private boolean compress;
/** parms for ScpExeDeployer */
private String sshExe;
private String sshArgs;
private String scpExe;
private String scpArgs;
/**
* @param compress
*/
public void setCompress(boolean compress)
{
this.compress = compress;
}
/**
* @return
*/
public boolean getCompress()
{
return compress;
}
/**
* @return
*/
public String getBasedir()
{
return basedir;
}
/**
* @param basedir
*/
public void setBasedir(String basedir)
{
this.basedir = basedir;
}
/**
* Set the alias of the repository
* @param repositoryAlias
*/
public void setRepositoryAlias(String repositoryAlias)
{
this.repositoryAlias = repositoryAlias;
}
/**
* Get the port of the host
* @return the port of the remote host where repository resides.
*/
public int getPort()
{
return port;
}
/**
* Set the port of the remote host
* @param port
*/
public void setPort(int port)
{
this.port = port;
}
/**
* Get the passphrase of the private key file.
* Passphrase is used only when host/protocol supports
* authetification via exchange of private/public keys
* and private key was provided.
*
* @return the passphrase of the private key file
*/
public String getPassphrase()
{
return passphrase;
}
/**
* Set the passphrase of the private key file
* @param passphrase the passphrase of the private key file
*/
public void setPassphrase(String passphrase)
{
this.passphrase = passphrase;
}
/**
* Get the absoluth path to the private key
* @return the path to private key
*/
public String getPrivateKey()
{
return privateKey;
}
/**
* Set the aboluth path to private key
* @param privateKey The path to private key in local file system
*/
public void setPrivateKey(String privateKey)
{
this.privateKey = privateKey;
}
public String getDirectoryMode()
{
return directoryMode;
}
public void setDirectoryMode( String directoryMode )
{
this.directoryMode = directoryMode;
}
public String getMode()
{
return mode;
}
public void setMode( String mode )
{
this.mode = mode;
}
/**
* Get the remote group to which will belong to
* after deployemnt. Not all protolcols support
* allow to change the group of the artifact
* @return remote group
*/
public String getGroup()
{
return group;
}
/**
* Set the remote group for artifact which is deployed
* @param group The remote group to which
* artifact which is deployed will belong
*/
public void setGroup(String group)
{
this.group = group;
}
/**
* Get the password to be used when user will be authetificated
* while connection to remote host is established
* @return the password of user
*/
public String getPassword()
{
return password;
}
/**
*
*
* @param password
*/
public void setPassword(String pass)
{
this.password = pass;
}
/**
* Returhn proxy server host name
* @return proxy server host name
*/
public String getProxyHost()
{
return proxyHost;
}
/**
* Set proxy host name
* @param proxyHost
*/
public void setProxyHost(String proxyHost)
{
this.proxyHost = proxyHost;
}
/**
* Get user's password used to login to proxy server
* @return the user's password at proxy host
*/
public String getProxyPassword()
{
return proxyPassword;
}
/**
* Set the proxy server password
* @param proxyPassword teh epassword to use to login to a proxy server
*/
public void setProxyPassword(String proxyPass)
{
this.proxyPassword = proxyPass;
}
/**
* Get the proxy port
* @return Poroxy server port
*/
public int getProxyPort()
{
return proxyPort;
}
/**
* Set the proxy port
* @param proxyPort
*/
public void setProxyPort(int proxyPort)
{
this.proxyPort = proxyPort;
}
/**
*
* Get the proxy user name
* @return
*/
public String getProxyUserName()
{
return proxyUserName;
}
/**
* Set the proxy user name
* @param proxyUserName the proxy user name
*/
public void setProxyUserName(String proxyUser)
{
this.proxyUserName = proxyUser;
}
/**
* Get url of remote host
* @return URL (with protocol) of remote host
*/
public String getUrl()
{
return url;
}
/**
* Set url of remote host
* @param url url of remote host
*/
public void setUrl(String url)
{
this.url = url;
}
/**
* Get user login name at remote host
* @return user name at remote host
*/
public String getUserName()
{
return userName;
}
/**
* Set user name at remote host
* @param userName
*/
public void setUserName(String user)
{
this.userName = user;
}
/**
* Return the host name (Cuts of protocol from the URL)
* @return The host name
*/
public String getHost()
{
if (url == null)
{
return "localhost";
}
return url.substring(url.indexOf("://") + 3).trim();
}
/**
* Get the name of the repository to which deploy attempt will be made
*
* @return the name (nickname, alias) of the repository
*/
public String getRepositoryAlias()
{
return repositoryAlias;
}
/**
* Get Debug mode
* @return the debug mode
*/
public boolean isDebugOn()
{
return debugOn;
}
/**
* Set deplyer in debug mode - more messages will be wriiten
* @param debugOn
*/
public void setDebugOn(boolean debugOn)
{
this.debugOn = debugOn;
}
public boolean isPassiveModeOn()
{
return passiveModeOn;
}
public void setPassiveModeOn(boolean passiveModeOn)
{
this.passiveModeOn = passiveModeOn;
}
public String getScpArgs() {
return scpArgs;
}
public void setScpArgs(String scpArgs) {
this.scpArgs = scpArgs;
}
public String getScpExe() {
return scpExe;
}
public void setScpExe(String scpExe) {
this.scpExe = scpExe;
}
public String getSshArgs() {
return sshArgs;
}
public void setSshArgs(String sshArgs) {
this.sshArgs = sshArgs;
}
public String getSshExe() {
return sshExe;
}
public void setSshExe(String sshExe) {
this.sshExe = sshExe;
}
}
@@ -1,35 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import org.apache.maven.deploy.exceptions.TransferFailedException;
/**
* Base deployer from which all deployers are derived.
*
* @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.4 2004/03/02 14:59:31 evenisse Exp $
*/
public abstract class AbstractDeployer implements Deployer
{
public void flush() throws TransferFailedException
{
}
}
@@ -1,70 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
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;
/**
*
* 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.6 2004/03/02 14:59:31 evenisse Exp $
*/
public interface Deployer
{
/**
* Set the information about host to which we will deploy.
* 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,
* Resources allocated in this metod should
* be release when deloyer is not needed any more
* @see #release()
*
* @param repoInfo
* @throws AuthenticationException when connection to remote host cannot be established
*/
public void init( RepositoryInfo repoInfo )
throws AuthenticationException;
/**
* Release all resources which were allocated
* by this deployer (e.g. a connection to remote host)
*
*/
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.
*/
public void deploy( DeployRequest request )
throws TransferFailedException;
/**
*
*/
public void flush() throws TransferFailedException;
}
@@ -1,93 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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;
/**
* Deployers which for every deployment request
* starts a new external process (e.g batch file, shell script)
*
* @version $Id: ExternalDeployer.java,v 1.5 2004/06/25 13:50:05 brett Exp $
* @todo still have to account for differing setups for people deploying to
* their own sites and to the central repository.
* @todo finich
*/
public class ExternalDeployer extends AbstractDeployer
{
public final static String PROTOCOL = "external://";
private String cmd = null;
private static final Log LOG = LogFactory.getLog(ExternalDeployer.class);
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#init(org.apache.maven.deploy.HostInfo)
*/
public void init(RepositoryInfo repoInfo) throws AuthenticationException
{
cmd = repoInfo.getHost();
}
/**
* @see org.apache.maven.deploy.deployers.Deployer#release()
*/
public void release()
{
}
/**
* @see org.apache.maven.deploy.deployers.Deployer#deploy(org.apache.maven.deploy.DeployRequest)
*/
public void deploy(DeployRequest request) throws TransferFailedException
{
String[] params = { request.getSrcFile(), request.getDestFile(), };
try
{
LOG.debug(
"Staring external process: '"
+ cmd
+ "' to deploy:'"
+ request.getDestFile());
Process process = Runtime.getRuntime().exec(cmd, params);
process.waitFor();
LOG.debug("External process finished");
}
catch (Exception e)
{
throw new TransferFailedException(
"Failed to deploy with external program",
e);
}
}
}
@@ -1,85 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import java.io.File;
import java.io.IOException;
import org.apache.maven.deploy.RepositoryInfo;
import org.apache.maven.deploy.DeployRequest;
import org.apache.maven.deploy.exceptions.TransferFailedException;
import org.codehaus.plexus.util.FileUtils;
/**
* Deployer which deploys to directory visible in local
* file system.
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id$
*/
public class FileDeployer extends AbstractDeployer
{
private RepositoryInfo repoInfo;
/** Protocol understandable by this deployer*/
public final static String PROTOCOL = "file://";
/**
* Do nothing
*/
public void init(RepositoryInfo repoInfo)
{
this.repoInfo = repoInfo;
}
/**
* Do nothing
*/
public void release()
{
}
/**
* @see org.apache.maven.fetch.fetchers.Fetcher#fetchUrl(java.lang.String, java.io.OutputStream)
*/
public void deploy(DeployRequest request) throws TransferFailedException
{
try
{
File srcFile = new File(request.getSrcFile());
File destFile =
new File(
repoInfo.getHost(),
repoInfo.getBasedir());
destFile = new File(destFile, request.dirname());
if (!destFile.exists())
{
destFile.mkdirs();
}
destFile = new File(destFile, request.filename());
FileUtils.copyFile(srcFile, destFile);
}
catch (IOException e)
{
throw new TransferFailedException(
"Cannot copy file: " + e.getMessage(), e);
}
}
}
@@ -1,251 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ProtocolCommandEvent;
import org.apache.commons.net.ProtocolCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
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;
/**
* An FTP deployer based on the FTPClient in the Commons Net package.
*
* Proxy server for FTPClient is not supported:
* {@link http://issues.apache.org/bugzilla/show_bug.cgi?id=18039}
*
* @author <a href="mailto:jason@zenplex.com">Jason van Zyl</a>
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id$
*
* @todo review exception handling
* @todo don't spool to System.out
*
*/
public class FtpDeployer extends AbstractDeployer
{
/** Protocol understandable by this deployer*/
public final static String PROTOCOL = "ftp://";
private FTPClient ftp = null;
private RepositoryInfo repoInfo = null;
private static final Log LOG = LogFactory.getLog(FtpDeployer.class);
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#init(org.apache.maven.deploy.HostInfo)
*/
public void init(RepositoryInfo repoInfo)
throws AuthenticationException
{
String username = repoInfo.getUserName();
String password = repoInfo.getPassword();
String host = repoInfo.getHost();
ftp = new FTPClient();
if (repoInfo.isDebugOn())
{
ftp.addProtocolCommandListener(
new PrintCommandListener(new PrintWriter(System.out)));
}
try
{
int reply;
if (repoInfo.getPort()
!= RepositoryInfo.UNKNOWN_PORT)
{
ftp.connect(host, repoInfo.getPort());
}
else
{
ftp.connect(host);
}
LOG.info("Connected to " + host + ".");
// After connection attempt, you should check the reply code to verify
// success.
reply = ftp.getReplyCode();
if (FTPReply.isPositiveCompletion(reply) == false)
{
ftp.disconnect();
throw new AuthenticationException("FTP server refused connection.");
}
}
catch (IOException e)
{
if (ftp.isConnected())
{
try
{
ftp.disconnect();
}
catch (IOException f)
{
// do nothing
}
}
throw new AuthenticationException("Could not connect to server.",e);
}
try
{
if (ftp.login(username.trim(), password.trim()) == false)
{
throw new AuthenticationException("Cannot login to remote system");
}
LOG.info("Remote system is " + ftp.getSystemName());
// Set to binary mode.
ftp.setFileType(FTP.BINARY_FILE_TYPE);
if(repoInfo.isPassiveModeOn())
{
ftp.enterLocalPassiveMode();
}
handleCommand( ftp.changeWorkingDirectory(repoInfo.getBasedir()));
}
catch (IOException e)
{
throw new AuthenticationException("Cannot login to remote system",e);
}
catch (TransferFailedException e)
{
throw new AuthenticationException("Cannot locate base directory", e );
}
this.repoInfo = repoInfo;
}
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#release()
*/
public void release()
{
if (ftp.isConnected())
{
try
{
ftp.disconnect();
}
catch (IOException e)
{
// do nothing
}
}
}
/**
* @see Deployer#deploy(DeployRequest)
*/
public void deploy(DeployRequest request) throws TransferFailedException
{
try
{
String[] dirs = StringUtils.split(request.dirname(), "/");
for (int i = 0; i < dirs.length; i++)
{
if ( !ftp.changeWorkingDirectory(dirs[i])) {
handleCommand( ftp.makeDirectory(dirs[i]));
// Ignore errors
ftp.sendSiteCommand( "CHGRP " + repoInfo.getGroup() + " " + dirs[i] );
ftp.sendSiteCommand( "CHMOD " + repoInfo.getDirectoryMode() + " " + dirs[i] );
handleCommand( ftp.changeWorkingDirectory(dirs[i]));
}
}
handleCommand( ftp.storeFile(
request.filename(),
new FileInputStream(request.getSrcFile())));
// Ignore errors
ftp.sendSiteCommand( "CHGRP " + repoInfo.getGroup() + " " + request.filename() );
ftp.sendSiteCommand( "CHMOD " + repoInfo.getMode() + " " + request.filename() );
for (int i = 0; i < dirs.length; i++)
{
handleCommand( ftp.changeWorkingDirectory(".."));
}
}
catch (TransferFailedException e)
{
throw e;
}
catch (Exception e)
{
throw new TransferFailedException(e.getMessage(),e);
}
}
private void handleCommand( boolean response ) throws TransferFailedException
{
if ( !response )
{
throw new TransferFailedException( "Error executing FTP command" );
}
}
/**
* Description of the Class
*/
public class PrintCommandListener implements ProtocolCommandListener
{
private PrintWriter writer;
/**
* Constructor for the PrintCommandListener object
*
* @param writer
*/
public PrintCommandListener(PrintWriter writer)
{
this.writer = writer;
}
/**
* Description of the Method
*/
public void protocolCommandSent(ProtocolCommandEvent event)
{
writer.print(event.getMessage());
writer.flush();
}
/**
* Description of the Method
*/
public void protocolReplyReceived(ProtocolCommandEvent event)
{
writer.print(event.getMessage());
writer.flush();
}
}
}
@@ -1,253 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import java.io.File;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.maven.deploy.RepositoryInfo;
import org.apache.maven.deploy.exceptions.AuthenticationException;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Proxy;
import com.jcraft.jsch.ProxyHTTP;
import com.jcraft.jsch.ProxySOCKS5;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;
/**
* A base class for deployers using protocols from SSH2 family
* and JSch library for underlining implmenetation
*
* This is responsible for authentification stage of the process.
*
* We will first try to
* use public keys for authentication
* and if that doesn't work then we fall back
* to using the login and password
*
* @version $Id: GenericSshDeployer.java,v 1.12 2004/09/28 09:20:40 brett 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
*/
public abstract class GenericSshDeployer extends AbstractDeployer
{
private RepositoryInfo repoInfo;
/** Default port used for SSH protocol */
public final static int DEFAULT_SSH_PORT = 22;
/** Default port used by SOCKS5 proxy server */
public final static int SOCKS5_PROXY_PORT = 1080;
private Session session = null;
private static final Log LOG = LogFactory.getLog(GenericSshDeployer.class);
/**
* @return
*/
public Session getSession()
{
return session;
}
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#getAuthenticationInfo()
*/
public RepositoryInfo getRepositoryInfo()
{
return repoInfo;
}
/**
* @see org.apache.maven.deploy.deployers.Deployer#release()
*/
public void release()
{
if ( session != null )
{
session.disconnect();
}
}
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#init(org.apache.maven.deploy.HostInfo)
*/
public void init(RepositoryInfo repoInfo)
throws AuthenticationException
{
try {
Class.forName( "javax.crypto.spec.DHParameterSpec" );
}
catch ( ClassNotFoundException e )
{
LOG.error( "JCE is required for an SSH based deployer" );
LOG.error( "Please use JDK 1.4 or above, or install a JCE provider" );
LOG.error( "A free (GPL) provider is available from Bouncycastle:" );
LOG.error( "http://www.bouncycastle.org/" );
throw new AuthenticationException( "JCE required" );
}
try
{
this.repoInfo = repoInfo;
JSch jsch = new JSch();
int port = repoInfo.getPort();
if (port == RepositoryInfo.UNKNOWN_PORT)
{
port = DEFAULT_SSH_PORT;
}
LOG.debug("host: '" + repoInfo.getHost() + "'");
String host = repoInfo.getHost();
session =
jsch.getSession(repoInfo.getUserName(), host, port);
// Look for the private key and use it if available.
if (repoInfo.getPrivateKey() != null)
{
File privateKey = new File(repoInfo.getPrivateKey());
if (privateKey.exists())
{
if (repoInfo.getPassphrase() == null)
{
repoInfo.setPassphrase("");
}
LOG.info("Using private key: " + privateKey);
jsch.addIdentity(
privateKey.getAbsolutePath(),
repoInfo.getPassphrase());
}
else
{
String msg = "Private key: " + privateKey + " not found ";
throw new AuthenticationException(msg);
}
}
String proxyHost = repoInfo.getProxyHost();
if (proxyHost != null)
{
Proxy proxy = null;
int proxyPort = repoInfo.getProxyPort();
// HACK:
//if port == 1080 we will use SOCKS5 Proxy
// otherwise will use HTTP Proxy
if (proxyPort == SOCKS5_PROXY_PORT)
{
proxy = new ProxySOCKS5(proxyHost);
((ProxySOCKS5) proxy).setUserPasswd(
repoInfo.getProxyUserName(),
repoInfo.getProxyPassword());
}
else
{
proxy = new ProxyHTTP(proxyHost, proxyPort);
((ProxyHTTP) proxy).setUserPasswd(
repoInfo.getProxyUserName(),
repoInfo.getProxyPassword());
}
proxy.connect(session, host, port);
}
// username and password will be given via UserInfo interface.
UserInfo ui = new MavenUserInfo(repoInfo);
session.setUserInfo(ui);
session.connect();
}
catch (Exception e)
{
LOG.debug("Connection failure exception", e);
throw new AuthenticationException( "Cannot connect. Reason: " + e.getMessage() );
}
}
/**
* MavenUserInfo class which returns the necessary name and password from
* the POM to secure an ssh connection.
*/
public class MavenUserInfo implements UserInfo
{
RepositoryInfo repoInfo;
MavenUserInfo(RepositoryInfo repoInfo)
{
this.repoInfo = repoInfo;
}
public String getPassphrase()
{
return repoInfo.getPassphrase();
}
/* (non-Javadoc)
* @see com.jcraft.jsch.UserInfo#getPassword()
*/
public String getPassword()
{
return repoInfo.getPassword();
}
/* (non-Javadoc)
* @see com.jcraft.jsch.UserInfo#promptPassphrase(java.lang.String)
*/
public boolean promptPassphrase(String arg0)
{
return true;
}
/* (non-Javadoc)
* @see com.jcraft.jsch.UserInfo#promptPassword(java.lang.String)
*/
public boolean promptPassword(String arg0)
{
return true;
}
/**
* @see com.jcraft.jsch.UserInfo#promptYesNo(java.lang.String)
*/
public boolean promptYesNo(String arg0)
{
return true;
}
/* (non-Javadoc)
* @see com.jcraft.jsch.UserInfo#showMessage(java.lang.String)
*/
public void showMessage(String message)
{
LOG.info(message);
}
}
}
@@ -1,160 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.methods.PutMethod;
import org.apache.maven.deploy.RepositoryInfo;
import org.apache.maven.deploy.DeployRequest;
import org.apache.maven.deploy.exceptions.TransferFailedException;
/**
* An HTTP deployer based the Commons HttpClient library.
*
* @author <a href="mailto:jason@zenplex.com">Jason van Zyl</a>
* @version $Id: HttpDeployer.java,v 1.7 2004/06/25 13:50:05 brett Exp $
*
* @todo still have to account for differing setups for people deploying to
* their own sites and to the central repository.
*
* @todo deal with proxies
* @todo deal with authentication
*
* @todo this class in not really functional. It should be completly refactored.
*/
public class HttpDeployer extends AbstractDeployer
{
private RepositoryInfo repoInfo;
/**Protocol understood by by this deployer*/
public final static String PROTOCOL = "http://";
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#init(org.apache.maven.deploy.HostInfo)
*/
public void init(RepositoryInfo repoInfo)
{
this.repoInfo = repoInfo;
}
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#release()
*/
public void release()
{
// TODO Auto-generated method stub
}
/**
* Description of the Method
*/
public void deploy(DeployRequest request) throws TransferFailedException
{
URL url = null;
try
{
url = new URL(repoInfo.getUrl());
}
catch (MalformedURLException murle)
{
}
Credentials creds =
new UsernamePasswordCredentials(
repoInfo.getUserName(),
repoInfo.getPassword());
//create a singular HttpClient object
HttpClient client = new HttpClient();
//establish a connection within 5 seconds
client.setConnectionTimeout(5000);
//set username / password
if (creds != null)
{
client.getState().setCredentials(null, creds);
}
//
HostConfiguration hc = new HostConfiguration();
hc.setHost(repoInfo.getHost());
//start a session with the webserver
client.setHostConfiguration(hc);
//create a method object
PutMethod method = new PutMethod(url.getPath());
try
{
method.setRequestBody(new FileInputStream(request.getSrcFile()));
}
catch(FileNotFoundException io)
{
throw new TransferFailedException("input file: '"+ request.getSrcFile() + " not found ");
}
//turn follow redirects off
method.setFollowRedirects(false);
//turn strict mode on
method.setStrictMode(false);
//execute the method
try
{
client.executeMethod(method);
}
catch (HttpException e)
{
throw new TransferFailedException("Http error connecting to '" + url + "'", e);
}
catch (IOException e)
{
throw new TransferFailedException("Unable to connect to '" + url + "'", e);
}
//get the request headers
Header[] requestHeaders = method.getRequestHeaders();
//get the response headers
Header[] responseHeaders = method.getResponseHeaders();
//get the response body
byte[] responseBody = method.getResponseBody();
method.releaseConnection();
}
}
@@ -1,204 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
import com.jcraft.jsch.SftpProgressMonitor;
/**
* An SSH2/SFTP deployer
*
* @author Michal Maczka
* @version $Revision: 1.12 $ $Date: 2004/09/28 09:20:40 $
*/
public class SFtpDeployer extends GenericSshDeployer
{
private static final Log LOG = LogFactory.getLog(SFtpDeployer.class);
/**Protocol understood by by this deployer*/
public final static String PROTOCOL = "sftp://";
/** SSH2 Chanel names used to communicate with the server*/
private final static String SFTP_CHANNEL = "sftp";
/** artibute of file used in SSH which denotes is given file is a directory*/
private static final int S_IFDIR = 0x4000;
private ChannelSftp channel = null;
private Integer groupId = null;
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#init(org.apache.maven.deploy.HostInfo)
*/
public void init(RepositoryInfo repoInfo)
throws AuthenticationException
{
try
{
if (repoInfo.getGroup() != null)
{
groupId = Integer.getInteger(repoInfo.getGroup());
}
}
catch (NumberFormatException e)
{
throw new AuthenticationException("SFTP deployer: remote group should be an integer");
}
super.init(repoInfo);
channel = null;
try
{
channel = (ChannelSftp) getSession().openChannel(SFTP_CHANNEL);
channel.connect();
channel.cd(repoInfo.getBasedir());
}
catch (Exception e)
{
throw new AuthenticationException(e.getMessage(),e);
}
}
/**
* @see org.apache.maven.deploy.deployers.Deployer#release()
*/
public void release()
{
channel.disconnect();
super.release();
}
/**
* @see Deployer#deploy(DeployRequest)
*/
public void deploy(DeployRequest request) throws TransferFailedException
{
try
{
// iterate over all directories in the path. try to create
// directory
String[] dirs = StringUtils.split(request.dirname(), "/");
for (int i = 0; i < dirs.length; i++)
{
try
{
SftpATTRS attrs = channel.stat(dirs[i]);
if ((attrs.getPermissions() & S_IFDIR) != 0)
{
// file exists and is dierctory
channel.cd(dirs[i]);
}
else
{
throw new TransferFailedException(
"Incorrect remote path:" + request.getDestFile());
}
}
catch (Exception e)
{
// file most probably does not exists
channel.mkdir(dirs[i]);
channel.cd(dirs[i]);
}
}
if (getRepositoryInfo().isDebugOn())
{
channel.put(
request.getSrcFile(),
request.filename(),
new ProgressMonitor());
}
else
{
channel.put(request.getSrcFile(), request.filename());
}
if (groupId != null)
{
if (getRepositoryInfo().isDebugOn())
{
LOG.info("Changing group to: " + groupId);
}
channel.chgrp(groupId.intValue(), request.filename());
if (getRepositoryInfo().isDebugOn())
{
LOG.info("Group successfully changed");
}
}
// change back the working directory to repository root
for (int i = 0; i < dirs.length; i++)
{
channel.cd("..");
}
}
catch (SftpException e)
{
String msg =
"Error occured while deploying to remote host:"
+ getRepositoryInfo().getHost()
+ ":"
+ e.getMessage();
throw new TransferFailedException(msg, e);
}
}
/** @todo use logger */
class ProgressMonitor implements SftpProgressMonitor
{
public boolean count(long count)
{
System.out.print("#");
return true;
}
public void end()
{
System.out.println();
}
public void init(int op, String src, String dest, long max)
{
}
}
}
@@ -1,421 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.Session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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
*
* @author Michal Maczka
* @version $Revision: 1.13 $ $Date: 2004/09/28 09:20:40 $
*/
public class ScpDeployer extends GenericSshDeployer
{
private static final Log LOG = LogFactory.getLog(ScpDeployer.class);
/**Protocol understood by this deployer*/
public final static String PROTOCOL = "scp://";
/** SSH2 Channel name used to communicate with the server*/
public final static String EXEC_CHANNEL = "exec";
/**
* 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(!repoInfo.getCompress());
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
{
LOG.debug("deployNotCompressed=" + deployNotCompressed);
if (deployNotCompressed)
{
doDeployNotCompressed(request);
}
else
{
srcFiles.add(request.getSrcFile());
destFiles.add(request.getDestFile());
doDeployCompressed();
}
}
/**
* @see Deployer#deploy(DeployRequest)
*
*/
public void doDeployNotCompressed(DeployRequest request)
throws TransferFailedException
{
Session session = getSession();
String mkdirCmd =
"mkdir -p "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.dirname()
+ "\n";
executeSimpleCommand(session, mkdirCmd);
// If an old SNAPSHOT exists, remove it
if (request.getDestFile().indexOf("SNAPSHOT") > 0) {
String cmd =
"rm -f "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.getDestFile()
+ "\n";
executeSimpleCommand(session, cmd);
}
doCopy(session, request);
if (getRepositoryInfo().getGroup() != null)
{
String chgrpCmd =
"chgrp "
+ getRepositoryInfo().getGroup()
+ " "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.getDestFile()
+ "\n";
executeSimpleCommand(session, chgrpCmd);
}
if (getRepositoryInfo().getMode() != null)
{
String chmodCmd =
"chmod "
+ getRepositoryInfo().getMode()
+ " "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.getDestFile()
+ "\n";
executeSimpleCommand(session, chmodCmd);
}
}
/**
* @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",e);
}
try
{
DeployRequest request =
new DeployRequest(zip.getAbsolutePath(), zip.getName());
doCopy(session, request);
String unzipCmd =
"unzip -uo "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.getDestFile()
+ " -d "
+ getRepositoryInfo().getBasedir()
+ "\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
{
LOG.info("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)
{
throw new TransferFailedException(
"Cannot execute remote command: " + command,e);
}
finally
{
if (channel != null)
{
channel.disconnect();
}
}
}
/**
* Copy artifact to remote host.
* Code extracted from JSCH exaples
*/
private void doCopy(Session session, DeployRequest request)
throws TransferFailedException
{
ChannelExec channel = null;
try
{
String srcFile = request.getSrcFile();
String destFile =
getRepositoryInfo().getBasedir() + "/" + request.getDestFile();
// exec 'scp -t rfile' remotely
String command = "scp -t " + destFile;
LOG.debug("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];
// wait for '\0'
do
{
in.read(tmp, 0, 1);
}
while (tmp[0] != 0);
// 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);
}
else
{
command += srcFile;
}
command += "\n";
out.write(command.getBytes());
out.flush();
// wait for '\0'
do
{
in.read(tmp, 0, 1);
}
while (tmp[0] != 0);
// send a content of inputFile
byte[] buf = new byte[1024];
FileInputStream fis = new FileInputStream(srcFile);
try {
while (true)
{
int len = fis.read(buf, 0, buf.length);
if (len <= 0)
{
break;
}
out.write(buf, 0, len);
out.flush();
}
}
finally {
fis.close();
}
// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();
// wait for '\0'
do
{
in.read(tmp, 0, 1);
}
while (tmp[0] != 0);
}
catch (Exception e)
{
String msg =
"Error occured while deploying to remote host:"
+ getRepositoryInfo().getHost();
throw new TransferFailedException(msg, e);
}
finally
{
if (channel != null)
{
channel.disconnect();
}
}
}
}
@@ -1,240 +0,0 @@
package org.apache.maven.deploy.deployers;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.maven.MavenUtils;
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;
/**
* SCP deployer using "external" scp program. To allow for
* ssh-agent type behavior. Also provides backwards compatible
* support for those using the
* maven.scp.executable/maven.scp.args
* and maven.ssh.executable/maven.ssh.args
*
*
*/
public class ScpExeDeployer extends AbstractDeployer
{
public final static String PROTOCOL = "scpexe://";
private RepositoryInfo repositoryInfo = null;
private String cmd = null;
private static final Log LOG = LogFactory.getLog(ScpExeDeployer.class);
/* (non-Javadoc)
* @see org.apache.maven.deploy.deployers.Deployer#init(org.apache.maven.deploy.HostInfo)
*/
public void init(RepositoryInfo repoInfo) throws AuthenticationException
{
repositoryInfo = repoInfo;
}
private RepositoryInfo getRepositoryInfo() {
return repositoryInfo;
}
/**
* @see org.apache.maven.deploy.deployers.Deployer#release()
*/
public void release()
{
}
/**
* @see org.apache.maven.deploy.deployers.Deployer#deploy(org.apache.maven.deploy.DeployRequest)
*/
public void deploy(DeployRequest request) throws TransferFailedException
{
String mkdirCmd =
"mkdir -p "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.dirname()
+ "\n";
executeSimpleCommand(mkdirCmd);
doCopy(request);
if (getRepositoryInfo().getGroup() != null)
{
String chgrpCmd =
"chgrp "
+ getRepositoryInfo().getGroup()
+ " "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.getDestFile()
+ "\n";
executeSimpleCommand(chgrpCmd);
}
if (getRepositoryInfo().getMode() != null)
{
String chmodCmd =
"chmod "
+ getRepositoryInfo().getMode()
+ " "
+ getRepositoryInfo().getBasedir()
+ "/"
+ request.getDestFile()
+ "\n";
executeSimpleCommand(chmodCmd);
}
}
private String arrayToString(String[] array) {
StringBuffer sb = new StringBuffer();
for (int i=0; i<array.length; i++) {
sb.append(array[i]);
sb.append(" ");
}
return sb.toString();
}
private void executeSimpleCommand(String cmd) throws TransferFailedException {
String args = getRepositoryInfo().getSshArgs();
String sshCmd = getRepositoryInfo().getSshExe() + " " +
( args == null ? "" : args + " " ) +
getRepositoryInfo().getUserName() + "@" + getRepositoryInfo().getHost() + " " +
cmd;
try {
if (LOG.isDebugEnabled()) {
LOG.debug("Executing command: " + sshCmd);
}
Process p = Runtime.getRuntime().exec(sshCmd);
// any error message?
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
int returnCode = p.waitFor();
if (returnCode != 0) {
LOG.debug( "exit code = " + returnCode );
throw new TransferFailedException("Error executing command: " + cmd);
}
} catch (IOException e) {
LOG.error("Error executing command: " + cmd);
throw new TransferFailedException("Error executing command: ", e);
} catch (InterruptedException e) {
LOG.error("Error executing command: " + cmd);
throw new TransferFailedException("Error executing command: ", e);
}
}
private void doCopy(DeployRequest request) throws TransferFailedException {
String srcFile;
try {
srcFile = MavenUtils.makeRelativePath( new File( System.getProperty( "user.dir" ) ), request.getSrcFile() );
} catch (IOException e) {
throw new TransferFailedException("Error locating artifact to deploy: ", e);
}
String destFile = getRepositoryInfo().getBasedir() + "/" + request.getDestFile();
if (destFile.indexOf("SNAPSHOT") > 0) {
// If an old SNAPSHOT exists, remove it
executeSimpleCommand("rm -f " + destFile);
}
String args = getRepositoryInfo().getScpArgs();
String scpCmd = getRepositoryInfo().getScpExe() + " " +
( args == null ? "" : args + " " ) +
srcFile + " " +
getRepositoryInfo().getUserName() + "@" + getRepositoryInfo().getHost() + ":" + destFile;
try {
if (LOG.isDebugEnabled()) {
LOG.debug("Executing command: " + scpCmd);
}
Process p = Runtime.getRuntime().exec(scpCmd);
// any error message?
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
int returnCode = p.waitFor();
if (returnCode != 0) {
LOG.debug( "exit code = " + returnCode );
throw new TransferFailedException("Error executing command: " + scpCmd);
}
} catch (IOException e) {
LOG.error("Error executing command: " + cmd);
throw new TransferFailedException("Error executing command: ", e);
} catch (InterruptedException e) {
LOG.error("Error executing command: " + cmd);
throw new TransferFailedException("Error executing command: ", e);
}
}
private class StreamGobbler extends Thread
{
private InputStream is;
private String type;
public StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
LOG.debug(type + ">" + line);
}
br.close();
isr.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
@@ -1,45 +0,0 @@
package org.apache.maven.deploy.exceptions;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
/**
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: AuthenticationException.java,v 1.3 2004/05/02 17:02:08 vmassol Exp $
*/
public class AuthenticationException extends DeployException
{
/**
* @param message
*/
public AuthenticationException(String message)
{
super(message);
}
/**
* @param message
* @param cause
*/
public AuthenticationException(String message, Throwable cause)
{
super(message, cause);
}
}
@@ -1,58 +0,0 @@
package org.apache.maven.deploy.exceptions;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
/**
* Root class for all exception thrown by Deployers
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: DeployException.java,v 1.4 2004/05/02 17:02:08 vmassol Exp $
*/
public abstract class DeployException extends Exception
{
private final String message;
private final Throwable cause;
public DeployException(String message, Throwable cause)
{
this.message = message;
this.cause = cause;
}
public DeployException(String message)
{
this.message = message;
this.cause = null;
}
/**
* @return
*/
public Throwable getCause()
{
return cause;
}
/**
* @return
*/
public String getMessage()
{
return message;
}
}
@@ -1,49 +0,0 @@
package org.apache.maven.deploy.exceptions;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
/**
* Exception which should be thrown when IO error occures during
* making remote copy of the file
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: TransferFailedException.java,v 1.3 2004/05/02 17:02:08 vmassol Exp $
*/
public class TransferFailedException extends DeployException
{
/**
* @param message
*/
public TransferFailedException(String message)
{
super(message);
}
/**
* @param message
* @param cause
*/
public TransferFailedException(String message, Throwable cause)
{
super(message, cause);
// TODO Auto-generated constructor stub
}
}
@@ -1,45 +0,0 @@
package org.apache.maven.deploy.exceptions;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
/**
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: UnsupportedProtocolException.java,v 1.3 2004/05/02 17:02:08 vmassol Exp $
*/
public class UnsupportedProtocolException extends DeployException
{
/**
* @param message
*/
public UnsupportedProtocolException(String message)
{
super(message);
}
/**
* @param message
* @param cause
*/
public UnsupportedProtocolException(String message, Throwable cause)
{
super(message, cause);
}
}
@@ -1,113 +0,0 @@
package org.apache.maven.deploy.util;
/* ====================================================================
* Copyright 2001-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
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="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id: Packager.java,v 1.4 2004/05/02 17:02:09 vmassol 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 )
{
}
}
}
}
}
+3
View File
@@ -25,6 +25,9 @@
<author email="vmassol@apache.org">Vincent Massol</author>
</properties>
<body>
<release version="1.5-SNAPSHOT" date="in SVN">
<action dev="brett" type="update" issue="MAVEN-1396">Replace bulk of code with Wagon</action>
</release>
<release version="1.4.1" date="2004-09-29">
<action dev="brett" type="fix">Improve error handling in FTPDeployer</action>
<action dev="brett" type="fix" issue="MPARTIFACT-38">Allow scpexe protocol to work better with args</action>