diff --git a/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java b/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java index 95b25a17ce..fbe38ab2e9 100644 --- a/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java +++ b/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDependencyProcessor.java @@ -119,7 +119,7 @@ public List getDependencies( ArtifactMetadata bmd, MetadataRea } iModels.get(0).setMostSpecialized(true); - return new MavenDomainModel(ProcessorContext.build(iModels, null)).getDependencyMetadata(); + return new MavenDomainModel( ProcessorContext.processManagementNodes(ProcessorContext.build(iModels, null).getModel() ) ).getDependencyMetadata(); } catch (IOException e) { throw new DependencyProcessorException(e); } diff --git a/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java b/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java index 229875e3c1..10fbf4e54d 100644 --- a/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java +++ b/maven-mercury/src/main/java/org/apache/maven/mercury/MavenDomainModel.java @@ -27,6 +27,7 @@ import org.apache.maven.mercury.artifact.ArtifactMetadata; import org.apache.maven.model.Dependency; import org.apache.maven.model.Exclusion; +import org.apache.maven.model.Model; import org.apache.maven.model.Parent; import org.apache.maven.model.PomClassicDomainModel; @@ -54,6 +55,12 @@ public MavenDomainModel(PomClassicDomainModel model) super(model.getModel()); } + public MavenDomainModel(Model model) + throws IOException + { + super(model); + } + public boolean hasParent() { return getParentMetadata() != null; diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/ProcessorContext.java b/maven-model-builder/src/main/java/org/apache/maven/model/ProcessorContext.java index 021e2280af..539a7fa8fe 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/ProcessorContext.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/ProcessorContext.java @@ -251,6 +251,14 @@ else if ( i < length - 2 ) } } } + + return target; + + } + + public static Model processManagementNodes(Model target) + throws IOException + { // Dependency Management DependencyManagementProcessor depProc = new DependencyManagementProcessor(); @@ -261,16 +269,14 @@ else if ( i < length - 2 ) } // Plugin Management - PluginsManagementProcessor procMng = new PluginsManagementProcessor(); if ( target.getBuild() != null && target.getBuild().getPluginManagement() != null) { procMng.process( null, new ArrayList( target.getBuild().getPluginManagement().getPlugins() ), target.getBuild().getPlugins(), true ); } - - return target; - + + return target; } public static Profile copyOfProfile(Profile profile) diff --git a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java index 0da18f7b0a..f8866f2d68 100644 --- a/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java +++ b/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java @@ -160,14 +160,22 @@ public MavenProject build( File pomFile, ProjectBuilderConfiguration configurati } domainModel = ProcessorContext.mergeProfilesIntoModel( externalProfiles, domainModel ); + } catch ( IOException e ) { throw new ProjectBuildingException("", ""); } - //Interpolation - MavenProject project = interpolateDomainModel( domainModel, configuration, pomFile ); + //Interpolation & Management + MavenProject project; + try { + Model model = ProcessorContext.processManagementNodes(interpolateDomainModel( domainModel, configuration, pomFile )); + project = this.fromDomainModelToMavenProject(model, domainModel.getParentFile(), configuration, pomFile); + } catch (IOException e) { + throw new ProjectBuildingException("", ""); + } + project.setActiveProfiles( projectProfiles ); Build build = project.getBuild(); @@ -269,7 +277,14 @@ public MavenProject buildFromRepository(Artifact artifact, ProjectBuilderConfigu { throw new ProjectBuildingException("", ""); } - project = interpolateDomainModel( domainModel, configuration, artifact.getFile() ); + + try { + Model model = ProcessorContext.processManagementNodes(interpolateDomainModel( domainModel, configuration, artifact.getFile() )); + project = this.fromDomainModelToMavenProject(model, domainModel.getParentFile(), configuration, artifact.getFile()); + } catch (IOException e) { + throw new ProjectBuildingException("", ""); + } + project.setActiveProfiles( projectProfiles ); artifact.setFile( artifact.getFile() ); project.setVersion( artifact.getVersion() ); @@ -368,7 +383,7 @@ public MavenProjectBuildingResult buildProjectWithDependencies( File pomFile, Pr return new MavenProjectBuildingResult( project, result ); } - private MavenProject interpolateDomainModel( PomClassicDomainModel domainModel, ProjectBuilderConfiguration config, File projectDescriptor ) + private Model interpolateDomainModel( PomClassicDomainModel domainModel, ProjectBuilderConfiguration config, File projectDescriptor ) throws ProjectBuildingException { Model model; @@ -403,9 +418,15 @@ private MavenProject interpolateDomainModel( PomClassicDomainModel domainModel, throw new ProjectBuildingException(projectId, "", projectDescriptor, e); } + return model; + } + + private MavenProject fromDomainModelToMavenProject(Model model, File parentFile, ProjectBuilderConfiguration config, File projectDescriptor) + throws InvalidProjectModelException, IOException + { MavenProject project; - + String projectId = safeVersionlessKey( model.getGroupId(), model.getArtifactId() ); try { project = new MavenProject( model, repositorySystem, this, config ); @@ -415,7 +436,7 @@ private MavenProject interpolateDomainModel( PomClassicDomainModel domainModel, Artifact projectArtifact = repositorySystem.createArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion(), null, project.getPackaging() ); project.setArtifact( projectArtifact ); - project.setParentFile( domainModel.getParentFile() ); + project.setParentFile( parentFile ); } catch ( InvalidRepositoryException e ) @@ -423,7 +444,7 @@ private MavenProject interpolateDomainModel( PomClassicDomainModel domainModel, throw new InvalidProjectModelException( projectId, e.getMessage(), projectDescriptor, e ); } - return project; + return project; } private PomClassicDomainModel build( String projectId, File pomFile, ProjectBuilderConfiguration projectBuilderConfiguration ) diff --git a/maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java b/maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java index 02794739ed..d6e92c621a 100644 --- a/maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java +++ b/maven-project/src/test/java/org/apache/maven/project/PomConstructionTest.java @@ -1419,13 +1419,23 @@ public void testDependencyScopeInheritance() assertNull("Scope not null: " + scope, scope); System.out.println(pom.getDomainModel().asString()); - } + } + public void testDependencyScope() throws Exception { PomTestWrapper pom = buildPom( "dependency-scope/sub" ); - System.out.println(pom.getDomainModel().asString()); - } + // System.out.println(pom.getDomainModel().asString()); + } + + //This will fail on a validation error if incorrect + public void testDependencyManagementWithInterpolation() + throws Exception + { + PomTestWrapper pom = buildPom( "dependency-management-with-interpolation/sub" ); + } + + private void assertPathSuffixEquals( String expected, Object actual ) { String a = actual.toString(); diff --git a/maven-project/src/test/resources-project-builder/dependency-management-with-interpolation/pom.xml b/maven-project/src/test/resources-project-builder/dependency-management-with-interpolation/pom.xml new file mode 100644 index 0000000000..49ffab5a50 --- /dev/null +++ b/maven-project/src/test/resources-project-builder/dependency-management-with-interpolation/pom.xml @@ -0,0 +1,19 @@ + + 4.0.0 + + asm-parent + asm + 3.0 + pom + + + + + asm-util + ${project.groupId} + ${project.version} + + + + + diff --git a/maven-project/src/test/resources-project-builder/dependency-management-with-interpolation/sub/pom.xml b/maven-project/src/test/resources-project-builder/dependency-management-with-interpolation/sub/pom.xml new file mode 100644 index 0000000000..2423568ef8 --- /dev/null +++ b/maven-project/src/test/resources-project-builder/dependency-management-with-interpolation/sub/pom.xml @@ -0,0 +1,17 @@ + + + asm-parent + asm + 3.0 + + 4.0.0 + + asm-xml + 3.0 + + + asm + asm-util + + + \ No newline at end of file