use checksum observer for MD5

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@154226 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
brett committed 2005-02-18 01:42:36 +00:00
1 parent 0f95bf75ea
commit 3be18bef2e
2 files changed
+172 -256

No files matched your search

@@ -25,13 +25,13 @@ import org.apache.maven.MavenException;
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.observers.ChecksumObserver;
import org.apache.maven.wagon.providers.file.FileWagon;
import org.apache.maven.wagon.providers.ftp.FtpWagon;
import org.apache.maven.wagon.providers.http.HttpWagon;
@@ -45,160 +45,137 @@ import java.net.MalformedURLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.TimeZone;
/**
*
* Default implementation of Artifact Deployer interface.
*
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
*
* @author <a href="mailto:michal.maczka@dimatics.com">Michal Maczka</a>
* @version $Id$
*/
public class DefaultArtifactDeployer implements ArtifactDeployer
public class DefaultArtifactDeployer
implements ArtifactDeployer
{
private static final String POM_TYPE = "pom";
/**
* Indicate if POM of given artifact should be also deployed
* to remote repository*/
/**
* Indicate if POM of given artifact should be also deployed
* to remote repository
*/
public static final boolean DEPLOY_POM = true;
/**
* Indicate if POM of given artifact should be also deployed
* in local repository*/
/**
* Indicate if POM of given artifact should be also deployed
* in local repository
*/
public static final boolean INSTALL_POM = true;
/**
* Indicate if snapshot version of
* POM of given artifact should be also deployed
* to remote repository*/
/**
* Indicate if snapshot version of
* POM of given artifact should be also deployed
* to remote repository
*/
public static final boolean DEPLOY_POM_SNAPSHOT = true;
/**
* Indicate if POM of given artifact should be also installed
* in local repository*/
/**
* Indicate if POM of given artifact should be also installed
* in local repository
*/
public static final boolean INSTALL_POM_SNAPSHOT = true;
private static final ArtifactTypeHandler POM_ARTIFACT_TYPE_HANDLER = new DefaultArtifactTypeHandler();
/**
* Date/time stamp which is appended to snapshot filenames
* Date/time stamp which is appended to snapshot filenames
*/
public final static DateFormat SNAPSHOT_SIGNATURE_FMT =
new SimpleDateFormat("yyyyMMdd.HHmmss");
public final static DateFormat SNAPSHOT_SIGNATURE_FMT = new SimpleDateFormat( "yyyyMMdd.HHmmss" );
static {
SNAPSHOT_SIGNATURE_FMT.setTimeZone(TimeZone.getTimeZone("GMT"));
static
{
SNAPSHOT_SIGNATURE_FMT.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
}
private static final Log LOG = LogFactory.getLog(DefaultArtifactDeployer.class);
private static final Log LOG = LogFactory.getLog( DefaultArtifactDeployer.class );
/**
* @see ArtifactDeployer#deploy(String, String, Project, ArtifactTypeHandler)
*/
public void deploy(String artifact, String type, Project project, ArtifactTypeHandler handler)
public void deploy( String artifact, String type, Project project, ArtifactTypeHandler handler )
throws MavenException
{
File file;
if(POM_TYPE.equals(type))
if ( POM_TYPE.equals( type ) )
{
file = project.getFile();
}
else
{
file = getFileForArtifact(artifact);
file = getFileForArtifact( artifact );
}
File md5File = createMD5Checksum(file);
try {
String repositoryPath =
handler.constructRepositoryFullPath(type, project, project.getCurrentVersion());
List srcFiles = new ArrayList();
srcFiles.add(file);
srcFiles.add(md5File);
List destFiles = new ArrayList();
destFiles.add(repositoryPath);
destFiles.add(repositoryPath + ".md5");
String repositoryPath = handler.constructRepositoryFullPath( type, project, project.getCurrentVersion() );
//do not deploy POM twice
if (DEPLOY_POM && !POM_TYPE.equals(type))
{
deploy(artifact, POM_TYPE, project, POM_ARTIFACT_TYPE_HANDLER);
}
doDeploy(srcFiles, destFiles, project);
}
finally {
//Delete md5 file
md5File.delete();
//do not deploy POM twice
if ( DEPLOY_POM && !POM_TYPE.equals( type ) )
{
deploy( artifact, POM_TYPE, project, POM_ARTIFACT_TYPE_HANDLER );
}
doDeploy( Collections.singletonList( file ), Collections.singletonList( repositoryPath ), project );
}
/**
* @see DefaultArtifactDeployer#deploySnapshot(String, String, Project, ArtifactTypeHandler)
*/
public void deploySnapshot(String artifact, String type, Project project, ArtifactTypeHandler handler)
public void deploySnapshot( String artifact, String type, Project project, ArtifactTypeHandler handler )
throws MavenException
{
String snapshotSignature = getSnapshotSignature();
File file;
if(POM_TYPE.equals(type))
if ( POM_TYPE.equals( type ) )
{
file = project.getFile();
file = project.getFile();
}
else
{
file = getFileForArtifact(artifact);
file = getFileForArtifact( artifact );
}
File md5File = createMD5Checksum(file);
File snapshotVersionFile =
createSnapshotVersionFile(file, snapshotSignature, project, type);
try {
File snapshotVersionFile = createSnapshotVersionFile( file, snapshotSignature, project, type );
try
{
List srcFiles = new ArrayList();
srcFiles.add(file);
srcFiles.add(md5File);
srcFiles.add(file);
srcFiles.add(md5File);
srcFiles.add( file );
srcFiles.add( file );
String snapshotFilename =
handler.constructRepositoryFullPath(
type,
project,
MavenConstants.SNAPSHOT_SIGNIFIER);
String timestampedFilename =
handler.constructRepositoryFullPath(type, project, snapshotSignature);
String snapshotFilename = handler.constructRepositoryFullPath( type, project,
MavenConstants.SNAPSHOT_SIGNIFIER );
String timestampedFilename = handler.constructRepositoryFullPath( type, project, snapshotSignature );
List destFiles = new ArrayList();
destFiles.add(snapshotFilename);
destFiles.add(snapshotFilename + ".md5");
destFiles.add(timestampedFilename);
destFiles.add(timestampedFilename + ".md5");
destFiles.add( snapshotFilename );
destFiles.add( timestampedFilename );
srcFiles.add(snapshotVersionFile);
srcFiles.add( snapshotVersionFile );
String snapshotVersionsFilename =
handler.constructRepositoryDirectoryPath(type, project)
+ project.getArtifactId()
+ "-snapshot-version";
destFiles.add(snapshotVersionsFilename);
String snapshotVersionsFilename = handler.constructRepositoryDirectoryPath( type, project ) +
project.getArtifactId() + "-snapshot-version";
destFiles.add( snapshotVersionsFilename );
// do not deploy POM twice
if (DEPLOY_POM_SNAPSHOT && !POM_TYPE.equals(type))
if ( DEPLOY_POM_SNAPSHOT && !POM_TYPE.equals( type ) )
{
deploySnapshot(artifact, POM_TYPE, project, POM_ARTIFACT_TYPE_HANDLER);
deploySnapshot( artifact, POM_TYPE, project, POM_ARTIFACT_TYPE_HANDLER );
}
doDeploy(srcFiles, destFiles, project);
doDeploy( srcFiles, destFiles, project );
}
finally {
// Delete md5 file
md5File.delete();
finally
{
snapshotVersionFile.delete();
}
}
@@ -206,205 +183,196 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
/**
* @see ArtifactDeployer#install(String, String, Project, ArtifactTypeHandler)
*/
public void install(String artifact, String type, Project project, ArtifactTypeHandler handler)
public void install( String artifact, String type, Project project, ArtifactTypeHandler handler )
throws MavenException
{
File file;
if(POM_TYPE.equals(type))
if ( POM_TYPE.equals( type ) )
{
file = project.getFile();
file = project.getFile();
}
else
{
file = getFileForArtifact(artifact);
file = getFileForArtifact( artifact );
}
doInstall(file, type, project, project.getCurrentVersion(), handler);
doInstall( file, type, project, project.getCurrentVersion(), handler );
// do not install twice
if (INSTALL_POM && !POM_TYPE.equals(type))
if ( INSTALL_POM && !POM_TYPE.equals( type ) )
{
doInstall(
project.getFile(),
POM_TYPE,
project,
project.getCurrentVersion(),
POM_ARTIFACT_TYPE_HANDLER);
doInstall( project.getFile(), POM_TYPE, project, project.getCurrentVersion(), POM_ARTIFACT_TYPE_HANDLER );
}
}
/**
* @see ArtifactDeployer#installSnapshot(String, String, Project, ArtifactTypeHandler)
*/
public void installSnapshot(String artifact, String type, Project project, ArtifactTypeHandler handler)
public void installSnapshot( String artifact, String type, Project project, ArtifactTypeHandler handler )
throws MavenException
{
File file;
if(POM_TYPE.equals(type))
if ( POM_TYPE.equals( type ) )
{
file = project.getFile();
file = project.getFile();
}
else
{
file = getFileForArtifact(artifact);
file = getFileForArtifact( artifact );
}
String snapshotSignature = getSnapshotSignature();
LOG.info("Installing snapshot of:'" + artifact + "''");
doInstall(file, type, project, MavenConstants.SNAPSHOT_SIGNIFIER, handler);
doInstall(file, type, project, snapshotSignature, handler);
if (INSTALL_POM_SNAPSHOT && !POM_TYPE.equals(type))
LOG.info( "Installing snapshot of:'" + artifact + "''" );
doInstall( file, type, project, MavenConstants.SNAPSHOT_SIGNIFIER, handler );
doInstall( file, type, project, snapshotSignature, handler );
if ( INSTALL_POM_SNAPSHOT && !POM_TYPE.equals( type ) )
{
File projectFile = project.getFile();
doInstall(
projectFile,
POM_TYPE,
project,
MavenConstants.SNAPSHOT_SIGNIFIER,
POM_ARTIFACT_TYPE_HANDLER);
doInstall(projectFile, POM_TYPE, project, snapshotSignature, POM_ARTIFACT_TYPE_HANDLER);
doInstall( projectFile, POM_TYPE, project, MavenConstants.SNAPSHOT_SIGNIFIER, POM_ARTIFACT_TYPE_HANDLER );
doInstall( projectFile, POM_TYPE, project, snapshotSignature, POM_ARTIFACT_TYPE_HANDLER );
}
}
/**
* Install given file in local repository
* @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
* Install given file in local repository
*
* @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
* @throws MavenException
*/
private void doInstall(
File file,
String type,
Project project,
String version,
ArtifactTypeHandler handler)
private void doInstall( File file, String type, Project project, String version, ArtifactTypeHandler handler )
throws MavenException
{
try
{
// TODO: swap for file wagon
File destFile =
new File(
getLocalRepository(project),
handler.constructRepositoryFullPath(type, project, version));
if (!destFile.getParentFile().exists())
File destFile = new File( getLocalRepository( project ),
handler.constructRepositoryFullPath( type, project, version ) );
if ( !destFile.getParentFile().exists() )
{
destFile.getParentFile().mkdirs();
}
LOG.info("Copying: from '" + file + "' to: '" + destFile + "'");
FileUtils.copyFile(file, destFile);
LOG.info( "Copying: from '" + file + "' to: '" + destFile + "'" );
FileUtils.copyFile( file, destFile );
}
catch (IOException e)
catch ( IOException e )
{
String msg =
"Cannot install file: '"
+ file
+ "'. Reason: "
+ e.getMessage();
throw new MavenException(msg, e);
String msg = "Cannot install file: '" + file + "'. Reason: " + e.getMessage();
throw new MavenException( msg, e );
}
}
private String findSshIdentity() {
private String findSshIdentity()
{
String key = findSshIdentity( System.getProperty( "user.home" ) );
if ( key != null ) {
return key;
if ( key != null )
{
return key;
}
if ( System.getProperty( "user.home" ).equals( System.getProperty( "user.home.env" ) ) == false ) {
if ( System.getProperty( "user.home" ).equals( System.getProperty( "user.home.env" ) ) == false )
{
key = findSshIdentity( System.getProperty( "user.home.env" ) );
if ( key != null ) {
return key;
if ( key != null )
{
return key;
}
}
LOG.warn( "Unable to locate identity id_rsa, id_dsa or identity - set maven.repo.default.privatekey" );
return null;
}
private String findSshIdentity( String home ) {
if ( home == null ) {
private String findSshIdentity( String home )
{
if ( home == null )
{
return null;
}
File sshHome = new File( home, ".ssh" );
LOG.debug( "Looking for SSH keys in " + sshHome );
File key = new File( sshHome, "id_dsa" );
if ( key.exists() ) {
if ( key.exists() )
{
LOG.debug( "found " + key );
return key.getAbsolutePath();
}
key = new File( sshHome, "id_rsa" );
if ( key.exists() ) {
if ( key.exists() )
{
LOG.debug( "found " + key );
return key.getAbsolutePath();
}
key = new File( sshHome, "identity" );
if ( key.exists() ) {
if ( key.exists() )
{
LOG.debug( "found " + key );
return key.getAbsolutePath();
}
return null;
}
private void doDeploy(List srcFiles, List destFiles, Project project)
private void doDeploy( List srcFiles, List destFiles, Project project )
throws MavenException
{
// trick add special values to context for default repository;
String repoStr =
(String) project.getContext().getVariable("maven.repo.list");
String repoStr = (String) project.getContext().getVariable( "maven.repo.list" );
if (repoStr == null || repoStr.trim().length() == 0)
if ( repoStr == null || repoStr.trim().length() == 0 )
{
String central = project.getDistributionSite();
String centralDirectory = project.getDistributionDirectory();
if (central == null || central.trim().length() == 0) {
central = (String) project.getContext().getVariable("maven.repo.central");
centralDirectory = (String) project.getContext().getVariable("maven.repo.central.directory");
if ( central == null || central.trim().length() == 0 )
{
central = (String) project.getContext().getVariable( "maven.repo.central" );
centralDirectory = (String) project.getContext().getVariable( "maven.repo.central.directory" );
}
if (central != null && central.trim().length() > 0) {
if ( central != null && central.trim().length() > 0 )
{
repoStr = "default";
project.getContext().setVariable("maven.repo.default", "scp://" + central);
if ( project.getContext().getVariable("maven.repo.default.privatekey") == null ) {
project.getContext().setVariable("maven.repo.default.privatekey", findSshIdentity());
project.getContext().setVariable( "maven.repo.default", "scp://" + central );
if ( project.getContext().getVariable( "maven.repo.default.privatekey" ) == null )
{
project.getContext().setVariable( "maven.repo.default.privatekey", findSshIdentity() );
}
if ( project.getContext().getVariable("maven.repo.default.passphrase") == null ) {
if ( project.getContext().getVariable( "maven.repo.default.passphrase" ) == null )
{
LOG.warn( "WARNING: assuming empty passphrase. Specify maven.repo.default.passphrase if needed" );
project.getContext().setVariable("maven.repo.default.passphrase", "");
project.getContext().setVariable( "maven.repo.default.passphrase", "" );
}
project.getContext().setVariable("maven.repo.default.directory", centralDirectory);
project.getContext().setVariable("maven.repo.default.username", project.getContext().getVariable("maven.username"));
project.getContext().setVariable("maven.repo.default.group", project.getContext().getVariable("maven.remote.group"));
project.getContext().setVariable( "maven.repo.default.directory", centralDirectory );
project.getContext().setVariable( "maven.repo.default.username",
project.getContext().getVariable( "maven.username" ) );
project.getContext().setVariable( "maven.repo.default.group",
project.getContext().getVariable( "maven.remote.group" ) );
}
}
String[] repos = StringUtils.split(repoStr, ",");
String[] repos = StringUtils.split( repoStr, "," );
LOG.info( "Will deploy to " + repos.length + " repository(ies): " + repoStr);
LOG.info( "Will deploy to " + repos.length + " repository(ies): " + repoStr );
boolean success = false;
for (int i = 0; i < repos.length; i++)
for ( int i = 0; i < repos.length; i++ )
{
String repo = repos[i].trim();
LOG.info("Deploying to repository: " + repo);
Repository repository = RepositoryBuilder.getRepository(project, repo);
LOG.info( "Deploying to repository: " + repo );
Repository repository = RepositoryBuilder.getRepository( project, repo );
try
{
deployFiles( repository, srcFiles, destFiles );
success = true;
}
catch (Exception e)
catch ( Exception e )
{
String msg =
"Failed to deploy to: "
+ repository.getId()
+ " Reason: "
+ e;
LOG.warn(msg, e);
String msg = "Failed to deploy to: " + repository.getId() + " Reason: " + e;
LOG.warn( msg, e );
// deploy to next repository
continue;
}
}
if ( !success ) {
throw new MavenException("Unable to deploy to any repositories");
if ( !success )
{
throw new MavenException( "Unable to deploy to any repositories" );
}
}
@@ -413,21 +381,22 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
AuthorizationException, MalformedURLException
{
if (srcFiles.size() != destFiles.size())
if ( srcFiles.size() != destFiles.size() )
{
String msg = "Lengths of the lists should be the same";
throw new IllegalArgumentException(msg);
throw new IllegalArgumentException( msg );
}
Wagon wagon = getWagon( repository.getProtocol() );
wagon.addTransferListener( new UploadMeter());
wagon.addTransferListener( new UploadMeter() );
wagon.addTransferListener( new ChecksumObserver() );
try
{
wagon.connect( repository );
Iterator srcIterator = srcFiles.iterator();
Iterator destIterator = destFiles.iterator();
while (srcIterator.hasNext())
while ( srcIterator.hasNext() )
{
File srcFile = (File) srcIterator.next();
String destFile = (String) destIterator.next();
@@ -440,9 +409,9 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
{
wagon.disconnect();
}
catch (Exception e)
catch ( Exception e )
{
LOG.error("Error cleaning up from the deployer", e);
LOG.error( "Error cleaning up from the deployer", e );
}
}
}
@@ -475,121 +444,74 @@ public class DefaultArtifactDeployer implements ArtifactDeployer
/**
* Return the local repository path form given project
*
* @param project
* @return The path to local repoository in local file system
*/
private String getLocalRepository(Project project)
private String getLocalRepository( Project project )
{
return project.getContext().getMavenRepoLocal();
}
/**
*
* @return
*/
private String getSnapshotSignature()
{
Date now = new Date();
return SNAPSHOT_SIGNATURE_FMT.format(now);
return SNAPSHOT_SIGNATURE_FMT.format( now );
}
/**
*
* @param artifact
* @return
*/
private File getFileForArtifact(String artifact) throws MavenException
private File getFileForArtifact( String artifact )
throws MavenException
{
File file = new File(artifact);
if (!file.exists())
File file = new File( artifact );
if ( !file.exists() )
{
String msg = "Artifact file: '" + artifact + "' must exist";
throw new MavenException(msg);
throw new MavenException( msg );
}
if (!file.canRead())
if ( !file.canRead() )
{
String msg = "Artifact file: '" + artifact + "' must be readable";
throw new MavenException(msg);
throw new MavenException( msg );
}
if (file.isDirectory())
if ( file.isDirectory() )
{
String msg =
"Artifact file: '" + artifact + "' must not be a directory";
throw new MavenException(msg);
String msg = "Artifact file: '" + artifact + "' must not be a directory";
throw new MavenException( msg );
}
return file.getAbsoluteFile();
}
/**
* Create a file which contains timestamp of the latetst snapshot
*
*
* @param snapshotVersion
* @param project
* @param type
* @return
*/
private File createSnapshotVersionFile(
File artifact,
String snapshotVersion,
Project project,
String type)
private File createSnapshotVersionFile( File artifact, String snapshotVersion, Project project, String type )
throws MavenException
{
File file = null;
String filename =
project.getArtifactId() + "-" + type + "-snapshot-version";
String filename = project.getArtifactId() + "-" + type + "-snapshot-version";
try
{
file = new File(artifact.getParent(), filename);
FileUtils.fileWrite(file.getAbsolutePath(), snapshotVersion);
file = new File( artifact.getParent(), filename );
FileUtils.fileWrite( file.getAbsolutePath(), snapshotVersion );
}
catch (Exception e)
catch ( Exception e )
{
throw new MavenException(
"Cannot create snapshot-version file:" + file);
throw new MavenException( "Cannot create snapshot-version file:" + file );
}
return file;
}
/**
* Create MD5 checksum file for given file. File is created
* in the same folder
* @param file
* @return The <code>File</code> which contatins MD5 checksum
* @throws MavenException when opertaion failed
*/
private File createMD5Checksum(File file) throws MavenException
{
// TODO: use the Observer in Wagon instead
MD5Sum md5Sum = new MD5Sum();
md5Sum.setFile(file);
try
{
md5Sum.execute();
}
catch (Exception e)
{
throw new MavenException(
"MD5 checksum error: " + e.getMessage(),
e);
}
String checksum = md5Sum.getChecksum();
File md5ChecksumFile = null;
try
{
md5ChecksumFile = new File(file.getAbsoluteFile() + ".md5");
FileUtils.fileWrite(md5ChecksumFile.getAbsolutePath(), checksum);
}
catch (Exception e)
{
throw new MavenException(
"Cannot create md5 checksum file: " + md5ChecksumFile);
}
return md5ChecksumFile;
}
}
@@ -61,9 +61,6 @@ public class UploadMeter implements TransferListener
public void transferProgress( TransferEvent transferEvent, byte[] buffer, int length )
{
// TODO: fix
// long total = transferEvent.getResource().getContentLength();
complete += length;
if (total > 0)
@@ -79,9 +76,6 @@ public class UploadMeter implements TransferListener
public void transferCompleted( TransferEvent transferEvent )
{
// TODO: fix
// long total = transferEvent.getResource().getContentLength();
System.out.println(" (" + (total/1024) + "K)");
}