From a4b716ef03af137ed6052c3efdc97d57f93fe391 Mon Sep 17 00:00:00 2001 From: Dmitry Kichinsky Date: Wed, 23 Jul 2025 14:25:25 +0200 Subject: [PATCH] [maven] IDEA-370480 optimize managed dependency storage GitOrigin-RevId: 5106e3da140ed8fad109b3a282af3638d95bcfe6 --- .../MavenAnnotationProcessorConfigurator.kt | 4 +-- .../idea/maven/project/MavenProject.kt | 27 ++++++++++++------- .../idea/maven/project/MavenProjectState.kt | 5 +++- .../idea/maven/project/MavenProjectsTree.kt | 7 ++--- .../project/importing/MavenProjectTest.kt | 8 +++--- .../MavenProjectTreeVersionNumberTest.kt | 4 +-- 6 files changed, 34 insertions(+), 21 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorConfigurator.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorConfigurator.kt index cd7767a0a66d..96800ce848eb 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorConfigurator.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenAnnotationProcessorConfigurator.kt @@ -22,8 +22,8 @@ import org.jdom.Element import org.jetbrains.annotations.ApiStatus import org.jetbrains.idea.maven.importing.MavenAnnotationProcessorConfiguratorUtil.getProcessorArtifactInfos import org.jetbrains.idea.maven.importing.MavenImportUtil.annotationProcessorOptions -import org.jetbrains.idea.maven.importing.MavenImportUtil.declaredAnnotationProcessors import org.jetbrains.idea.maven.importing.MavenImportUtil.compilerConfigsForCompilePhase +import org.jetbrains.idea.maven.importing.MavenImportUtil.declaredAnnotationProcessors import org.jetbrains.idea.maven.importing.MavenImportUtil.getAnnotationProcessorDirectory import org.jetbrains.idea.maven.importing.MavenImportUtil.procMode import org.jetbrains.idea.maven.importing.MavenWorkspaceConfigurator.* @@ -405,7 +405,7 @@ object MavenAnnotationProcessorConfiguratorUtil { val pluginVersion = project.findPlugin(PLUGIN_GROUP_ID, PLUGIN_ARTIFACT_ID)?.version ?: return null if (VersionComparatorUtil.compare(pluginVersion, "3.12.0") >= 0 && groupId != null && artifactId != null) { - return project.findManagedDependency(groupId, artifactId)?.version + return project.findManagedDependencyVersion(groupId, artifactId) } return null } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.kt index dbbc1221a2db..096e5c7d9374 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.kt @@ -54,15 +54,21 @@ class MavenProject(val file: VirtualFile) { @Throws(IOException::class) fun write(out: DataOutputStream) { - out.writeUTF(path) + try { + out.writeUTF(path) - BufferExposingByteArrayOutputStream().use { bs -> - ObjectOutputStream(bs).use { os -> - os.writeObject(myState) - out.writeInt(bs.size()) - out.write(bs.internalBuffer, 0, bs.size()) + BufferExposingByteArrayOutputStream().use { bs -> + ObjectOutputStream(bs).use { os -> + os.writeObject(myState) + out.writeInt(bs.size()) + out.write(bs.internalBuffer, 0, bs.size()) + } } } + catch (e: IOException) { + MavenLog.LOG.error("Unable to write project " + file.path, e) + throw e + } } @Internal @@ -587,7 +593,7 @@ class MavenProject(val file: VirtualFile) { setState(newState) } - fun findManagedDependency(groupId: String, artifactId: String): MavenId? = myState.managedDependencies["$groupId:$artifactId"] + fun findManagedDependencyVersion(groupId: String, artifactId: String): String? = myState.managedDependencies[GroupAndArtifact(groupId, artifactId)] fun findDependencies(depProject: MavenProject): List { return findDependencies(depProject.mavenId) @@ -856,7 +862,7 @@ class MavenProject(val file: VirtualFile) { val newPluginInfos = LinkedHashSet() val newExtensions = LinkedHashSet() val newAnnotationProcessors = LinkedHashSet() - val newManagedDeps = LinkedHashMap() + val newManagedDeps = HashMap(managedDependencies.size) if (keepPreviousArtifacts) { newUnresolvedArtifacts.addAll(state.unresolvedArtifactIds) @@ -886,7 +892,10 @@ class MavenProject(val file: VirtualFile) { newDependencyTree.addAll(model.dependencyTree) newDependencies.addAll(model.dependencies) newExtensions.addAll(model.extensions) - managedDependencies.forEach { md -> newManagedDeps.put("${md.groupId}:${md.artifactId}", md) } + + for (md in managedDependencies) { + newManagedDeps.put(GroupAndArtifact(md.groupId ?: "", md.artifactId ?: ""), md.version ?: "") + } val remoteRepositories = ArrayList(newRepositories) val remotePluginRepositories = ArrayList(newPluginRepositories) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectState.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectState.kt index d44d5650a0d1..03f8112ed15c 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectState.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectState.kt @@ -11,6 +11,9 @@ import java.util.* @ApiStatus.Experimental data class MavenPluginWithArtifact(val plugin: MavenPlugin, val artifact: MavenArtifact?) : Serializable +@ApiStatus.Experimental +data class GroupAndArtifact(val groupId: String, val artifactId: String) : Serializable + @ApiStatus.Internal data class MavenProjectState( val lastReadStamp: Long = 0, @@ -35,7 +38,7 @@ data class MavenProjectState( val remoteRepositories: List = emptyList(), val remotePluginRepositories: List = emptyList(), val annotationProcessors: List = emptyList(), - val managedDependencies: Map = emptyMap(), + val managedDependencies: Map = emptyMap(), val modulesPathsAndNames: Map = emptyMap(), val modelMap: Map = emptyMap(), val profilesIds: Collection = emptySet(), diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt index 2b502cad8f17..20e7139f2dcb 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.kt @@ -32,6 +32,7 @@ import org.jetbrains.annotations.TestOnly import org.jetbrains.idea.maven.dom.references.MavenFilteredPropertyPsiReferenceProvider import org.jetbrains.idea.maven.model.* import org.jetbrains.idea.maven.project.MavenProjectsTreeUpdater.UpdateSpec +import org.jetbrains.idea.maven.server.NativeMavenProjectHolder import org.jetbrains.idea.maven.telemetry.tracer import org.jetbrains.idea.maven.utils.* import java.io.* @@ -951,7 +952,7 @@ class MavenProjectsTree(val project: Project) { @Suppress("DEPRECATION") @Deprecated("use projectResolved(Pair)") fun projectResolved(projectWithChanges: Pair, - nativeMavenProject: org.jetbrains.idea.maven.server.NativeMavenProjectHolder?) { + nativeMavenProject: NativeMavenProjectHolder?) { } @Suppress("DEPRECATION") @@ -1093,8 +1094,8 @@ class MavenProjectsTree(val project: Project) { companion object { private val LOG = Logger.getInstance(MavenProjectsTree::class.java) - private const val STORAGE_VERSION_NUMBER = 13 - val STORAGE_VERSION = MavenProjectsTree::class.java.simpleName + "." + STORAGE_VERSION_NUMBER + private const val STORAGE_VERSION_NUMBER = 14 + val STORAGE_VERSION: String = MavenProjectsTree::class.java.simpleName + "." + STORAGE_VERSION_NUMBER private fun String.getStorageVersionNumber(): Int { val parts = this.split(".") diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTest.kt index d4f10ed4dff2..f53452276d1e 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTest.kt @@ -937,7 +937,7 @@ class MavenProjectTest : MavenMultiVersionImportingTestCase() { importProjectAsync() - assertEquals("4.0", projectsTree.findProject(p)!!.findManagedDependency("junit", "junit")!!.version) + assertEquals("4.0", projectsTree.findProject(p)!!.findManagedDependencyVersion("junit", "junit")!!) } @Test @@ -973,7 +973,7 @@ class MavenProjectTest : MavenMultiVersionImportingTestCase() { importProjectAsync() - assertEquals("4.0", projectsTree.findProject(m1)!!.findManagedDependency("junit", "junit")!!.version) + assertEquals("4.0", projectsTree.findProject(m1)!!.findManagedDependencyVersion("junit", "junit")!!) } @Test @@ -1018,8 +1018,8 @@ class MavenProjectTest : MavenMultiVersionImportingTestCase() { importProjectAsync() - assertEquals("4.0", projectsTree.findProject(m1)!!.findManagedDependency("junit", "junit")!!.version) - assertEquals("1.0", projectsTree.findProject(m1)!!.findManagedDependency("another", "dep")!!.version) + assertEquals("4.0", projectsTree.findProject(m1)!!.findManagedDependencyVersion("junit", "junit")!!) + assertEquals("1.0", projectsTree.findProject(m1)!!.findManagedDependencyVersion("another", "dep")!!) } protected fun assertDependenciesNodes(nodes: List?, expected: String?) { diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTreeVersionNumberTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTreeVersionNumberTest.kt index d7a626879c80..0fa22f62e660 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTreeVersionNumberTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/importing/MavenProjectTreeVersionNumberTest.kt @@ -17,12 +17,12 @@ import kotlin.reflect.full.findAnnotation class MavenProjectTreeVersionNumberTest : UsefulTestCase() { fun `test do not forget updating STORAGE_VERSION_NUMBER when structure changed`() { - val hash = Hashing.komihash5_0().hashStream(); + val hash = Hashing.komihash5_0().hashStream() val recursionKeeper = HashSet() hashKType(MavenProjectState::class.createType(), recursionKeeper, hash) hash.putString(MavenProjectsTree.STORAGE_VERSION) - assertEquals("UPDATE STORAGE VERSION ALONG WITH THIS HASH!!!", 8386196208490699208, hash.asLong) + assertEquals("UPDATE STORAGE VERSION ALONG WITH THIS HASH!!!", 5736572056086370157, hash.asLong) } private fun hashKType(type: KType, recursionKeeper: MutableSet, hash: HashSink) {