diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt index 05a1092d34c1..78db717c30a6 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/MavenSyncConsole.kt @@ -9,12 +9,16 @@ import com.intellij.build.events.EventResult import com.intellij.build.events.MessageEvent import com.intellij.build.events.MessageEventResult import com.intellij.build.events.impl.* +import com.intellij.build.issue.BuildIssue +import com.intellij.build.issue.BuildIssueQuickFix import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType import com.intellij.openapi.project.Project import com.intellij.openapi.util.registry.Registry import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.idea.maven.buildtool.quickfix.OpenMavenSettingsQuickFix +import org.jetbrains.idea.maven.buildtool.quickfix.UseBundledMavenQuickFix import org.jetbrains.idea.maven.execution.SyncBundle import org.jetbrains.idea.maven.server.MavenServerProgressIndicator import org.jetbrains.idea.maven.utils.MavenLog @@ -172,6 +176,7 @@ class MavenSyncConsole(private val myProject: Project) { completeTask(downloadString, downloadArtifactString, SuccessResultImpl(false)) } + @Synchronized private fun downloadEventFailed(keyPrefix: String, dependency: String, error: String, stackTrace: String?) = doIfImportInProcess{ val downloadString = SyncBundle.message("${keyPrefix}.download") @@ -201,6 +206,18 @@ class MavenSyncConsole(private val myProject: Project) { } } + @Synchronized + fun showQuickFixBadMaven(message: String, kind: MessageEvent.Kind) { + mySyncView.onEvent(mySyncId, BuildIssueEventImpl(mySyncId, object : BuildIssue { + override val title = "Bad maven version" + override val description: String = "${message}\n" + + "- Open Settings\n" + + "- Use Bundled\n" + + override val quickFixes: List = listOf(OpenMavenSettingsQuickFix(), UseBundledMavenQuickFix()) + }, kind)) + } + private fun isJavadocOrSource(dependency: String): Boolean { val split = dependency.split(':') if (split.size < 4) { @@ -215,7 +232,6 @@ class MavenSyncConsole(private val myProject: Project) { action.invoke() } - private inner class ArtifactSyncListenerImpl(val keyPrefix: String) : ArtifactSyncListener { override fun downloadStarted(dependency: String) { downloadEventStarted(keyPrefix, dependency) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/OpenMavenSettingsQuickFix.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/OpenMavenSettingsQuickFix.kt new file mode 100644 index 000000000000..d3ba01a26f7c --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/OpenMavenSettingsQuickFix.kt @@ -0,0 +1,25 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.idea.maven.buildtool.quickfix + +import com.intellij.build.issue.BuildIssueQuickFix +import com.intellij.openapi.actionSystem.DataProvider +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.options.ShowSettingsUtil +import com.intellij.openapi.project.Project +import org.jetbrains.idea.maven.utils.MavenSettings +import java.util.concurrent.CompletableFuture + +class OpenMavenSettingsQuickFix : BuildIssueQuickFix { + override val id: String = ID + + override fun runQuickFix(project: Project, dataProvider: DataProvider): CompletableFuture<*> { + ApplicationManager.getApplication().invokeLater { + ShowSettingsUtil.getInstance().showSettingsDialog(project, MavenSettings.DISPLAY_NAME) + } + return CompletableFuture.completedFuture(null) + } + + companion object { + const val ID = "open_maven_settings_quick_fix" + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/UseBundledMavenQuickFix.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/UseBundledMavenQuickFix.kt new file mode 100644 index 000000000000..e427a9410545 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/buildtool/quickfix/UseBundledMavenQuickFix.kt @@ -0,0 +1,33 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package org.jetbrains.idea.maven.buildtool.quickfix + +import com.intellij.build.issue.BuildIssueQuickFix +import com.intellij.ide.actions.ShowSettingsUtilImpl +import com.intellij.notification.Notification +import com.intellij.notification.NotificationType +import com.intellij.openapi.actionSystem.DataProvider +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.options.ShowSettingsUtil +import com.intellij.openapi.project.Project +import org.jetbrains.idea.maven.project.MavenGeneralSettings +import org.jetbrains.idea.maven.project.MavenWorkspaceSettings +import org.jetbrains.idea.maven.project.MavenWorkspaceSettingsComponent +import org.jetbrains.idea.maven.server.MavenServerManager +import org.jetbrains.idea.maven.utils.MavenSettings +import org.jetbrains.idea.maven.utils.MavenUtil +import java.util.concurrent.CompletableFuture + +class UseBundledMavenQuickFix: BuildIssueQuickFix { + override val id: String = ID + + override fun runQuickFix(project: Project, dataProvider: DataProvider): CompletableFuture<*> { + MavenWorkspaceSettingsComponent.getInstance(project).settings.generalSettings.mavenHome = MavenServerManager.BUNDLED_MAVEN_3 + Notification(MavenUtil.MAVEN_NOTIFICATION_GROUP, "", "Maven version changed to ${MavenServerManager.getInstance().currentMavenVersion}", NotificationType.INFORMATION).notify(null) + return CompletableFuture.completedFuture(null) + } + + companion object { + const val ID = "use_bundled_maven_quick_fix" + } + +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java index 5aadac9ecbe3..fd1df1e81f75 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java @@ -59,6 +59,7 @@ import org.jetbrains.idea.maven.importing.MavenProjectImporter; import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.project.MavenArtifactDownloader.DownloadResult; import org.jetbrains.idea.maven.server.MavenEmbedderWrapper; +import org.jetbrains.idea.maven.server.MavenServerManager; import org.jetbrains.idea.maven.server.MavenServerProgressIndicator; import org.jetbrains.idea.maven.server.NativeMavenProjectHolder; import org.jetbrains.idea.maven.utils.*; @@ -884,6 +885,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent public Promise> scheduleImportAndResolve(boolean fromAutoImport) { getSyncConsole().startImport(myProgressListener, fromAutoImport); + MavenServerManager.getInstance().showMavenNotifications(getSyncConsole()); MavenSyncConsole console = getSyncConsole(); AsyncPromise> promise = scheduleResolve(); promise.onProcessed(m -> { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java index 26fa7764eead..d386e55fe1f2 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenServerManager.java @@ -1,6 +1,7 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package org.jetbrains.idea.maven.server; +import com.intellij.build.events.MessageEvent; import com.intellij.execution.DefaultExecutionResult; import com.intellij.execution.ExecutionException; import com.intellij.execution.ExecutionResult; @@ -37,7 +38,6 @@ import com.intellij.util.EnvironmentUtil; import com.intellij.util.PathUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.io.BaseOutputReader; -import com.intellij.util.text.VersionComparatorUtil; import com.intellij.util.xmlb.Converter; import com.intellij.util.xmlb.annotations.Attribute; import gnu.trove.THashMap; @@ -48,9 +48,11 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; +import org.jetbrains.idea.maven.buildtool.MavenSyncConsole; import org.jetbrains.idea.maven.execution.MavenExecutionOptions; import org.jetbrains.idea.maven.execution.MavenRunnerSettings; import org.jetbrains.idea.maven.execution.RunnerBundle; +import org.jetbrains.idea.maven.execution.SyncBundle; import org.jetbrains.idea.maven.model.MavenExplicitProfiles; import org.jetbrains.idea.maven.model.MavenModel; import org.jetbrains.idea.maven.project.MavenGeneralSettings; @@ -100,6 +102,17 @@ public class MavenServerManager extends MavenRemoteObjectWrapper im private boolean myDownloadListenerExported; private State myState = new State(); + public void showMavenNotifications(MavenSyncConsole console) { + String mavenVersion = getCurrentMavenVersion(); + if (mavenVersion == null) { + console.showQuickFixBadMaven(SyncBundle.message("maven.sync.quickfixes.nomaven"), MessageEvent.Kind.ERROR); + } + + if (StringUtil.compareVersionNumbers(mavenVersion, "3.6.0") == 0) { + console.showQuickFixBadMaven(SyncBundle.message("maven.sync.quickfixes.maven360"), MessageEvent.Kind.WARNING); + } + } + private static class BundledMavenPathHolder { private static final File myBundledMaven2Home; private static final File myBundledMaven3Home; @@ -308,15 +321,6 @@ public class MavenServerManager extends MavenRemoteObjectWrapper im } } - private static void showNofificationIfMaven360(@NotNull String mavenVersion, @NotNull String sdkConfigLocation) { - if(StringUtil.compareVersionNumbers(mavenVersion, "3.6.0") == 0) { - new Notification(MavenUtil.MAVEN_NOTIFICATION_GROUP, "", - "You use Maven 3.6.0, there could be issues importing multimodule project.
" + - "It is recommended to upgrade or downgrade Maven version at
" + - sdkConfigLocation, - NotificationType.WARNING).notify(null); - } - } public static File getMavenEventListener() { return BundledMavenPathHolder.eventListenerJar; @@ -725,8 +729,6 @@ public class MavenServerManager extends MavenRemoteObjectWrapper im String sdkConfigLocation = "Settings | Build, Execution, Deployment | Build Tools | Maven | Importing | JDK for Importer"; verifyMavenSdkRequirements(jdk, mavenVersion, sdkConfigLocation); - showNofificationIfMaven360(mavenVersion,sdkConfigLocation); - final List classPath = new ArrayList<>(); classPath.add(PathUtil.getJarPathForClass(org.apache.log4j.Logger.class)); if (StringUtil.compareVersionNumbers(mavenVersion, "3.1") < 0) { diff --git a/plugins/maven/src/main/resources/SyncBundle.properties b/plugins/maven/src/main/resources/SyncBundle.properties index 5f1b969061ae..d9efcb7701ff 100644 --- a/plugins/maven/src/main/resources/SyncBundle.properties +++ b/plugins/maven/src/main/resources/SyncBundle.properties @@ -6,4 +6,7 @@ maven.sync.plugins.artifact.download=Downloading {0} maven.sync.dependencies.resolve=Resolve dependencies maven.sync.dependencies.resolve.error=Cannot resolve {0} maven.sync.dependencies.download=Downloading dependencies -maven.sync.dependencies.artifact.download=Downloading {0} \ No newline at end of file +maven.sync.dependencies.artifact.download=Downloading {0} + +maven.sync.quickfixes.nomaven=Maven version not defined +maven.sync.quickfixes.maven360=You use Maven 3.6.0, there could be issues importing multimodule project. It is recommended to upgrade or downgrade Maven version