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