From 6aa1fb38b8271a1e65adec5cbfe2e7c67dbf8f48 Mon Sep 17 00:00:00 2001 From: Falko Modler Date: Sun, 20 Dec 2020 21:59:38 +0100 Subject: [PATCH] [MNG-6843] Thread-safe artifacts in MavenProject Avoids concurrency issues when aggregator plugins are involved. --- .../apache/maven/project/MavenProject.java | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/project/MavenProject.java b/maven-core/src/main/java/org/apache/maven/project/MavenProject.java index 3cf7bd142823..7e4b11ce30a6 100644 --- a/maven-core/src/main/java/org/apache/maven/project/MavenProject.java +++ b/maven-core/src/main/java/org/apache/maven/project/MavenProject.java @@ -111,10 +111,6 @@ public class MavenProject private Set resolvedArtifacts; - private ArtifactFilter artifactFilter; - - private Set artifacts; - private Artifact parentArtifact; private Set pluginArtifacts; @@ -151,8 +147,8 @@ public class MavenProject private Artifact artifact; - // calculated. - private Map artifactMap; + private final ThreadLocal threadLocalArtifactsHolder = + ThreadLocal.withInitial( ArtifactsHolder::new ); private Model originalModel; @@ -695,10 +691,11 @@ public void addLicense( License license ) public void setArtifacts( Set artifacts ) { - this.artifacts = artifacts; + ArtifactsHolder artifactsHolder = threadLocalArtifactsHolder.get(); + artifactsHolder.artifacts = artifacts; // flush the calculated artifactMap - artifactMap = null; + artifactsHolder.artifactMap = null; } /** @@ -711,34 +708,36 @@ public void setArtifacts( Set artifacts ) */ public Set getArtifacts() { - if ( artifacts == null ) + ArtifactsHolder artifactsHolder = threadLocalArtifactsHolder.get(); + if ( artifactsHolder.artifacts == null ) { - if ( artifactFilter == null || resolvedArtifacts == null ) + if ( artifactsHolder.artifactFilter == null || resolvedArtifacts == null ) { - artifacts = new LinkedHashSet<>(); + artifactsHolder.artifacts = new LinkedHashSet<>(); } else { - artifacts = new LinkedHashSet<>( resolvedArtifacts.size() * 2 ); + artifactsHolder.artifacts = new LinkedHashSet<>( resolvedArtifacts.size() * 2 ); for ( Artifact artifact : resolvedArtifacts ) { - if ( artifactFilter.include( artifact ) ) + if ( artifactsHolder.artifactFilter.include( artifact ) ) { - artifacts.add( artifact ); + artifactsHolder.artifacts.add( artifact ); } } } } - return artifacts; + return artifactsHolder.artifacts; } public Map getArtifactMap() { - if ( artifactMap == null ) + ArtifactsHolder artifactsHolder = threadLocalArtifactsHolder.get(); + if ( artifactsHolder.artifactMap == null ) { - artifactMap = ArtifactUtils.artifactMapByVersionlessId( getArtifacts() ); + artifactsHolder.artifactMap = ArtifactUtils.artifactMapByVersionlessId( getArtifacts() ); } - return artifactMap; + return artifactsHolder.artifactMap; } public void setPluginArtifacts( Set pluginArtifacts ) @@ -1073,7 +1072,7 @@ else if ( !( other instanceof MavenProject ) ) MavenProject that = (MavenProject) other; return Objects.equals( getArtifactId(), that.getArtifactId() ) - && Objects.equals( getGroupId(), that.getGroupId() ) + && Objects.equals( getGroupId(), that.getGroupId() ) && Objects.equals( getVersion(), that.getVersion() ); } @@ -1433,8 +1432,9 @@ public DependencyFilter getExtensionDependencyFilter() public void setResolvedArtifacts( Set artifacts ) { this.resolvedArtifacts = ( artifacts != null ) ? artifacts : Collections.emptySet(); - this.artifacts = null; - this.artifactMap = null; + ArtifactsHolder artifactsHolder = threadLocalArtifactsHolder.get(); + artifactsHolder.artifacts = null; + artifactsHolder.artifactMap = null; } /** @@ -1447,9 +1447,10 @@ public void setResolvedArtifacts( Set artifacts ) */ public void setArtifactFilter( ArtifactFilter artifactFilter ) { - this.artifactFilter = artifactFilter; - this.artifacts = null; - this.artifactMap = null; + ArtifactsHolder artifactsHolder = threadLocalArtifactsHolder.get(); + artifactsHolder.artifactFilter = artifactFilter; + artifactsHolder.artifacts = null; + artifactsHolder.artifactMap = null; } /** @@ -1844,7 +1845,6 @@ public Map getReportArtifactMap() { reportArtifactMap = ArtifactUtils.artifactMapByVersionlessId( getReportArtifacts() ); } - return reportArtifactMap; } @@ -1869,7 +1869,6 @@ public Map getExtensionArtifactMap() { extensionArtifactMap = ArtifactUtils.artifactMapByVersionlessId( getExtensionArtifacts() ); } - return extensionArtifactMap; } @@ -1991,4 +1990,11 @@ public void setProjectBuildingRequest( ProjectBuildingRequest projectBuildingReq { this.projectBuilderConfiguration = projectBuildingRequest; } + + private static class ArtifactsHolder + { + private ArtifactFilter artifactFilter; + private Set artifacts; + private Map artifactMap; + } }