project.setActiveProfiles( activeProfiles );
project.setOriginalModel( originalModel );
lineage.addFirst( project );
Parent parentModel = model.getParent();
String projectId = safeVersionlessKey( model.getGroupId(), model.getArtifactId() );
if ( parentModel != null )
{
if ( StringUtils.isEmpty( parentModel.getGroupId() ) )
{
throw new ProjectBuildingException( projectId, "Missing groupId element from parent element" );
}
else if ( StringUtils.isEmpty( parentModel.getArtifactId() ) )
{
throw new ProjectBuildingException( projectId, "Missing artifactId element from parent element" );
}
else if ( parentModel.getGroupId().equals( model.getGroupId() ) &&
parentModel.getArtifactId().equals( model.getArtifactId() ) )
{
throw new ProjectBuildingException( projectId,
"Parent element is a duplicate of " + "the current project " );
}
else if ( StringUtils.isEmpty( parentModel.getVersion() ) )
{
throw new ProjectBuildingException( projectId, "Missing version element from parent element" );
}
// the only way this will have a value is if we find the parent on disk...
File parentDescriptor = null;
model = null;
String parentKey =
createCacheKey( parentModel.getGroupId(), parentModel.getArtifactId(), parentModel.getVersion() );
MavenProject parentProject = (MavenProject) rawProjectCache.get( parentKey );
if ( parentProject != null )
{
model = ModelUtils.cloneModel( parentProject.getModel() );
parentDescriptor = parentProject.getFile();
}
String parentRelativePath = parentModel.getRelativePath();
// if we can't find a cached model matching the parent spec, then let's try to look on disk using
// <relativePath/>
if ( ( model == null ) && ( projectDir != null ) && StringUtils.isNotEmpty( parentRelativePath ) )
{
parentDescriptor = new File( projectDir, parentRelativePath );
if ( getLogger().isDebugEnabled() )
{
getLogger().debug( "Searching for parent-POM: " + parentModel.getId() + " of project: " +
project.getId() + " in relative path: " + parentRelativePath );
}
if ( parentDescriptor.isDirectory() )
{
if ( getLogger().isDebugEnabled() )
{
getLogger().debug( "Path specified in <relativePath/> (" + parentRelativePath +
") is a directory. Searching for 'pom.xml' within this directory." );
}
parentDescriptor = new File( parentDescriptor, "pom.xml" );
if ( !parentDescriptor.exists() )
{
if ( getLogger().isDebugEnabled() )
{
getLogger().debug( "Parent-POM: " + parentModel.getId() + " for project: " +
project.getId() + " cannot be loaded from relative path: " + parentDescriptor +
"; path does not exist." );
}
}
}
if ( parentDescriptor != null )
{
try
{
parentDescriptor = parentDescriptor.getCanonicalFile();
}
catch ( IOException e )
{
getLogger().debug( "Failed to canonicalize potential parent POM: \'" + parentDescriptor + "\'",
e );
parentDescriptor = null;
}
}
if ( ( parentDescriptor != null ) && parentDescriptor.exists() )
{
Model candidateParent = readModel( projectId, parentDescriptor, strict );
String candidateParentGroupId = candidateParent.getGroupId();
if ( ( candidateParentGroupId == null ) && ( candidateParent.getParent() != null ) )
{
candidateParentGroupId = candidateParent.getParent().getGroupId();
}
String candidateParentVersion = candidateParent.getVersion();
if ( ( candidateParentVersion == null ) && ( candidateParent.getParent() != null ) )
{
candidateParentVersion = candidateParent.getParent().getVersion();
}
if ( parentModel.getGroupId().equals( candidateParentGroupId ) &&
parentModel.getArtifactId().equals( candidateParent.getArtifactId() ) &&
parentModel.getVersion().equals( candidateParentVersion ) )
{
model = candidateParent;
getLogger().debug( "Using parent-POM from the project hierarchy at: \'" +
parentModel.getRelativePath() + "\' for project: " + project.getId() );
}
else
{
getLogger().debug( "Invalid parent-POM referenced by relative path '" +
parentModel.getRelativePath() + "' in parent specification in " + project.getId() + ":" +
"\n Specified: " + parentModel.getId() + "\n Found: " + candidateParent.getId() );
}
}
else if ( getLogger().isDebugEnabled() )
{
getLogger().debug(
"Parent-POM: " + parentModel.getId() + " not found in relative path: " + parentRelativePath );
}
}
Artifact parentArtifact = null;
// only resolve the parent model from the repository system if we didn't find it on disk...
if ( model == null )
{
// MNG-2302: parent's File was being populated incorrectly when parent is loaded from repo.
// keep this in line with other POMs loaded from the repository...the file should be null.
parentDescriptor = null;
//!! (**)
// ----------------------------------------------------------------------
// Do we have the necessary information to actually find the parent
// POMs here?? I don't think so ... Say only one remote repository is
// specified and that is ibiblio then this model that we just read doesn't
// have any repository information ... I think we might have to inherit
// as we go in order to do this.
// ----------------------------------------------------------------------
// we must add the repository this POM was found in too, by chance it may be located where the parent is
// we can't query the parent to ask where it is :)
List remoteRepositories = new ArrayList( aggregatedRemoteWagonRepositories );
remoteRepositories.addAll( parentSearchRepositories );
if ( getLogger().isDebugEnabled() )
{
getLogger().debug( "Retrieving parent-POM: " + parentModel.getId() + " for project: " +
project.getId() + " from the repository." );
}
parentArtifact = artifactFactory.createParentArtifact( parentModel.getGroupId(),
parentModel.getArtifactId(),
parentModel.getVersion() );
try
{
model = findModelFromRepository( parentArtifact, remoteRepositories, config.getLocalRepository(), false );
}