diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/SessionData.java b/api/maven-api-core/src/main/java/org/apache/maven/api/SessionData.java index 134e44d12341..fd8964564a29 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/SessionData.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/SessionData.java @@ -18,14 +18,15 @@ */ package org.apache.maven.api; -import java.util.function.Supplier; - import org.apache.maven.api.annotations.Experimental; import org.apache.maven.api.annotations.Nonnull; import org.apache.maven.api.annotations.Nullable; import org.apache.maven.api.annotations.Provider; import org.apache.maven.api.annotations.ThreadSafe; +import java.util.Objects; +import java.util.function.Supplier; + /** * A container for data that is specific to a session. * All components may use this storage to associate arbitrary data with a session. @@ -49,7 +50,7 @@ public interface SessionData { * @param key the key under which to store the session data, must not be {@code null} * @param value the data to associate with the key, may be {@code null} to remove the mapping */ - void set(@Nonnull Object key, @Nullable Object value); + void set(@Nonnull Key key, @Nullable T value); /** * Associates the specified session data with the given key if the key is currently mapped to the given value. This @@ -61,7 +62,7 @@ public interface SessionData { * @return {@code true} if the key mapping was successfully updated from the old value to the new value, * {@code false} if the current key mapping didn't match the expected value and was not updated. */ - boolean set(@Nonnull Object key, @Nullable Object oldValue, @Nullable Object newValue); + boolean replace(@Nonnull Key key, @Nullable T oldValue, @Nullable T newValue); /** * Gets the session data associated with the specified key. @@ -70,7 +71,7 @@ public interface SessionData { * @return the session data associated with the key or {@code null} if none */ @Nullable - Object get(@Nonnull Object key); + T get(@Nonnull Key key); /** * Retrieve of compute the data associated with the specified key. @@ -80,5 +81,55 @@ public interface SessionData { * @return the session data associated with the key */ @Nullable - Object computeIfAbsent(@Nonnull Object key, @Nonnull Supplier supplier); + T computeIfAbsent(@Nonnull Key key, @Nonnull Supplier supplier); + + /** + * Create a key using the given class as an identifier and as the type of the object. + */ + static Key key(Class clazz) { + return new Key<>(clazz, clazz); + } + + /** + * Create a key using the given class and id. + */ + static Key key(Class clazz, Object id) { + return new Key<>(clazz, id); + } + + /** + * Key used to query the session data + * @param the type of the object associated to this key + */ + final class Key { + + private final Class type; + private final Object id; + + private Key(Class type, Object id) { + this.type = type; + this.id = id; + } + + public Class type() { + return type; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Key key = (Key) o; + return Objects.equals(id, key.id) && Objects.equals(type, key.type); + } + + @Override + public int hashCode() { + return Objects.hash(id, type); + } + } } diff --git a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java index 450a646283fd..598ddbe6c439 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java +++ b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultSession.java @@ -177,25 +177,27 @@ public SessionData getData() { org.eclipse.aether.SessionData data = session.getData(); return new SessionData() { @Override - public void set(@Nonnull Object key, @Nullable Object value) { + public void set(@Nonnull Key key, @Nullable T value) { data.set(key, value); } @Override - public boolean set(@Nonnull Object key, @Nullable Object oldValue, @Nullable Object newValue) { + public boolean replace(@Nonnull Key key, @Nullable T oldValue, @Nullable T newValue) { return data.set(key, oldValue, newValue); } @Nullable @Override - public Object get(@Nonnull Object key) { - return data.get(key); + @SuppressWarnings("unchecked") + public T get(@Nonnull Key key) { + return (T) data.get(key); } @Nullable @Override - public Object computeIfAbsent(@Nonnull Object key, @Nonnull Supplier supplier) { - return data.computeIfAbsent(key, supplier); + @SuppressWarnings("unchecked") + public T computeIfAbsent(@Nonnull Key key, @Nonnull Supplier supplier) { + return (T) data.computeIfAbsent(key, (Supplier) supplier); } }; } diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java index 5e9bd430fd42..57f95e4ca41b 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java @@ -32,7 +32,6 @@ import org.apache.maven.lifecycle.internal.LifecycleStarter; import org.apache.maven.lifecycle.internal.LifecycleTaskSegmentCalculator; import org.apache.maven.lifecycle.internal.MojoExecutor; -import org.apache.maven.lifecycle.internal.ProjectIndex; import org.apache.maven.lifecycle.internal.TaskSegment; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.InvalidPluginDescriptorException; @@ -146,6 +145,6 @@ public void calculateForkedExecutions(MojoExecution mojoExecution, MavenSession // Site 3.x public List executeForkedExecutions(MojoExecution mojoExecution, MavenSession session) throws LifecycleExecutionException { - return mojoExecutor.executeForkedExecutions(mojoExecution, session, new ProjectIndex(session.getProjects())); + return mojoExecutor.executeForkedExecutions(mojoExecution, session); } } diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilder.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilder.java index 842410ca4d8c..5450e16ea514 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilder.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilder.java @@ -104,7 +104,7 @@ public void buildProject( projectExecutionListener.beforeProjectLifecycleExecution( new ProjectExecutionEvent(session, currentProject, mojoExecutions)); - mojoExecutor.execute(session, mojoExecutions, reactorContext.getProjectIndex()); + mojoExecutor.execute(session, mojoExecutions); long buildEndTime = System.currentTimeMillis(); diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java index 52a7ce02158c..5f442555bc88 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java @@ -36,6 +36,7 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.apache.maven.api.SessionData; import org.apache.maven.api.services.MessageBuilderFactory; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; @@ -57,7 +58,6 @@ import org.apache.maven.plugin.PluginManagerException; import org.apache.maven.plugin.descriptor.MojoDescriptor; import org.apache.maven.project.MavenProject; -import org.eclipse.aether.SessionData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -74,6 +74,11 @@ public class MojoExecutor { private static final Logger LOGGER = LoggerFactory.getLogger(MojoExecutor.class); + private static final SessionData.Key PROJECT_INDEX = SessionData.key(ProjectIndex.class); + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static final SessionData.Key> PROJECT_LOCKS = + (SessionData.Key) SessionData.key(Map.class, ProjectLock.class); private final BuildPluginManager pluginManager; private final MavenPluginManager mavenPluginManager; @@ -149,8 +154,7 @@ private Collection toScopes(String classpath) { return Collections.unmodifiableCollection(scopes); } - public void execute( - final MavenSession session, final List mojoExecutions, final ProjectIndex projectIndex) + public void execute(final MavenSession session, final List mojoExecutions) throws LifecycleExecutionException { final DependencyContext dependencyContext = newDependencyContext(session, mojoExecutions); @@ -160,7 +164,7 @@ public void execute( mojosExecutionStrategy.get().execute(mojoExecutions, session, new MojoExecutionRunner() { @Override public void run(MojoExecution mojoExecution) throws LifecycleExecutionException { - MojoExecutor.this.execute(session, mojoExecution, projectIndex, dependencyContext, phaseRecorder); + MojoExecutor.this.execute(session, mojoExecution, dependencyContext, phaseRecorder); } }); } @@ -168,19 +172,14 @@ public void run(MojoExecution mojoExecution) throws LifecycleExecutionException private void execute( MavenSession session, MojoExecution mojoExecution, - ProjectIndex projectIndex, DependencyContext dependencyContext, PhaseRecorder phaseRecorder) throws LifecycleExecutionException { - execute(session, mojoExecution, projectIndex, dependencyContext); + execute(session, mojoExecution, dependencyContext); phaseRecorder.observeExecution(mojoExecution); } - private void execute( - MavenSession session, - MojoExecution mojoExecution, - ProjectIndex projectIndex, - DependencyContext dependencyContext) + private void execute(MavenSession session, MojoExecution mojoExecution, DependencyContext dependencyContext) throws LifecycleExecutionException { MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor(); @@ -211,7 +210,7 @@ private void execute( } } - doExecute(session, mojoExecution, projectIndex, dependencyContext); + doExecute(session, mojoExecution, dependencyContext); } /** @@ -273,11 +272,9 @@ public void close() { mojos.remove(Thread.currentThread()); } - @SuppressWarnings({"unchecked", "rawtypes"}) private OwnerReentrantLock getProjectLock(MavenSession session) { - SessionData data = session.getRepositorySession().getData(); - Map locks = - (Map) data.computeIfAbsent(ProjectLock.class, ConcurrentHashMap::new); + SessionData data = session.getSession().getData(); + Map locks = data.computeIfAbsent(PROJECT_LOCKS, ConcurrentHashMap::new); return locks.computeIfAbsent(session.getCurrentProject(), p -> new OwnerReentrantLock()); } } @@ -302,15 +299,11 @@ private static void warn(String msg) { } } - private void doExecute( - MavenSession session, - MojoExecution mojoExecution, - ProjectIndex projectIndex, - DependencyContext dependencyContext) + private void doExecute(MavenSession session, MojoExecution mojoExecution, DependencyContext dependencyContext) throws LifecycleExecutionException { MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor(); - List forkedProjects = executeForkedExecutions(mojoExecution, session, projectIndex); + List forkedProjects = executeForkedExecutions(mojoExecution, session); ensureDependenciesAreResolved(mojoDescriptor, session, dependencyContext); @@ -407,8 +400,7 @@ private ArtifactFilter getArtifactFilter(MojoDescriptor mojoDescriptor) { } } - public List executeForkedExecutions( - MojoExecution mojoExecution, MavenSession session, ProjectIndex projectIndex) + public List executeForkedExecutions(MojoExecution mojoExecution, MavenSession session) throws LifecycleExecutionException { List forkedProjects = Collections.emptyList(); @@ -425,6 +417,10 @@ public List executeForkedExecutions( for (Map.Entry> fork : forkedExecutions.entrySet()) { String projectId = fork.getKey(); + ProjectIndex projectIndex = session.getSession() + .getData() + .computeIfAbsent(PROJECT_INDEX, () -> new ProjectIndex(session.getProjects())); + int index = projectIndex.getIndices().get(projectId); MavenProject forkedProject = projectIndex.getProjects().get(projectId); @@ -448,7 +444,7 @@ public List executeForkedExecutions( eventCatapult.fire(ExecutionEvent.Type.ForkedProjectStarted, session, mojoExecution); - execute(session, mojoExecutions, projectIndex); + execute(session, mojoExecutions); eventCatapult.fire(ExecutionEvent.Type.ForkedProjectSucceeded, session, mojoExecution); } catch (LifecycleExecutionException e) { diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ReactorContext.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ReactorContext.java index b0ab335e5036..4906758e1cd7 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ReactorContext.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/ReactorContext.java @@ -29,19 +29,15 @@ public class ReactorContext { private final MavenExecutionResult result; - private final ProjectIndex projectIndex; - private final ClassLoader originalContextClassLoader; private final ReactorBuildStatus reactorBuildStatus; public ReactorContext( MavenExecutionResult result, - ProjectIndex projectIndex, ClassLoader originalContextClassLoader, ReactorBuildStatus reactorBuildStatus) { this.result = result; - this.projectIndex = projectIndex; this.originalContextClassLoader = originalContextClassLoader; this.reactorBuildStatus = reactorBuildStatus; } @@ -54,10 +50,6 @@ public MavenExecutionResult getResult() { return result; } - public ProjectIndex getProjectIndex() { - return projectIndex; - } - public ClassLoader getOriginalContextClassLoader() { return originalContextClassLoader; } diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilderTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilderTest.java index 3852f3e9802a..ff9749dfee2e 100644 --- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilderTest.java +++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleModuleBuilderTest.java @@ -53,9 +53,9 @@ void testCurrentProject() throws Exception { List currentProjects = new ArrayList<>(); MojoExecutorStub mojoExecutor = new MojoExecutorStub() { @Override - public void execute(MavenSession session, List mojoExecutions, ProjectIndex projectIndex) + public void execute(MavenSession session, List mojoExecutions) throws LifecycleExecutionException { - super.execute(session, mojoExecutions, projectIndex); + super.execute(session, mojoExecutions); currentProjects.add(session.getCurrentProject()); } }; diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java index 94d50952740b..4e7862932246 100644 --- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java +++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/MojoExecutorStub.java @@ -30,7 +30,6 @@ import org.apache.maven.lifecycle.internal.ExecutionEventCatapult; import org.apache.maven.lifecycle.internal.LifecycleDependencyResolver; import org.apache.maven.lifecycle.internal.MojoExecutor; -import org.apache.maven.lifecycle.internal.ProjectIndex; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.BuildPluginManager; import org.apache.maven.plugin.MavenPluginManager; @@ -67,14 +66,12 @@ public MojoExecutorStub( } @Override - public void execute(MavenSession session, List mojoExecutions, ProjectIndex projectIndex) - throws LifecycleExecutionException { + public void execute(MavenSession session, List mojoExecutions) throws LifecycleExecutionException { executions.addAll(mojoExecutions); } @Override - public List executeForkedExecutions( - MojoExecution mojoExecution, MavenSession session, ProjectIndex projectIndex) + public List executeForkedExecutions(MojoExecution mojoExecution, MavenSession session) throws LifecycleExecutionException { return null; }