Repository: maven Updated Branches: refs/heads/master 8c3a2b717 -> 24e792188
[MNG-5971] Imported dependencies should be available to inheritance processing o Updated to account for MNG-4052. Project: http://git-wip-us.apache.org/repos/asf/maven/repo Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/24e79218 Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/24e79218 Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/24e79218 Branch: refs/heads/master Commit: 24e792188260ffd41278555c9452c2a91e2acb3d Parents: 8c3a2b7 Author: Christian Schulte <schu...@apache.org> Authored: Mon Feb 22 03:00:08 2016 +0100 Committer: Christian Schulte <schu...@apache.org> Committed: Mon Feb 22 03:17:28 2016 +0100 ---------------------------------------------------------------------- .../model/building/DefaultModelBuilder.java | 81 +++++++++++++------- .../building/DefaultModelBuildingResult.java | 26 ++++++- .../model/building/ModelBuildingResult.java | 12 +++ 3 files changed, 90 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven/blob/24e79218/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java index 072be72..5265755 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java @@ -335,13 +335,13 @@ public class DefaultModelBuilder } else if ( currentData == resultData ) { // First iteration - add initial id after version resolution. - currentData.setGroupId( currentData.getRawModel().getGroupId() == null ? parentData.getGroupId() - : currentData.getRawModel() - .getGroupId() ); + currentData.setGroupId( currentData.getRawModel().getGroupId() == null + ? parentData.getGroupId() + : currentData.getRawModel().getGroupId() ); - currentData.setVersion( currentData.getRawModel().getVersion() == null ? parentData.getVersion() - : currentData.getRawModel() - .getVersion() ); + currentData.setVersion( currentData.getRawModel().getVersion() == null + ? parentData.getVersion() + : currentData.getRawModel().getVersion() ); currentData.setArtifactId( currentData.getRawModel().getArtifactId() ); parentIds.add( currentData.getId() ); @@ -374,27 +374,41 @@ public class DefaultModelBuilder problems.setSource( inputModel ); checkPluginVersions( lineage, request, problems ); + // [MNG-4052] import scope dependencies prefer to download pom rather than find it in the current project // [MNG-5971] Imported dependencies should be available to inheritance processing - processImports( lineage, request, problems ); + // + // This first phase of model building is used for building models holding just enough information to map + // groupId:artifactId:version to pom files and to provide modules to build. For this, inheritance and + // interpolation needs to be performed. A temporary model is built in phase 1 applying inheritance and + // interpolation to fill in those values but is not returned. The rest of the model building takes place in + // phase 2. + final List<ModelData> intermediateLineage = new ArrayList<>( lineage.size() ); + for ( final ModelData modelData : lineage ) + { + final ModelData intermediateModel = new ModelData( modelData.getSource(), modelData.getModel().clone() ); + intermediateModel.setRawModel( modelData.getRawModel().clone() ); + intermediateModel.setActiveProfiles( modelData.getActiveProfiles() ); + intermediateModel.setArtifactId( modelData.getArtifactId() ); + intermediateModel.setGroupId( modelData.getGroupId() ); + intermediateModel.setVersion( modelData.getVersion() ); + intermediateLineage.add( intermediateModel ); + } // inheritance assembly - assembleInheritance( lineage, request, problems ); + assembleInheritance( intermediateLineage, request, problems ); + + Model intermediateModel = intermediateLineage.get( 0 ).getModel(); + intermediateModel = interpolateModel( intermediateModel, request, problems ); Model resultModel = resultData.getModel(); + resultModel.setGroupId( intermediateModel.getGroupId() ); + resultModel.setArtifactId( intermediateModel.getArtifactId() ); + resultModel.setVersion( intermediateModel.getVersion() ); + problems.setSource( resultModel ); problems.setRootModel( resultModel ); - // model interpolation - resultModel = interpolateModel( resultModel, request, problems ); - resultData.setModel( resultModel ); - - // url normalization - modelUrlNormalizer.normalize( resultModel, request ); - - // Now the fully interpolated model is available: reconfigure the resolver - configureResolver( request.getModelResolver(), resultModel, problems, true ); - resultData.setGroupId( resultModel.getGroupId() ); resultData.setArtifactId( resultModel.getArtifactId() ); resultData.setVersion( resultModel.getVersion() ); @@ -408,6 +422,7 @@ public class DefaultModelBuilder result.addModelId( modelId ); result.setActivePomProfiles( modelId, currentData.getActiveProfiles() ); result.setRawModel( modelId, currentData.getRawModel() ); + result.setEffectiveModel( modelId, currentData.getModel() ); } if ( !request.isTwoPhaseBuilding() ) @@ -422,13 +437,6 @@ public class DefaultModelBuilder public ModelBuildingResult build( ModelBuildingRequest request, ModelBuildingResult result ) throws ModelBuildingException { - return build( request, result, new LinkedHashSet<String>(), new LinkedHashSet<String>() ); - } - - private ModelBuildingResult build( ModelBuildingRequest request, ModelBuildingResult result, - Collection<String> managementImports, Collection<String> dependencyImports ) - throws ModelBuildingException - { // phase 2 Model resultModel = result.getEffectiveModel(); @@ -436,6 +444,27 @@ public class DefaultModelBuilder problems.setSource( resultModel ); problems.setRootModel( resultModel ); + final List<ModelData> lineage = new ArrayList<>( result.getModelIds().size() ); + + for ( final String modelId : result.getModelIds() ) + { + lineage.add( new ModelData( null, result.getEffectiveModel( modelId ) ) ); + } + + // [MNG-5971] Imported dependencies should be available to inheritance processing + processImports( lineage, request, problems ); + + // inheritance assembly + assembleInheritance( lineage, request, problems ); + + resultModel = interpolateModel( resultModel, request, problems ); + + // url normalization + modelUrlNormalizer.normalize( resultModel, request ); + + // Now the fully interpolated model is available: reconfigure the resolver + configureResolver( request.getModelResolver(), resultModel, problems, true ); + // model path translation modelPathTranslator.alignToBaseDirectory( resultModel, resultModel.getProjectDirectory(), request ); @@ -718,7 +747,7 @@ public class DefaultModelBuilder { // [MNG-5971] Imported dependencies should be available to inheritance processing - // Creates an intermediate model with property and repository inheritance. + // Creates an intermediate model with only property and repository inheritance. final List<Model> intermediateLineage = new ArrayList<>( lineage.size() ); for ( int i = 0, s0 = lineage.size(); i < s0; i++ ) http://git-wip-us.apache.org/repos/asf/maven/blob/24e79218/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java index 7bf45b5..fe1c7ae 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java @@ -39,11 +39,13 @@ class DefaultModelBuildingResult private Model effectiveModel; - private List<String> modelIds; + private final List<String> modelIds; - private Map<String, Model> rawModels; + private final Map<String, Model> rawModels; - private Map<String, List<Profile>> activePomProfiles; + private final Map<String, Model> effectiveModels; + + private final Map<String, List<Profile>> activePomProfiles; private List<Profile> activeExternalProfiles; @@ -56,6 +58,7 @@ class DefaultModelBuildingResult activePomProfiles = new HashMap<>(); activeExternalProfiles = new ArrayList<>(); problems = new ArrayList<>(); + effectiveModels = new HashMap<>(); } @Override @@ -110,6 +113,23 @@ class DefaultModelBuildingResult } @Override + public Model getEffectiveModel( final String modelId ) + { + return this.effectiveModels.get( modelId ); + } + + public DefaultModelBuildingResult setEffectiveModel( final String modelId, final Model model ) + { + // Intentionally notNull because Super POM may not contain a modelId + Validate.notNull( modelId, "modelId must not be null" ); + Validate.notNull( model, "model must not be null" ); + + this.effectiveModels.put( modelId, model ); + + return this; + } + + @Override public List<Profile> getActivePomProfiles( String modelId ) { return activePomProfiles.get( modelId ); http://git-wip-us.apache.org/repos/asf/maven/blob/24e79218/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java index 44b1295..f86b6ec 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java @@ -69,6 +69,18 @@ public interface ModelBuildingResult Model getRawModel( String modelId ); /** + * Gets the effective model for a given identifier. The model identifier should be from the collection obtained by + * {@link #getModelIds()}. As a special case, an empty string can be used as the identifier for the super POM. + * + * @param modelId The identifier of the desired effective model, must not be {@code null}. + * + * @return The effective model or {@code null} if the specified model id does not refer to a known model. + * + * @since 3.4 + */ + Model getEffectiveModel( String modelId ); + + /** * Gets the profiles from the specified model that were active during model building. The model identifier should be * from the collection obtained by {@link #getModelIds()}. As a special case, an empty string can be used as the * identifier for the super POM.