From fd6c1512cdae45058aa8dcdf72410ceef8267535 Mon Sep 17 00:00:00 2001 From: Dmitry Kichinsky Date: Wed, 25 Jun 2025 12:02:31 +0200 Subject: [PATCH] [maven] IDEA-374453 Maven synchronize throws java.util.ConcurrentModificationException: Thread-safe Maven model base (cherry picked from commit 67592a9b22df895ad3b4d6fe37bda7172b5af863) IJ-CR-167129 GitOrigin-RevId: ca8bd87fa1e6a00730b3e8aa6cc1af6a9ea421a6 --- .../idea/maven/model/MavenModelBase.java | 74 ++++++++++--------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/plugins/maven-server-api/src/main/java/org/jetbrains/idea/maven/model/MavenModelBase.java b/plugins/maven-server-api/src/main/java/org/jetbrains/idea/maven/model/MavenModelBase.java index 4f27d31b780e..5c0054f5aeb6 100644 --- a/plugins/maven-server-api/src/main/java/org/jetbrains/idea/maven/model/MavenModelBase.java +++ b/plugins/maven-server-api/src/main/java/org/jetbrains/idea/maven/model/MavenModelBase.java @@ -15,19 +15,21 @@ */ package org.jetbrains.idea.maven.model; +import org.jetbrains.annotations.NotNull; + import java.io.Serializable; import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; public class MavenModelBase implements Serializable { private Properties myProperties; - private ArrayList myPlugins = new ArrayList<>(); - private ArrayList myExtensions = new ArrayList<>(); - private ArrayList myDependencies = new ArrayList<>(); - private ArrayList myDependencyTree = new ArrayList<>(); - private ArrayList myRemoteRepositories = new ArrayList<>(); - private ArrayList myRemotePluginRepositories = new ArrayList<>(); - - private ArrayList myModules; + private @NotNull List<@NotNull MavenPlugin> myPlugins = new CopyOnWriteArrayList<>(); + private @NotNull List<@NotNull MavenArtifact> myExtensions = new CopyOnWriteArrayList<>(); + private @NotNull List<@NotNull MavenArtifact> myDependencies = new CopyOnWriteArrayList<>(); + private @NotNull List<@NotNull MavenArtifactNode> myDependencyTree = new CopyOnWriteArrayList<>(); + private @NotNull List<@NotNull MavenRemoteRepository> myRemoteRepositories = new CopyOnWriteArrayList<>(); + private @NotNull List<@NotNull MavenRemoteRepository> myRemotePluginRepositories = new CopyOnWriteArrayList<>(); + private @NotNull List<@NotNull String> myModules = new CopyOnWriteArrayList<>(); public Properties getProperties() { if (myProperties == null) myProperties = new Properties(); @@ -52,59 +54,59 @@ public class MavenModelBase implements Serializable { setProperties(newProperties); } - public List getPlugins() { - return myPlugins; + public @NotNull List<@NotNull MavenPlugin> getPlugins() { + return Collections.unmodifiableList(myPlugins); } - public void setPlugins(List plugins) { - myPlugins = new ArrayList<>(plugins); + public void setPlugins(@NotNull List<@NotNull MavenPlugin> plugins) { + myPlugins = new CopyOnWriteArrayList<>(plugins); } - public List getExtensions() { - return myExtensions; + public @NotNull List<@NotNull MavenArtifact> getExtensions() { + return Collections.unmodifiableList(myExtensions); } - public void setExtensions(List extensions) { - myExtensions = new ArrayList<>(extensions); + public void setExtensions(@NotNull List<@NotNull MavenArtifact> extensions) { + myExtensions = new CopyOnWriteArrayList<>(extensions); } - public List getDependencies() { - return myDependencies; + public @NotNull List<@NotNull MavenArtifact> getDependencies() { + return Collections.unmodifiableList(myDependencies); } - public void setDependencies(List dependencies) { - myDependencies = new ArrayList<>(dependencies); + public void setDependencies(@NotNull List<@NotNull MavenArtifact> dependencies) { + myDependencies = new CopyOnWriteArrayList<>(dependencies); } - public List getDependencyTree() { - return myDependencyTree; + public @NotNull List<@NotNull MavenArtifactNode> getDependencyTree() { + return Collections.unmodifiableList(myDependencyTree); } - public void setDependencyTree(List dependencyTree) { - myDependencyTree = new ArrayList<>(dependencyTree); + public void setDependencyTree(@NotNull List<@NotNull MavenArtifactNode> dependencyTree) { + myDependencyTree = new CopyOnWriteArrayList<>(dependencyTree); } - public List getRemoteRepositories() { - return myRemoteRepositories; + public @NotNull List<@NotNull MavenRemoteRepository> getRemoteRepositories() { + return Collections.unmodifiableList(myRemoteRepositories); } - public void setRemoteRepositories(List remoteRepositories) { - myRemoteRepositories = new ArrayList<>(remoteRepositories); + public void setRemoteRepositories(@NotNull List<@NotNull MavenRemoteRepository> remoteRepositories) { + myRemoteRepositories = new CopyOnWriteArrayList<>(remoteRepositories); } - public ArrayList getRemotePluginRepositories() { - return myRemotePluginRepositories; + public @NotNull List<@NotNull MavenRemoteRepository> getRemotePluginRepositories() { + return Collections.unmodifiableList(myRemotePluginRepositories); } - public void setRemotePluginRepositories(List remotePluginRepositories) { - myRemotePluginRepositories = new ArrayList<>(remotePluginRepositories); + public void setRemotePluginRepositories(@NotNull List<@NotNull MavenRemoteRepository> remotePluginRepositories) { + myRemotePluginRepositories = new CopyOnWriteArrayList<>(remotePluginRepositories); } - public List getModules() { - return myModules; + public @NotNull List<@NotNull String> getModules() { + return Collections.unmodifiableList(myModules); } - public void setModules(List modules) { - myModules = new ArrayList<>(modules); + public void setModules(@NotNull List<@NotNull String> modules) { + myModules = new CopyOnWriteArrayList<>(modules); } }