From 45563ff5cbfd066761913ae35a4e3e8e6e25e83c Mon Sep 17 00:00:00 2001 From: Igor Fedorenko Date: Thu, 5 Feb 2015 12:07:41 -0500 Subject: [PATCH] mechanism to carryover session scope seeds from one thread to another Signed-off-by: Igor Fedorenko --- .../internal/LifecycleModuleBuilder.java | 2 +- .../lifecycle/internal/LifecycleStarter.java | 8 ++++- .../lifecycle/internal/ReactorContext.java | 13 +++++++- .../session/scope/internal/SessionScope.java | 33 +++++++++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) 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 d987a307092a..f9e6e6a7519b 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 @@ -89,7 +89,7 @@ public void buildProject( MavenSession session, MavenSession rootSession, Reacto // session may be different from rootSession seeded in DefaultMaven // explicitly seed the right session here to make sure it is used by Guice - sessionScope.enter(); + sessionScope.enter( reactorContext.getSessionScopeMemento() ); sessionScope.seed( MavenSession.class, session ); try { diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleStarter.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleStarter.java index cc00ff901e1a..55217dc9cea1 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleStarter.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleStarter.java @@ -30,6 +30,7 @@ import org.apache.maven.lifecycle.NoGoalSpecifiedException; import org.apache.maven.lifecycle.internal.builder.Builder; import org.apache.maven.lifecycle.internal.builder.BuilderNotFoundException; +import org.apache.maven.session.scope.internal.SessionScope; import org.codehaus.plexus.component.annotations.Component; import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.Logger; @@ -64,6 +65,9 @@ public class LifecycleStarter @Requirement private Map builders; + + @Requirement + private SessionScope sessionScope; public void execute( MavenSession session ) { @@ -102,7 +106,9 @@ public void execute( MavenSession session ) ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader(); ReactorBuildStatus reactorBuildStatus = new ReactorBuildStatus( session.getProjectDependencyGraph() ); - reactorContext = new ReactorContext( result, projectIndex, oldContextClassLoader, reactorBuildStatus ); + reactorContext = + new ReactorContext( result, projectIndex, oldContextClassLoader, reactorBuildStatus, + sessionScope.memento() ); String builderId = session.getRequest().getBuilderId(); Builder builder = builders.get( builderId ); 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 a6adc9589655..feda5fc617c9 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 @@ -20,6 +20,7 @@ */ import org.apache.maven.execution.MavenExecutionResult; +import org.apache.maven.session.scope.internal.SessionScope; /** * Context that is fixed for the entire reactor build. @@ -39,14 +40,17 @@ public class ReactorContext private final ReactorBuildStatus reactorBuildStatus; + private final SessionScope.Memento sessionScope; public ReactorContext( MavenExecutionResult result, ProjectIndex projectIndex, - ClassLoader originalContextClassLoader, ReactorBuildStatus reactorBuildStatus ) + ClassLoader originalContextClassLoader, ReactorBuildStatus reactorBuildStatus, + SessionScope.Memento sessionScope ) { this.result = result; this.projectIndex = projectIndex; this.originalContextClassLoader = originalContextClassLoader; this.reactorBuildStatus = reactorBuildStatus; + this.sessionScope = sessionScope; } public ReactorBuildStatus getReactorBuildStatus() @@ -69,4 +73,11 @@ public ClassLoader getOriginalContextClassLoader() return originalContextClassLoader; } + /** + * @since 3.2.6 + */ + public SessionScope.Memento getSessionScopeMemento() + { + return sessionScope; + } } diff --git a/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScope.java b/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScope.java index ae62ea2b8801..5a38e6ea5799 100644 --- a/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScope.java +++ b/maven-core/src/main/java/org/apache/maven/session/scope/internal/SessionScope.java @@ -19,9 +19,11 @@ * under the License. */ +import java.util.Collections; import java.util.LinkedList; import java.util.Map; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.google.inject.Key; import com.google.inject.OutOfScopeException; @@ -32,6 +34,19 @@ public class SessionScope implements Scope { + /** + * @since 3.2.6 + */ + public static class Memento + { + final Map, Provider> seeded; + + Memento( final Map, Provider> seeded ) + { + this.seeded = ImmutableMap.copyOf( seeded ); + } + } + private static final Provider SEEDED_KEY_PROVIDER = new Provider() { public Object get() @@ -60,6 +75,15 @@ public void enter() stack.addFirst( new ScopeState() ); } + /** + * @since 3.2.6 + */ + public void enter( Memento memento ) + { + enter(); + getScopeState().seeded.putAll( memento.seeded ); + } + private ScopeState getScopeState() { LinkedList stack = values.get(); @@ -84,6 +108,15 @@ public void exit() } } + /** + * @since 3.2.6 + */ + public Memento memento() + { + LinkedList stack = values.get(); + return new Memento( stack != null ? stack.getFirst().seeded : Collections., Provider>emptyMap() ); + } + public void seed( Class clazz, Provider value ) { getScopeState().seeded.put( Key.get( clazz ), value );