blob: 12e6e2383ccd38ce30191bfddfb9323060661f5b [file] [log] [blame]
package org.apache.maven.project;
/*
* 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 java.io.File;
import java.io.IOException;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.InvalidArtifactRTException;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.LegacyLocalRepositoryManager;
import org.apache.maven.bridge.MavenRepositorySystem;
import org.apache.maven.feature.Features;
import org.apache.maven.model.Build;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.DependencyManagement;
import org.apache.maven.model.DeploymentRepository;
import org.apache.maven.model.Extension;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.Profile;
import org.apache.maven.model.ReportPlugin;
import org.apache.maven.model.building.ArtifactModelSource;
import org.apache.maven.model.building.TransformerContextBuilder;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.building.DefaultModelProblem;
import org.apache.maven.model.building.FileModelSource;
import org.apache.maven.model.building.ModelBuilder;
import org.apache.maven.model.building.ModelBuildingException;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.model.building.ModelBuildingResult;
import org.apache.maven.model.building.ModelProblem;
import org.apache.maven.model.building.ModelProcessor;
import org.apache.maven.model.building.ModelSource;
import org.apache.maven.model.building.StringModelSource;
import org.apache.maven.model.building.TransformerContext;
import org.apache.maven.model.resolution.ModelResolver;
import org.apache.maven.repository.internal.ArtifactDescriptorUtils;
import org.apache.maven.repository.internal.DefaultModelCache;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.Os;
import org.codehaus.plexus.util.StringUtils;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.RequestTrace;
import org.eclipse.aether.impl.RemoteRepositoryManager;
import org.eclipse.aether.repository.LocalRepositoryManager;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.repository.WorkspaceRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResult;
/**
* DefaultProjectBuilder
*/
@Named
@Singleton
public class DefaultProjectBuilder
implements ProjectBuilder
{
@Inject
private Logger logger;
@Inject
private ModelBuilder modelBuilder;
@Inject
private ModelProcessor modelProcessor;
@Inject
private ProjectBuildingHelper projectBuildingHelper;
@Inject
private MavenRepositorySystem repositorySystem;
@Inject
private org.eclipse.aether.RepositorySystem repoSystem;
@Inject
private RemoteRepositoryManager repositoryManager;
@Inject
private ProjectDependenciesResolver dependencyResolver;
// ----------------------------------------------------------------------
// MavenProjectBuilder Implementation
// ----------------------------------------------------------------------
@Override
public ProjectBuildingResult build( File pomFile, ProjectBuildingRequest request )
throws ProjectBuildingException
{
return build( pomFile, new FileModelSource( pomFile ),
new InternalConfig( request, null, null ) );
}
@Override
public ProjectBuildingResult build( ModelSource modelSource, ProjectBuildingRequest request )
throws ProjectBuildingException
{
return build( null, modelSource,
new InternalConfig( request, null, null ) );
}
private ProjectBuildingResult build( File pomFile, ModelSource modelSource, InternalConfig config )
throws ProjectBuildingException
{
ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
try
{
ProjectBuildingRequest projectBuildingRequest = config.request;
MavenProject project = projectBuildingRequest.getProject();
List<ModelProblem> modelProblems = null;
Throwable error = null;
if ( project == null )
{
ModelBuildingRequest request = getModelBuildingRequest( config );
project = new MavenProject();
project.setFile( pomFile );
DefaultModelBuildingListener listener =
new DefaultModelBuildingListener( project, projectBuildingHelper, projectBuildingRequest );
request.setModelBuildingListener( listener );
request.setPomFile( pomFile );
request.setModelSource( modelSource );
request.setLocationTracking( true );
ModelBuildingResult result;
try
{
result = modelBuilder.build( request );
}
catch ( ModelBuildingException e )
{
result = e.getResult();
if ( result == null || result.getEffectiveModel() == null )
{
throw new ProjectBuildingException( e.getModelId(), e.getMessage(), pomFile, e );
}
// validation error, continue project building and delay failing to help IDEs
error = e;
}
modelProblems = result.getProblems();
initProject( project, Collections.emptyMap(), true,
result, new HashMap<>(), projectBuildingRequest );
}
else if ( projectBuildingRequest.isResolveDependencies() )
{
projectBuildingHelper.selectProjectRealm( project );
}
DependencyResolutionResult resolutionResult = null;
if ( projectBuildingRequest.isResolveDependencies() )
{
resolutionResult = resolveDependencies( project, config.session );
}
ProjectBuildingResult result = new DefaultProjectBuildingResult( project, modelProblems, resolutionResult );
if ( error != null )
{
ProjectBuildingException e = new ProjectBuildingException( Arrays.asList( result ) );
e.initCause( error );
throw e;
}
return result;
}
finally
{
Thread.currentThread().setContextClassLoader( oldContextClassLoader );
}
}
private DependencyResolutionResult resolveDependencies( MavenProject project, RepositorySystemSession session )
{
DependencyResolutionResult resolutionResult;
try
{
DefaultDependencyResolutionRequest resolution = new DefaultDependencyResolutionRequest( project, session );
resolutionResult = dependencyResolver.resolve( resolution );
}
catch ( DependencyResolutionException e )
{
resolutionResult = e.getResult();
}
Set<Artifact> artifacts = new LinkedHashSet<>();
if ( resolutionResult.getDependencyGraph() != null )
{
RepositoryUtils.toArtifacts( artifacts, resolutionResult.getDependencyGraph().getChildren(),
Collections.singletonList( project.getArtifact().getId() ), null );
// Maven 2.x quirk: an artifact always points at the local repo, regardless whether resolved or not
LocalRepositoryManager lrm = session.getLocalRepositoryManager();
for ( Artifact artifact : artifacts )
{
if ( !artifact.isResolved() )
{
String path = lrm.getPathForLocalArtifact( RepositoryUtils.toArtifact( artifact ) );
artifact.setFile( new File( lrm.getRepository().getBasedir(), path ) );
}
}
}
project.setResolvedArtifacts( artifacts );
project.setArtifacts( artifacts );
return resolutionResult;
}
private List<String> getProfileIds( List<Profile> profiles )
{
return profiles.stream().map( Profile::getId ).collect( Collectors.toList() );
}
private ModelBuildingRequest getModelBuildingRequest( InternalConfig config )
{
ProjectBuildingRequest configuration = config.request;
ModelBuildingRequest request = new DefaultModelBuildingRequest();
RequestTrace trace = RequestTrace.newChild( null, configuration ).newChild( request );
ModelResolver resolver =
new ProjectModelResolver( config.session, trace, repoSystem, repositoryManager, config.repositories,
configuration.getRepositoryMerging(), config.modelPool );
request.setValidationLevel( configuration.getValidationLevel() );
request.setProcessPlugins( configuration.isProcessPlugins() );
request.setProfiles( configuration.getProfiles() );
request.setActiveProfileIds( configuration.getActiveProfileIds() );
request.setInactiveProfileIds( configuration.getInactiveProfileIds() );
request.setSystemProperties( configuration.getSystemProperties() );
request.setUserProperties( configuration.getUserProperties() );
request.setBuildStartTime( configuration.getBuildStartTime() );
request.setModelResolver( resolver );
// this is a hint that we want to build 1 file, so don't cache. See MNG-7063
if ( config.modelPool != null )
{
request.setModelCache( DefaultModelCache.newInstance( config.session ) );
}
request.setTransformerContextBuilder( config.transformerContextBuilder );
return request;
}
@Override
public ProjectBuildingResult build( Artifact artifact, ProjectBuildingRequest request )
throws ProjectBuildingException
{
return build( artifact, false, request );
}
@Override
public ProjectBuildingResult build( Artifact artifact, boolean allowStubModel, ProjectBuildingRequest request )
throws ProjectBuildingException
{
org.eclipse.aether.artifact.Artifact pomArtifact = RepositoryUtils.toArtifact( artifact );
pomArtifact = ArtifactDescriptorUtils.toPomArtifact( pomArtifact );
InternalConfig config =
new InternalConfig( request, null, null );
boolean localProject;
try
{
ArtifactRequest pomRequest = new ArtifactRequest();
pomRequest.setArtifact( pomArtifact );
pomRequest.setRepositories( config.repositories );
ArtifactResult pomResult = repoSystem.resolveArtifact( config.session, pomRequest );
pomArtifact = pomResult.getArtifact();
localProject = pomResult.getRepository() instanceof WorkspaceRepository;
}
catch ( org.eclipse.aether.resolution.ArtifactResolutionException e )
{
if ( e.getResults().get( 0 ).isMissing() && allowStubModel )
{
return build( null, createStubModelSource( artifact ), config );
}
throw new ProjectBuildingException( artifact.getId(),
"Error resolving project artifact: " + e.getMessage(), e );
}
File pomFile = pomArtifact.getFile();
if ( "pom".equals( artifact.getType() ) )
{
artifact.selectVersion( pomArtifact.getVersion() );
artifact.setFile( pomFile );
artifact.setResolved( true );
}
if ( localProject )
{
return build( pomFile, new FileModelSource( pomFile ), config );
}
else
{
return build( null, new ArtifactModelSource( pomFile, artifact.getGroupId(), artifact.getArtifactId(),
artifact.getVersion() ),
config );
}
}
private ModelSource createStubModelSource( Artifact artifact )
{
StringBuilder buffer = new StringBuilder( 1024 );
buffer.append( "<?xml version='1.0'?>" );
buffer.append( "<project>" );
buffer.append( "<modelVersion>4.0.0</modelVersion>" );
buffer.append( "<groupId>" ).append( artifact.getGroupId() ).append( "</groupId>" );
buffer.append( "<artifactId>" ).append( artifact.getArtifactId() ).append( "</artifactId>" );
buffer.append( "<version>" ).append( artifact.getBaseVersion() ).append( "</version>" );
buffer.append( "<packaging>" ).append( artifact.getType() ).append( "</packaging>" );
buffer.append( "</project>" );
return new StringModelSource( buffer, artifact.getId() );
}
@Override
public List<ProjectBuildingResult> build( List<File> pomFiles, boolean recursive, ProjectBuildingRequest request )
throws ProjectBuildingException
{
List<ProjectBuildingResult> results = new ArrayList<>();
List<InterimResult> interimResults = new ArrayList<>();
ReactorModelPool.Builder poolBuilder = new ReactorModelPool.Builder();
final ReactorModelPool modelPool = poolBuilder.build();
InternalConfig config =
new InternalConfig( request, modelPool, modelBuilder.newTransformerContextBuilder() );
Map<File, MavenProject> projectIndex = new HashMap<>( 256 );
// phase 1: get file Models from the reactor.
boolean noErrors =
build( results, interimResults, projectIndex, pomFiles, new LinkedHashSet<>(), true, recursive,
config, poolBuilder );
ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
try
{
// Phase 2: get effective models from the reactor
noErrors =
build( results, new ArrayList<>(), projectIndex, interimResults, request,
new HashMap<>(), config.session ) && noErrors;
}
finally
{
Thread.currentThread().setContextClassLoader( oldContextClassLoader );
}
if ( Features.buildConsumer().isActive() )
{
request.getRepositorySession().getData().set( TransformerContext.KEY,
config.transformerContextBuilder.build() );
}
if ( !noErrors )
{
throw new ProjectBuildingException( results );
}
return results;
}
@SuppressWarnings( "checkstyle:parameternumber" )
private boolean build( List<ProjectBuildingResult> results, List<InterimResult> interimResults,
Map<File, MavenProject> projectIndex, List<File> pomFiles, Set<File> aggregatorFiles,
boolean root, boolean recursive, InternalConfig config,
ReactorModelPool.Builder poolBuilder )
{
boolean noErrors = true;
for ( File pomFile : pomFiles )
{
aggregatorFiles.add( pomFile );
if ( !build( results, interimResults, projectIndex, pomFile, aggregatorFiles, root, recursive, config,
poolBuilder ) )
{
noErrors = false;
}
aggregatorFiles.remove( pomFile );
}
return noErrors;
}
@SuppressWarnings( "checkstyle:parameternumber" )
private boolean build( List<ProjectBuildingResult> results, List<InterimResult> interimResults,
Map<File, MavenProject> projectIndex, File pomFile, Set<File> aggregatorFiles,
boolean isRoot, boolean recursive, InternalConfig config,
ReactorModelPool.Builder poolBuilder )
{
boolean noErrors = true;
MavenProject project = new MavenProject();
project.setFile( pomFile );
ModelBuildingRequest request = getModelBuildingRequest( config )
.setPomFile( pomFile )
.setTwoPhaseBuilding( true )
.setLocationTracking( true );
DefaultModelBuildingListener listener =
new DefaultModelBuildingListener( project, projectBuildingHelper, config.request );
request.setModelBuildingListener( listener );
ModelBuildingResult result;
try
{
result = modelBuilder.build( request );
}
catch ( ModelBuildingException e )
{
result = e.getResult();
if ( result == null || result.getFileModel() == null )
{
results.add( new DefaultProjectBuildingResult( e.getModelId(), pomFile, e.getProblems() ) );
return false;
}
// validation error, continue project building and delay failing to help IDEs
// result.getProblems().addAll(e.getProblems()) ?
noErrors = false;
}
Model model = result.getFileModel().clone();
poolBuilder.put( model.getPomFile().toPath(), model );
InterimResult interimResult = new InterimResult( pomFile, request, result, listener, isRoot );
interimResults.add( interimResult );
if ( recursive )
{
File basedir = pomFile.getParentFile();
List<File> moduleFiles = new ArrayList<>();
for ( String module : model.getModules() )
{
if ( StringUtils.isEmpty( module ) )
{
continue;
}
module = module.replace( '\\', File.separatorChar ).replace( '/', File.separatorChar );
File moduleFile = new File( basedir, module );
if ( moduleFile.isDirectory() )
{
moduleFile = modelProcessor.locatePom( moduleFile );
}
if ( !moduleFile.isFile() )
{
ModelProblem problem =
new DefaultModelProblem( "Child module " + moduleFile + " of " + pomFile
+ " does not exist", ModelProblem.Severity.ERROR, ModelProblem.Version.BASE, model, -1,
-1, null );
result.getProblems().add( problem );
noErrors = false;
continue;
}
if ( Os.isFamily( Os.FAMILY_WINDOWS ) )
{
// we don't canonicalize on unix to avoid interfering with symlinks
try
{
moduleFile = moduleFile.getCanonicalFile();
}
catch ( IOException e )
{
moduleFile = moduleFile.getAbsoluteFile();
}
}
else
{
moduleFile = new File( moduleFile.toURI().normalize() );
}
if ( aggregatorFiles.contains( moduleFile ) )
{
StringBuilder buffer = new StringBuilder( 256 );
for ( File aggregatorFile : aggregatorFiles )
{
buffer.append( aggregatorFile ).append( " -> " );
}
buffer.append( moduleFile );
ModelProblem problem =
new DefaultModelProblem( "Child module " + moduleFile + " of " + pomFile
+ " forms aggregation cycle " + buffer, ModelProblem.Severity.ERROR,
ModelProblem.Version.BASE, model, -1, -1, null );
result.getProblems().add( problem );
noErrors = false;
continue;
}
moduleFiles.add( moduleFile );
}
interimResult.modules = new ArrayList<>();
if ( !build( results, interimResult.modules, projectIndex, moduleFiles, aggregatorFiles, false,
recursive, config, poolBuilder ) )
{
noErrors = false;
}
}
projectIndex.put( pomFile, project );
return noErrors;
}
static class InterimResult
{
File pomFile;
ModelBuildingRequest request;
ModelBuildingResult result;
DefaultModelBuildingListener listener;
boolean root;
List<InterimResult> modules = Collections.emptyList();
InterimResult( File pomFile, ModelBuildingRequest request, ModelBuildingResult result,
DefaultModelBuildingListener listener, boolean root )
{
this.pomFile = pomFile;
this.request = request;
this.result = result;
this.listener = listener;
this.root = root;
}
}
private boolean build( List<ProjectBuildingResult> results, List<MavenProject> projects,
Map<File, MavenProject> projectIndex, List<InterimResult> interimResults,
ProjectBuildingRequest request, Map<File, Boolean> profilesXmls,
RepositorySystemSession session )
{
boolean noErrors = true;
for ( InterimResult interimResult : interimResults )
{
MavenProject project = interimResult.listener.getProject();
try
{
ModelBuildingResult result = modelBuilder.build( interimResult.request, interimResult.result );
// 2nd pass of initialization: resolve and build parent if necessary
try
{
initProject( project, projectIndex, true, result, profilesXmls, request );
}
catch ( InvalidArtifactRTException iarte )
{
result.getProblems().add( new DefaultModelProblem( null, ModelProblem.Severity.ERROR, null,
result.getEffectiveModel(), -1, -1, iarte ) );
}
List<MavenProject> modules = new ArrayList<>();
noErrors =
build( results, modules, projectIndex, interimResult.modules, request, profilesXmls, session )
&& noErrors;
projects.addAll( modules );
projects.add( project );
project.setExecutionRoot( interimResult.root );
project.setCollectedProjects( modules );
DependencyResolutionResult resolutionResult = null;
if ( request.isResolveDependencies() )
{
resolutionResult = resolveDependencies( project, session );
}
results.add( new DefaultProjectBuildingResult( project, result.getProblems(), resolutionResult ) );
}
catch ( ModelBuildingException e )
{
DefaultProjectBuildingResult result = null;
if ( project == null || interimResult.result.getEffectiveModel() == null )
{
result = new DefaultProjectBuildingResult( e.getModelId(), interimResult.pomFile, e.getProblems() );
}
else
{
project.setModel( interimResult.result.getEffectiveModel() );
result = new DefaultProjectBuildingResult( project, e.getProblems(), null );
}
results.add( result );
noErrors = false;
}
}
return noErrors;
}
@SuppressWarnings( "checkstyle:methodlength" )
private void initProject( MavenProject project, Map<File, MavenProject> projects,
boolean buildParentIfNotExisting, ModelBuildingResult result,
Map<File, Boolean> profilesXmls, ProjectBuildingRequest projectBuildingRequest )
{
Model model = result.getEffectiveModel();
project.setModel( model );
project.setOriginalModel( result.getFileModel() );
initParent( project, projects, buildParentIfNotExisting, result, projectBuildingRequest );
Artifact projectArtifact =
repositorySystem.createArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion(), null,
project.getPackaging() );
project.setArtifact( projectArtifact );
if ( project.getFile() != null && buildParentIfNotExisting ) // only set those on 2nd phase, ignore on 1st pass
{
Build build = project.getBuild();
project.addScriptSourceRoot( build.getScriptSourceDirectory() );
project.addCompileSourceRoot( build.getSourceDirectory() );
project.addTestCompileSourceRoot( build.getTestSourceDirectory() );
}
List<Profile> activeProfiles = new ArrayList<>();
activeProfiles.addAll( result.getActivePomProfiles( result.getModelIds().get( 0 ) ) );
activeProfiles.addAll( result.getActiveExternalProfiles() );
project.setActiveProfiles( activeProfiles );
project.setInjectedProfileIds( "external", getProfileIds( result.getActiveExternalProfiles() ) );
for ( String modelId : result.getModelIds() )
{
project.setInjectedProfileIds( modelId, getProfileIds( result.getActivePomProfiles( modelId ) ) );
}
//
// All the parts that were taken out of MavenProject for Maven 4.0.0
//
project.setProjectBuildingRequest( projectBuildingRequest );
// pluginArtifacts
Set<Artifact> pluginArtifacts = new HashSet<>();
for ( Plugin plugin : project.getBuildPlugins() )
{
Artifact artifact = repositorySystem.createPluginArtifact( plugin );
if ( artifact != null )
{
pluginArtifacts.add( artifact );
}
}
project.setPluginArtifacts( pluginArtifacts );
// reportArtifacts
Set<Artifact> reportArtifacts = new HashSet<>();
for ( ReportPlugin report : project.getReportPlugins() )
{
Plugin pp = new Plugin();
pp.setGroupId( report.getGroupId() );
pp.setArtifactId( report.getArtifactId() );
pp.setVersion( report.getVersion() );
Artifact artifact = repositorySystem.createPluginArtifact( pp );
if ( artifact != null )
{
reportArtifacts.add( artifact );
}
}
project.setReportArtifacts( reportArtifacts );
// extensionArtifacts
Set<Artifact> extensionArtifacts = new HashSet<>();
List<Extension> extensions = project.getBuildExtensions();
if ( extensions != null )
{
for ( Extension ext : extensions )
{
String version;
if ( StringUtils.isEmpty( ext.getVersion() ) )
{
version = "RELEASE";
}
else
{
version = ext.getVersion();
}
Artifact artifact =
repositorySystem.createArtifact( ext.getGroupId(), ext.getArtifactId(), version, null, "jar" );
if ( artifact != null )
{
extensionArtifacts.add( artifact );
}
}
}
project.setExtensionArtifacts( extensionArtifacts );
// managedVersionMap
Map<String, Artifact> map = null;
if ( repositorySystem != null )
{
final DependencyManagement dependencyManagement = project.getDependencyManagement();
if ( ( dependencyManagement != null ) && ( ( dependencyManagement.getDependencies() ) != null )
&& ( dependencyManagement.getDependencies().size() > 0 ) )
{
map = new AbstractMap<String, Artifact>()
{
HashMap<String, Artifact> delegate;
@Override
public Set<Entry<String, Artifact>> entrySet()
{
return Collections.unmodifiableSet( compute().entrySet() );
}
@Override
public Set<String> keySet()
{
return Collections.unmodifiableSet( compute().keySet() );
}
@Override
public Collection<Artifact> values()
{
return Collections.unmodifiableCollection( compute().values() );
}
@Override
public boolean containsValue( Object value )
{
return compute().containsValue( value );
}
@Override
public boolean containsKey( Object key )
{
return compute().containsKey( key );
}
@Override
public Artifact get( Object key )
{
return compute().get( key );
}
HashMap<String, Artifact> compute()
{
if ( delegate == null )
{
delegate = new HashMap<>();
for ( Dependency d : dependencyManagement.getDependencies() )
{
Artifact artifact = repositorySystem.createDependencyArtifact( d );
if ( artifact != null )
{
delegate.put( d.getManagementKey(), artifact );
}
}
}
return delegate;
}
};
}
else
{
map = Collections.emptyMap();
}
}
project.setManagedVersionMap( map );
// release artifact repository
if ( project.getDistributionManagement() != null
&& project.getDistributionManagement().getRepository() != null )
{
try
{
DeploymentRepository r = project.getDistributionManagement().getRepository();
if ( !StringUtils.isEmpty( r.getId() ) && !StringUtils.isEmpty( r.getUrl() ) )
{
ArtifactRepository repo = MavenRepositorySystem.buildArtifactRepository( r );
repositorySystem.injectProxy( projectBuildingRequest.getRepositorySession(),
Arrays.asList( repo ) );
repositorySystem.injectAuthentication( projectBuildingRequest.getRepositorySession(),
Arrays.asList( repo ) );
project.setReleaseArtifactRepository( repo );
}
}
catch ( InvalidRepositoryException e )
{
throw new IllegalStateException( "Failed to create release distribution repository for "
+ project.getId(), e );
}
}
// snapshot artifact repository
if ( project.getDistributionManagement() != null
&& project.getDistributionManagement().getSnapshotRepository() != null )
{
try
{
DeploymentRepository r = project.getDistributionManagement().getSnapshotRepository();
if ( !StringUtils.isEmpty( r.getId() ) && !StringUtils.isEmpty( r.getUrl() ) )
{
ArtifactRepository repo = MavenRepositorySystem.buildArtifactRepository( r );
repositorySystem.injectProxy( projectBuildingRequest.getRepositorySession(),
Arrays.asList( repo ) );
repositorySystem.injectAuthentication( projectBuildingRequest.getRepositorySession(),
Arrays.asList( repo ) );
project.setSnapshotArtifactRepository( repo );
}
}
catch ( InvalidRepositoryException e )
{
throw new IllegalStateException( "Failed to create snapshot distribution repository for "
+ project.getId(), e );
}
}
}
private void initParent( MavenProject project, Map<File, MavenProject> projects, boolean buildParentIfNotExisting,
ModelBuildingResult result, ProjectBuildingRequest projectBuildingRequest )
{
Model parentModel = result.getModelIds().size() > 1 && !result.getModelIds().get( 1 ).isEmpty()
? result.getRawModel( result.getModelIds().get( 1 ) )
: null;
if ( parentModel != null )
{
final String parentGroupId = inheritedGroupId( result, 1 );
final String parentVersion = inheritedVersion( result, 1 );
project.setParentArtifact( repositorySystem.createProjectArtifact( parentGroupId,
parentModel.getArtifactId(),
parentVersion ) );
// org.apache.maven.its.mng4834:parent:0.1
String parentModelId = result.getModelIds().get( 1 );
File parentPomFile = result.getRawModel( parentModelId ).getPomFile();
MavenProject parent = projects.get( parentPomFile );
if ( parent == null && buildParentIfNotExisting )
{
//
// At this point the DefaultModelBuildingListener has fired and it populates the
// remote repositories with those found in the pom.xml, along with the existing externally
// defined repositories.
//
projectBuildingRequest.setRemoteRepositories( project.getRemoteArtifactRepositories() );
if ( parentPomFile != null )
{
project.setParentFile( parentPomFile );
try
{
parent = build( parentPomFile, projectBuildingRequest ).getProject();
}
catch ( ProjectBuildingException e )
{
// MNG-4488 where let invalid parents slide on by
if ( logger.isDebugEnabled() )
{
// Message below is checked for in the MNG-2199 core IT.
logger.warn( "Failed to build parent project for " + project.getId(), e );
}
else
{
// Message below is checked for in the MNG-2199 core IT.
logger.warn( "Failed to build parent project for " + project.getId() );
}
}
}
else
{
Artifact parentArtifact = project.getParentArtifact();
try
{
parent = build( parentArtifact, projectBuildingRequest ).getProject();
}
catch ( ProjectBuildingException e )
{
// MNG-4488 where let invalid parents slide on by
if ( logger.isDebugEnabled() )
{
// Message below is checked for in the MNG-2199 core IT.
logger.warn( "Failed to build parent project for " + project.getId(), e );
}
else
{
// Message below is checked for in the MNG-2199 core IT.
logger.warn( "Failed to build parent project for " + project.getId() );
}
}
}
}
project.setParent( parent );
if ( project.getParentFile() == null && parent != null )
{
project.setParentFile( parent.getFile() );
}
}
}
private static String inheritedGroupId( final ModelBuildingResult result, final int modelIndex )
{
String groupId = null;
final String modelId = result.getModelIds().get( modelIndex );
if ( !modelId.isEmpty() )
{
final Model model = result.getRawModel( modelId );
groupId = model.getGroupId() != null
? model.getGroupId()
: inheritedGroupId( result, modelIndex + 1 );
}
return groupId;
}
private static String inheritedVersion( final ModelBuildingResult result, final int modelIndex )
{
String version = null;
final String modelId = result.getModelIds().get( modelIndex );
if ( !modelId.isEmpty() )
{
final Model model = result.getRawModel( modelId );
version = model.getVersion() != null
? model.getVersion()
: inheritedVersion( result, modelIndex + 1 );
}
return version;
}
/**
* InternalConfig
*/
class InternalConfig
{
private final ProjectBuildingRequest request;
private final RepositorySystemSession session;
private final List<RemoteRepository> repositories;
private final ReactorModelPool modelPool;
private final TransformerContextBuilder transformerContextBuilder;
InternalConfig( ProjectBuildingRequest request, ReactorModelPool modelPool,
TransformerContextBuilder transformerContextBuilder )
{
this.request = request;
this.modelPool = modelPool;
this.transformerContextBuilder = transformerContextBuilder;
session =
LegacyLocalRepositoryManager.overlay( request.getLocalRepository(), request.getRepositorySession(),
repoSystem );
repositories = RepositoryUtils.toRepos( request.getRemoteRepositories() );
}
}
}