From 5d9eb9cf2f1dacd38c2956eb05958018524288ea Mon Sep 17 00:00:00 2001 From: Giovanni van der Schelde Date: Fri, 21 Feb 2025 14:57:51 +0100 Subject: [PATCH 1/2] [MNG-8588] Add activated profiles to Project interface --- .../java/org/apache/maven/api/Project.java | 14 ++++++ .../maven/internal/impl/DefaultProject.java | 6 +++ .../DefaultMavenProjectBuilderTest.java | 31 +++++++++++++ .../projects/pom-with-profiles/pom.xml | 46 +++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 impl/maven-core/src/test/resources/projects/pom-with-profiles/pom.xml diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/Project.java b/api/maven-api-core/src/main/java/org/apache/maven/api/Project.java index 27cf17908cae..0e608b0ded33 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/Project.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/Project.java @@ -20,6 +20,7 @@ import java.nio.file.Path; import java.util.List; +import java.util.Map; import java.util.Optional; import org.apache.maven.api.annotations.Experimental; @@ -237,4 +238,17 @@ default String getId() { */ @Nonnull Optional getParent(); + + /** + * Gets the identifiers of all profiles that contributed to this project's effective model. This includes active + * profiles from the project's POM and all its parent POMs as well as from external sources like the + * {@code settings.xml}. The profile identifiers are grouped by the identifier of their source, e.g. + * {@code ::} for a POM profile or {@code external} for profiles from the + * {@code settings.xml}. + * + * @return The identifiers of all activated profiles, indexed by the source from which the profiles originated, never + * {@code null}. + */ + @Nonnull + Map> getActivatedProfileIdsBySource(); } diff --git a/impl/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProject.java b/impl/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProject.java index 6b7903b6d6ca..277b04701d6e 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProject.java +++ b/impl/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProject.java @@ -23,6 +23,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Optional; import org.apache.maven.RepositoryUtils; @@ -165,6 +166,11 @@ public Optional getParent() { return Optional.ofNullable(session.getProject(parent)); } + @Override + public Map> getActivatedProfileIdsBySource() { + return project.getInjectedProfileIds(); + } + @Nonnull private DependencyCoordinates toDependency(org.apache.maven.api.model.Dependency dependency) { return new DependencyCoordinates() { diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java index 60994b8213f4..09f3f085e9a0 100644 --- a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java +++ b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java @@ -345,6 +345,37 @@ void rereadPom_mng7063() throws Exception { assertThat(project.getName(), is("PROJECT NAME")); } + @Test + void testActivatedProfileIsResolved() throws Exception { + File testPom = getTestFile("src/test/resources/projects/pom-with-profiles/pom.xml"); + + ProjectBuildingRequest request = newBuildingRequest(); + request.setLocalRepository(getLocalRepository()); + request.setActiveProfileIds(List.of("profile1")); + + MavenProject project = projectBuilder.build(testPom, request).getProject(); + + assertEquals(1, project.getActiveProfiles().size()); + assertTrue(project.getActiveProfiles().stream().anyMatch(p -> "profile1".equals(p.getId()))); + assertTrue(project.getActiveProfiles().stream().noneMatch(p -> "profile2".equals(p.getId()))); + assertTrue(project.getActiveProfiles().stream().noneMatch(p -> "active-by-default".equals(p.getId()))); + } + + @Test + void testActivatedProfileByDefaultIsResolved() throws Exception { + File testPom = getTestFile("src/test/resources/projects/pom-with-profiles/pom.xml"); + + ProjectBuildingRequest request = newBuildingRequest(); + request.setLocalRepository(getLocalRepository()); + + MavenProject project = projectBuilder.build(testPom, request).getProject(); + + assertEquals(1, project.getActiveProfiles().size()); + assertTrue(project.getActiveProfiles().stream().noneMatch(p -> "profile1".equals(p.getId()))); + assertTrue(project.getActiveProfiles().stream().noneMatch(p -> "profile2".equals(p.getId()))); + assertTrue(project.getActiveProfiles().stream().anyMatch(p -> "active-by-default".equals(p.getId()))); + } + /** * Tests whether external version range parent references are build correctly. * diff --git a/impl/maven-core/src/test/resources/projects/pom-with-profiles/pom.xml b/impl/maven-core/src/test/resources/projects/pom-with-profiles/pom.xml new file mode 100644 index 000000000000..fdf4e9b47d4c --- /dev/null +++ b/impl/maven-core/src/test/resources/projects/pom-with-profiles/pom.xml @@ -0,0 +1,46 @@ + + + + + + 4.0.0 + + maven + maven-core + 2.0-SNAPSHOT + + Maven + + + + active-by-default + + true + + + + profile1 + + + profile2 + + + From 5308f551d9acd7ebb01dd088d96f60e9a63f32b5 Mon Sep 17 00:00:00 2001 From: Giovanni van der Schelde Date: Fri, 21 Feb 2025 20:54:11 +0100 Subject: [PATCH 2/2] [MNG-8588] Add tests for getInjectedProfileIds() --- .../DefaultMavenProjectBuilderTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java index 09f3f085e9a0..baaf5a00478a 100644 --- a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java +++ b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java @@ -29,6 +29,7 @@ import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.impl.InternalSession; import org.apache.maven.internal.impl.InternalMavenSession; +import org.apache.maven.model.Profile; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -345,6 +346,61 @@ void rereadPom_mng7063() throws Exception { assertThat(project.getName(), is("PROJECT NAME")); } + @Test + void testActivatedProfileBySource() throws Exception { + File testPom = getTestFile("src/test/resources/projects/pom-with-profiles/pom.xml"); + + ProjectBuildingRequest request = newBuildingRequest(); + request.setLocalRepository(getLocalRepository()); + request.setActiveProfileIds(List.of("profile1")); + + MavenProject project = projectBuilder.build(testPom, request).getProject(); + + assertTrue(project.getInjectedProfileIds().keySet().containsAll(List.of("external", project.getId()))); + assertTrue(project.getInjectedProfileIds().get("external").isEmpty()); + assertTrue(project.getInjectedProfileIds().get(project.getId()).stream().anyMatch("profile1"::equals)); + assertTrue(project.getInjectedProfileIds().get(project.getId()).stream().noneMatch("profile2"::equals)); + assertTrue( + project.getInjectedProfileIds().get(project.getId()).stream().noneMatch("active-by-default"::equals)); + } + + @Test + void testActivatedDefaultProfileBySource() throws Exception { + File testPom = getTestFile("src/test/resources/projects/pom-with-profiles/pom.xml"); + + ProjectBuildingRequest request = newBuildingRequest(); + request.setLocalRepository(getLocalRepository()); + + MavenProject project = projectBuilder.build(testPom, request).getProject(); + + assertTrue(project.getInjectedProfileIds().keySet().containsAll(List.of("external", project.getId()))); + assertTrue(project.getInjectedProfileIds().get("external").isEmpty()); + assertTrue(project.getInjectedProfileIds().get(project.getId()).stream().noneMatch("profile1"::equals)); + assertTrue(project.getInjectedProfileIds().get(project.getId()).stream().noneMatch("profile2"::equals)); + assertTrue(project.getInjectedProfileIds().get(project.getId()).stream().anyMatch("active-by-default"::equals)); + } + + @Test + void testActivatedExternalProfileBySource() throws Exception { + File testPom = getTestFile("src/test/resources/projects/pom-with-profiles/pom.xml"); + + ProjectBuildingRequest request = newBuildingRequest(); + request.setLocalRepository(getLocalRepository()); + + final Profile externalProfile = new Profile(); + externalProfile.setId("external-profile"); + request.addProfile(externalProfile); + request.setActiveProfileIds(List.of(externalProfile.getId())); + + MavenProject project = projectBuilder.build(testPom, request).getProject(); + + assertTrue(project.getInjectedProfileIds().keySet().containsAll(List.of("external", project.getId()))); + assertTrue(project.getInjectedProfileIds().get("external").stream().anyMatch("external-profile"::equals)); + assertTrue(project.getInjectedProfileIds().get(project.getId()).stream().noneMatch("profile1"::equals)); + assertTrue(project.getInjectedProfileIds().get(project.getId()).stream().noneMatch("profile2"::equals)); + assertTrue(project.getInjectedProfileIds().get(project.getId()).stream().anyMatch("active-by-default"::equals)); + } + @Test void testActivatedProfileIsResolved() throws Exception { File testPom = getTestFile("src/test/resources/projects/pom-with-profiles/pom.xml");