diff --git a/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseWorkspace.java b/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseWorkspace.java index fcc4669eed..44640b86e8 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseWorkspace.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseWorkspace.java @@ -14,8 +14,6 @@ import java.nio.file.Path; -import org.codehaus.plexus.logging.Logger; - /** * A generic representation of a workspace that is only initialized once and carries a cache key, * belonging to a thread so it can be used in a threadsafe manner @@ -28,14 +26,11 @@ public final class EclipseWorkspace { private T key; - private Logger logger; - private Thread thread; - EclipseWorkspace(Path workDir, T key, Logger logger, Thread thread) { + EclipseWorkspace(Path workDir, T key, Thread thread) { this.workDir = workDir; this.key = key; - this.logger = logger; this.thread = thread; } diff --git a/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseWorkspaceManager.java b/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseWorkspaceManager.java index 978a040341..574911328b 100644 --- a/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseWorkspaceManager.java +++ b/tycho-core/src/main/java/org/eclipse/tycho/osgi/framework/EclipseWorkspaceManager.java @@ -15,7 +15,10 @@ import java.io.IOException; import java.net.URI; import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.io.FileUtils; @@ -32,7 +35,8 @@ @Component(role = EclipseWorkspaceManager.class) public class EclipseWorkspaceManager implements Disposable { - private final Map>> cache = new ConcurrentHashMap<>(); + private final Map>> cache = new WeakHashMap<>(); + private final List> toclean = new ArrayList<>(); @Requirement private Logger logger; @@ -45,30 +49,43 @@ public class EclipseWorkspaceManager implements Disposable { @SuppressWarnings("unchecked") public EclipseWorkspace getWorkspace(T key) { Thread currentThread = Thread.currentThread(); - return (EclipseWorkspace) cache.computeIfAbsent(currentThread, t -> new ConcurrentHashMap<>()) - .computeIfAbsent(key, x -> { - try { - return new EclipseWorkspace<>(Files.createTempDirectory("eclipseWorkspace"), key, logger, - currentThread); - } catch (IOException e) { - throw new IllegalStateException("can't create a temporary directory for the workspace!", e); - } - }); + synchronized (cache) { + return (EclipseWorkspace) cache.computeIfAbsent(currentThread, t -> new ConcurrentHashMap<>()) + .computeIfAbsent(key, x -> { + try { + EclipseWorkspace workspace = new EclipseWorkspace<>( + Files.createTempDirectory("eclipseWorkspace"), key, currentThread); + toclean.add(workspace); + return workspace; + } catch (IOException e) { + throw new IllegalStateException("can't create a temporary directory for the workspace!", e); + } + }); + } } @Override public void dispose() { - cache.values().forEach(map -> { - map.values().forEach(ws -> FileUtils.deleteQuietly(ws.getWorkDir().toFile())); - }); + cache.clear(); + for (EclipseWorkspace workspace : toclean) { + FileUtils.deleteQuietly(workspace.getWorkDir().toFile()); + } } + /** + * Get a workspace that is unique for the given uri, current thread and mojo and therefore safe + * to be used in a maven multithread execution + * + * @param uri + * @param mojo + * @return an {@link EclipseWorkspace} + */ public EclipseWorkspace getWorkspace(URI uri, Mojo mojo) { - return getWorkspace(new MojoKey(uri.normalize(), mojo.getClass())); + return getWorkspace(new MojoKey(uri.normalize(), mojo.getClass().getName())); } - private static final record MojoKey(URI uri, Class clz) { + private static final record MojoKey(URI uri, String mojoClassName) { //a key that uses the mojo class and a URI }