Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExecutionContext.java')
-rw-r--r--org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExecutionContext.java104
1 files changed, 65 insertions, 39 deletions
diff --git a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExecutionContext.java b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExecutionContext.java
index 032153a2..95dc5637 100644
--- a/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExecutionContext.java
+++ b/org.eclipse.m2e.core/src/org/eclipse/m2e/core/internal/embedder/MavenExecutionContext.java
@@ -14,7 +14,9 @@ package org.eclipse.m2e.core.internal.embedder;
import java.util.ArrayDeque;
import java.util.Collections;
import java.util.Deque;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import org.eclipse.core.runtime.CoreException;
@@ -32,7 +34,6 @@ import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.properties.internal.EnvironmentUtils;
-import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.transfer.TransferListener;
import org.eclipse.m2e.core.embedder.ICallable;
@@ -43,24 +44,30 @@ import org.eclipse.m2e.core.embedder.IMavenExecutionContext;
* @since 1.4
*/
public class MavenExecutionContext implements IMavenExecutionContext {
- private static final ThreadLocal<Deque<MavenExecutionContext>> context = new ThreadLocal<Deque<MavenExecutionContext>>();
- private final MavenImpl maven;
+ private static final String CTX_PREFIX = MavenExecutionContext.class.getName();
- private MavenExecutionRequest request;
+ private static final String CTX_LOCALREPOSITORY = CTX_PREFIX + "/localRepository";
+
+ private static final String CTX_MAVENSESSION = CTX_PREFIX + "/mavenSession";
- private ArtifactRepository localRepository;
+ private static final String CTX_REPOSITORYSESSION = CTX_PREFIX + "/repositorySession";
- private FilterRepositorySystemSession repositorySession;
+ private static final ThreadLocal<Deque<MavenExecutionContext>> threadLocal = new ThreadLocal<Deque<MavenExecutionContext>>();
- private MavenSession mavenSession;
+ private final MavenImpl maven;
+
+ private MavenExecutionRequest request;
+
+ // TODO maybe delegate to parent context
+ private Map<String, Object> context;
public MavenExecutionContext(MavenImpl maven) {
this.maven = maven;
}
public MavenExecutionRequest getExecutionRequest() throws CoreException {
- if(request != null && mavenSession != null) {
+ if(request != null && context != null) {
return new ReadonlyMavenExecutionRequest(request);
}
if(request == null) {
@@ -71,7 +78,7 @@ public class MavenExecutionContext implements IMavenExecutionContext {
protected MavenExecutionRequest newExecutionRequest() throws CoreException {
MavenExecutionRequest request = null;
- Deque<MavenExecutionContext> stack = context.get();
+ Deque<MavenExecutionContext> stack = threadLocal.get();
if(stack != null && !stack.isEmpty()) {
MavenExecutionRequest parent = stack.peek().request;
if(parent == null) {
@@ -90,10 +97,10 @@ public class MavenExecutionContext implements IMavenExecutionContext {
}
public <V> V execute(MavenProject project, ICallable<V> callable, IProgressMonitor monitor) throws CoreException {
- Deque<MavenExecutionContext> stack = context.get();
+ Deque<MavenExecutionContext> stack = threadLocal.get();
if(stack == null) {
stack = new ArrayDeque<MavenExecutionContext>();
- context.set(stack);
+ threadLocal.set(stack);
}
final MavenExecutionContext parent = stack.peek();
@@ -103,52 +110,50 @@ public class MavenExecutionContext implements IMavenExecutionContext {
}
// remember original configuration to "pop" the session stack properly
- final ArtifactRepository origlocalRepository = localRepository;
- final FilterRepositorySystemSession origRepositorySession = repositorySession;
- final MavenSession origMavenSession = mavenSession;
final MavenExecutionRequest origRequest = request;
+ final Map<String, Object> origContext = context;
if(request == null && parent != null) {
this.request = parent.request;
- this.localRepository = parent.localRepository;
- this.repositorySession = parent.repositorySession;
- this.mavenSession = parent.mavenSession;
+ this.context = new HashMap<String, Object>(parent.context);
} else {
+ this.context = new HashMap<String, Object>();
if(request == null) {
request = newExecutionRequest();
}
maven.populateDefaults(request);
populateSystemProperties(request);
- this.localRepository = request.getLocalRepository();
- this.repositorySession = maven.createRepositorySession(request);
+ setValue(CTX_LOCALREPOSITORY, request.getLocalRepository());
+ final FilterRepositorySystemSession repositorySession = maven.createRepositorySession(request);
+ setValue(CTX_REPOSITORYSESSION, repositorySession);
if(parent != null) {
- this.repositorySession.setData(parent.repositorySession.getData());
+ repositorySession.setData(parent.getRepositorySession().getData());
}
final MavenExecutionResult result = new DefaultMavenExecutionResult();
- this.mavenSession = new MavenSession(maven.getPlexusContainer(), repositorySession, request, result);
+ setValue(CTX_MAVENSESSION, new MavenSession(maven.getPlexusContainer(), repositorySession, request, result));
}
final LegacySupport legacySupport = maven.lookup(LegacySupport.class);
final MavenSession origLegacySession = legacySupport.getSession(); // TODO validate == origSession
stack.push(this);
- legacySupport.setSession(mavenSession);
+ legacySupport.setSession(getSession());
try {
return executeBare(project, callable, monitor);
} finally {
stack.pop();
if(stack.isEmpty()) {
- context.set(null); // TODO decide if this is useful
+ threadLocal.set(null); // TODO decide if this is useful
}
legacySupport.setSession(origLegacySession);
- mavenSession = origMavenSession;
- repositorySession = origRepositorySession;
- localRepository = origlocalRepository;
request = origRequest;
+ context = origContext;
}
}
private <V> V executeBare(MavenProject project, ICallable<V> callable, IProgressMonitor monitor) throws CoreException {
+ final MavenSession mavenSession = getSession();
+ final FilterRepositorySystemSession repositorySession = getRepositorySession();
final TransferListener origTransferListener = repositorySession.setTransferListener(maven
.createArtifactTransferListener(monitor));
final MavenProject origProject = mavenSession.getCurrentProject();
@@ -169,29 +174,36 @@ public class MavenExecutionContext implements IMavenExecutionContext {
}
public MavenSession getSession() {
- if(mavenSession == null) {
+ if(context == null) {
throw new IllegalStateException();
}
- return mavenSession;
+ return getValue(CTX_MAVENSESSION);
}
public ArtifactRepository getLocalRepository() {
- if(mavenSession == null) {
+ if(context == null) {
throw new IllegalStateException();
}
- return localRepository;
+ return getValue(CTX_LOCALREPOSITORY);
}
- public RepositorySystemSession getRepositorySession() {
- if(mavenSession == null) {
+ public FilterRepositorySystemSession getRepositorySession() {
+ if(context == null) {
throw new IllegalStateException();
}
- return repositorySession;
+ return getValue(CTX_REPOSITORYSESSION);
}
public static MavenExecutionContext getThreadContext() {
- final Deque<MavenExecutionContext> stack = context.get();
- return stack != null ? stack.peek() : null;
+ return getThreadContext(true);
+ }
+
+ /**
+ * @since 1.5
+ */
+ public static MavenExecutionContext getThreadContext(boolean innermost) {
+ final Deque<MavenExecutionContext> stack = threadLocal.get();
+ return stack != null ? (innermost ? stack.peekFirst() : stack.peekLast()) : null;
}
public static void populateSystemProperties(MavenExecutionRequest request) {
@@ -233,8 +245,8 @@ public class MavenExecutionContext implements IMavenExecutionContext {
* @since 1.5
*/
public static Deque<MavenExecutionContext> suspend() {
- Deque<MavenExecutionContext> queue = context.get();
- context.set(null);
+ Deque<MavenExecutionContext> queue = threadLocal.get();
+ threadLocal.set(null);
return queue;
}
@@ -245,10 +257,24 @@ public class MavenExecutionContext implements IMavenExecutionContext {
* @since 1.5
*/
public static void resume(Deque<MavenExecutionContext> queue) {
- if(context.get() != null) {
+ if(threadLocal.get() != null) {
throw new IllegalStateException();
}
- context.set(queue);
+ threadLocal.set(queue);
+ }
+
+ /**
+ * @since 1.5
+ */
+ @SuppressWarnings("unchecked")
+ public <T> T getValue(String key) {
+ return (T) context.get(key);
}
+ /**
+ * @since 1.5
+ */
+ public <T> void setValue(String key, T value) {
+ context.put(key, value);
+ }
}

Back to the top