Skip to content

Commit adf796d

Browse files
EgorkaKulikovVassiliy-Kudryashov
authored andcommitted
Use custom Maven dependencies installation #1251 #1300 (#1445)
Co-authored-by: Vassiliy Kudryashov <vassiliy.kudryashov@gmail.com>
1 parent 94a82da commit adf796d

File tree

5 files changed

+140
-8
lines changed

5 files changed

+140
-8
lines changed

utbot-android-studio/src/main/kotlin/org/androidstudio/plugin/util/UtAndroidGradleJavaProjectModelModifierWrapper.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import com.intellij.openapi.roots.ExternalLibraryDescriptor
1010
import com.intellij.openapi.roots.impl.IdeaProjectModelModifier
1111
import com.intellij.openapi.roots.libraries.Library
1212
import com.intellij.pom.java.LanguageLevel
13-
import com.intellij.util.containers.ContainerUtil
1413
import org.jetbrains.concurrency.Promise
1514

1615
/*
@@ -25,9 +24,7 @@ class UtAndroidGradleJavaProjectModelModifierWrapper(val project: Project): Idea
2524
descriptor: ExternalLibraryDescriptor,
2625
scope: DependencyScope
2726
): Promise<Void?>? {
28-
29-
val module = ContainerUtil.getFirstItem(modules) ?: return null
30-
if (!isAndroidGradleProject(module.project)) {
27+
if (!isAndroidGradleProject(project)) {
3128
return null
3229
}
3330

utbot-intellij/build.gradle.kts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,14 @@ intellij {
4949
"JavaScript"
5050
)
5151

52+
val mavenUtilsPlugins = listOf(
53+
"org.jetbrains.idea.maven"
54+
)
55+
5256
plugins.set(
5357
when (ideType) {
54-
"IC" -> jvmPlugins + pythonCommunityPlugins + androidPlugins
55-
"IU" -> jvmPlugins + pythonUltimatePlugins + jsPlugins + androidPlugins
58+
"IC" -> jvmPlugins + pythonCommunityPlugins + androidPlugins + mavenUtilsPlugins
59+
"IU" -> jvmPlugins + pythonUltimatePlugins + jsPlugins + androidPlugins + mavenUtilsPlugins
5660
"PC" -> pythonCommunityPlugins
5761
"PY" -> pythonUltimatePlugins // something else, JS?
5862
else -> jvmPlugins

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtProjectModelModifier.kt renamed to utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/util/UtIdeaProjectModelModifier.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,27 @@ import com.intellij.util.PathUtil
1717
import com.intellij.util.containers.ContainerUtil
1818
import org.jetbrains.concurrency.Promise
1919
import org.jetbrains.concurrency.resolvedPromise
20+
import org.jetbrains.idea.maven.project.MavenProjectsManager
2021
import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties
2122
import org.jetbrains.jps.model.library.JpsMavenRepositoryLibraryDescriptor
2223
import org.utbot.intellij.plugin.models.mavenCoordinates
2324
import org.utbot.intellij.plugin.ui.utils.isBuildWithGradle
2425

25-
class UtProjectModelModifier(val project: Project) : IdeaProjectModelModifier(project) {
26+
class UtIdeaProjectModelModifier(val project: Project) : IdeaProjectModelModifier(project) {
2627
override fun addExternalLibraryDependency(
2728
modules: Collection<Module>,
2829
descriptor: ExternalLibraryDescriptor,
2930
scope: DependencyScope
3031
): Promise<Void>? {
32+
if (project.isBuildWithGradle) {
33+
return null
34+
}
35+
for (module in modules) {
36+
if (MavenProjectsManager.getInstance(project).isMavenizedModule(module)) {
37+
return null
38+
}
39+
}
40+
3141
val defaultRoots = descriptor.libraryClassesRoots
3242
val firstModule = ContainerUtil.getFirstItem(modules) ?: return null
3343
val classesRoots = if (defaultRoots.isNotEmpty()) {
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
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+
}

utbot-intellij/src/main/resources/META-INF/plugin.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<name>UnitTestBot</name>
66
<vendor>utbot.org</vendor>
77
<depends>com.intellij.modules.platform</depends>
8+
<depends>org.jetbrains.idea.maven</depends>
89

910
<depends optional="true" config-file="withJava.xml">com.intellij.modules.java</depends>
1011
<depends optional="true" config-file="withKotlin.xml">org.jetbrains.kotlin</depends>
@@ -31,8 +32,9 @@
3132
<projectService serviceImplementation="org.utbot.intellij.plugin.settings.Settings" preload="true"/>
3233
<registryKey defaultValue="false" description="Enable editing Kotlin test files" key="kotlin.ultra.light.classes.empty.text.range"/>
3334
<postStartupActivity implementation="org.utbot.intellij.plugin.ui.GotItTooltipActivity"/>
34-
<projectModelModifier implementation="org.utbot.intellij.plugin.util.UtProjectModelModifier"/>
3535
<projectModelModifier implementation="org.androidstudio.plugin.util.UtAndroidGradleJavaProjectModelModifierWrapper" order="first"/>
36+
<projectModelModifier implementation="org.utbot.intellij.plugin.util.UtMavenProjectModelModifier" order="first"/>
37+
<projectModelModifier implementation="org.utbot.intellij.plugin.util.UtIdeaProjectModelModifier" order="first"/>
3638
<!--Documentation-->
3739
<customJavadocTagProvider implementation="org.utbot.intellij.plugin.javadoc.UtCustomJavaDocTagProvider"/>
3840
<lang.documentationProvider language="JAVA" order="first" implementationClass="org.utbot.intellij.plugin.javadoc.UtDocumentationProvider"/>

0 commit comments

Comments
 (0)