mirror of https://github.com/apache/maven.git
* Migrating to wagon-manager 1.0-beta-3-SNAPSHOT
* Created org.apache.maven.artifact.manager.ArtifactManager * Deprecated org.apache.maven.artifact.manager.WagonManager in favor of new ArtifactManager * Updated the rest of maven to utilize this new ArtifactManager. * The default wagon providers list is now managed from within wagon-manager's dependency list. git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@505520 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9e03384f41
commit
33f23db7de
|
@ -32,11 +32,6 @@
|
||||||
<artifactId>maven-repository-metadata</artifactId>
|
<artifactId>maven-repository-metadata</artifactId>
|
||||||
<version>2.1-SNAPSHOT</version>
|
<version>2.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-file</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.plexus</groupId>
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
<artifactId>plexus-utils</artifactId>
|
<artifactId>plexus-utils</artifactId>
|
||||||
|
@ -52,7 +47,8 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
<groupId>org.apache.maven.wagon</groupId>
|
||||||
<artifactId>wagon-provider-api</artifactId>
|
<artifactId>wagon-manager</artifactId>
|
||||||
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>easymock</groupId>
|
<groupId>easymock</groupId>
|
||||||
|
|
|
@ -17,7 +17,7 @@ package org.apache.maven.artifact.deployer;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.maven.artifact.Artifact;
|
import org.apache.maven.artifact.Artifact;
|
||||||
import org.apache.maven.artifact.manager.WagonManager;
|
import org.apache.maven.artifact.manager.ArtifactManager;
|
||||||
import org.apache.maven.artifact.metadata.ArtifactMetadata;
|
import org.apache.maven.artifact.metadata.ArtifactMetadata;
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataDeploymentException;
|
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataDeploymentException;
|
||||||
|
@ -35,7 +35,7 @@ public class DefaultArtifactDeployer
|
||||||
extends AbstractLogEnabled
|
extends AbstractLogEnabled
|
||||||
implements ArtifactDeployer
|
implements ArtifactDeployer
|
||||||
{
|
{
|
||||||
private WagonManager wagonManager;
|
private ArtifactManager artifactManager;
|
||||||
|
|
||||||
private ArtifactTransformationManager transformationManager;
|
private ArtifactTransformationManager transformationManager;
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ public class DefaultArtifactDeployer
|
||||||
ArtifactRepository localRepository )
|
ArtifactRepository localRepository )
|
||||||
throws ArtifactDeploymentException
|
throws ArtifactDeploymentException
|
||||||
{
|
{
|
||||||
if ( !wagonManager.isOnline() )
|
if ( !artifactManager.isOnline() )
|
||||||
{
|
{
|
||||||
// deployment shouldn't silently fail when offline
|
// deployment shouldn't silently fail when offline
|
||||||
throw new ArtifactDeploymentException( "System is offline. Cannot deploy artifact: " + artifact + "." );
|
throw new ArtifactDeploymentException( "System is offline. Cannot deploy artifact: " + artifact + "." );
|
||||||
|
@ -74,7 +74,7 @@ public class DefaultArtifactDeployer
|
||||||
FileUtils.copyFile( source, artifactFile );
|
FileUtils.copyFile( source, artifactFile );
|
||||||
}
|
}
|
||||||
|
|
||||||
wagonManager.putArtifact( source, artifact, deploymentRepository );
|
artifactManager.putArtifact( source, artifact, deploymentRepository );
|
||||||
|
|
||||||
// must be after the artifact is installed
|
// must be after the artifact is installed
|
||||||
for ( Iterator i = artifact.getMetadataList().iterator(); i.hasNext(); )
|
for ( Iterator i = artifact.getMetadataList().iterator(); i.hasNext(); )
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
package org.apache.maven.artifact.manager;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.artifact.Artifact;
|
||||||
|
import org.apache.maven.artifact.metadata.ArtifactMetadata;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
|
||||||
|
import org.apache.maven.wagon.ResourceDoesNotExistException;
|
||||||
|
import org.apache.maven.wagon.TransferFailedException;
|
||||||
|
import org.apache.maven.wagon.manager.WagonManager;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manages artifact get and put related operations in Maven.
|
||||||
|
*
|
||||||
|
* Can get artifacts from remote repositories, or place local artifacts into remote repositories.
|
||||||
|
*
|
||||||
|
* @author <a href="michal.maczka@dimatics.com">Michal Maczka </a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public interface ArtifactManager
|
||||||
|
{
|
||||||
|
String ROLE = ArtifactManager.class.getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag indicating state of the ArtifactManager connectivity.
|
||||||
|
*
|
||||||
|
* @return true means we are online, false means we are offline.
|
||||||
|
*/
|
||||||
|
boolean isOnline();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the WagonManager that this ArtifactManager is using.
|
||||||
|
*
|
||||||
|
* @return the wagon manager in use.
|
||||||
|
*/
|
||||||
|
WagonManager getWagonManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an artifact from the specified List of remoteRepositories.
|
||||||
|
*
|
||||||
|
* @param artifact the artifact to fetch.
|
||||||
|
* @param remoteRepositories the list of {@link ArtifactRepository} objects to search.
|
||||||
|
* @throws TransferFailedException if the transfer failed.
|
||||||
|
* @throws ResourceDoesNotExistException if the resource does not exist on any remote repository.
|
||||||
|
*/
|
||||||
|
void getArtifact( Artifact artifact, List remoteRepositories )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an {@link Artifact} from the specified {@link ArtifactRepository}.
|
||||||
|
*
|
||||||
|
* @param artifact the artifact to fetch.
|
||||||
|
* @param repository the remote repository to search.
|
||||||
|
* @throws TransferFailedException if the transfer failed.
|
||||||
|
* @throws ResourceDoesNotExistException if the resource does not exist on the remote repository.
|
||||||
|
*/
|
||||||
|
void getArtifact( Artifact artifact, ArtifactRepository repository )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a Put of the source {@link File} to the {@link Artifact} on the specified {@link ArtifactRepository}
|
||||||
|
*
|
||||||
|
* @param source the file containing the artifact on the local file system.
|
||||||
|
* @param artifact the artifact to put to the remote repository.
|
||||||
|
* @param deploymentRepository the remote repository to put the artifact into.
|
||||||
|
* @throws TransferFailedException if the transfer failed.
|
||||||
|
*/
|
||||||
|
void putArtifact( File source, Artifact artifact, ArtifactRepository deploymentRepository )
|
||||||
|
throws TransferFailedException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a Put of the source {@link File} to the {@link ArtifactMetadata} on the specified {@link ArtifactRepository}
|
||||||
|
*
|
||||||
|
* @param source the file containing the metadata on the local file system.
|
||||||
|
* @param artifactMetadata the artifact metadata to put to the remote repository.
|
||||||
|
* @param repository the remote repository to put the artifact into.
|
||||||
|
* @throws TransferFailedException if the transfer failed.
|
||||||
|
*/
|
||||||
|
void putArtifactMetadata( File source, ArtifactMetadata artifactMetadata, ArtifactRepository repository )
|
||||||
|
throws TransferFailedException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the {@link ArtifactMetadata} from the Remote {@link ArtifactRepository}.
|
||||||
|
*
|
||||||
|
* @param metadata the metadata to attempt to fetch.
|
||||||
|
* @param remoteRepository the remote repository to find the metadata in.
|
||||||
|
* @param destination the destination file on the local file system.
|
||||||
|
* @param checksumPolicy the checksum policy to use when fetching file.
|
||||||
|
* Can be either the value {@link ArtifactRepositoryPolicy#CHECKSUM_POLICY_FAIL} or
|
||||||
|
* {@link ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE}, all other values are treated as
|
||||||
|
* {@link ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE}.
|
||||||
|
* @throws TransferFailedException
|
||||||
|
* @throws ResourceDoesNotExistException
|
||||||
|
*/
|
||||||
|
void getArtifactMetadata( ArtifactMetadata metadata, ArtifactRepository remoteRepository, File destination,
|
||||||
|
String checksumPolicy )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException;
|
||||||
|
}
|
|
@ -0,0 +1,553 @@
|
||||||
|
package org.apache.maven.artifact.manager;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.artifact.Artifact;
|
||||||
|
import org.apache.maven.artifact.metadata.ArtifactMetadata;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
|
||||||
|
import org.apache.maven.wagon.ConnectionException;
|
||||||
|
import org.apache.maven.wagon.ResourceDoesNotExistException;
|
||||||
|
import org.apache.maven.wagon.TransferFailedException;
|
||||||
|
import org.apache.maven.wagon.UnsupportedProtocolException;
|
||||||
|
import org.apache.maven.wagon.Wagon;
|
||||||
|
import org.apache.maven.wagon.authentication.AuthenticationException;
|
||||||
|
import org.apache.maven.wagon.authorization.AuthorizationException;
|
||||||
|
import org.apache.maven.wagon.manager.NotOnlineException;
|
||||||
|
import org.apache.maven.wagon.manager.RepositoryNotFoundException;
|
||||||
|
import org.apache.maven.wagon.manager.WagonConfigurationException;
|
||||||
|
import org.apache.maven.wagon.manager.WagonManager;
|
||||||
|
import org.apache.maven.wagon.observers.ChecksumObserver;
|
||||||
|
import org.apache.maven.wagon.repository.Repository;
|
||||||
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
|
import org.codehaus.plexus.util.FileUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DefaultArtifactManager
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class DefaultArtifactManager
|
||||||
|
extends AbstractLogEnabled
|
||||||
|
implements ArtifactManager
|
||||||
|
{
|
||||||
|
private WagonManager wagonManager;
|
||||||
|
|
||||||
|
public void putArtifact( File source, Artifact artifact, ArtifactRepository deploymentRepository )
|
||||||
|
throws TransferFailedException
|
||||||
|
{
|
||||||
|
putRemoteFile( deploymentRepository, source, deploymentRepository.pathOf( artifact ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void putArtifactMetadata( File source, ArtifactMetadata artifactMetadata, ArtifactRepository repository )
|
||||||
|
throws TransferFailedException
|
||||||
|
{
|
||||||
|
getLogger().info( "Uploading " + artifactMetadata );
|
||||||
|
putRemoteFile( repository, source, repository.pathOfRemoteRepositoryMetadata( artifactMetadata ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void putRemoteFile( ArtifactRepository repository, File source, String remotePath )
|
||||||
|
throws TransferFailedException
|
||||||
|
{
|
||||||
|
failIfNotOnline();
|
||||||
|
|
||||||
|
addWagonRepository( repository );
|
||||||
|
|
||||||
|
Wagon wagon = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
wagon = wagonManager.getWagon( repository.getId() );
|
||||||
|
|
||||||
|
Map checksums = new HashMap( 2 );
|
||||||
|
Map sums = new HashMap( 2 );
|
||||||
|
|
||||||
|
// TODO: configure these on the repository
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ChecksumObserver checksumObserver = new ChecksumObserver( "MD5" );
|
||||||
|
wagon.addTransferListener( checksumObserver );
|
||||||
|
checksums.put( "md5", checksumObserver );
|
||||||
|
|
||||||
|
checksumObserver = new ChecksumObserver( "SHA-1" );
|
||||||
|
wagon.addTransferListener( checksumObserver );
|
||||||
|
checksums.put( "sha1", checksumObserver );
|
||||||
|
}
|
||||||
|
catch ( NoSuchAlgorithmException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Unable to add checksum methods: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
|
||||||
|
wagon.connect();
|
||||||
|
|
||||||
|
wagon.put( source, remotePath );
|
||||||
|
|
||||||
|
// Pre-store the checksums as any future puts will overwrite them
|
||||||
|
for ( Iterator i = checksums.keySet().iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
String extension = (String) i.next();
|
||||||
|
ChecksumObserver observer = (ChecksumObserver) checksums.get( extension );
|
||||||
|
sums.put( extension, observer.getActualChecksum() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// We do this in here so we can checksum the artifact metadata too, otherwise it could be metadata itself
|
||||||
|
for ( Iterator i = checksums.keySet().iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
String extension = (String) i.next();
|
||||||
|
|
||||||
|
// TODO: shouldn't need a file intermediatary - improve wagon to take a stream
|
||||||
|
File temp = File.createTempFile( "maven-artifact", null );
|
||||||
|
temp.deleteOnExit();
|
||||||
|
FileUtils.fileWrite( temp.getAbsolutePath(), (String) sums.get( extension ) );
|
||||||
|
|
||||||
|
wagon.put( temp, remotePath + "." + extension );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( ConnectionException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Connection failed: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( AuthenticationException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Authentication failed: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( AuthorizationException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Authorization failed: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( ResourceDoesNotExistException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Resource to deploy not found: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( IOException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Error creating temporary file for deployment: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( UnsupportedProtocolException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Protocol not supported.", e );
|
||||||
|
}
|
||||||
|
catch ( RepositoryNotFoundException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Repository not found.", e );
|
||||||
|
}
|
||||||
|
catch ( WagonConfigurationException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Wagon configuration exception.", e );
|
||||||
|
}
|
||||||
|
catch ( NotOnlineException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Wagon has been configured to be offline: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
// Note: releaseWagon will disconnect too.
|
||||||
|
wagonManager.releaseWagon( wagon );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addWagonRepository( ArtifactRepository repository )
|
||||||
|
{
|
||||||
|
if ( repository instanceof Repository )
|
||||||
|
{
|
||||||
|
wagonManager.addRepository( (Repository) repository );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wagonManager.addRepository( new Repository( repository.getId(), repository.getUrl() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getArtifact( Artifact artifact, List remoteRepositories )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException
|
||||||
|
{
|
||||||
|
// TODO [BP]: The exception handling here needs some work
|
||||||
|
boolean successful = false;
|
||||||
|
for ( Iterator iter = remoteRepositories.iterator(); iter.hasNext() && !successful; )
|
||||||
|
{
|
||||||
|
ArtifactRepository repository = (ArtifactRepository) iter.next();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
getArtifact( artifact, repository );
|
||||||
|
|
||||||
|
successful = artifact.isResolved();
|
||||||
|
}
|
||||||
|
catch ( ResourceDoesNotExistException e )
|
||||||
|
{
|
||||||
|
// This one we will eat when looking through remote repositories
|
||||||
|
// because we want to cycle through them all before squawking.
|
||||||
|
|
||||||
|
getLogger().warn(
|
||||||
|
"Unable to get resource '" + artifact.getId() + "' from repository "
|
||||||
|
+ repository.getId() + " (" + repository.getUrl() + ")" );
|
||||||
|
}
|
||||||
|
catch ( TransferFailedException e )
|
||||||
|
{
|
||||||
|
getLogger().warn(
|
||||||
|
"Unable to get resource '" + artifact.getId() + "' from repository "
|
||||||
|
+ repository.getId() + " (" + repository.getUrl() + ")" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if it already exists locally we were just trying to force it - ignore the update
|
||||||
|
if ( !successful && !artifact.getFile().exists() )
|
||||||
|
{
|
||||||
|
throw new ResourceDoesNotExistException( "Unable to download the artifact from any repository" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getArtifact( Artifact artifact, ArtifactRepository repository )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException
|
||||||
|
{
|
||||||
|
String remotePath = repository.pathOf( artifact );
|
||||||
|
|
||||||
|
ArtifactRepositoryPolicy policy = artifact.isSnapshot() ? repository.getSnapshots() : repository.getReleases();
|
||||||
|
|
||||||
|
if ( !policy.isEnabled() )
|
||||||
|
{
|
||||||
|
getLogger().debug( "Skipping disabled repository " + repository.getId() );
|
||||||
|
}
|
||||||
|
else if ( repository.isBlacklisted() )
|
||||||
|
{
|
||||||
|
getLogger().debug( "Skipping blacklisted repository " + repository.getId() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
getLogger().debug( "Trying repository " + repository.getId() );
|
||||||
|
getRemoteFile( repository, artifact.getFile(), remotePath, policy.getChecksumPolicy(), false );
|
||||||
|
getLogger().debug( " Artifact resolved" );
|
||||||
|
|
||||||
|
artifact.setResolved( true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getArtifactMetadata( ArtifactMetadata metadata, ArtifactRepository repository, File destination,
|
||||||
|
String checksumPolicy )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException
|
||||||
|
{
|
||||||
|
String remotePath = repository.pathOfRemoteRepositoryMetadata( metadata );
|
||||||
|
|
||||||
|
getRemoteFile( repository, destination, remotePath, checksumPolicy, true );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getRemoteFile( ArtifactRepository repository, File destination, String remotePath,
|
||||||
|
String checksumPolicy, boolean force )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException
|
||||||
|
{
|
||||||
|
// TODO: better exceptions - transfer failed is not enough?
|
||||||
|
|
||||||
|
failIfNotOnline();
|
||||||
|
|
||||||
|
addWagonRepository( repository );
|
||||||
|
|
||||||
|
Wagon wagon = null;
|
||||||
|
|
||||||
|
File temp = new File( destination + ".tmp" );
|
||||||
|
temp.deleteOnExit();
|
||||||
|
|
||||||
|
boolean downloaded = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
wagon = wagonManager.getWagon( repository.getId() );
|
||||||
|
|
||||||
|
// TODO: configure on repository
|
||||||
|
ChecksumObserver md5ChecksumObserver;
|
||||||
|
ChecksumObserver sha1ChecksumObserver;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
md5ChecksumObserver = new ChecksumObserver( "MD5" );
|
||||||
|
wagon.addTransferListener( md5ChecksumObserver );
|
||||||
|
|
||||||
|
sha1ChecksumObserver = new ChecksumObserver( "SHA-1" );
|
||||||
|
wagon.addTransferListener( sha1ChecksumObserver );
|
||||||
|
}
|
||||||
|
catch ( NoSuchAlgorithmException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Unable to add checksum methods: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
|
||||||
|
wagon.connect();
|
||||||
|
|
||||||
|
boolean firstRun = true;
|
||||||
|
boolean retry = true;
|
||||||
|
|
||||||
|
// this will run at most twice. The first time, the firstRun flag is turned off, and if the retry flag
|
||||||
|
// is set on the first run, it will be turned off and not re-set on the second try. This is because the
|
||||||
|
// only way the retry flag can be set is if ( firstRun == true ).
|
||||||
|
while ( firstRun || retry )
|
||||||
|
{
|
||||||
|
// reset the retry flag.
|
||||||
|
retry = false;
|
||||||
|
|
||||||
|
// This should take care of creating destination directory now on
|
||||||
|
if ( destination.exists() && !force )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
downloaded = wagon.getIfNewer( remotePath, temp, destination.lastModified() );
|
||||||
|
if ( !downloaded )
|
||||||
|
{
|
||||||
|
// prevent additional checks of this artifact until it expires again
|
||||||
|
destination.setLastModified( System.currentTimeMillis() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( UnsupportedOperationException e )
|
||||||
|
{
|
||||||
|
// older wagons throw this. Just get() instead
|
||||||
|
wagon.get( remotePath, temp );
|
||||||
|
downloaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wagon.get( remotePath, temp );
|
||||||
|
downloaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( downloaded )
|
||||||
|
{
|
||||||
|
// try to verify the SHA-1 checksum for this file.
|
||||||
|
try
|
||||||
|
{
|
||||||
|
verifyChecksum( sha1ChecksumObserver, destination, temp, remotePath, ".sha1", wagon );
|
||||||
|
}
|
||||||
|
catch ( ChecksumFailedException e )
|
||||||
|
{
|
||||||
|
// if we catch a ChecksumFailedException, it means the transfer/read succeeded, but the checksum
|
||||||
|
// doesn't match. This could be a problem with the server (ibiblio HTTP-200 error page), so we'll
|
||||||
|
// try this up to two times. On the second try, we'll handle it as a bona-fide error, based on the
|
||||||
|
// repository's checksum checking policy.
|
||||||
|
if ( firstRun )
|
||||||
|
{
|
||||||
|
getLogger().warn( "*** CHECKSUM FAILED - " + e.getMessage() + " - RETRYING" );
|
||||||
|
retry = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
handleChecksumFailure( checksumPolicy, e.getMessage(), e.getCause() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( ResourceDoesNotExistException sha1TryException )
|
||||||
|
{
|
||||||
|
getLogger().debug( "SHA1 not found, trying MD5", sha1TryException );
|
||||||
|
|
||||||
|
// if this IS NOT a ChecksumFailedException, it was a problem with transfer/read of the checksum
|
||||||
|
// file...we'll try again with the MD5 checksum.
|
||||||
|
try
|
||||||
|
{
|
||||||
|
verifyChecksum( md5ChecksumObserver, destination, temp, remotePath, ".md5", wagon );
|
||||||
|
}
|
||||||
|
catch ( ChecksumFailedException e )
|
||||||
|
{
|
||||||
|
// if we also fail to verify based on the MD5 checksum, and the checksum transfer/read
|
||||||
|
// succeeded, then we need to determine whether to retry or handle it as a failure.
|
||||||
|
if ( firstRun )
|
||||||
|
{
|
||||||
|
retry = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
handleChecksumFailure( checksumPolicy, e.getMessage(), e.getCause() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( ResourceDoesNotExistException md5TryException )
|
||||||
|
{
|
||||||
|
// this was a failed transfer, and we don't want to retry.
|
||||||
|
handleChecksumFailure( checksumPolicy, "Error retrieving checksum file for " + remotePath,
|
||||||
|
md5TryException );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// unset the firstRun flag, so we don't get caught in an infinite loop...
|
||||||
|
firstRun = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( ConnectionException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Connection failed: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( AuthenticationException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Authentication failed: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( AuthorizationException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Authorization failed: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( UnsupportedProtocolException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Transfer Failed: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( RepositoryNotFoundException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Internal Error: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( WagonConfigurationException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Wagon Configuration Error: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( NotOnlineException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Wagon has been configured to be offline: " + e.getMessage(), e );
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
wagonManager.releaseWagon( wagon );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( downloaded )
|
||||||
|
{
|
||||||
|
if ( !temp.exists() )
|
||||||
|
{
|
||||||
|
throw new ResourceDoesNotExistException( "Downloaded file does not exist: " + temp );
|
||||||
|
}
|
||||||
|
|
||||||
|
// The temporary file is named destination + ".tmp" and is done this way to ensure
|
||||||
|
// that the temporary file is in the same file system as the destination because the
|
||||||
|
// File.renameTo operation doesn't really work across file systems.
|
||||||
|
// So we will attempt to do a File.renameTo for efficiency and atomicity, if this fails
|
||||||
|
// then we will use a brute force copy and delete the temporary file.
|
||||||
|
|
||||||
|
if ( !temp.renameTo( destination ) )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FileUtils.copyFile( temp, destination );
|
||||||
|
|
||||||
|
temp.delete();
|
||||||
|
}
|
||||||
|
catch ( IOException e )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "Error copying temporary file to the final destination: "
|
||||||
|
+ e.getMessage(), e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void failIfNotOnline()
|
||||||
|
throws TransferFailedException
|
||||||
|
{
|
||||||
|
if ( !isOnline() )
|
||||||
|
{
|
||||||
|
throw new TransferFailedException( "System is offline." );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleChecksumFailure( String checksumPolicy, String message, Throwable cause )
|
||||||
|
throws ChecksumFailedException
|
||||||
|
{
|
||||||
|
if ( ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL.equals( checksumPolicy ) )
|
||||||
|
{
|
||||||
|
throw new ChecksumFailedException( message, cause );
|
||||||
|
}
|
||||||
|
else if ( !ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals( checksumPolicy ) )
|
||||||
|
{
|
||||||
|
// warn if it is set to anything other than ignore
|
||||||
|
getLogger().warn( "*** CHECKSUM FAILED - " + message + " - IGNORING" );
|
||||||
|
}
|
||||||
|
// otherwise it is ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyChecksum( ChecksumObserver checksumObserver, File destination, File tempDestination,
|
||||||
|
String remotePath, String checksumFileExtension, Wagon wagon )
|
||||||
|
throws ResourceDoesNotExistException, TransferFailedException, AuthorizationException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// grab it first, because it's about to change...
|
||||||
|
String actualChecksum = checksumObserver.getActualChecksum();
|
||||||
|
|
||||||
|
File tempChecksumFile = new File( tempDestination + checksumFileExtension + ".tmp" );
|
||||||
|
tempChecksumFile.deleteOnExit();
|
||||||
|
wagon.get( remotePath + checksumFileExtension, tempChecksumFile );
|
||||||
|
|
||||||
|
String expectedChecksum = FileUtils.fileRead( tempChecksumFile );
|
||||||
|
|
||||||
|
// remove whitespaces at the end
|
||||||
|
expectedChecksum = expectedChecksum.trim();
|
||||||
|
|
||||||
|
// check for 'MD5 (name) = CHECKSUM'
|
||||||
|
if ( expectedChecksum.startsWith( "MD5" ) )
|
||||||
|
{
|
||||||
|
int lastSpacePos = expectedChecksum.lastIndexOf( ' ' );
|
||||||
|
expectedChecksum = expectedChecksum.substring( lastSpacePos + 1 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// remove everything after the first space (if available)
|
||||||
|
int spacePos = expectedChecksum.indexOf( ' ' );
|
||||||
|
|
||||||
|
if ( spacePos != -1 )
|
||||||
|
{
|
||||||
|
expectedChecksum = expectedChecksum.substring( 0, spacePos );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( expectedChecksum.equals( actualChecksum ) )
|
||||||
|
{
|
||||||
|
File checksumFile = new File( destination + checksumFileExtension );
|
||||||
|
if ( checksumFile.exists() )
|
||||||
|
{
|
||||||
|
checksumFile.delete();
|
||||||
|
}
|
||||||
|
FileUtils.copyFile( tempChecksumFile, checksumFile );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new ChecksumFailedException( "Checksum failed on download: local = '" + actualChecksum
|
||||||
|
+ "'; remote = '" + expectedChecksum + "'" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( IOException e )
|
||||||
|
{
|
||||||
|
throw new ChecksumFailedException( "Invalid checksum file", e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOnline()
|
||||||
|
{
|
||||||
|
return wagonManager.isOnline();
|
||||||
|
}
|
||||||
|
|
||||||
|
public WagonManager getWagonManager()
|
||||||
|
{
|
||||||
|
return wagonManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public void registerWagons( Collection wagons, PlexusContainer extensionContainer )
|
||||||
|
{
|
||||||
|
for ( Iterator i = wagons.iterator(); i.hasNext(); )
|
||||||
|
{
|
||||||
|
availableWagons.put( i.next(), extensionContainer );
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
|
@ -1,19 +1,22 @@
|
||||||
package org.apache.maven.artifact.manager;
|
package org.apache.maven.artifact.manager;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2001-2006 The Apache Software Foundation.
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
*
|
* or more contributor license agreements. See the NOTICE file
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* distributed with this work for additional information
|
||||||
* you may not use this file except in compliance with the License.
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
* You may obtain a copy of the License at
|
* to you 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
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing,
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* software distributed under the License is distributed on an
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
* See the License for the specific language governing permissions and
|
* KIND, either express or implied. See the License for the
|
||||||
* limitations under the License.
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.maven.artifact.Artifact;
|
import org.apache.maven.artifact.Artifact;
|
||||||
|
@ -31,6 +34,10 @@ import org.apache.maven.wagon.authentication.AuthenticationException;
|
||||||
import org.apache.maven.wagon.authentication.AuthenticationInfo;
|
import org.apache.maven.wagon.authentication.AuthenticationInfo;
|
||||||
import org.apache.maven.wagon.authorization.AuthorizationException;
|
import org.apache.maven.wagon.authorization.AuthorizationException;
|
||||||
import org.apache.maven.wagon.events.TransferListener;
|
import org.apache.maven.wagon.events.TransferListener;
|
||||||
|
import org.apache.maven.wagon.manager.NotOnlineException;
|
||||||
|
import org.apache.maven.wagon.manager.RepositoryNotFoundException;
|
||||||
|
import org.apache.maven.wagon.manager.RepositorySettings;
|
||||||
|
import org.apache.maven.wagon.manager.WagonConfigurationException;
|
||||||
import org.apache.maven.wagon.observers.ChecksumObserver;
|
import org.apache.maven.wagon.observers.ChecksumObserver;
|
||||||
import org.apache.maven.wagon.proxy.ProxyInfo;
|
import org.apache.maven.wagon.proxy.ProxyInfo;
|
||||||
import org.apache.maven.wagon.repository.Repository;
|
import org.apache.maven.wagon.repository.Repository;
|
||||||
|
@ -59,803 +66,168 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DefaultWagonManager
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
* @deprecated in favor of {@link ArtifactManager} and {@link WagonManager}
|
||||||
|
*/
|
||||||
public class DefaultWagonManager
|
public class DefaultWagonManager
|
||||||
extends AbstractLogEnabled
|
extends AbstractLogEnabled
|
||||||
implements WagonManager, Contextualizable
|
implements WagonManager
|
||||||
{
|
{
|
||||||
private static final String WILDCARD = "*";
|
private ArtifactManager artifactManager;
|
||||||
|
|
||||||
private PlexusContainer container;
|
|
||||||
|
|
||||||
// TODO: proxies, authentication and mirrors are via settings, and should come in via an alternate method - perhaps
|
|
||||||
// attached to ArtifactRepository before the method is called (so AR would be composed of WR, not inherit it)
|
|
||||||
private Map proxies = new HashMap();
|
|
||||||
|
|
||||||
private Map authenticationInfoMap = new HashMap();
|
|
||||||
|
|
||||||
private Map serverPermissionsMap = new HashMap();
|
|
||||||
|
|
||||||
private Map mirrors = new HashMap();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Map( String, XmlPlexusConfiguration ) with the repository id and the wagon configuration
|
|
||||||
*/
|
|
||||||
private Map serverConfigurationMap = new HashMap();
|
|
||||||
|
|
||||||
private TransferListener downloadMonitor;
|
private TransferListener downloadMonitor;
|
||||||
|
|
||||||
private boolean online = true;
|
private RepositorySettings getRepositorySettings( String repositoryId )
|
||||||
|
|
||||||
private ArtifactRepositoryFactory repositoryFactory;
|
|
||||||
|
|
||||||
private boolean interactive = true;
|
|
||||||
|
|
||||||
private Map availableWagons = new HashMap();
|
|
||||||
|
|
||||||
// TODO: this leaks the component in the public api - it is never released back to the container
|
|
||||||
public Wagon getWagon( Repository repository )
|
|
||||||
throws UnsupportedProtocolException, WagonConfigurationException
|
|
||||||
{
|
{
|
||||||
String protocol = repository.getProtocol();
|
return artifactManager.getWagonManager().getRepositorySettings( repositoryId );
|
||||||
|
|
||||||
if ( protocol == null )
|
|
||||||
{
|
|
||||||
throw new UnsupportedProtocolException( "The repository " + repository + " does not specify a protocol" );
|
|
||||||
}
|
|
||||||
|
|
||||||
Wagon wagon = getWagon( protocol );
|
|
||||||
|
|
||||||
configureWagon( wagon, repository.getId() );
|
|
||||||
|
|
||||||
return wagon;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Wagon getWagon( String protocol )
|
|
||||||
throws UnsupportedProtocolException
|
|
||||||
{
|
|
||||||
PlexusContainer container = getWagonContainer( protocol );
|
|
||||||
|
|
||||||
Wagon wagon;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
wagon = (Wagon) container.lookup( Wagon.ROLE, protocol );
|
|
||||||
}
|
|
||||||
catch ( ComponentLookupException e1 )
|
|
||||||
{
|
|
||||||
e1.printStackTrace();
|
|
||||||
|
|
||||||
throw new UnsupportedProtocolException(
|
|
||||||
"Cannot find wagon which supports the requested protocol: " + protocol, e1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
wagon.setInteractive( interactive );
|
|
||||||
|
|
||||||
return wagon;
|
|
||||||
}
|
|
||||||
|
|
||||||
private PlexusContainer getWagonContainer( String protocol )
|
|
||||||
{
|
|
||||||
PlexusContainer container = this.container;
|
|
||||||
|
|
||||||
if ( availableWagons.containsKey( protocol ) )
|
|
||||||
{
|
|
||||||
container = (PlexusContainer) availableWagons.get( protocol );
|
|
||||||
}
|
|
||||||
return container;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void putArtifact( File source, Artifact artifact, ArtifactRepository deploymentRepository )
|
|
||||||
throws TransferFailedException
|
|
||||||
{
|
|
||||||
putRemoteFile( deploymentRepository, source, deploymentRepository.pathOf( artifact ), downloadMonitor );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void putArtifactMetadata( File source, ArtifactMetadata artifactMetadata, ArtifactRepository repository )
|
|
||||||
throws TransferFailedException
|
|
||||||
{
|
|
||||||
getLogger().info( "Uploading " + artifactMetadata );
|
|
||||||
putRemoteFile( repository, source, repository.pathOfRemoteRepositoryMetadata( artifactMetadata ), null );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void putRemoteFile( ArtifactRepository repository, File source, String remotePath,
|
|
||||||
TransferListener downloadMonitor )
|
|
||||||
throws TransferFailedException
|
|
||||||
{
|
|
||||||
failIfNotOnline();
|
|
||||||
|
|
||||||
String protocol = repository.getProtocol();
|
|
||||||
|
|
||||||
Wagon wagon;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
wagon = getWagon( protocol );
|
|
||||||
|
|
||||||
configureWagon( wagon, repository );
|
|
||||||
}
|
|
||||||
catch ( UnsupportedProtocolException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Unsupported Protocol: '" + protocol + "': " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( downloadMonitor != null )
|
|
||||||
{
|
|
||||||
wagon.addTransferListener( downloadMonitor );
|
|
||||||
}
|
|
||||||
|
|
||||||
Map checksums = new HashMap( 2 );
|
|
||||||
Map sums = new HashMap( 2 );
|
|
||||||
|
|
||||||
// TODO: configure these on the repository
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ChecksumObserver checksumObserver = new ChecksumObserver( "MD5" );
|
|
||||||
wagon.addTransferListener( checksumObserver );
|
|
||||||
checksums.put( "md5", checksumObserver );
|
|
||||||
checksumObserver = new ChecksumObserver( "SHA-1" );
|
|
||||||
wagon.addTransferListener( checksumObserver );
|
|
||||||
checksums.put( "sha1", checksumObserver );
|
|
||||||
}
|
|
||||||
catch ( NoSuchAlgorithmException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Unable to add checksum methods: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Repository artifactRepository = new Repository( repository.getId(), repository.getUrl() );
|
|
||||||
|
|
||||||
if ( serverPermissionsMap.containsKey( repository.getId() ) )
|
|
||||||
{
|
|
||||||
RepositoryPermissions perms = (RepositoryPermissions) serverPermissionsMap.get( repository.getId() );
|
|
||||||
getLogger().debug(
|
|
||||||
"adding permissions to wagon connection: " + perms.getFileMode() + " " + perms.getDirectoryMode() );
|
|
||||||
artifactRepository.setPermissions( perms );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
getLogger().debug( "not adding permissions to wagon connection" );
|
|
||||||
}
|
|
||||||
|
|
||||||
wagon.connect( artifactRepository, getAuthenticationInfo( repository.getId() ), getProxy( protocol ) );
|
|
||||||
|
|
||||||
wagon.put( source, remotePath );
|
|
||||||
|
|
||||||
wagon.removeTransferListener( downloadMonitor );
|
|
||||||
|
|
||||||
// Pre-store the checksums as any future puts will overwrite them
|
|
||||||
for ( Iterator i = checksums.keySet().iterator(); i.hasNext(); )
|
|
||||||
{
|
|
||||||
String extension = (String) i.next();
|
|
||||||
ChecksumObserver observer = (ChecksumObserver) checksums.get( extension );
|
|
||||||
sums.put( extension, observer.getActualChecksum() );
|
|
||||||
}
|
|
||||||
|
|
||||||
// We do this in here so we can checksum the artifact metadata too, otherwise it could be metadata itself
|
|
||||||
for ( Iterator i = checksums.keySet().iterator(); i.hasNext(); )
|
|
||||||
{
|
|
||||||
String extension = (String) i.next();
|
|
||||||
|
|
||||||
// TODO: shouldn't need a file intermediatary - improve wagon to take a stream
|
|
||||||
File temp = File.createTempFile( "maven-artifact", null );
|
|
||||||
temp.deleteOnExit();
|
|
||||||
FileUtils.fileWrite( temp.getAbsolutePath(), (String) sums.get( extension ) );
|
|
||||||
|
|
||||||
wagon.put( temp, remotePath + "." + extension );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch ( ConnectionException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Connection failed: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
catch ( AuthenticationException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Authentication failed: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
catch ( AuthorizationException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Authorization failed: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
catch ( ResourceDoesNotExistException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Resource to deploy not found: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
catch ( IOException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Error creating temporary file for deployment: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
disconnectWagon( wagon );
|
|
||||||
|
|
||||||
releaseWagon( protocol, wagon );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getArtifact( Artifact artifact, List remoteRepositories )
|
|
||||||
throws TransferFailedException, ResourceDoesNotExistException
|
|
||||||
{
|
|
||||||
// TODO [BP]: The exception handling here needs some work
|
|
||||||
boolean successful = false;
|
|
||||||
for ( Iterator iter = remoteRepositories.iterator(); iter.hasNext() && !successful; )
|
|
||||||
{
|
|
||||||
ArtifactRepository repository = (ArtifactRepository) iter.next();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
getArtifact( artifact, repository );
|
|
||||||
|
|
||||||
successful = artifact.isResolved();
|
|
||||||
}
|
|
||||||
catch ( ResourceDoesNotExistException e )
|
|
||||||
{
|
|
||||||
// This one we will eat when looking through remote repositories
|
|
||||||
// because we want to cycle through them all before squawking.
|
|
||||||
|
|
||||||
getLogger().warn( "Unable to get resource '" + artifact.getId() + "' from repository " +
|
|
||||||
repository.getId() + " (" + repository.getUrl() + ")" );
|
|
||||||
}
|
|
||||||
catch ( TransferFailedException e )
|
|
||||||
{
|
|
||||||
getLogger().warn( "Unable to get resource '" + artifact.getId() + "' from repository " +
|
|
||||||
repository.getId() + " (" + repository.getUrl() + ")" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if it already exists locally we were just trying to force it - ignore the update
|
|
||||||
if ( !successful && !artifact.getFile().exists() )
|
|
||||||
{
|
|
||||||
throw new ResourceDoesNotExistException( "Unable to download the artifact from any repository" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getArtifact( Artifact artifact, ArtifactRepository repository )
|
|
||||||
throws TransferFailedException, ResourceDoesNotExistException
|
|
||||||
{
|
|
||||||
String remotePath = repository.pathOf( artifact );
|
|
||||||
|
|
||||||
ArtifactRepositoryPolicy policy = artifact.isSnapshot() ? repository.getSnapshots() : repository.getReleases();
|
|
||||||
|
|
||||||
if ( !policy.isEnabled() )
|
|
||||||
{
|
|
||||||
getLogger().debug( "Skipping disabled repository " + repository.getId() );
|
|
||||||
}
|
|
||||||
else if ( repository.isBlacklisted() )
|
|
||||||
{
|
|
||||||
getLogger().debug( "Skipping blacklisted repository " + repository.getId() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
getLogger().debug( "Trying repository " + repository.getId() );
|
|
||||||
getRemoteFile( repository, artifact.getFile(), remotePath, downloadMonitor, policy.getChecksumPolicy(),
|
|
||||||
false );
|
|
||||||
getLogger().debug( " Artifact resolved" );
|
|
||||||
|
|
||||||
artifact.setResolved( true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void getArtifactMetadata( ArtifactMetadata metadata, ArtifactRepository repository, File destination,
|
|
||||||
String checksumPolicy )
|
|
||||||
throws TransferFailedException, ResourceDoesNotExistException
|
|
||||||
{
|
|
||||||
String remotePath = repository.pathOfRemoteRepositoryMetadata( metadata );
|
|
||||||
|
|
||||||
getRemoteFile( repository, destination, remotePath, null, checksumPolicy, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getRemoteFile( ArtifactRepository repository, File destination, String remotePath,
|
|
||||||
TransferListener downloadMonitor, String checksumPolicy, boolean force )
|
|
||||||
throws TransferFailedException, ResourceDoesNotExistException
|
|
||||||
{
|
|
||||||
// TODO: better excetpions - transfer failed is not enough?
|
|
||||||
|
|
||||||
failIfNotOnline();
|
|
||||||
|
|
||||||
ArtifactRepository mirror = getMirror( repository.getId() );
|
|
||||||
if ( mirror != null )
|
|
||||||
{
|
|
||||||
repository = repositoryFactory.createArtifactRepository( mirror.getId(), mirror.getUrl(),
|
|
||||||
repository.getLayout(), repository.getSnapshots(),
|
|
||||||
repository.getReleases() );
|
|
||||||
}
|
|
||||||
|
|
||||||
String protocol = repository.getProtocol();
|
|
||||||
Wagon wagon;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
wagon = getWagon( protocol );
|
|
||||||
|
|
||||||
configureWagon( wagon, repository );
|
|
||||||
}
|
|
||||||
catch ( UnsupportedProtocolException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Unsupported Protocol: '" + protocol + "': " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( downloadMonitor != null )
|
|
||||||
{
|
|
||||||
wagon.addTransferListener( downloadMonitor );
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: configure on repository
|
|
||||||
ChecksumObserver md5ChecksumObserver;
|
|
||||||
ChecksumObserver sha1ChecksumObserver;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
md5ChecksumObserver = new ChecksumObserver( "MD5" );
|
|
||||||
wagon.addTransferListener( md5ChecksumObserver );
|
|
||||||
|
|
||||||
sha1ChecksumObserver = new ChecksumObserver( "SHA-1" );
|
|
||||||
wagon.addTransferListener( sha1ChecksumObserver );
|
|
||||||
}
|
|
||||||
catch ( NoSuchAlgorithmException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Unable to add checksum methods: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
|
|
||||||
File temp = new File( destination + ".tmp" );
|
|
||||||
temp.deleteOnExit();
|
|
||||||
|
|
||||||
boolean downloaded = false;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
wagon.connect( new Repository( repository.getId(), repository.getUrl() ),
|
|
||||||
getAuthenticationInfo( repository.getId() ), getProxy( protocol ) );
|
|
||||||
|
|
||||||
boolean firstRun = true;
|
|
||||||
boolean retry = true;
|
|
||||||
|
|
||||||
// this will run at most twice. The first time, the firstRun flag is turned off, and if the retry flag
|
|
||||||
// is set on the first run, it will be turned off and not re-set on the second try. This is because the
|
|
||||||
// only way the retry flag can be set is if ( firstRun == true ).
|
|
||||||
while ( firstRun || retry )
|
|
||||||
{
|
|
||||||
// reset the retry flag.
|
|
||||||
retry = false;
|
|
||||||
|
|
||||||
// This should take care of creating destination directory now on
|
|
||||||
if ( destination.exists() && !force )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
downloaded = wagon.getIfNewer( remotePath, temp, destination.lastModified() );
|
|
||||||
if ( !downloaded )
|
|
||||||
{
|
|
||||||
// prevent additional checks of this artifact until it expires again
|
|
||||||
destination.setLastModified( System.currentTimeMillis() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch ( UnsupportedOperationException e )
|
|
||||||
{
|
|
||||||
// older wagons throw this. Just get() instead
|
|
||||||
wagon.get( remotePath, temp );
|
|
||||||
downloaded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wagon.get( remotePath, temp );
|
|
||||||
downloaded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( downloaded )
|
|
||||||
{
|
|
||||||
// keep the checksum files from showing up on the download monitor...
|
|
||||||
if ( downloadMonitor != null )
|
|
||||||
{
|
|
||||||
wagon.removeTransferListener( downloadMonitor );
|
|
||||||
}
|
|
||||||
|
|
||||||
// try to verify the SHA-1 checksum for this file.
|
|
||||||
try
|
|
||||||
{
|
|
||||||
verifyChecksum( sha1ChecksumObserver, destination, temp, remotePath, ".sha1", wagon );
|
|
||||||
}
|
|
||||||
catch ( ChecksumFailedException e )
|
|
||||||
{
|
|
||||||
// if we catch a ChecksumFailedException, it means the transfer/read succeeded, but the checksum
|
|
||||||
// doesn't match. This could be a problem with the server (ibiblio HTTP-200 error page), so we'll
|
|
||||||
// try this up to two times. On the second try, we'll handle it as a bona-fide error, based on the
|
|
||||||
// repository's checksum checking policy.
|
|
||||||
if ( firstRun )
|
|
||||||
{
|
|
||||||
getLogger().warn( "*** CHECKSUM FAILED - " + e.getMessage() + " - RETRYING" );
|
|
||||||
retry = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
handleChecksumFailure( checksumPolicy, e.getMessage(), e.getCause() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch ( ResourceDoesNotExistException sha1TryException )
|
|
||||||
{
|
|
||||||
getLogger().debug( "SHA1 not found, trying MD5", sha1TryException );
|
|
||||||
|
|
||||||
// if this IS NOT a ChecksumFailedException, it was a problem with transfer/read of the checksum
|
|
||||||
// file...we'll try again with the MD5 checksum.
|
|
||||||
try
|
|
||||||
{
|
|
||||||
verifyChecksum( md5ChecksumObserver, destination, temp, remotePath, ".md5", wagon );
|
|
||||||
}
|
|
||||||
catch ( ChecksumFailedException e )
|
|
||||||
{
|
|
||||||
// if we also fail to verify based on the MD5 checksum, and the checksum transfer/read
|
|
||||||
// succeeded, then we need to determine whether to retry or handle it as a failure.
|
|
||||||
if ( firstRun )
|
|
||||||
{
|
|
||||||
retry = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
handleChecksumFailure( checksumPolicy, e.getMessage(), e.getCause() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch ( ResourceDoesNotExistException md5TryException )
|
|
||||||
{
|
|
||||||
// this was a failed transfer, and we don't want to retry.
|
|
||||||
handleChecksumFailure( checksumPolicy, "Error retrieving checksum file for " + remotePath,
|
|
||||||
md5TryException );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// reinstate the download monitor...
|
|
||||||
if ( downloadMonitor != null )
|
|
||||||
{
|
|
||||||
wagon.addTransferListener( downloadMonitor );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// unset the firstRun flag, so we don't get caught in an infinite loop...
|
|
||||||
firstRun = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch ( ConnectionException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Connection failed: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
catch ( AuthenticationException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Authentication failed: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
catch ( AuthorizationException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "Authorization failed: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
disconnectWagon( wagon );
|
|
||||||
|
|
||||||
releaseWagon( protocol, wagon );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( downloaded )
|
|
||||||
{
|
|
||||||
if ( !temp.exists() )
|
|
||||||
{
|
|
||||||
throw new ResourceDoesNotExistException( "Downloaded file does not exist: " + temp );
|
|
||||||
}
|
|
||||||
|
|
||||||
// The temporary file is named destination + ".tmp" and is done this way to ensure
|
|
||||||
// that the temporary file is in the same file system as the destination because the
|
|
||||||
// File.renameTo operation doesn't really work across file systems.
|
|
||||||
// So we will attempt to do a File.renameTo for efficiency and atomicity, if this fails
|
|
||||||
// then we will use a brute force copy and delete the temporary file.
|
|
||||||
|
|
||||||
if ( !temp.renameTo( destination ) )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
FileUtils.copyFile( temp, destination );
|
|
||||||
|
|
||||||
temp.delete();
|
|
||||||
}
|
|
||||||
catch ( IOException e )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException(
|
|
||||||
"Error copying temporary file to the final destination: " + e.getMessage(), e );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void failIfNotOnline()
|
|
||||||
throws TransferFailedException
|
|
||||||
{
|
|
||||||
if ( !isOnline() )
|
|
||||||
{
|
|
||||||
throw new TransferFailedException( "System is offline." );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void handleChecksumFailure( String checksumPolicy, String message, Throwable cause )
|
|
||||||
throws ChecksumFailedException
|
|
||||||
{
|
|
||||||
if ( ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL.equals( checksumPolicy ) )
|
|
||||||
{
|
|
||||||
throw new ChecksumFailedException( message, cause );
|
|
||||||
}
|
|
||||||
else if ( !ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE.equals( checksumPolicy ) )
|
|
||||||
{
|
|
||||||
// warn if it is set to anything other than ignore
|
|
||||||
getLogger().warn( "*** CHECKSUM FAILED - " + message + " - IGNORING" );
|
|
||||||
}
|
|
||||||
// otherwise it is ignore
|
|
||||||
}
|
|
||||||
|
|
||||||
private void verifyChecksum( ChecksumObserver checksumObserver, File destination, File tempDestination,
|
|
||||||
String remotePath, String checksumFileExtension, Wagon wagon )
|
|
||||||
throws ResourceDoesNotExistException, TransferFailedException, AuthorizationException
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// grab it first, because it's about to change...
|
|
||||||
String actualChecksum = checksumObserver.getActualChecksum();
|
|
||||||
|
|
||||||
File tempChecksumFile = new File( tempDestination + checksumFileExtension + ".tmp" );
|
|
||||||
tempChecksumFile.deleteOnExit();
|
|
||||||
wagon.get( remotePath + checksumFileExtension, tempChecksumFile );
|
|
||||||
|
|
||||||
String expectedChecksum = FileUtils.fileRead( tempChecksumFile );
|
|
||||||
|
|
||||||
// remove whitespaces at the end
|
|
||||||
expectedChecksum = expectedChecksum.trim();
|
|
||||||
|
|
||||||
// check for 'MD5 (name) = CHECKSUM'
|
|
||||||
if ( expectedChecksum.startsWith( "MD5" ) )
|
|
||||||
{
|
|
||||||
int lastSpacePos = expectedChecksum.lastIndexOf( ' ' );
|
|
||||||
expectedChecksum = expectedChecksum.substring( lastSpacePos + 1 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// remove everything after the first space (if available)
|
|
||||||
int spacePos = expectedChecksum.indexOf( ' ' );
|
|
||||||
|
|
||||||
if ( spacePos != -1 )
|
|
||||||
{
|
|
||||||
expectedChecksum = expectedChecksum.substring( 0, spacePos );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( expectedChecksum.equals( actualChecksum ) )
|
|
||||||
{
|
|
||||||
File checksumFile = new File( destination + checksumFileExtension );
|
|
||||||
if ( checksumFile.exists() )
|
|
||||||
{
|
|
||||||
checksumFile.delete();
|
|
||||||
}
|
|
||||||
FileUtils.copyFile( tempChecksumFile, checksumFile );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new ChecksumFailedException( "Checksum failed on download: local = '" + actualChecksum +
|
|
||||||
"'; remote = '" + expectedChecksum + "'" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch ( IOException e )
|
|
||||||
{
|
|
||||||
throw new ChecksumFailedException( "Invalid checksum file", e );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void disconnectWagon( Wagon wagon )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
wagon.disconnect();
|
|
||||||
}
|
|
||||||
catch ( ConnectionException e )
|
|
||||||
{
|
|
||||||
getLogger().error( "Problem disconnecting from wagon - ignoring: " + e.getMessage() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void releaseWagon( String protocol, Wagon wagon )
|
|
||||||
{
|
|
||||||
PlexusContainer container = getWagonContainer( protocol );
|
|
||||||
try
|
|
||||||
{
|
|
||||||
container.release( wagon );
|
|
||||||
}
|
|
||||||
catch ( ComponentLifecycleException e )
|
|
||||||
{
|
|
||||||
getLogger().error( "Problem releasing wagon - ignoring: " + e.getMessage() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProxyInfo getProxy( String protocol )
|
|
||||||
{
|
|
||||||
return (ProxyInfo) proxies.get( protocol );
|
|
||||||
}
|
|
||||||
|
|
||||||
public AuthenticationInfo getAuthenticationInfo( String id )
|
|
||||||
{
|
|
||||||
return (AuthenticationInfo) authenticationInfoMap.get( id );
|
|
||||||
}
|
|
||||||
|
|
||||||
public ArtifactRepository getMirror( String mirrorOf )
|
|
||||||
{
|
|
||||||
ArtifactRepository repository = (ArtifactRepository) mirrors.get( mirrorOf );
|
|
||||||
if ( repository == null )
|
|
||||||
{
|
|
||||||
repository = (ArtifactRepository) mirrors.get( WILDCARD );
|
|
||||||
}
|
|
||||||
return repository;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the proxy used for a particular protocol.
|
|
||||||
*
|
|
||||||
* @param protocol the protocol (required)
|
|
||||||
* @param host the proxy host name (required)
|
|
||||||
* @param port the proxy port (required)
|
|
||||||
* @param username the username for the proxy, or null if there is none
|
|
||||||
* @param password the password for the proxy, or null if there is none
|
|
||||||
* @param nonProxyHosts the set of hosts not to use the proxy for. Follows Java system
|
|
||||||
* property format: <code>*.foo.com|localhost</code>.
|
|
||||||
* @todo [BP] would be nice to configure this via plexus in some way
|
|
||||||
*/
|
|
||||||
public void addProxy( String protocol, String host, int port, String username, String password,
|
|
||||||
String nonProxyHosts )
|
|
||||||
{
|
|
||||||
ProxyInfo proxyInfo = new ProxyInfo();
|
|
||||||
proxyInfo.setHost( host );
|
|
||||||
proxyInfo.setType( protocol );
|
|
||||||
proxyInfo.setPort( port );
|
|
||||||
proxyInfo.setNonProxyHosts( nonProxyHosts );
|
|
||||||
proxyInfo.setUserName( username );
|
|
||||||
proxyInfo.setPassword( password );
|
|
||||||
|
|
||||||
proxies.put( protocol, proxyInfo );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void contextualize( Context context )
|
|
||||||
throws ContextException
|
|
||||||
{
|
|
||||||
container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo I'd rather not be setting this explicitly.
|
|
||||||
*/
|
|
||||||
public void setDownloadMonitor( TransferListener downloadMonitor )
|
|
||||||
{
|
|
||||||
this.downloadMonitor = downloadMonitor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addAuthenticationInfo( String repositoryId, String username, String password, String privateKey,
|
public void addAuthenticationInfo( String repositoryId, String username, String password, String privateKey,
|
||||||
String passphrase )
|
String passphrase )
|
||||||
{
|
{
|
||||||
AuthenticationInfo authInfo = new AuthenticationInfo();
|
RepositorySettings settings = getRepositorySettings( repositoryId );
|
||||||
|
settings.setAuthentication( username, password, privateKey, passphrase );
|
||||||
authInfo.setUserName( username );
|
|
||||||
|
|
||||||
authInfo.setPassword( password );
|
|
||||||
|
|
||||||
authInfo.setPrivateKey( privateKey );
|
|
||||||
|
|
||||||
authInfo.setPassphrase( passphrase );
|
|
||||||
|
|
||||||
authenticationInfoMap.put( repositoryId, authInfo );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addPermissionInfo( String repositoryId, String filePermissions, String directoryPermissions )
|
|
||||||
{
|
|
||||||
|
|
||||||
RepositoryPermissions permissions = new RepositoryPermissions();
|
|
||||||
boolean addPermissions = false;
|
|
||||||
|
|
||||||
if ( filePermissions != null )
|
|
||||||
{
|
|
||||||
permissions.setFileMode( filePermissions );
|
|
||||||
addPermissions = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( directoryPermissions != null )
|
|
||||||
{
|
|
||||||
permissions.setDirectoryMode( directoryPermissions );
|
|
||||||
addPermissions = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( addPermissions )
|
|
||||||
{
|
|
||||||
serverPermissionsMap.put( repositoryId, permissions );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addMirror( String id, String mirrorOf, String url )
|
|
||||||
{
|
|
||||||
ArtifactRepository mirror = new DefaultArtifactRepository( id, url, null );
|
|
||||||
|
|
||||||
mirrors.put( mirrorOf, mirror );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOnline( boolean online )
|
|
||||||
{
|
|
||||||
this.online = online;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isOnline()
|
|
||||||
{
|
|
||||||
return online;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setInteractive( boolean interactive )
|
|
||||||
{
|
|
||||||
this.interactive = interactive;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void registerWagons( Collection wagons, PlexusContainer extensionContainer )
|
|
||||||
{
|
|
||||||
for ( Iterator i = wagons.iterator(); i.hasNext(); )
|
|
||||||
{
|
|
||||||
availableWagons.put( i.next(), extensionContainer );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies the server configuration to the wagon
|
|
||||||
*
|
|
||||||
* @param wagon the wagon to configure
|
|
||||||
* @param repository the repository that has the configuration
|
|
||||||
* @throws WagonConfigurationException wraps any error given during configuration of the wagon instance
|
|
||||||
*/
|
|
||||||
private void configureWagon( Wagon wagon, ArtifactRepository repository )
|
|
||||||
throws WagonConfigurationException
|
|
||||||
{
|
|
||||||
configureWagon( wagon, repository.getId() );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void configureWagon( Wagon wagon, String repositoryId )
|
|
||||||
throws WagonConfigurationException
|
|
||||||
{
|
|
||||||
if ( serverConfigurationMap.containsKey( repositoryId ) )
|
|
||||||
{
|
|
||||||
ComponentConfigurator componentConfigurator = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
componentConfigurator = (ComponentConfigurator) container.lookup( ComponentConfigurator.ROLE );
|
|
||||||
componentConfigurator.configureComponent( wagon, (PlexusConfiguration) serverConfigurationMap
|
|
||||||
.get( repositoryId ), container.getContainerRealm() );
|
|
||||||
}
|
|
||||||
catch ( final ComponentLookupException e )
|
|
||||||
{
|
|
||||||
throw new WagonConfigurationException( repositoryId,
|
|
||||||
"Unable to lookup wagon configurator. Wagon configuration cannot be applied.",
|
|
||||||
e );
|
|
||||||
}
|
|
||||||
catch ( ComponentConfigurationException e )
|
|
||||||
{
|
|
||||||
throw new WagonConfigurationException( repositoryId, "Unable to apply wagon configuration.", e );
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if ( componentConfigurator != null )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
container.release( componentConfigurator );
|
|
||||||
}
|
|
||||||
catch ( ComponentLifecycleException e )
|
|
||||||
{
|
|
||||||
getLogger().error( "Problem releasing configurator - ignoring: " + e.getMessage() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addConfiguration( String repositoryId, Xpp3Dom configuration )
|
public void addConfiguration( String repositoryId, Xpp3Dom configuration )
|
||||||
{
|
{
|
||||||
if ( repositoryId == null || configuration == null )
|
RepositorySettings settings = getRepositorySettings( repositoryId );
|
||||||
|
settings.setConfiguration( new XmlPlexusConfiguration( configuration ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addMirror( String id, String mirrorOf, String url )
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException( "arguments can't be null" );
|
RepositorySettings settings = getRepositorySettings( mirrorOf );
|
||||||
|
Repository repository = new Repository( id, url );
|
||||||
|
artifactManager.getWagonManager().addRepository( repository );
|
||||||
|
settings.addMirror( repository.getId() );
|
||||||
}
|
}
|
||||||
|
|
||||||
final XmlPlexusConfiguration xmlConf = new XmlPlexusConfiguration( configuration );
|
public void addPermissionInfo( String repositoryId, String filePermissions, String directoryPermissions )
|
||||||
|
{
|
||||||
serverConfigurationMap.put( repositoryId, xmlConf );
|
RepositorySettings settings = getRepositorySettings( repositoryId );
|
||||||
|
settings.setPermissions( /* group */null, filePermissions, directoryPermissions );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addProxy( String protocol, String host, int port, String username, String password, String nonProxyHosts )
|
||||||
|
{
|
||||||
|
artifactManager.getWagonManager().addProxy( protocol, host, port, username, password, nonProxyHosts );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getArtifact( Artifact artifact, List remoteRepositories )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException
|
||||||
|
{
|
||||||
|
artifactManager.getArtifact( artifact, remoteRepositories );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getArtifact( Artifact artifact, ArtifactRepository repository )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException
|
||||||
|
{
|
||||||
|
artifactManager.getArtifact( artifact, repository );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getArtifactMetadata( ArtifactMetadata metadata, ArtifactRepository remoteRepository, File destination,
|
||||||
|
String checksumPolicy )
|
||||||
|
throws TransferFailedException, ResourceDoesNotExistException
|
||||||
|
{
|
||||||
|
artifactManager.getArtifactMetadata( metadata, remoteRepository, destination, checksumPolicy );
|
||||||
|
}
|
||||||
|
|
||||||
|
public AuthenticationInfo getAuthenticationInfo( String id )
|
||||||
|
{
|
||||||
|
RepositorySettings settings = getRepositorySettings( id );
|
||||||
|
return settings.getAuthentication();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProxyInfo getProxy( String protocol )
|
||||||
|
{
|
||||||
|
return artifactManager.getWagonManager().getProxy( protocol );
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wagon getWagon( String protocol )
|
||||||
|
throws UnsupportedProtocolException
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Wagon getWagon( Repository repository )
|
||||||
|
throws UnsupportedProtocolException
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return artifactManager.getWagonManager().getWagon( repository.getId() );
|
||||||
|
}
|
||||||
|
catch ( RepositoryNotFoundException e )
|
||||||
|
{
|
||||||
|
// Not throwing to maintain API contract.
|
||||||
|
// TODO: Need to remove this class in prior to maven 2.1 anyway.
|
||||||
|
getLogger().error( e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( WagonConfigurationException e )
|
||||||
|
{
|
||||||
|
// Not throwing to maintain API contract.
|
||||||
|
// TODO: Need to remove this class in prior to maven 2.1 anyway.
|
||||||
|
getLogger().error( e.getMessage(), e );
|
||||||
|
}
|
||||||
|
catch ( NotOnlineException e )
|
||||||
|
{
|
||||||
|
// Not throwing to maintain API contract.
|
||||||
|
// TODO: Need to remove this class in prior to maven 2.1 anyway.
|
||||||
|
getLogger().error( e.getMessage(), e );
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOnline()
|
||||||
|
{
|
||||||
|
return artifactManager.isOnline();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void putArtifact( File source, Artifact artifact, ArtifactRepository deploymentRepository )
|
||||||
|
throws TransferFailedException
|
||||||
|
{
|
||||||
|
artifactManager.putArtifact( source, artifact, deploymentRepository );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void putArtifactMetadata( File source, ArtifactMetadata artifactMetadata, ArtifactRepository repository )
|
||||||
|
throws TransferFailedException
|
||||||
|
{
|
||||||
|
artifactManager.putArtifactMetadata( source, artifactMetadata, repository );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerWagons( Collection wagons, PlexusContainer extensionContainer )
|
||||||
|
{
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDownloadMonitor( TransferListener monitor )
|
||||||
|
{
|
||||||
|
// Remove previous (to maintain API contract)
|
||||||
|
if ( this.downloadMonitor != null )
|
||||||
|
{
|
||||||
|
artifactManager.getWagonManager().removeTransferListener( this.downloadMonitor );
|
||||||
|
}
|
||||||
|
|
||||||
|
this.downloadMonitor = monitor;
|
||||||
|
|
||||||
|
// Add new (to maintain API contract)
|
||||||
|
if ( this.downloadMonitor != null )
|
||||||
|
{
|
||||||
|
artifactManager.getWagonManager().addTransferListener( this.downloadMonitor );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInteractive( boolean interactive )
|
||||||
|
{
|
||||||
|
artifactManager.getWagonManager().setInteractive( interactive );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnline( boolean online )
|
||||||
|
{
|
||||||
|
artifactManager.getWagonManager().setOnline( online );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
package org.apache.maven.artifact.manager;
|
|
||||||
|
|
||||||
import org.apache.maven.wagon.TransferFailedException;
|
|
||||||
|
|
||||||
|
|
||||||
public class WagonConfigurationException
|
|
||||||
extends TransferFailedException
|
|
||||||
{
|
|
||||||
|
|
||||||
static final long serialVersionUID = 1;
|
|
||||||
|
|
||||||
private final String originalMessage;
|
|
||||||
private final String repositoryId;
|
|
||||||
|
|
||||||
public WagonConfigurationException( String repositoryId, String message, Throwable cause )
|
|
||||||
{
|
|
||||||
super( "While configuring wagon for \'" + repositoryId + "\': " + message, cause );
|
|
||||||
|
|
||||||
this.repositoryId = repositoryId;
|
|
||||||
this.originalMessage = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
public WagonConfigurationException( String repositoryId, String message )
|
|
||||||
{
|
|
||||||
super( "While configuring wagon for \'" + repositoryId + "\': " + message );
|
|
||||||
|
|
||||||
this.repositoryId = repositoryId;
|
|
||||||
this.originalMessage = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final String getRepositoryId()
|
|
||||||
{
|
|
||||||
return repositoryId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final String getOriginalMessage()
|
|
||||||
{
|
|
||||||
return originalMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -39,6 +39,7 @@ import java.util.List;
|
||||||
*
|
*
|
||||||
* @author <a href="michal.maczka@dimatics.com">Michal Maczka </a>
|
* @author <a href="michal.maczka@dimatics.com">Michal Maczka </a>
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
|
* @deprecated in favor of {@link ArtifactManager} and {@link org.apache.maven.wagon.manager.WagonManager}
|
||||||
*/
|
*/
|
||||||
public interface WagonManager
|
public interface WagonManager
|
||||||
{
|
{
|
||||||
|
@ -66,7 +67,7 @@ public interface WagonManager
|
||||||
* @throws WagonConfigurationException if the wagon can't be configured for the repository
|
* @throws WagonConfigurationException if the wagon can't be configured for the repository
|
||||||
*/
|
*/
|
||||||
Wagon getWagon( Repository repository )
|
Wagon getWagon( Repository repository )
|
||||||
throws UnsupportedProtocolException, WagonConfigurationException;
|
throws UnsupportedProtocolException;
|
||||||
|
|
||||||
void getArtifact( Artifact artifact, List remoteRepositories )
|
void getArtifact( Artifact artifact, List remoteRepositories )
|
||||||
throws TransferFailedException, ResourceDoesNotExistException;
|
throws TransferFailedException, ResourceDoesNotExistException;
|
||||||
|
|
|
@ -16,7 +16,7 @@ package org.apache.maven.artifact.repository.metadata;
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.maven.artifact.manager.WagonManager;
|
import org.apache.maven.artifact.manager.ArtifactManager;
|
||||||
import org.apache.maven.artifact.metadata.ArtifactMetadata;
|
import org.apache.maven.artifact.metadata.ArtifactMetadata;
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
|
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
|
||||||
|
@ -40,12 +40,17 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DefaultRepositoryMetadataManager
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
public class DefaultRepositoryMetadataManager
|
public class DefaultRepositoryMetadataManager
|
||||||
extends AbstractLogEnabled
|
extends AbstractLogEnabled
|
||||||
implements RepositoryMetadataManager
|
implements RepositoryMetadataManager
|
||||||
{
|
{
|
||||||
// component requirement
|
// component requirement
|
||||||
private WagonManager wagonManager;
|
private ArtifactManager artifactManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @todo very primitive. Probably we can cache artifacts themselves in a central location, as well as reset the flag over time in a long running process.
|
* @todo very primitive. Probably we can cache artifacts themselves in a central location, as well as reset the flag over time in a long running process.
|
||||||
|
@ -300,7 +305,7 @@ public class DefaultRepositoryMetadataManager
|
||||||
ArtifactRepository remoteRepository )
|
ArtifactRepository remoteRepository )
|
||||||
throws RepositoryMetadataResolutionException
|
throws RepositoryMetadataResolutionException
|
||||||
{
|
{
|
||||||
if ( !wagonManager.isOnline() )
|
if ( !artifactManager.isOnline() )
|
||||||
{
|
{
|
||||||
// metadata is required for deployment, can't be offline
|
// metadata is required for deployment, can't be offline
|
||||||
throw new RepositoryMetadataResolutionException(
|
throw new RepositoryMetadataResolutionException(
|
||||||
|
@ -340,7 +345,7 @@ public class DefaultRepositoryMetadataManager
|
||||||
String checksumPolicy, boolean allowBlacklisting )
|
String checksumPolicy, boolean allowBlacklisting )
|
||||||
throws RepositoryMetadataResolutionException, TransferFailedException
|
throws RepositoryMetadataResolutionException, TransferFailedException
|
||||||
{
|
{
|
||||||
if ( !wagonManager.isOnline() )
|
if ( !artifactManager.isOnline() )
|
||||||
{
|
{
|
||||||
if ( allowBlacklisting )
|
if ( allowBlacklisting )
|
||||||
{
|
{
|
||||||
|
@ -358,7 +363,7 @@ public class DefaultRepositoryMetadataManager
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
wagonManager.getArtifactMetadata( metadata, repository, file, checksumPolicy );
|
artifactManager.getArtifactMetadata( metadata, repository, file, checksumPolicy );
|
||||||
}
|
}
|
||||||
catch ( ResourceDoesNotExistException e )
|
catch ( ResourceDoesNotExistException e )
|
||||||
{
|
{
|
||||||
|
@ -391,7 +396,7 @@ public class DefaultRepositoryMetadataManager
|
||||||
ArtifactRepository deploymentRepository )
|
ArtifactRepository deploymentRepository )
|
||||||
throws RepositoryMetadataDeploymentException
|
throws RepositoryMetadataDeploymentException
|
||||||
{
|
{
|
||||||
if ( !wagonManager.isOnline() )
|
if ( !artifactManager.isOnline() )
|
||||||
{
|
{
|
||||||
// deployment shouldn't silently fail when offline
|
// deployment shouldn't silently fail when offline
|
||||||
throw new RepositoryMetadataDeploymentException(
|
throw new RepositoryMetadataDeploymentException(
|
||||||
|
@ -431,7 +436,7 @@ public class DefaultRepositoryMetadataManager
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
wagonManager.putArtifactMetadata( file, metadata, deploymentRepository );
|
artifactManager.putArtifactMetadata( file, metadata, deploymentRepository );
|
||||||
}
|
}
|
||||||
catch ( TransferFailedException e )
|
catch ( TransferFailedException e )
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,7 +18,7 @@ package org.apache.maven.artifact.resolver;
|
||||||
|
|
||||||
import org.apache.maven.artifact.Artifact;
|
import org.apache.maven.artifact.Artifact;
|
||||||
import org.apache.maven.artifact.factory.ArtifactFactory;
|
import org.apache.maven.artifact.factory.ArtifactFactory;
|
||||||
import org.apache.maven.artifact.manager.WagonManager;
|
import org.apache.maven.artifact.manager.ArtifactManager;
|
||||||
import org.apache.maven.artifact.metadata.ArtifactMetadata;
|
import org.apache.maven.artifact.metadata.ArtifactMetadata;
|
||||||
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
|
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
|
@ -52,7 +52,7 @@ public class DefaultArtifactResolver
|
||||||
// Components
|
// Components
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
private WagonManager wagonManager;
|
private ArtifactManager artifactManager;
|
||||||
|
|
||||||
private ArtifactTransformationManager transformationManager;
|
private ArtifactTransformationManager transformationManager;
|
||||||
|
|
||||||
|
@ -164,7 +164,7 @@ public class DefaultArtifactResolver
|
||||||
boolean resolved = false;
|
boolean resolved = false;
|
||||||
if ( !destination.exists() || force )
|
if ( !destination.exists() || force )
|
||||||
{
|
{
|
||||||
if ( !wagonManager.isOnline() )
|
if ( !artifactManager.isOnline() )
|
||||||
{
|
{
|
||||||
throw new ArtifactNotFoundException( "System is offline.", artifact );
|
throw new ArtifactNotFoundException( "System is offline.", artifact );
|
||||||
}
|
}
|
||||||
|
@ -175,11 +175,11 @@ public class DefaultArtifactResolver
|
||||||
if ( artifact.getRepository() != null )
|
if ( artifact.getRepository() != null )
|
||||||
{
|
{
|
||||||
// the transformations discovered the artifact - so use it exclusively
|
// the transformations discovered the artifact - so use it exclusively
|
||||||
wagonManager.getArtifact( artifact, artifact.getRepository() );
|
artifactManager.getArtifact( artifact, artifact.getRepository() );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wagonManager.getArtifact( artifact, repositories );
|
artifactManager.getArtifact( artifact, repositories );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !artifact.isResolved() && !destination.exists() )
|
if ( !artifact.isResolved() && !destination.exists() )
|
||||||
|
|
|
@ -43,8 +43,6 @@ public abstract class AbstractVersionTransformation
|
||||||
{
|
{
|
||||||
protected RepositoryMetadataManager repositoryMetadataManager;
|
protected RepositoryMetadataManager repositoryMetadataManager;
|
||||||
|
|
||||||
protected WagonManager wagonManager;
|
|
||||||
|
|
||||||
protected String resolveVersion( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
|
protected String resolveVersion( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
|
||||||
throws RepositoryMetadataResolutionException
|
throws RepositoryMetadataResolutionException
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,7 @@ package org.apache.maven.artifact.transform;
|
||||||
|
|
||||||
import org.apache.maven.artifact.Artifact;
|
import org.apache.maven.artifact.Artifact;
|
||||||
import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
|
import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
|
||||||
|
import org.apache.maven.artifact.manager.ArtifactManager;
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
import org.apache.maven.artifact.repository.metadata.Metadata;
|
import org.apache.maven.artifact.repository.metadata.Metadata;
|
||||||
import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
|
import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
|
||||||
|
@ -43,6 +44,8 @@ import java.util.TimeZone;
|
||||||
public class SnapshotTransformation
|
public class SnapshotTransformation
|
||||||
extends AbstractVersionTransformation
|
extends AbstractVersionTransformation
|
||||||
{
|
{
|
||||||
|
private ArtifactManager artifactManager;
|
||||||
|
|
||||||
private String deploymentTimestamp;
|
private String deploymentTimestamp;
|
||||||
|
|
||||||
private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" );
|
private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" );
|
||||||
|
@ -147,7 +150,7 @@ public class SnapshotTransformation
|
||||||
{
|
{
|
||||||
RepositoryMetadata metadata = new SnapshotArtifactRepositoryMetadata( artifact );
|
RepositoryMetadata metadata = new SnapshotArtifactRepositoryMetadata( artifact );
|
||||||
|
|
||||||
if ( !wagonManager.isOnline() )
|
if ( !artifactManager.isOnline() )
|
||||||
{
|
{
|
||||||
// build number is a required feature for metadata consistency
|
// build number is a required feature for metadata consistency
|
||||||
throw new RepositoryMetadataResolutionException(
|
throw new RepositoryMetadataResolutionException(
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
<component-set>
|
<component-set>
|
||||||
<components>
|
<components>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
|
|
||||||
| WagonManager
|
| Old WagonManager
|
||||||
|
|
|
||||||
|
| !!Deprecated!!
|
||||||
|
|
|
|
||||||
-->
|
-->
|
||||||
<component>
|
<component>
|
||||||
|
@ -10,7 +13,23 @@
|
||||||
<implementation>org.apache.maven.artifact.manager.DefaultWagonManager</implementation>
|
<implementation>org.apache.maven.artifact.manager.DefaultWagonManager</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.repository.ArtifactRepositoryFactory</role>
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
|
</requirement>
|
||||||
|
</requirements>
|
||||||
|
</component>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
|
||||||
|
| ArtifactManager
|
||||||
|
|
|
||||||
|
-->
|
||||||
|
<component>
|
||||||
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
|
<implementation>org.apache.maven.artifact.manager.DefaultArtifactManager</implementation>
|
||||||
|
<requirements>
|
||||||
|
<requirement>
|
||||||
|
<role>org.apache.maven.wagon.manager.WagonManager</role>
|
||||||
|
<role-hint>default</role-hint>
|
||||||
</requirement>
|
</requirement>
|
||||||
</requirements>
|
</requirements>
|
||||||
</component>
|
</component>
|
||||||
|
@ -20,7 +39,7 @@
|
||||||
<implementation>org.apache.maven.artifact.repository.metadata.DefaultRepositoryMetadataManager</implementation>
|
<implementation>org.apache.maven.artifact.repository.metadata.DefaultRepositoryMetadataManager</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
</requirements>
|
</requirements>
|
||||||
</component>
|
</component>
|
||||||
|
@ -36,7 +55,7 @@
|
||||||
<implementation>org.apache.maven.artifact.transform.SnapshotTransformation</implementation>
|
<implementation>org.apache.maven.artifact.transform.SnapshotTransformation</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager</role>
|
<role>org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager</role>
|
||||||
|
@ -49,9 +68,6 @@
|
||||||
<role-hint>release</role-hint>
|
<role-hint>release</role-hint>
|
||||||
<implementation>org.apache.maven.artifact.transform.ReleaseArtifactTransformation</implementation>
|
<implementation>org.apache.maven.artifact.transform.ReleaseArtifactTransformation</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
|
||||||
</requirement>
|
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager</role>
|
<role>org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
|
@ -63,9 +79,6 @@
|
||||||
<role-hint>latest</role-hint>
|
<role-hint>latest</role-hint>
|
||||||
<implementation>org.apache.maven.artifact.transform.LatestArtifactTransformation</implementation>
|
<implementation>org.apache.maven.artifact.transform.LatestArtifactTransformation</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
|
||||||
</requirement>
|
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager</role>
|
<role>org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
|
@ -98,7 +111,7 @@
|
||||||
<implementation>org.apache.maven.artifact.resolver.DefaultArtifactResolver</implementation>
|
<implementation>org.apache.maven.artifact.resolver.DefaultArtifactResolver</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.transform.ArtifactTransformationManager</role>
|
<role>org.apache.maven.artifact.transform.ArtifactTransformationManager</role>
|
||||||
|
@ -140,7 +153,7 @@
|
||||||
<implementation>org.apache.maven.artifact.deployer.DefaultArtifactDeployer</implementation>
|
<implementation>org.apache.maven.artifact.deployer.DefaultArtifactDeployer</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.transform.ArtifactTransformationManager</role>
|
<role>org.apache.maven.artifact.transform.ArtifactTransformationManager</role>
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
package org.apache.maven.artifact.manager;
|
||||||
|
|
||||||
|
import org.apache.maven.artifact.Artifact;
|
||||||
|
import org.apache.maven.artifact.factory.ArtifactFactory;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
|
||||||
|
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
|
||||||
|
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
|
||||||
|
import org.apache.maven.wagon.ResourceDoesNotExistException;
|
||||||
|
import org.apache.maven.wagon.TransferFailedException;
|
||||||
|
import org.apache.maven.wagon.repository.Repository;
|
||||||
|
import org.codehaus.plexus.PlexusTestCase;
|
||||||
|
import org.codehaus.plexus.util.FileUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class DefaultArtifactManagerTest
|
||||||
|
extends PlexusTestCase
|
||||||
|
{
|
||||||
|
private ArtifactFactory artifactFactory;
|
||||||
|
|
||||||
|
private ArtifactManager artifactManager;
|
||||||
|
|
||||||
|
private File localTestRepo;
|
||||||
|
|
||||||
|
private File remoteTestRepo;
|
||||||
|
|
||||||
|
protected void setUp()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
super.setUp();
|
||||||
|
|
||||||
|
artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );
|
||||||
|
artifactManager = (ArtifactManager) lookup( ArtifactManager.ROLE );
|
||||||
|
|
||||||
|
localTestRepo = setupDir( "target/test-classes/repositories/" + getName() + "/local-repository" );
|
||||||
|
remoteTestRepo = setupDir( "target/test-classes/repositories/" + getName() + "/remote-repository" );
|
||||||
|
}
|
||||||
|
|
||||||
|
private File setupDir( String rootPath )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
File rootDir = new File( getBasedir(), rootPath );
|
||||||
|
|
||||||
|
// Clean up from old tests.
|
||||||
|
if ( rootDir.exists() )
|
||||||
|
{
|
||||||
|
FileUtils.deleteDirectory( rootDir );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create dir
|
||||||
|
rootDir.mkdirs();
|
||||||
|
|
||||||
|
return rootDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void tearDown()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
release( artifactManager );
|
||||||
|
|
||||||
|
super.tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Artifact createArtifact( String groupId, String artifactId, String version, String type )
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
Artifact artifact = artifactFactory.createBuildArtifact( groupId, artifactId, version, type );
|
||||||
|
ArtifactRepository repository = localRepository();
|
||||||
|
String artifactPath = repository.pathOf( artifact );
|
||||||
|
File f = new File( localTestRepo, artifactPath );
|
||||||
|
artifact.setFile( f );
|
||||||
|
return artifact;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ArtifactRepository localRepository()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
ArtifactRepositoryLayout repoLayout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE,
|
||||||
|
"legacy" );
|
||||||
|
|
||||||
|
return new DefaultArtifactRepository( "local", "file://" + localTestRepo.getPath(), repoLayout );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ArtifactRepository remoteRepository()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
ArtifactRepositoryLayout repoLayout = (ArtifactRepositoryLayout) lookup( ArtifactRepositoryLayout.ROLE,
|
||||||
|
"legacy" );
|
||||||
|
|
||||||
|
return new DefaultArtifactRepository( "test", "file://" + remoteTestRepo.getPath(), repoLayout,
|
||||||
|
new ArtifactRepositoryPolicy(), new ArtifactRepositoryPolicy() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOnline()
|
||||||
|
throws ResourceDoesNotExistException, Exception
|
||||||
|
{
|
||||||
|
artifactManager.getWagonManager().setOnline( false );
|
||||||
|
|
||||||
|
assertFalse( artifactManager.isOnline() );
|
||||||
|
|
||||||
|
// Attempt to get a wagon.
|
||||||
|
artifactManager.getWagonManager().addRepository( new Repository( "test", "http://localhost:10007/" ) );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Artifact artifact = createArtifact( "test", "testLib", "1.0", "jar" );
|
||||||
|
|
||||||
|
artifactManager.getArtifact( artifact, localRepository() );
|
||||||
|
fail( "Should have thrown TransferFailedException as we are offline." );
|
||||||
|
}
|
||||||
|
catch ( TransferFailedException e )
|
||||||
|
{
|
||||||
|
/* expected path */
|
||||||
|
assertEquals( "System is offline.", e.getMessage() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testGetArtifact()
|
||||||
|
throws ResourceDoesNotExistException, Exception
|
||||||
|
{
|
||||||
|
artifactManager.getWagonManager().setOnline( true );
|
||||||
|
|
||||||
|
assertTrue( artifactManager.isOnline() );
|
||||||
|
|
||||||
|
Artifact artifact = createArtifact( "test", "testLib", "1.0", "jar" );
|
||||||
|
setupRemoteTestArtifact( artifact );
|
||||||
|
|
||||||
|
artifactManager.getArtifact( artifact, remoteRepository() );
|
||||||
|
|
||||||
|
assertTrue( artifact.isResolved() );
|
||||||
|
assertTrue( artifact.getFile().exists() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupRemoteTestArtifact( Artifact artifact )
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
ArtifactRepository remoterepo = remoteRepository();
|
||||||
|
String artifactPath = remoterepo.pathOf( artifact );
|
||||||
|
File actualRemoteFile = new File( remoteTestRepo, artifactPath );
|
||||||
|
|
||||||
|
actualRemoteFile.getParentFile().mkdirs();
|
||||||
|
|
||||||
|
FileUtils.fileWrite( actualRemoteFile.getAbsolutePath(),
|
||||||
|
"Virtual Cess Pool of Totally Useless and Trivial Information" );
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,147 +0,0 @@
|
||||||
package org.apache.maven.artifact.manager;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2001-2006 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.wagon.UnsupportedProtocolException;
|
|
||||||
import org.apache.maven.wagon.Wagon;
|
|
||||||
import org.apache.maven.wagon.repository.Repository;
|
|
||||||
import org.codehaus.plexus.PlexusTestCase;
|
|
||||||
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
|
|
||||||
* @version $Id$
|
|
||||||
*/
|
|
||||||
public class DefaultWagonManagerTest
|
|
||||||
extends PlexusTestCase
|
|
||||||
{
|
|
||||||
|
|
||||||
private WagonManager wagonManager;
|
|
||||||
|
|
||||||
protected void setUp()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
super.setUp();
|
|
||||||
|
|
||||||
wagonManager = (WagonManager) lookup( WagonManager.ROLE );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testDefaultWagonManager()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
assertWagon( "a" );
|
|
||||||
|
|
||||||
assertWagon( "b1" );
|
|
||||||
|
|
||||||
assertWagon( "b2" );
|
|
||||||
|
|
||||||
assertWagon( "c" );
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assertWagon( "d" );
|
|
||||||
|
|
||||||
fail( "Expected :" + UnsupportedProtocolException.class.getName() );
|
|
||||||
}
|
|
||||||
catch ( UnsupportedProtocolException e )
|
|
||||||
{
|
|
||||||
//ok
|
|
||||||
assertTrue( true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetWagonRepository()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
assertWagonRepository( "a" );
|
|
||||||
|
|
||||||
assertWagonRepository( "b1" );
|
|
||||||
|
|
||||||
assertWagonRepository( "b2" );
|
|
||||||
|
|
||||||
assertWagonRepository( "c" );
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assertWagonRepository( "d" );
|
|
||||||
|
|
||||||
fail( "Expected :" + UnsupportedProtocolException.class.getName() );
|
|
||||||
}
|
|
||||||
catch ( UnsupportedProtocolException e )
|
|
||||||
{
|
|
||||||
//ok
|
|
||||||
assertTrue( true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testGetWagonRepositoryNullProtocol()
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Repository repository = new Repository();
|
|
||||||
|
|
||||||
repository.setProtocol( null );
|
|
||||||
|
|
||||||
Wagon wagon = (Wagon) wagonManager.getWagon( repository );
|
|
||||||
|
|
||||||
fail( "Expected :" + UnsupportedProtocolException.class.getName() );
|
|
||||||
}
|
|
||||||
catch ( UnsupportedProtocolException e )
|
|
||||||
{
|
|
||||||
//ok
|
|
||||||
assertTrue( true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertWagon( String protocol )
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
Wagon wagon = (Wagon) wagonManager.getWagon( protocol );
|
|
||||||
|
|
||||||
assertNotNull( "Check wagon, protocol=" + protocol, wagon );
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertWagonRepository( String protocol )
|
|
||||||
throws Exception
|
|
||||||
{
|
|
||||||
Repository repository = new Repository();
|
|
||||||
|
|
||||||
String s = "value=" + protocol;
|
|
||||||
|
|
||||||
repository.setId( "id=" + protocol );
|
|
||||||
|
|
||||||
repository.setProtocol( protocol );
|
|
||||||
|
|
||||||
Xpp3Dom conf = new Xpp3Dom( "configuration" );
|
|
||||||
|
|
||||||
Xpp3Dom configurableField = new Xpp3Dom( "configurableField" );
|
|
||||||
|
|
||||||
configurableField.setValue( s );
|
|
||||||
|
|
||||||
conf.addChild( configurableField );
|
|
||||||
|
|
||||||
wagonManager.addConfiguration( repository.getId(), conf );
|
|
||||||
|
|
||||||
WagonMock wagon = (WagonMock) wagonManager.getWagon( repository );
|
|
||||||
|
|
||||||
assertNotNull( "Check wagon, protocol=" + protocol, wagon );
|
|
||||||
|
|
||||||
assertEquals( "Check configuration for wagon, protocol=" + protocol, s, wagon.getConfigurableField() );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
<!--
|
|
||||||
/*
|
|
||||||
* Copyright 2001-2006 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.
|
|
||||||
*/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<plexus>
|
|
||||||
<components>
|
|
||||||
<component>
|
|
||||||
<role>org.apache.maven.wagon.Wagon</role>
|
|
||||||
<role-hint>a</role-hint>
|
|
||||||
<implementation>org.apache.maven.artifact.manager.WagonA</implementation>
|
|
||||||
</component>
|
|
||||||
<component>
|
|
||||||
<role>org.apache.maven.wagon.Wagon</role>
|
|
||||||
<role-hint>b1</role-hint>
|
|
||||||
<implementation>org.apache.maven.artifact.manager.WagonB</implementation>
|
|
||||||
</component>
|
|
||||||
<component>
|
|
||||||
<role>org.apache.maven.wagon.Wagon</role>
|
|
||||||
<role-hint>b2</role-hint>
|
|
||||||
<implementation>org.apache.maven.artifact.manager.WagonB</implementation>
|
|
||||||
</component>
|
|
||||||
<component>
|
|
||||||
<role>org.apache.maven.wagon.Wagon</role>
|
|
||||||
<role-hint>c</role-hint>
|
|
||||||
<implementation>org.apache.maven.artifact.manager.WagonC</implementation>
|
|
||||||
</component>
|
|
||||||
<component>
|
|
||||||
<role>org.apache.maven.artifact.repository.authentication.AuthenticationInfoProvider</role>
|
|
||||||
<implementation>org.apache.maven.artifact.repository.authentication.DummyAuthenticationInfoProvider</implementation>
|
|
||||||
</component>
|
|
||||||
</components>
|
|
||||||
</plexus>
|
|
|
@ -62,6 +62,10 @@
|
||||||
<artifactId>maven-embedder</artifactId>
|
<artifactId>maven-embedder</artifactId>
|
||||||
<version>2.1-SNAPSHOT</version>
|
<version>2.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-lang</groupId>
|
||||||
|
<artifactId>commons-lang</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-cli</groupId>
|
<groupId>commons-cli</groupId>
|
||||||
<artifactId>commons-cli</artifactId>
|
<artifactId>commons-cli</artifactId>
|
||||||
|
|
|
@ -16,6 +16,7 @@ package org.apache.maven.cli;
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.maven.MavenTransferListener;
|
import org.apache.maven.MavenTransferListener;
|
||||||
import org.apache.maven.wagon.WagonConstants;
|
import org.apache.maven.wagon.WagonConstants;
|
||||||
import org.apache.maven.wagon.events.TransferEvent;
|
import org.apache.maven.wagon.events.TransferEvent;
|
||||||
|
@ -32,9 +33,37 @@ public abstract class AbstractConsoleDownloadMonitor
|
||||||
extends AbstractLogEnabled
|
extends AbstractLogEnabled
|
||||||
implements MavenTransferListener
|
implements MavenTransferListener
|
||||||
{
|
{
|
||||||
|
private boolean showChecksumEvents = false;
|
||||||
|
|
||||||
|
protected boolean showEvent( TransferEvent event )
|
||||||
|
{
|
||||||
|
if ( event.getResource() == null )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
String resource = event.getResource().getName();
|
||||||
|
|
||||||
|
if ( StringUtils.isBlank( resource ) )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( resource.endsWith( ".sha1" ) || resource.endsWith( ".md5" ) )
|
||||||
|
{
|
||||||
|
return showChecksumEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void transferInitiated( TransferEvent transferEvent )
|
public void transferInitiated( TransferEvent transferEvent )
|
||||||
{
|
{
|
||||||
|
if ( !showEvent( transferEvent ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String message = transferEvent.getRequestType() == TransferEvent.REQUEST_PUT ? "Uploading" : "Downloading";
|
String message = transferEvent.getRequestType() == TransferEvent.REQUEST_PUT ? "Uploading" : "Downloading";
|
||||||
|
|
||||||
String url = transferEvent.getWagon().getRepository().getUrl();
|
String url = transferEvent.getWagon().getRepository().getUrl();
|
||||||
|
@ -85,4 +114,13 @@ public abstract class AbstractConsoleDownloadMonitor
|
||||||
// getLogger().debug( message );
|
// getLogger().debug( message );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isShowChecksumEvents()
|
||||||
|
{
|
||||||
|
return showChecksumEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShowChecksumEvents( boolean showChecksumEvents )
|
||||||
|
{
|
||||||
|
this.showChecksumEvents = showChecksumEvents;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -29,6 +29,11 @@ public class BatchModeDownloadMonitor
|
||||||
{
|
{
|
||||||
public void transferInitiated( TransferEvent transferEvent )
|
public void transferInitiated( TransferEvent transferEvent )
|
||||||
{
|
{
|
||||||
|
if ( !showEvent( transferEvent ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String message = transferEvent.getRequestType() == TransferEvent.REQUEST_PUT ? "Uploading" : "Downloading";
|
String message = transferEvent.getRequestType() == TransferEvent.REQUEST_PUT ? "Uploading" : "Downloading";
|
||||||
|
|
||||||
String url = transferEvent.getWagon().getRepository().getUrl();
|
String url = transferEvent.getWagon().getRepository().getUrl();
|
||||||
|
|
|
@ -41,6 +41,12 @@ public class ConsoleDownloadMonitor
|
||||||
{
|
{
|
||||||
long total = transferEvent.getResource().getContentLength();
|
long total = transferEvent.getResource().getContentLength();
|
||||||
complete += length;
|
complete += length;
|
||||||
|
|
||||||
|
if ( !showEvent( transferEvent ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO [BP]: Sys.out may no longer be appropriate, but will \r work with getLogger()?
|
// TODO [BP]: Sys.out may no longer be appropriate, but will \r work with getLogger()?
|
||||||
if ( total >= 1024 )
|
if ( total >= 1024 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -279,6 +279,8 @@ public class MavenCli
|
||||||
transferListener = new BatchModeDownloadMonitor();
|
transferListener = new BatchModeDownloadMonitor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transferListener.setShowChecksumEvents( false );
|
||||||
|
|
||||||
// This means to scan a directory structure for POMs and process them.
|
// This means to scan a directory structure for POMs and process them.
|
||||||
boolean useReactor = false;
|
boolean useReactor = false;
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ package org.apache.maven.cli;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.maven.MavenTransferListener;
|
||||||
import org.apache.maven.wagon.ConnectionException;
|
import org.apache.maven.wagon.ConnectionException;
|
||||||
import org.apache.maven.wagon.authentication.AuthenticationException;
|
import org.apache.maven.wagon.authentication.AuthenticationException;
|
||||||
import org.apache.maven.wagon.events.TransferEvent;
|
import org.apache.maven.wagon.events.TransferEvent;
|
||||||
|
@ -25,6 +26,8 @@ import org.apache.maven.wagon.providers.file.FileWagon;
|
||||||
import org.apache.maven.wagon.repository.Repository;
|
import org.apache.maven.wagon.repository.Repository;
|
||||||
import org.apache.maven.wagon.resource.Resource;
|
import org.apache.maven.wagon.resource.Resource;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test for {@link AbstractConsoleDownloadMonitor}
|
* Test for {@link AbstractConsoleDownloadMonitor}
|
||||||
*
|
*
|
||||||
|
@ -34,19 +37,19 @@ import org.apache.maven.wagon.resource.Resource;
|
||||||
public abstract class AbstractConsoleDownloadMonitorTest
|
public abstract class AbstractConsoleDownloadMonitorTest
|
||||||
extends TestCase
|
extends TestCase
|
||||||
{
|
{
|
||||||
private AbstractConsoleDownloadMonitor monitor;
|
private MavenTransferListener monitor;
|
||||||
|
|
||||||
public AbstractConsoleDownloadMonitorTest()
|
public AbstractConsoleDownloadMonitorTest()
|
||||||
{
|
{
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMonitor( AbstractConsoleDownloadMonitor monitor )
|
public void setMonitor( MavenTransferListener monitor )
|
||||||
{
|
{
|
||||||
this.monitor = monitor;
|
this.monitor = monitor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AbstractConsoleDownloadMonitor getMonitor()
|
public MavenTransferListener getMonitor()
|
||||||
{
|
{
|
||||||
return monitor;
|
return monitor;
|
||||||
}
|
}
|
||||||
|
@ -88,25 +91,37 @@ public abstract class AbstractConsoleDownloadMonitorTest
|
||||||
monitor.debug( "msg" );
|
monitor.debug( "msg" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class RepositoryMock
|
||||||
|
extends Repository
|
||||||
|
{
|
||||||
|
public RepositoryMock()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
setId("mock");
|
||||||
|
File basedir = new File(System.getProperty( "basedir", "." ));
|
||||||
|
setUrl( "file://" + basedir.getAbsolutePath() + "/target/" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class TransferEventMock
|
private class TransferEventMock
|
||||||
extends TransferEvent
|
extends TransferEvent
|
||||||
{
|
{
|
||||||
public TransferEventMock()
|
public TransferEventMock()
|
||||||
throws ConnectionException, AuthenticationException
|
throws ConnectionException, AuthenticationException
|
||||||
{
|
{
|
||||||
super( new FileWagon(), new Resource(), TransferEvent.TRANSFER_INITIATED, TransferEvent.REQUEST_GET );
|
super( new FileWagon(), new RepositoryMock(), new Resource(), TransferEvent.TRANSFER_INITIATED, TransferEvent.REQUEST_GET );
|
||||||
getResource().setContentLength( 100000 );
|
getResource().setContentLength( 100000 );
|
||||||
Repository repository = new Repository();
|
getWagon().setRepository( new RepositoryMock() );
|
||||||
getWagon().connect( repository );
|
getWagon().connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
public TransferEventMock( Exception exception )
|
public TransferEventMock( Exception exception )
|
||||||
throws ConnectionException, AuthenticationException
|
throws ConnectionException, AuthenticationException
|
||||||
{
|
{
|
||||||
super( new FileWagon(), new Resource(), exception, TransferEvent.REQUEST_GET );
|
super( new FileWagon(), new RepositoryMock(), new Resource(), exception, TransferEvent.REQUEST_GET );
|
||||||
getResource().setContentLength( 100000 );
|
getResource().setContentLength( 100000 );
|
||||||
Repository repository = new Repository();
|
getWagon().setRepository( new RepositoryMock() );
|
||||||
getWagon().connect( repository );
|
getWagon().connect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -37,21 +37,11 @@
|
||||||
<artifactId>maven-settings</artifactId>
|
<artifactId>maven-settings</artifactId>
|
||||||
<version>2.1-SNAPSHOT</version>
|
<version>2.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-file</artifactId>
|
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven</groupId>
|
<groupId>org.apache.maven</groupId>
|
||||||
<artifactId>maven-plugin-parameter-documenter</artifactId>
|
<artifactId>maven-plugin-parameter-documenter</artifactId>
|
||||||
<version>2.1-SNAPSHOT</version>
|
<version>2.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-http-lightweight</artifactId>
|
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.reporting</groupId>
|
<groupId>org.apache.maven.reporting</groupId>
|
||||||
<artifactId>maven-reporting-api</artifactId>
|
<artifactId>maven-reporting-api</artifactId>
|
||||||
|
@ -72,10 +62,6 @@
|
||||||
<artifactId>maven-artifact</artifactId>
|
<artifactId>maven-artifact</artifactId>
|
||||||
<version>2.1-SNAPSHOT</version>
|
<version>2.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-provider-api</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.plexus</groupId>
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
<artifactId>plexus-container-default</artifactId>
|
<artifactId>plexus-container-default</artifactId>
|
||||||
|
@ -155,16 +141,6 @@
|
||||||
<artifactId>maven-tools</artifactId>
|
<artifactId>maven-tools</artifactId>
|
||||||
<version>2.1-SNAPSHOT</version>
|
<version>2.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-ssh</artifactId>
|
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-ssh-external</artifactId>
|
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.plexus</groupId>
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
<artifactId>plexus-utils</artifactId>
|
<artifactId>plexus-utils</artifactId>
|
||||||
|
|
|
@ -1,5 +1,24 @@
|
||||||
package org.apache.maven;
|
package org.apache.maven;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.wagon.events.TransferListener;
|
import org.apache.maven.wagon.events.TransferListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -9,4 +28,7 @@ import org.apache.maven.wagon.events.TransferListener;
|
||||||
public interface MavenTransferListener
|
public interface MavenTransferListener
|
||||||
extends TransferListener
|
extends TransferListener
|
||||||
{
|
{
|
||||||
|
public boolean isShowChecksumEvents();
|
||||||
|
|
||||||
|
public void setShowChecksumEvents( boolean showChecksumEvents );
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@ import org.codehaus.plexus.logging.Logger;
|
||||||
import org.codehaus.plexus.logging.console.ConsoleLogger;
|
import org.codehaus.plexus.logging.console.ConsoleLogger;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -94,8 +93,6 @@ public class DefaultBuildExtensionScanner
|
||||||
}
|
}
|
||||||
|
|
||||||
getLogger().debug( "Finished pre-scanning: " + pom + " for build extensions." );
|
getLogger().debug( "Finished pre-scanning: " + pom + " for build extensions." );
|
||||||
|
|
||||||
extensionManager.registerWagons();
|
|
||||||
}
|
}
|
||||||
catch ( ModelInterpolationException e )
|
catch ( ModelInterpolationException e )
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,7 +20,6 @@ import org.apache.maven.ArtifactFilterManager;
|
||||||
import org.apache.maven.artifact.Artifact;
|
import org.apache.maven.artifact.Artifact;
|
||||||
import org.apache.maven.artifact.ArtifactUtils;
|
import org.apache.maven.artifact.ArtifactUtils;
|
||||||
import org.apache.maven.artifact.factory.ArtifactFactory;
|
import org.apache.maven.artifact.factory.ArtifactFactory;
|
||||||
import org.apache.maven.artifact.manager.WagonManager;
|
|
||||||
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
|
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
|
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
|
||||||
|
@ -32,11 +31,9 @@ import org.apache.maven.model.Extension;
|
||||||
import org.apache.maven.model.Model;
|
import org.apache.maven.model.Model;
|
||||||
import org.apache.maven.model.Parent;
|
import org.apache.maven.model.Parent;
|
||||||
import org.apache.maven.project.MavenProject;
|
import org.apache.maven.project.MavenProject;
|
||||||
import org.apache.maven.wagon.Wagon;
|
|
||||||
import org.codehaus.plexus.PlexusConstants;
|
import org.codehaus.plexus.PlexusConstants;
|
||||||
import org.codehaus.plexus.PlexusContainer;
|
import org.codehaus.plexus.PlexusContainer;
|
||||||
import org.codehaus.plexus.PlexusContainerException;
|
import org.codehaus.plexus.PlexusContainerException;
|
||||||
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
|
||||||
import org.codehaus.plexus.context.Context;
|
import org.codehaus.plexus.context.Context;
|
||||||
import org.codehaus.plexus.context.ContextException;
|
import org.codehaus.plexus.context.ContextException;
|
||||||
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
|
@ -45,7 +42,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to locate extensions.
|
* Used to locate extensions.
|
||||||
|
@ -69,8 +65,6 @@ public class DefaultExtensionManager
|
||||||
|
|
||||||
private ArtifactFilterManager artifactFilterManager;
|
private ArtifactFilterManager artifactFilterManager;
|
||||||
|
|
||||||
private WagonManager wagonManager;
|
|
||||||
|
|
||||||
public void addExtension( Extension extension,
|
public void addExtension( Extension extension,
|
||||||
Model originatingModel,
|
Model originatingModel,
|
||||||
List remoteRepositories,
|
List remoteRepositories,
|
||||||
|
@ -153,19 +147,6 @@ public class DefaultExtensionManager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerWagons()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Map wagons = container.lookupMap( Wagon.ROLE );
|
|
||||||
wagonManager.registerWagons( wagons.keySet(), container );
|
|
||||||
}
|
|
||||||
catch ( ComponentLookupException e )
|
|
||||||
{
|
|
||||||
// now wagons found in the extension
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void contextualize( Context context )
|
public void contextualize( Context context )
|
||||||
throws ContextException
|
throws ContextException
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,8 +37,6 @@ public interface ExtensionManager
|
||||||
void addExtension( Extension extension, MavenProject project, ArtifactRepository localRepository )
|
void addExtension( Extension extension, MavenProject project, ArtifactRepository localRepository )
|
||||||
throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException;
|
throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException;
|
||||||
|
|
||||||
void registerWagons();
|
|
||||||
|
|
||||||
void addExtension( Extension extension, Model originatingModel, List remoteRepositories,
|
void addExtension( Extension extension, Model originatingModel, List remoteRepositories,
|
||||||
ArtifactRepository localRepository )
|
ArtifactRepository localRepository )
|
||||||
throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException;
|
throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException;
|
||||||
|
|
|
@ -1,31 +1,39 @@
|
||||||
package org.apache.maven.usability;
|
package org.apache.maven.usability;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2001-2005 The Apache Software Foundation.
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
*
|
* or more contributor license agreements. See the NOTICE file
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* distributed with this work for additional information
|
||||||
* you may not use this file except in compliance with the License.
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
* You may obtain a copy of the License at
|
* to you 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
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing,
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* software distributed under the License is distributed on an
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
* See the License for the specific language governing permissions and
|
* KIND, either express or implied. See the License for the
|
||||||
* limitations under the License.
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.maven.artifact.manager.WagonManager;
|
import org.apache.maven.artifact.manager.ArtifactManager;
|
||||||
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
|
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
|
||||||
import org.apache.maven.usability.diagnostics.DiagnosisUtils;
|
import org.apache.maven.usability.diagnostics.DiagnosisUtils;
|
||||||
import org.apache.maven.usability.diagnostics.ErrorDiagnoser;
|
import org.apache.maven.usability.diagnostics.ErrorDiagnoser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ArtifactNotFoundDiagnoser
|
||||||
|
*
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
public class ArtifactNotFoundDiagnoser
|
public class ArtifactNotFoundDiagnoser
|
||||||
implements ErrorDiagnoser
|
implements ErrorDiagnoser
|
||||||
{
|
{
|
||||||
|
|
||||||
private WagonManager wagonManager;
|
private ArtifactManager artifactManager;
|
||||||
|
|
||||||
public boolean canDiagnose( Throwable error )
|
public boolean canDiagnose( Throwable error )
|
||||||
{
|
{
|
||||||
|
@ -46,7 +54,7 @@ public class ArtifactNotFoundDiagnoser
|
||||||
message.append( "\n\n" );
|
message.append( "\n\n" );
|
||||||
message.append( "Reason: " ).append( exception.getMessage() );
|
message.append( "Reason: " ).append( exception.getMessage() );
|
||||||
|
|
||||||
if ( !wagonManager.isOnline() )
|
if ( !artifactManager.isOnline() )
|
||||||
{
|
{
|
||||||
message.append( "\n" ).append( SystemWarnings.getOfflineWarning() );
|
message.append( "\n" ).append( SystemWarnings.getOfflineWarning() );
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ package org.apache.maven.usability;
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.apache.maven.artifact.manager.WagonManager;
|
import org.apache.maven.artifact.manager.ArtifactManager;
|
||||||
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
|
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
|
||||||
import org.apache.maven.usability.diagnostics.DiagnosisUtils;
|
import org.apache.maven.usability.diagnostics.DiagnosisUtils;
|
||||||
import org.apache.maven.usability.diagnostics.ErrorDiagnoser;
|
import org.apache.maven.usability.diagnostics.ErrorDiagnoser;
|
||||||
|
@ -27,7 +27,7 @@ public class ArtifactResolverDiagnoser
|
||||||
implements ErrorDiagnoser
|
implements ErrorDiagnoser
|
||||||
{
|
{
|
||||||
|
|
||||||
private WagonManager wagonManager;
|
private ArtifactManager artifactManager;
|
||||||
|
|
||||||
public boolean canDiagnose( Throwable error )
|
public boolean canDiagnose( Throwable error )
|
||||||
{
|
{
|
||||||
|
@ -52,7 +52,7 @@ public class ArtifactResolverDiagnoser
|
||||||
message.append( "\n\nCaused by I/O exception: " ).append( ioe.getMessage() );
|
message.append( "\n\nCaused by I/O exception: " ).append( ioe.getMessage() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !wagonManager.isOnline() )
|
if ( !artifactManager.isOnline() )
|
||||||
{
|
{
|
||||||
message.append( "\n" ).append( SystemWarnings.getOfflineWarning() );
|
message.append( "\n" ).append( SystemWarnings.getOfflineWarning() );
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,9 +82,6 @@
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.metadata.ArtifactMetadataSource</role>
|
<role>org.apache.maven.artifact.metadata.ArtifactMetadataSource</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
<requirement>
|
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
|
||||||
</requirement>
|
|
||||||
</requirements>
|
</requirements>
|
||||||
</component>
|
</component>
|
||||||
|
|
||||||
|
@ -196,7 +193,7 @@
|
||||||
<implementation>org.apache.maven.usability.ArtifactNotFoundDiagnoser</implementation>
|
<implementation>org.apache.maven.usability.ArtifactNotFoundDiagnoser</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
</requirements>
|
</requirements>
|
||||||
</component>
|
</component>
|
||||||
|
@ -211,7 +208,7 @@
|
||||||
<implementation>org.apache.maven.usability.ArtifactResolverDiagnoser</implementation>
|
<implementation>org.apache.maven.usability.ArtifactResolverDiagnoser</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
</requirements>
|
</requirements>
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -65,6 +65,10 @@
|
||||||
<artifactId>maven-tools</artifactId>
|
<artifactId>maven-tools</artifactId>
|
||||||
<version>2.1-SNAPSHOT</version>
|
<version>2.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-lang</groupId>
|
||||||
|
<artifactId>commons-lang</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>jdom</groupId>
|
<groupId>jdom</groupId>
|
||||||
<artifactId>jdom</artifactId>
|
<artifactId>jdom</artifactId>
|
||||||
|
|
|
@ -344,8 +344,6 @@ public class MavenEmbedder
|
||||||
project = mavenProjectBuilder.buildWithDependencies( new File( request.getPomFile() ),
|
project = mavenProjectBuilder.buildWithDependencies( new File( request.getPomFile() ),
|
||||||
request.getLocalRepository(), profileManager,
|
request.getLocalRepository(), profileManager,
|
||||||
request.getTransferListener() );
|
request.getTransferListener() );
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (PluginManagerException e)
|
catch (PluginManagerException e)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,33 +1,59 @@
|
||||||
package org.apache.maven.embedder.execution;
|
package org.apache.maven.embedder.execution;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.MavenTools;
|
||||||
|
import org.apache.maven.SettingsConfigurationException;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
|
||||||
|
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
|
||||||
|
import org.apache.maven.embedder.MavenEmbedderException;
|
||||||
|
import org.apache.maven.execution.MavenExecutionRequest;
|
||||||
|
import org.apache.maven.monitor.event.DefaultEventMonitor;
|
||||||
|
import org.apache.maven.plugin.Mojo;
|
||||||
|
import org.apache.maven.settings.Mirror;
|
||||||
|
import org.apache.maven.settings.Proxy;
|
||||||
|
import org.apache.maven.settings.Server;
|
||||||
|
import org.apache.maven.settings.Settings;
|
||||||
|
import org.apache.maven.usability.SystemWarnings;
|
||||||
|
import org.apache.maven.wagon.manager.RepositorySettings;
|
||||||
|
import org.apache.maven.wagon.manager.WagonManager;
|
||||||
|
import org.apache.maven.wagon.repository.Repository;
|
||||||
|
import org.codehaus.plexus.PlexusConstants;
|
||||||
|
import org.codehaus.plexus.PlexusContainer;
|
||||||
|
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
|
||||||
|
import org.codehaus.plexus.context.Context;
|
||||||
|
import org.codehaus.plexus.context.ContextException;
|
||||||
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
|
import org.codehaus.plexus.logging.Logger;
|
||||||
|
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
|
||||||
|
import org.codehaus.plexus.util.StringUtils;
|
||||||
|
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.apache.maven.MavenTools;
|
/**
|
||||||
import org.apache.maven.SettingsConfigurationException;
|
* DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
import org.apache.maven.monitor.event.DefaultEventMonitor;
|
*
|
||||||
import org.apache.maven.plugin.Mojo;
|
* @version $Id$
|
||||||
import org.apache.maven.settings.Settings;
|
*/
|
||||||
import org.apache.maven.settings.Proxy;
|
|
||||||
import org.apache.maven.settings.Server;
|
|
||||||
import org.apache.maven.settings.Mirror;
|
|
||||||
import org.apache.maven.usability.SystemWarnings;
|
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
|
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
|
|
||||||
import org.apache.maven.artifact.manager.WagonManager;
|
|
||||||
import org.apache.maven.embedder.MavenEmbedderException;
|
|
||||||
import org.apache.maven.execution.MavenExecutionRequest;
|
|
||||||
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
|
||||||
import org.codehaus.plexus.logging.Logger;
|
|
||||||
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
|
||||||
import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
|
|
||||||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
|
|
||||||
import org.codehaus.plexus.context.ContextException;
|
|
||||||
import org.codehaus.plexus.context.Context;
|
|
||||||
import org.codehaus.plexus.PlexusContainer;
|
|
||||||
import org.codehaus.plexus.PlexusConstants;
|
|
||||||
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
|
||||||
|
|
||||||
public class DefaultMavenExecutionRequestDefaultsPopulator
|
public class DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
extends AbstractLogEnabled
|
extends AbstractLogEnabled
|
||||||
implements MavenExecutionRequestDefaultsPopulator, Contextualizable
|
implements MavenExecutionRequestDefaultsPopulator, Contextualizable
|
||||||
|
@ -38,6 +64,8 @@ public class DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
|
|
||||||
private PlexusContainer container;
|
private PlexusContainer container;
|
||||||
|
|
||||||
|
private WagonManager wagonManager;
|
||||||
|
|
||||||
public MavenExecutionRequest populateDefaults( MavenExecutionRequest request )
|
public MavenExecutionRequest populateDefaults( MavenExecutionRequest request )
|
||||||
throws MavenEmbedderException
|
throws MavenEmbedderException
|
||||||
{
|
{
|
||||||
|
@ -53,9 +81,9 @@ public class DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
request.setSettings( mavenTools.buildSettings( userSettingsPath, globalSettingsFile, request.isInteractiveMode(),
|
request.setSettings( mavenTools.buildSettings( userSettingsPath, globalSettingsFile, request
|
||||||
request.isOffline(), request.isUsePluginRegistry(),
|
.isInteractiveMode(), request.isOffline(), request.isUsePluginRegistry(), request
|
||||||
request.isUsePluginUpdateOverride() ) );
|
.isUsePluginUpdateOverride() ) );
|
||||||
}
|
}
|
||||||
catch ( SettingsConfigurationException e )
|
catch ( SettingsConfigurationException e )
|
||||||
{
|
{
|
||||||
|
@ -84,7 +112,8 @@ public class DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
snapshotPolicySet = true;
|
snapshotPolicySet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !snapshotPolicySet ) {
|
if ( !snapshotPolicySet )
|
||||||
|
{
|
||||||
if ( request.isUpdateSnapshots() )
|
if ( request.isUpdateSnapshots() )
|
||||||
{
|
{
|
||||||
artifactRepositoryFactory.setGlobalUpdatePolicy( ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS );
|
artifactRepositoryFactory.setGlobalUpdatePolicy( ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS );
|
||||||
|
@ -100,16 +129,12 @@ public class DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
|
|
||||||
// Wagon
|
// Wagon
|
||||||
|
|
||||||
|
wagonManager.setOnline( !request.isOffline() );
|
||||||
|
|
||||||
if ( request.getSettings().isOffline() )
|
if ( request.getSettings().isOffline() )
|
||||||
{
|
{
|
||||||
getLogger().info( SystemWarnings.getOfflineWarning() );
|
getLogger().info( SystemWarnings.getOfflineWarning() );
|
||||||
|
|
||||||
WagonManager wagonManager = null;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
wagonManager = (WagonManager) container.lookup( WagonManager.ROLE );
|
|
||||||
|
|
||||||
if ( request.isOffline() )
|
if ( request.isOffline() )
|
||||||
{
|
{
|
||||||
wagonManager.setOnline( false );
|
wagonManager.setOnline( false );
|
||||||
|
@ -118,40 +143,16 @@ public class DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
{
|
{
|
||||||
wagonManager.setInteractive( request.isInteractiveMode() );
|
wagonManager.setInteractive( request.isInteractiveMode() );
|
||||||
|
|
||||||
wagonManager.setDownloadMonitor( request.getTransferListener() );
|
wagonManager.addTransferListener( request.getTransferListener() );
|
||||||
|
|
||||||
wagonManager.setOnline( true );
|
wagonManager.setOnline( true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch ( ComponentLookupException e )
|
|
||||||
{
|
|
||||||
throw new MavenEmbedderException( "Cannot retrieve WagonManager in order to set offline mode.", e );
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
container.release( wagonManager );
|
|
||||||
}
|
|
||||||
catch ( ComponentLifecycleException e )
|
|
||||||
{
|
|
||||||
getLogger().warn( "Cannot release WagonManager.", e );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
resolveParameters( request.getSettings() );
|
resolveParameters( request.getSettings() );
|
||||||
}
|
}
|
||||||
catch ( ComponentLookupException e )
|
|
||||||
{
|
|
||||||
throw new MavenEmbedderException( "Unable to configure Maven for execution", e );
|
|
||||||
}
|
|
||||||
catch ( ComponentLifecycleException e )
|
|
||||||
{
|
|
||||||
throw new MavenEmbedderException( "Unable to configure Maven for execution", e );
|
|
||||||
}
|
|
||||||
catch ( SettingsConfigurationException e )
|
catch ( SettingsConfigurationException e )
|
||||||
{
|
{
|
||||||
throw new MavenEmbedderException( "Unable to configure Maven for execution", e );
|
throw new MavenEmbedderException( "Unable to configure Maven for execution", e );
|
||||||
|
@ -179,11 +180,7 @@ public class DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resolveParameters( Settings settings )
|
private void resolveParameters( Settings settings )
|
||||||
throws ComponentLookupException, ComponentLifecycleException, SettingsConfigurationException
|
throws SettingsConfigurationException
|
||||||
{
|
|
||||||
WagonManager wagonManager = (WagonManager) container.lookup( WagonManager.ROLE );
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
Proxy proxy = settings.getActiveProxy();
|
Proxy proxy = settings.getActiveProxy();
|
||||||
|
|
||||||
|
@ -194,23 +191,25 @@ public class DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
throw new SettingsConfigurationException( "Proxy in settings.xml has no host" );
|
throw new SettingsConfigurationException( "Proxy in settings.xml has no host" );
|
||||||
}
|
}
|
||||||
|
|
||||||
wagonManager.addProxy( proxy.getProtocol(), proxy.getHost(), proxy.getPort(), proxy.getUsername(),
|
wagonManager.addProxy( proxy.getProtocol(), proxy.getHost(), proxy.getPort(), proxy.getUsername(), proxy
|
||||||
proxy.getPassword(), proxy.getNonProxyHosts() );
|
.getPassword(), proxy.getNonProxyHosts() );
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( Iterator i = settings.getServers().iterator(); i.hasNext(); )
|
for ( Iterator i = settings.getServers().iterator(); i.hasNext(); )
|
||||||
{
|
{
|
||||||
Server server = (Server) i.next();
|
Server server = (Server) i.next();
|
||||||
|
|
||||||
wagonManager.addAuthenticationInfo( server.getId(), server.getUsername(), server.getPassword(),
|
RepositorySettings repoSetting = wagonManager.getRepositorySettings( server.getId() );
|
||||||
server.getPrivateKey(), server.getPassphrase() );
|
|
||||||
|
|
||||||
wagonManager.addPermissionInfo( server.getId(), server.getFilePermissions(),
|
repoSetting.setAuthentication( server.getUsername(), server.getPassword(), server.getPrivateKey(), server
|
||||||
server.getDirectoryPermissions() );
|
.getPassphrase() );
|
||||||
|
|
||||||
|
repoSetting
|
||||||
|
.setPermissions( /* group */null, server.getFilePermissions(), server.getDirectoryPermissions() );
|
||||||
|
|
||||||
if ( server.getConfiguration() != null )
|
if ( server.getConfiguration() != null )
|
||||||
{
|
{
|
||||||
wagonManager.addConfiguration( server.getId(), (Xpp3Dom) server.getConfiguration() );
|
repoSetting.setConfiguration( new XmlPlexusConfiguration( (Xpp3Dom) server.getConfiguration() ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,12 +217,15 @@ public class DefaultMavenExecutionRequestDefaultsPopulator
|
||||||
{
|
{
|
||||||
Mirror mirror = (Mirror) i.next();
|
Mirror mirror = (Mirror) i.next();
|
||||||
|
|
||||||
wagonManager.addMirror( mirror.getId(), mirror.getMirrorOf(), mirror.getUrl() );
|
try
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
{
|
||||||
container.release( wagonManager );
|
wagonManager.addRepositoryMirror( mirror.getMirrorOf(), mirror.getId(), mirror.getUrl() );
|
||||||
|
}
|
||||||
|
catch ( IllegalArgumentException e )
|
||||||
|
{
|
||||||
|
throw new SettingsConfigurationException( "Unable to configure mirror " + mirror + ": "
|
||||||
|
+ e.getMessage(), e );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
<role>org.apache.maven.embedder.execution.MavenExecutionRequestDefaultsPopulator</role>
|
<role>org.apache.maven.embedder.execution.MavenExecutionRequestDefaultsPopulator</role>
|
||||||
<implementation>org.apache.maven.embedder.execution.DefaultMavenExecutionRequestDefaultsPopulator</implementation>
|
<implementation>org.apache.maven.embedder.execution.DefaultMavenExecutionRequestDefaultsPopulator</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
|
<requirement>
|
||||||
|
<role>org.apache.maven.wagon.manager.WagonManager</role>
|
||||||
|
<role-hint>default</role-hint>
|
||||||
|
</requirement>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.MavenTools</role>
|
<role>org.apache.maven.MavenTools</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
|
|
|
@ -47,6 +47,26 @@ public class MavenEmbedderTest
|
||||||
maven.stop();
|
maven.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void assertNoExceptions( MavenExecutionResult result )
|
||||||
|
{
|
||||||
|
List exceptions = result.getExceptions();
|
||||||
|
if ( ( exceptions == null ) || exceptions.isEmpty() )
|
||||||
|
{
|
||||||
|
// everything is a-ok.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
System.err.println( "Encountered " + exceptions.size() + " exception(s)." );
|
||||||
|
Iterator it = exceptions.iterator();
|
||||||
|
while ( it.hasNext() )
|
||||||
|
{
|
||||||
|
Exception exception = (Exception) it.next();
|
||||||
|
exception.printStackTrace( System.err );
|
||||||
|
}
|
||||||
|
|
||||||
|
fail( "Encountered Exceptions in MavenExecutionResult during " + getName() );
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
// Goal/Phase execution tests
|
// Goal/Phase execution tests
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
@ -60,13 +80,13 @@ public class MavenEmbedderTest
|
||||||
|
|
||||||
FileUtils.copyDirectoryStructure( testDirectory, targetDirectory );
|
FileUtils.copyDirectoryStructure( testDirectory, targetDirectory );
|
||||||
|
|
||||||
MavenExecutionRequest request = new DefaultMavenExecutionRequest()
|
MavenExecutionRequest request = new DefaultMavenExecutionRequest().setBaseDirectory( targetDirectory )
|
||||||
.setBaseDirectory( targetDirectory )
|
.setShowErrors( true ).setGoals( Arrays.asList( new String[] { "package" } ) );
|
||||||
.setShowErrors( true )
|
|
||||||
.setGoals( Arrays.asList( new String[]{ "package" } ) );
|
|
||||||
|
|
||||||
MavenExecutionResult result = maven.execute( request );
|
MavenExecutionResult result = maven.execute( request );
|
||||||
|
|
||||||
|
assertNoExceptions( result );
|
||||||
|
|
||||||
MavenProject project = result.getMavenProject();
|
MavenProject project = result.getMavenProject();
|
||||||
|
|
||||||
assertEquals( "embedder-test-project", project.getArtifactId() );
|
assertEquals( "embedder-test-project", project.getArtifactId() );
|
||||||
|
@ -85,13 +105,16 @@ public class MavenEmbedderTest
|
||||||
|
|
||||||
FileUtils.copyDirectoryStructure( testDirectory, targetDirectory );
|
FileUtils.copyDirectoryStructure( testDirectory, targetDirectory );
|
||||||
|
|
||||||
MavenExecutionRequest request = new DefaultMavenExecutionRequest()
|
MavenExecutionRequest request = new DefaultMavenExecutionRequest().setPomFile(
|
||||||
.setPomFile( new File( targetDirectory, "pom.xml" ).getAbsolutePath() )
|
new File( targetDirectory,
|
||||||
.setShowErrors( true )
|
"pom.xml" )
|
||||||
.setGoals( Arrays.asList( new String[]{ "package" } ) );
|
.getAbsolutePath() )
|
||||||
|
.setShowErrors( true ).setGoals( Arrays.asList( new String[] { "package" } ) );
|
||||||
|
|
||||||
MavenExecutionResult result = maven.execute( request );
|
MavenExecutionResult result = maven.execute( request );
|
||||||
|
|
||||||
|
assertNoExceptions( result );
|
||||||
|
|
||||||
MavenProject project = result.getMavenProject();
|
MavenProject project = result.getMavenProject();
|
||||||
|
|
||||||
assertEquals( "embedder-test-project", project.getArtifactId() );
|
assertEquals( "embedder-test-project", project.getArtifactId() );
|
||||||
|
@ -113,12 +136,13 @@ public class MavenEmbedderTest
|
||||||
// Check with profile not active
|
// Check with profile not active
|
||||||
|
|
||||||
MavenExecutionRequest requestWithoutProfile = new DefaultMavenExecutionRequest()
|
MavenExecutionRequest requestWithoutProfile = new DefaultMavenExecutionRequest()
|
||||||
.setPomFile( new File( targetDirectory, "pom.xml" ).getAbsolutePath() )
|
.setPomFile( new File( targetDirectory, "pom.xml" ).getAbsolutePath() ).setShowErrors( true )
|
||||||
.setShowErrors( true )
|
|
||||||
.setGoals( Arrays.asList( new String[] { "validate" } ) );
|
.setGoals( Arrays.asList( new String[] { "validate" } ) );
|
||||||
|
|
||||||
MavenExecutionResult r0 = maven.execute( requestWithoutProfile );
|
MavenExecutionResult r0 = maven.execute( requestWithoutProfile );
|
||||||
|
|
||||||
|
assertNoExceptions( r0 );
|
||||||
|
|
||||||
MavenProject p0 = r0.getMavenProject();
|
MavenProject p0 = r0.getMavenProject();
|
||||||
|
|
||||||
assertNull( p0.getProperties().getProperty( "embedderProfile" ) );
|
assertNull( p0.getProperties().getProperty( "embedderProfile" ) );
|
||||||
|
@ -129,10 +153,11 @@ public class MavenEmbedderTest
|
||||||
|
|
||||||
// Check with profile activated
|
// Check with profile activated
|
||||||
|
|
||||||
MavenExecutionRequest request = new DefaultMavenExecutionRequest()
|
MavenExecutionRequest request = new DefaultMavenExecutionRequest().setPomFile(
|
||||||
.setPomFile( new File( targetDirectory, "pom.xml" ).getAbsolutePath() )
|
new File( targetDirectory,
|
||||||
.setShowErrors( true )
|
"pom.xml" )
|
||||||
.setGoals( Arrays.asList( new String[]{ "validate" } ) )
|
.getAbsolutePath() )
|
||||||
|
.setShowErrors( true ).setGoals( Arrays.asList( new String[] { "validate" } ) )
|
||||||
.addActiveProfile( "embedderProfile" );
|
.addActiveProfile( "embedderProfile" );
|
||||||
|
|
||||||
MavenExecutionResult r1 = maven.execute( request );
|
MavenExecutionResult r1 = maven.execute( request );
|
||||||
|
@ -191,12 +216,13 @@ public class MavenEmbedderTest
|
||||||
public void testProjectReading()
|
public void testProjectReading()
|
||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
MavenExecutionRequest request = new DefaultMavenExecutionRequest()
|
MavenExecutionRequest request = new DefaultMavenExecutionRequest().setShowErrors( true )
|
||||||
.setShowErrors( true )
|
|
||||||
.setPomFile( getPomFile().getAbsolutePath() );
|
.setPomFile( getPomFile().getAbsolutePath() );
|
||||||
|
|
||||||
MavenExecutionResult result = maven.readProjectWithDependencies( request );
|
MavenExecutionResult result = maven.readProjectWithDependencies( request );
|
||||||
|
|
||||||
|
assertNoExceptions( result );
|
||||||
|
|
||||||
assertEquals( "org.apache.maven", result.getMavenProject().getGroupId() );
|
assertEquals( "org.apache.maven", result.getMavenProject().getGroupId() );
|
||||||
|
|
||||||
Set artifacts = result.getMavenProject().getArtifacts();
|
Set artifacts = result.getMavenProject().getArtifacts();
|
||||||
|
@ -211,13 +237,14 @@ public class MavenEmbedderTest
|
||||||
public void testProjectWithExtensionsReading()
|
public void testProjectWithExtensionsReading()
|
||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
MavenExecutionRequest request = new DefaultMavenExecutionRequest()
|
MavenExecutionRequest request = new DefaultMavenExecutionRequest().setShowErrors( true )
|
||||||
.setShowErrors( true )
|
|
||||||
.setPomFile( new File( basedir, "src/test/resources/pom2.xml" ).getAbsolutePath() );
|
.setPomFile( new File( basedir, "src/test/resources/pom2.xml" ).getAbsolutePath() );
|
||||||
|
|
||||||
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||||
MavenExecutionResult result = new ExtendableMavenEmbedder( classLoader ).readProjectWithDependencies( request );
|
MavenExecutionResult result = new ExtendableMavenEmbedder( classLoader ).readProjectWithDependencies( request );
|
||||||
|
|
||||||
|
assertNoExceptions( result );
|
||||||
|
|
||||||
// Iterator it = result.getMavenProject().getTestClasspathElements().iterator();
|
// Iterator it = result.getMavenProject().getTestClasspathElements().iterator();
|
||||||
// while(it.hasNext()) {
|
// while(it.hasNext()) {
|
||||||
// Object object = (Object) it.next();
|
// Object object = (Object) it.next();
|
||||||
|
@ -229,7 +256,6 @@ public class MavenEmbedderTest
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Model Writing
|
// Model Writing
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -263,51 +289,67 @@ public class MavenEmbedderTest
|
||||||
return new File( basedir, "src/test/resources/pom.xml" );
|
return new File( basedir, "src/test/resources/pom.xml" );
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ExtendableMavenEmbedder extends MavenEmbedder {
|
private class ExtendableMavenEmbedder
|
||||||
|
extends MavenEmbedder
|
||||||
|
{
|
||||||
|
|
||||||
public ExtendableMavenEmbedder(ClassLoader classLoader) throws MavenEmbedderException {
|
public ExtendableMavenEmbedder( ClassLoader classLoader )
|
||||||
|
throws MavenEmbedderException
|
||||||
|
{
|
||||||
super( classLoader, new MavenEmbedderConsoleLogger() );
|
super( classLoader, new MavenEmbedderConsoleLogger() );
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Map getPluginExtensionComponents(Plugin plugin) throws PluginManagerException {
|
protected Map getPluginExtensionComponents( Plugin plugin )
|
||||||
|
throws PluginManagerException
|
||||||
|
{
|
||||||
Map toReturn = new HashMap();
|
Map toReturn = new HashMap();
|
||||||
MyArtifactHandler handler = new MyArtifactHandler();
|
MyArtifactHandler handler = new MyArtifactHandler();
|
||||||
toReturn.put( "mkleint", handler );
|
toReturn.put( "mkleint", handler );
|
||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void verifyPlugin( Plugin plugin, MavenProject project ) {
|
protected void verifyPlugin( Plugin plugin, MavenProject project )
|
||||||
|
{
|
||||||
//ignore don't want to actually verify in test
|
//ignore don't want to actually verify in test
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MyArtifactHandler implements ArtifactHandler {
|
private class MyArtifactHandler
|
||||||
|
implements ArtifactHandler
|
||||||
|
{
|
||||||
|
|
||||||
public String getExtension() {
|
public String getExtension()
|
||||||
|
{
|
||||||
return "jar";
|
return "jar";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDirectory() {
|
public String getDirectory()
|
||||||
|
{
|
||||||
throw new UnsupportedOperationException( "Not supported yet." );
|
throw new UnsupportedOperationException( "Not supported yet." );
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getClassifier() {
|
public String getClassifier()
|
||||||
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getPackaging() {
|
public String getPackaging()
|
||||||
|
{
|
||||||
return "mkleint";
|
return "mkleint";
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isIncludesDependencies() {
|
public boolean isIncludesDependencies()
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLanguage() {
|
public String getLanguage()
|
||||||
|
{
|
||||||
return "java";
|
return "java";
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAddedToClasspath() {
|
public boolean isAddedToClasspath()
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,10 +78,5 @@
|
||||||
<groupId>org.codehaus.plexus</groupId>
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
<artifactId>plexus-container-default</artifactId>
|
<artifactId>plexus-container-default</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-file</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
|
|
@ -22,6 +22,7 @@ import org.apache.maven.artifact.ArtifactStatus;
|
||||||
import org.apache.maven.artifact.ArtifactUtils;
|
import org.apache.maven.artifact.ArtifactUtils;
|
||||||
import org.apache.maven.artifact.InvalidRepositoryException;
|
import org.apache.maven.artifact.InvalidRepositoryException;
|
||||||
import org.apache.maven.artifact.factory.ArtifactFactory;
|
import org.apache.maven.artifact.factory.ArtifactFactory;
|
||||||
|
import org.apache.maven.artifact.manager.ArtifactManager;
|
||||||
import org.apache.maven.artifact.manager.WagonManager;
|
import org.apache.maven.artifact.manager.WagonManager;
|
||||||
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
|
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
|
||||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||||
|
@ -175,9 +176,11 @@ public class DefaultMavenProjectBuilder
|
||||||
// I am making this available for use with a new method that takes a
|
// I am making this available for use with a new method that takes a
|
||||||
// a monitor wagon monitor as a parameter so that tools can use the
|
// a monitor wagon monitor as a parameter so that tools can use the
|
||||||
// methods here and receive callbacks. MNG-1015
|
// methods here and receive callbacks. MNG-1015
|
||||||
|
//
|
||||||
|
// Probably no longer relevant with wagonManager/artifactManager change - joakime
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
private WagonManager wagonManager;
|
private ArtifactManager artifactManager;
|
||||||
|
|
||||||
public static final String MAVEN_MODEL_VERSION = "4.0.0";
|
public static final String MAVEN_MODEL_VERSION = "4.0.0";
|
||||||
|
|
||||||
|
@ -361,7 +364,7 @@ public class DefaultMavenProjectBuilder
|
||||||
|
|
||||||
if ( transferListener != null )
|
if ( transferListener != null )
|
||||||
{
|
{
|
||||||
wagonManager.setDownloadMonitor( transferListener );
|
artifactManager.getWagonManager().addTransferListener( transferListener );
|
||||||
}
|
}
|
||||||
|
|
||||||
ArtifactResolutionResult result = artifactResolver.resolveTransitively( project.getDependencyArtifacts(),
|
ArtifactResolutionResult result = artifactResolver.resolveTransitively( project.getDependencyArtifacts(),
|
||||||
|
|
|
@ -127,7 +127,7 @@
|
||||||
<role-hint>default</role-hint>
|
<role-hint>default</role-hint>
|
||||||
</requirement>
|
</requirement>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.MavenTools</role>
|
<role>org.apache.maven.MavenTools</role>
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<implementation>org.apache.maven.project.TestArtifactResolver</implementation>
|
<implementation>org.apache.maven.project.TestArtifactResolver</implementation>
|
||||||
<requirements>
|
<requirements>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.manager.WagonManager</role>
|
<role>org.apache.maven.artifact.manager.ArtifactManager</role>
|
||||||
</requirement>
|
</requirement>
|
||||||
<requirement>
|
<requirement>
|
||||||
<role>org.apache.maven.artifact.factory.ArtifactFactory</role>
|
<role>org.apache.maven.artifact.factory.ArtifactFactory</role>
|
||||||
|
|
|
@ -528,6 +528,25 @@
|
||||||
</field>
|
</field>
|
||||||
-->
|
-->
|
||||||
</fields>
|
</fields>
|
||||||
|
<codeSegments>
|
||||||
|
<codeSegment>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
<code><![CDATA[
|
||||||
|
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
sb.append( "Mirror[" );
|
||||||
|
sb.append( "id=" ).append( this.getId() );
|
||||||
|
sb.append( ",mirrorOf=" ).append( mirrorOf );
|
||||||
|
sb.append( ",url=" ).append( this.url );
|
||||||
|
sb.append( ",name=" ).append( this.name );
|
||||||
|
sb.append( "]" );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
]]></code>
|
||||||
|
</codeSegment>
|
||||||
|
</codeSegments>
|
||||||
</class>
|
</class>
|
||||||
<!-- Profile support -->
|
<!-- Profile support -->
|
||||||
<class>
|
<class>
|
||||||
|
|
27
pom.xml
27
pom.xml
|
@ -168,7 +168,6 @@
|
||||||
<module>maven-tools</module>
|
<module>maven-tools</module>
|
||||||
</modules>
|
</modules>
|
||||||
<properties>
|
<properties>
|
||||||
<wagonVersion>1.0-beta-3-SNAPSHOT</wagonVersion>
|
|
||||||
<plexusVersion>1.0-alpha-16</plexusVersion>
|
<plexusVersion>1.0-alpha-16</plexusVersion>
|
||||||
</properties>
|
</properties>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
@ -201,30 +200,20 @@
|
||||||
<artifactId>plexus-utils</artifactId>
|
<artifactId>plexus-utils</artifactId>
|
||||||
<version>1.4</version>
|
<version>1.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-lang</groupId>
|
||||||
|
<artifactId>commons-lang</artifactId>
|
||||||
|
<version>2.1</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
<groupId>org.apache.maven.wagon</groupId>
|
||||||
<artifactId>wagon-provider-api</artifactId>
|
<artifactId>wagon-provider-api</artifactId>
|
||||||
<version>${wagonVersion}</version>
|
<version>1.0-beta-3-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
<groupId>org.apache.maven.wagon</groupId>
|
||||||
<artifactId>wagon-ssh</artifactId>
|
<artifactId>wagon-manager</artifactId>
|
||||||
<version>${wagonVersion}</version>
|
<version>1.0-beta-3-SNAPSHOT</version>
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-ssh-external</artifactId>
|
|
||||||
<version>${wagonVersion}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-file</artifactId>
|
|
||||||
<version>${wagonVersion}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.maven.wagon</groupId>
|
|
||||||
<artifactId>wagon-http-lightweight</artifactId>
|
|
||||||
<version>${wagonVersion}</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>easymock</groupId>
|
<groupId>easymock</groupId>
|
||||||
|
|
Loading…
Reference in New Issue