1
+ package org.utbot.intellij.plugin.util
2
+
3
+ import com.intellij.codeInsight.daemon.impl.quickfix.LocateLibraryDialog
4
+ import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix
5
+ import com.intellij.ide.JavaUiBundle
6
+ import com.intellij.jarRepository.JarRepositoryManager
7
+ import com.intellij.openapi.application.WriteAction
8
+ import com.intellij.openapi.module.Module
9
+ import com.intellij.openapi.project.Project
10
+ import com.intellij.openapi.roots.DependencyScope
11
+ import com.intellij.openapi.roots.ExternalLibraryDescriptor
12
+ import com.intellij.openapi.roots.ModuleRootModificationUtil
13
+ import com.intellij.openapi.roots.OrderRootType
14
+ import com.intellij.openapi.roots.impl.IdeaProjectModelModifier
15
+ import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar
16
+ import com.intellij.openapi.roots.libraries.LibraryUtil
17
+ import com.intellij.openapi.roots.libraries.ui.OrderRoot
18
+ import com.intellij.openapi.ui.Messages
19
+ import com.intellij.util.PathUtil
20
+ import com.intellij.util.containers.ContainerUtil
21
+ import java.util.stream.Collectors
22
+ import org.jetbrains.concurrency.Promise
23
+ import org.jetbrains.concurrency.rejectedPromise
24
+ import org.jetbrains.concurrency.resolvedPromise
25
+ import org.jetbrains.idea.maven.utils.library.RepositoryLibraryDescription
26
+ import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties
27
+ import org.jetbrains.jps.model.library.JpsMavenRepositoryLibraryDescriptor
28
+
29
+ class UtProjectModelModifier (val project : Project ) : IdeaProjectModelModifier(project) {
30
+ override fun addExternalLibraryDependency (
31
+ modules : Collection <Module ?>,
32
+ descriptor : ExternalLibraryDescriptor ,
33
+ scope : DependencyScope
34
+ ): Promise <Void > {
35
+ val defaultRoots = descriptor.libraryClassesRoots
36
+ val classesRoots: List <String ?>
37
+ val firstModule = ContainerUtil .getFirstItem(modules)
38
+ classesRoots = if (defaultRoots.isNotEmpty()) {
39
+ LocateLibraryDialog (firstModule!! , defaultRoots, descriptor.presentableName).showAndGetResult()
40
+ } else {
41
+ val version = descriptor.preferredVersion
42
+ val mavenCoordinates = descriptor.libraryGroupId + " :" +
43
+ descriptor.libraryArtifactId + " :" +
44
+ (version ? : RepositoryLibraryDescription .ReleaseVersionId )
45
+
46
+ val libraryProperties = RepositoryLibraryProperties (JpsMavenRepositoryLibraryDescriptor (mavenCoordinates))
47
+ val roots = JarRepositoryManager .loadDependenciesModal(
48
+ project,
49
+ libraryProperties,
50
+ false ,
51
+ false ,
52
+ null ,
53
+ null
54
+ )
55
+ if (roots.isEmpty()) {
56
+ @Suppress(" SpellCheckingInspection" )
57
+ Messages .showErrorDialog(
58
+ project, JavaUiBundle .message(" dialog.mesage.0.was.not.loaded" , descriptor.presentableName),
59
+ JavaUiBundle .message(" dialog.title.failed.to.download.library" )
60
+ )
61
+ return rejectedPromise()
62
+ }
63
+ roots.stream()
64
+ .filter { root: OrderRoot -> root.type == = OrderRootType .CLASSES }
65
+ .map { root: OrderRoot ->
66
+ PathUtil .getLocalPath(
67
+ root.file
68
+ )
69
+ }
70
+ .collect(Collectors .toList())
71
+ }
72
+ if (classesRoots.isNotEmpty()) {
73
+ val libraryName = if (classesRoots.size > 1 ) descriptor.presentableName else null
74
+ val urls = OrderEntryFix .refreshAndConvertToUrls(classesRoots)
75
+ if (modules.size == 1 ) {
76
+ ModuleRootModificationUtil .addModuleLibrary(firstModule!! , libraryName, urls, emptyList(), scope)
77
+ } else {
78
+ WriteAction .run<RuntimeException > {
79
+ val library =
80
+ LibraryUtil .createLibrary(
81
+ LibraryTablesRegistrar .getInstance().getLibraryTable(project), descriptor.presentableName
82
+ )
83
+ val model = library.modifiableModel
84
+ for (url in urls) {
85
+ model.addRoot(url!! , OrderRootType .CLASSES )
86
+ }
87
+ model.commit()
88
+ for (module in modules) {
89
+ ModuleRootModificationUtil .addDependency(module!! , library, scope, false )
90
+ }
91
+ }
92
+ }
93
+ }
94
+ return resolvedPromise()
95
+ }
96
+ }
0 commit comments