From ce7be0ef4955119c06fd7c621a6d12897bdd9656 Mon Sep 17 00:00:00 2001 From: Stepan Hrbacek Date: Sun, 5 Jan 2020 20:16:01 +0100 Subject: [PATCH] Clone projects in MavenSession.clone() Each build session will then have its own copy of MavenProject objects and cannot be influenced, for example, get determining compile classpath by other running build threads. --- .../apache/maven/execution/MavenSession.java | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java index 5b56df36d003..cc361ec79505 100644 --- a/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java +++ b/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java @@ -21,6 +21,8 @@ import java.io.File; import java.util.Arrays; +import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; @@ -79,7 +81,7 @@ public class MavenSession new ConcurrentHashMap<>(); - public void setProjects( List projects ) + public synchronized void setProjects( List projects ) { if ( !projects.isEmpty() ) { @@ -239,7 +241,10 @@ public MavenSession clone() { try { - return (MavenSession) super.clone(); + MavenSession thisClone = (MavenSession) super.clone(); + thisClone.setProjects( getProjectsClone() ); + + return thisClone; } catch ( CloneNotSupportedException e ) { @@ -247,6 +252,30 @@ public MavenSession clone() } } + private synchronized List getProjectsClone() + { + if ( projects == null ) + { + return null; + } + else + { + if ( projects.isEmpty() ) + { + return Collections.emptyList(); + } + else + { + List clonedProjects = new ArrayList<>( projects.size() ); + for ( MavenProject project : projects ) + { + clonedProjects.add( project.clone() ); + } + return clonedProjects; + } + } + } + public Date getStartTime() { return request.getStartTime(); @@ -302,7 +331,7 @@ public Map getProjectMap() { return projectMap; } - + @Deprecated public MavenSession( PlexusContainer container, RepositorySystemSession repositorySession, MavenExecutionRequest request, MavenExecutionResult result )