1+ package org.utbot.intellij.plugin.util
2+
3+ import com.intellij.openapi.command.WriteCommandAction
4+ import com.intellij.openapi.fileEditor.FileDocumentManager
5+ import com.intellij.openapi.module.Module
6+ import com.intellij.openapi.project.Project
7+ import com.intellij.openapi.roots.DependencyScope
8+ import com.intellij.openapi.roots.ExternalLibraryDescriptor
9+ import com.intellij.openapi.roots.JavaProjectModelModifier
10+ import com.intellij.openapi.util.Trinity
11+ import com.intellij.openapi.util.text.StringUtil
12+ import com.intellij.pom.java.LanguageLevel
13+ import com.intellij.psi.PsiDocumentManager
14+ import com.intellij.psi.util.PsiUtilCore
15+ import com.intellij.psi.xml.XmlFile
16+ import com.intellij.util.ThrowableRunnable
17+ import com.intellij.util.xml.DomUtil
18+ import org.jetbrains.concurrency.Promise
19+ import org.jetbrains.concurrency.rejectedPromise
20+ import org.jetbrains.idea.maven.dom.MavenDomBundle
21+ import org.jetbrains.idea.maven.dom.MavenDomUtil
22+ import org.jetbrains.idea.maven.dom.converters.MavenDependencyCompletionUtil
23+ import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel
24+ import org.jetbrains.idea.maven.model.MavenConstants
25+ import org.jetbrains.idea.maven.model.MavenId
26+ import org.jetbrains.idea.maven.project.MavenProject
27+ import org.jetbrains.idea.maven.project.MavenProjectsManager
28+
29+ class UtMavenProjectModelModifier (val project : Project ): JavaProjectModelModifier() {
30+
31+ private val mavenProjectsManager = MavenProjectsManager .getInstance(project)
32+
33+ override fun addExternalLibraryDependency (
34+ modules : Collection <Module >,
35+ descriptor : ExternalLibraryDescriptor ,
36+ scope : DependencyScope
37+ ): Promise <Void ?>? {
38+ for (module in modules) {
39+ if (! mavenProjectsManager.isMavenizedModule(module)) {
40+ return null
41+ }
42+ }
43+
44+ val mavenId = MavenId (descriptor.libraryGroupId, descriptor.libraryArtifactId, descriptor.preferredVersion)
45+ return addDependency(modules, mavenId, descriptor.preferredVersion, scope)
46+ }
47+
48+ override fun changeLanguageLevel (module : Module , level : LanguageLevel ): Promise <Void > = rejectedPromise()
49+
50+ private fun addDependency (
51+ fromModules : Collection <Module >,
52+ mavenId : MavenId ,
53+ preferredVersion : String? ,
54+ scope : DependencyScope ,
55+ ): Promise <Void ?>? {
56+ val models: MutableList <Trinity <MavenDomProjectModel , MavenId , String ?>> = ArrayList (fromModules.size)
57+ val files: MutableList <XmlFile > = ArrayList (fromModules.size)
58+ val projectToUpdate: MutableList <MavenProject > = ArrayList (fromModules.size)
59+ val mavenScope = getMavenScope(scope)
60+
61+ for (from in fromModules) {
62+ if (! mavenProjectsManager.isMavenizedModule(from)) return null
63+ val fromProject: MavenProject = mavenProjectsManager.findProject(from) ? : return null
64+ val model = MavenDomUtil .getMavenDomProjectModel(project, fromProject.file) ? : return null
65+ var scopeToSet: String? = null
66+ var version: String? = null
67+ if (mavenId.groupId != null && mavenId.artifactId != null ) {
68+ val managedDependency = MavenDependencyCompletionUtil .findManagedDependency(
69+ model, project,
70+ mavenId.groupId!! ,
71+ mavenId.artifactId!!
72+ )
73+ if (managedDependency != null ) {
74+ val managedScope = StringUtil .nullize(managedDependency.scope.stringValue, true )
75+ scopeToSet = if (managedScope == null && MavenConstants .SCOPE_COMPILE == mavenScope ||
76+ StringUtil .equals(managedScope, mavenScope)
77+ ) null else mavenScope
78+ }
79+ if (managedDependency == null || StringUtil .isEmpty(managedDependency.version.stringValue)) {
80+ version = preferredVersion
81+ scopeToSet = mavenScope
82+ }
83+ }
84+ models.add(Trinity .create(model, MavenId (mavenId.groupId, mavenId.artifactId, version), scopeToSet))
85+ files.add(DomUtil .getFile(model))
86+ projectToUpdate.add(fromProject)
87+ }
88+
89+ WriteCommandAction .writeCommandAction(project, * PsiUtilCore .toPsiFileArray(files))
90+ .withName(MavenDomBundle .message(" fix.add.dependency" )).run (
91+ ThrowableRunnable <RuntimeException > {
92+ val pdm = PsiDocumentManager .getInstance(project)
93+ for (trinity in models) {
94+ val model = trinity.first
95+ val dependency = MavenDomUtil .createDomDependency(model, null , trinity.second)
96+ val ms = trinity.third
97+ if (ms != null ) {
98+ dependency.scope.stringValue = ms
99+ }
100+ val document =
101+ pdm.getDocument(DomUtil .getFile(model))
102+ if (document != null ) {
103+ pdm.doPostponedOperationsAndUnblockDocument(document)
104+ FileDocumentManager .getInstance().saveDocument(document)
105+ }
106+ }
107+ })
108+
109+ return mavenProjectsManager.forceUpdateProjects(projectToUpdate)
110+ }
111+
112+ private fun getMavenScope (scope : DependencyScope ): String? = when (scope) {
113+ DependencyScope .RUNTIME -> MavenConstants .SCOPE_RUNTIME
114+ DependencyScope .COMPILE -> MavenConstants .SCOPE_COMPILE
115+ DependencyScope .TEST -> MavenConstants .SCOPE_TEST
116+ DependencyScope .PROVIDED -> MavenConstants .SCOPE_PROVIDED
117+ else -> throw IllegalArgumentException (scope.toString())
118+ }
119+ }
0 commit comments