Skip to content

Commit

Permalink
[MNG-6957] Versionless reactor dependencies/parent should work even i…
Browse files Browse the repository at this point in the history
…f modules are aggregated in reverse order

This closes #391
  • Loading branch information
rfscholte authored and michael-o committed Dec 22, 2020
1 parent 2ef0e5b commit 37afe81
Show file tree
Hide file tree
Showing 30 changed files with 934 additions and 592 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@
class ConsumerModelSourceTransformer extends AbstractModelSourceTransformer
{
@Override
protected AbstractSAXFilter getSAXFilter( Path pomFile,
protected AbstractSAXFilter getSAXFilter( Path pomFile,
TransformerContext context,
Consumer<LexicalHandler> lexicalHandlerConsumer )
throws TransformerConfigurationException, SAXException, ParserConfigurationException
{
return new DefaultConsumerPomXMLFilterFactory( new DefaultBuildPomXMLFilterFactory( context,
lexicalHandlerConsumer ) ).get( pomFile );
lexicalHandlerConsumer, true ) ).get( pomFile );
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -33,6 +32,7 @@
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;
Expand All @@ -56,6 +56,7 @@
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;
Expand Down Expand Up @@ -129,7 +130,7 @@ public ProjectBuildingResult build( File pomFile, ProjectBuildingRequest request
throws ProjectBuildingException
{
return build( pomFile, new FileModelSource( pomFile ),
new InternalConfig( request, null, useGlobalModelCache() ? getModelCache() : null ) );
new InternalConfig( request, null, useGlobalModelCache() ? getModelCache() : null, null ) );
}

private boolean useGlobalModelCache()
Expand All @@ -142,7 +143,7 @@ public ProjectBuildingResult build( ModelSource modelSource, ProjectBuildingRequ
throws ProjectBuildingException
{
return build( null, modelSource,
new InternalConfig( request, null, useGlobalModelCache() ? getModelCache() : null ) );
new InternalConfig( request, null, useGlobalModelCache() ? getModelCache() : null, null ) );
}

private ProjectBuildingResult build( File pomFile, ModelSource modelSource, InternalConfig config )
Expand Down Expand Up @@ -263,14 +264,7 @@ private DependencyResolutionResult resolveDependencies( MavenProject project, Re

private List<String> getProfileIds( List<Profile> profiles )
{
List<String> ids = new ArrayList<>( profiles.size() );

for ( Profile profile : profiles )
{
ids.add( profile.getId() );
}

return ids;
return profiles.stream().map( Profile::getId ).collect( Collectors.toList() );
}

private ModelBuildingRequest getModelBuildingRequest( InternalConfig config )
Expand All @@ -295,7 +289,7 @@ private ModelBuildingRequest getModelBuildingRequest( InternalConfig config )
request.setBuildStartTime( configuration.getBuildStartTime() );
request.setModelResolver( resolver );
request.setModelCache( config.modelCache );
request.setTransformerContext( (TransformerContext) config.session.getData().get( TransformerContext.KEY ) );
request.setTransformerContextBuilder( config.transformerContextBuilder );

return request;
}
Expand All @@ -314,7 +308,8 @@ public ProjectBuildingResult build( Artifact artifact, boolean allowStubModel, P
org.eclipse.aether.artifact.Artifact pomArtifact = RepositoryUtils.toArtifact( artifact );
pomArtifact = ArtifactDescriptorUtils.toPomArtifact( pomArtifact );

InternalConfig config = new InternalConfig( request, null, useGlobalModelCache() ? getModelCache() : null );
InternalConfig config =
new InternalConfig( request, null, useGlobalModelCache() ? getModelCache() : null, null );

boolean localProject;

Expand Down Expand Up @@ -385,37 +380,14 @@ public List<ProjectBuildingResult> build( List<File> pomFiles, boolean recursive

ReactorModelPool.Builder poolBuilder = new ReactorModelPool.Builder();
final ReactorModelPool modelPool = poolBuilder.build();

if ( Features.buildConsumer().isActive() )
{
final TransformerContext context = new TransformerContext()
{
@Override
public String getUserProperty( String key )
{
return request.getUserProperties().getProperty( key );
}

@Override
public Model getRawModel( Path p )
{
return modelPool.get( p );
}

@Override
public Model getRawModel( String groupId, String artifactId )
{
return modelPool.get( groupId, artifactId, null );
}
};
request.getRepositorySession().getData().set( TransformerContext.KEY, context );
}

InternalConfig config = new InternalConfig( request, modelPool,
useGlobalModelCache() ? getModelCache() : new ReactorModelCache() );
InternalConfig config =
new InternalConfig( request, modelPool, useGlobalModelCache() ? getModelCache() : new ReactorModelCache(),
modelBuilder.newTransformerContextBuilder() );

Map<String, MavenProject> projectIndex = new HashMap<>( 256 );
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 );
Expand All @@ -424,6 +396,7 @@ public Model getRawModel( String groupId, String artifactId )

try
{
// Phase 2: get effective models from the reactor
noErrors =
build( results, new ArrayList<>(), projectIndex, interimResults, request,
new HashMap<>(), config.session ) && noErrors;
Expand All @@ -433,6 +406,12 @@ public Model getRawModel( String groupId, String artifactId )
Thread.currentThread().setContextClassLoader( oldContextClassLoader );
}

if ( Features.buildConsumer().isActive() )
{
request.getRepositorySession().getData().set( TransformerContext.KEY,
config.transformerContextBuilder.build() );
}

if ( !noErrors )
{
throw new ProjectBuildingException( results );
Expand All @@ -443,7 +422,7 @@ public Model getRawModel( String groupId, String artifactId )

@SuppressWarnings( "checkstyle:parameternumber" )
private boolean build( List<ProjectBuildingResult> results, List<InterimResult> interimResults,
Map<String, MavenProject> projectIndex, List<File> pomFiles, Set<File> aggregatorFiles,
Map<File, MavenProject> projectIndex, List<File> pomFiles, Set<File> aggregatorFiles,
boolean root, boolean recursive, InternalConfig config,
ReactorModelPool.Builder poolBuilder )
{
Expand All @@ -467,20 +446,19 @@ private boolean build( List<ProjectBuildingResult> results, List<InterimResult>

@SuppressWarnings( "checkstyle:parameternumber" )
private boolean build( List<ProjectBuildingResult> results, List<InterimResult> interimResults,
Map<String, MavenProject> projectIndex, File pomFile, Set<File> aggregatorFiles,
Map<File, MavenProject> projectIndex, File pomFile, Set<File> aggregatorFiles,
boolean isRoot, boolean recursive, InternalConfig config,
ReactorModelPool.Builder poolBuilder )
{
boolean noErrors = true;

ModelBuildingRequest request = getModelBuildingRequest( config );

MavenProject project = new MavenProject();
project.setFile( pomFile );

request.setPomFile( pomFile );
request.setTwoPhaseBuilding( true );
request.setLocationTracking( true );
ModelBuildingRequest request = getModelBuildingRequest( config )
.setPomFile( pomFile )
.setTwoPhaseBuilding( true )
.setLocationTracking( true );

DefaultModelBuildingListener listener =
new DefaultModelBuildingListener( project, projectBuildingHelper, config.request );
Expand All @@ -494,7 +472,7 @@ private boolean build( List<ProjectBuildingResult> results, List<InterimResult>
catch ( ModelBuildingException e )
{
result = e.getResult();
if ( result == null || result.getEffectiveModel() == null )
if ( result == null || result.getFileModel() == null )
{
results.add( new DefaultProjectBuildingResult( e.getModelId(), pomFile, e.getProblems() ) );

Expand All @@ -505,32 +483,17 @@ private boolean build( List<ProjectBuildingResult> results, List<InterimResult>
noErrors = false;
}

Model model = result.getEffectiveModel();

poolBuilder.put( model.getPomFile().toPath(), result.getRawModel() );

try
{
// first pass: build without building parent.
initProject( project, projectIndex, false, result, new HashMap<>( 0 ), config.request );
}
catch ( InvalidArtifactRTException iarte )
{
result.getProblems().add( new DefaultModelProblem( null, ModelProblem.Severity.ERROR, null, model, -1, -1,
iarte ) );
}
Model model = result.getFileModel().clone();

projectIndex.put( result.getModelIds().get( 0 ), project );
poolBuilder.put( model.getPomFile().toPath(), model );

InterimResult interimResult = new InterimResult( pomFile, request, result, listener, isRoot );
interimResults.add( interimResult );

if ( recursive && !model.getModules().isEmpty() )
if ( recursive )
{
File basedir = pomFile.getParentFile();

List<File> moduleFiles = new ArrayList<>();

for ( String module : model.getModules() )
{
if ( StringUtils.isEmpty( module ) )
Expand Down Expand Up @@ -609,6 +572,8 @@ private boolean build( List<ProjectBuildingResult> results, List<InterimResult>
}
}

projectIndex.put( pomFile, project );

return noErrors;
}

Expand Down Expand Up @@ -640,7 +605,7 @@ static class InterimResult
}

private boolean build( List<ProjectBuildingResult> results, List<MavenProject> projects,
Map<String, MavenProject> projectIndex, List<InterimResult> interimResults,
Map<File, MavenProject> projectIndex, List<InterimResult> interimResults,
ProjectBuildingRequest request, Map<File, Boolean> profilesXmls,
RepositorySystemSession session )
{
Expand Down Expand Up @@ -685,12 +650,14 @@ private boolean build( List<ProjectBuildingResult> results, List<MavenProject> p
catch ( ModelBuildingException e )
{
DefaultProjectBuildingResult result = null;
if ( project == 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 );
Expand All @@ -703,15 +670,14 @@ private boolean build( List<ProjectBuildingResult> results, List<MavenProject> p
}

@SuppressWarnings( "checkstyle:methodlength" )
private void initProject( MavenProject project, Map<String, MavenProject> projects,
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.getRawModel() );
project.setFile( model.getPomFile() );
project.setOriginalModel( result.getFileModel() );

initParent( project, projects, buildParentIfNotExisting, result, projectBuildingRequest );

Expand Down Expand Up @@ -938,7 +904,7 @@ HashMap<String, Artifact> compute()
}
}

private void initParent( MavenProject project, Map<String, MavenProject> projects, boolean buildParentIfNotExisting,
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()
Expand All @@ -957,7 +923,7 @@ private void initParent( MavenProject project, Map<String, MavenProject> project
// org.apache.maven.its.mng4834:parent:0.1
String parentModelId = result.getModelIds().get( 1 );
File parentPomFile = result.getRawModel( parentModelId ).getPomFile();
MavenProject parent = projects.get( parentModelId );
MavenProject parent = projects.get( parentPomFile );
if ( parent == null && buildParentIfNotExisting )
{
//
Expand Down Expand Up @@ -1096,15 +1062,21 @@ class InternalConfig

private final ReactorModelCache modelCache;

InternalConfig( ProjectBuildingRequest request, ReactorModelPool modelPool, ReactorModelCache modelCache )
private final TransformerContextBuilder transformerContextBuilder;

InternalConfig( ProjectBuildingRequest request, ReactorModelPool modelPool, ReactorModelCache modelCache,
TransformerContextBuilder transformerContextBuilder )
{
this.request = request;
this.modelPool = modelPool;
this.modelCache = modelCache;
this.transformerContextBuilder = transformerContextBuilder;

session =
LegacyLocalRepositoryManager.overlay( request.getLocalRepository(), request.getRepositorySession(),
repoSystem );
repositories = RepositoryUtils.toRepos( request.getRemoteRepositories() );

}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,7 @@ private static final class GavCacheKey
this.artifactId = ( artifactId != null ) ? artifactId : "";
this.version = ( version != null ) ? version : "";
this.tag = ( tag != null ) ? tag : "";

int hash = 17;
hash = hash * 31 + this.groupId.hashCode();
hash = hash * 31 + this.artifactId.hashCode();
hash = hash * 31 + this.version.hashCode();
hash = hash * 31 + this.tag.hashCode();
hashCode = hash;
this.hashCode = Objects.hash( groupId, artifactId, version, tag );
}

@Override
Expand All @@ -113,7 +107,6 @@ public int hashCode()
{
return hashCode;
}

}

private static final class SourceCacheKey
Expand Down
Loading

0 comments on commit 37afe81

Please sign in to comment.