in maven-project/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java [165:318]
private ProjectRelocation retrieveRelocatedProject( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
throws ArtifactMetadataRetrievalException
{
MavenProject project = null;
ProjectBuilderConfiguration config = projectBuilderConfig;
if ( config == null )
{
config = new DefaultProjectBuilderConfiguration().setLocalRepository( localRepository );
}
Artifact pomArtifact;
boolean done = false;
do
{
// TODO: can we just modify the original?
pomArtifact = artifactFactory.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(),
artifact.getVersion(), artifact.getScope() );
if ( Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) )
{
done = true;
}
else
{
try
{
project = mavenProjectBuilder.buildFromRepository( pomArtifact, remoteRepositories, config,
true );
}
catch ( InvalidProjectModelException e )
{
String id = pomArtifact.getId();
if ( !warnedPoms.contains( id ) )
{
warnedPoms.add( pomArtifact.getId() );
getLogger().warn( "POM for \'"
+ pomArtifact
+ "\' is invalid.\n\nIts dependencies (if any) will NOT be available to the current build." );
if ( getLogger().isDebugEnabled() )
{
getLogger().debug( "Reason: " + e.getMessage() );
ModelValidationResult validationResult = e.getValidationResult();
if ( validationResult != null )
{
getLogger().debug( "\nValidation Errors:" );
for ( Iterator i = validationResult.getMessages().iterator(); i.hasNext(); )
{
getLogger().debug( i.next().toString() );
}
getLogger().debug( "\n" );
}
}
}
project = null;
}
catch ( ProjectBuildingException e )
{
throw new ArtifactMetadataRetrievalException( "Unable to read the metadata file for artifact '"
+ artifact.getDependencyConflictId() + "': " + e.getMessage(), e, artifact );
}
if ( project != null )
{
Relocation relocation = null;
DistributionManagement distMgmt = project.getDistributionManagement();
if ( distMgmt != null )
{
relocation = distMgmt.getRelocation();
artifact.setDownloadUrl( distMgmt.getDownloadUrl() );
pomArtifact.setDownloadUrl( distMgmt.getDownloadUrl() );
}
if ( relocation != null )
{
if ( relocation.getGroupId() != null )
{
artifact.setGroupId( relocation.getGroupId() );
project.setGroupId( relocation.getGroupId() );
}
if ( relocation.getArtifactId() != null )
{
artifact.setArtifactId( relocation.getArtifactId() );
project.setArtifactId( relocation.getArtifactId() );
}
if ( relocation.getVersion() != null )
{
//note: see MNG-3454. This causes a problem, but fixing it may break more.
artifact.setVersionRange( VersionRange.createFromVersion( relocation.getVersion() ) );
project.setVersion( relocation.getVersion() );
}
if ( artifact.getDependencyFilter() != null
&& !artifact.getDependencyFilter().include( artifact ) )
{
return null;
}
//MNG-2861: the artifact data has changed. If the available versions where previously retrieved,
//we need to update it. TODO: shouldn't the versions be merged across relocations?
List available = artifact.getAvailableVersions();
if ( available != null && !available.isEmpty() )
{
artifact.setAvailableVersions( retrieveAvailableVersions( artifact, localRepository,
remoteRepositories ) );
}
String message = "\n This artifact has been relocated to " + artifact.getGroupId() + ":"
+ artifact.getArtifactId() + ":" + artifact.getVersion() + ".\n";
if ( relocation.getMessage() != null )
{
message += " " + relocation.getMessage() + "\n";
}
if ( artifact.getDependencyTrail() != null && artifact.getDependencyTrail().size() == 1 )
{
getLogger().warn( "While downloading " + pomArtifact.getGroupId() + ":"
+ pomArtifact.getArtifactId() + ":" + pomArtifact.getVersion() + message + "\n" );
}
else
{
getLogger().debug( "While downloading " + pomArtifact.getGroupId() + ":"
+ pomArtifact.getArtifactId() + ":" + pomArtifact.getVersion() + message + "\n" );
}
}
else
{
done = true;
}
}
else
{
done = true;
}
}
}
while ( !done );
ProjectRelocation rel = new ProjectRelocation();
rel.project = project;
rel.pomArtifact = pomArtifact;
return rel;
}