diff --git a/platform/lang-impl/src/com/intellij/build/issue/quickfix/OpenFileQuickFix.kt b/platform/lang-impl/src/com/intellij/build/issue/quickfix/OpenFileQuickFix.kt index 5587173650a6..0fb8298bafa2 100644 --- a/platform/lang-impl/src/com/intellij/build/issue/quickfix/OpenFileQuickFix.kt +++ b/platform/lang-impl/src/com/intellij/build/issue/quickfix/OpenFileQuickFix.kt @@ -7,7 +7,6 @@ import com.intellij.codeInsight.highlighting.HighlightUsagesHandler import com.intellij.find.FindManager import com.intellij.find.FindModel import com.intellij.openapi.actionSystem.DataContext -import com.intellij.openapi.actionSystem.DataProvider import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.editor.colors.EditorColors import com.intellij.openapi.fileEditor.FileEditorManager @@ -41,6 +40,7 @@ class OpenFileQuickFix(private val path: Path, private val search: String?) : Bu } companion object { + @JvmStatic fun showFile(project: Project, path: Path, search: String?) { ApplicationManager.getApplication().invokeLater { val file = VfsUtil.findFileByIoFile(path.toFile(), false) ?: return@invokeLater diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java index 10e1a7577df8..143f3c3e4d1a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java @@ -103,7 +103,8 @@ public final class MavenExternalParameters { Sdk jdk = getJdk(project, runnerSettings, project != null && MavenRunner.getInstance(project).getState() == runnerSettings); params.setJdk(jdk); - final String mavenHome = resolveMavenHome(coreSettings, project, runConfiguration); + File mavenWrapperFile = getMavenWrapper(project, parameters.getWorkingDirPath(), coreSettings); + final String mavenHome = resolveMavenHome(coreSettings, project, runConfiguration, mavenWrapperFile); final String mavenVersion = MavenUtil.getMavenVersion(mavenHome); if(mavenVersion == null) { throw new ExecutionException(MavenProjectBundle.message("dialog.message.maven.home.directory.invalid", mavenHome)); @@ -162,6 +163,14 @@ public final class MavenExternalParameters { return params; } + @Nullable + private static File getMavenWrapper(@Nullable Project project, + @NotNull String workingDirPath, + @NotNull MavenGeneralSettings coreSettings) { + return (project != null && MavenUtil.isWrapper(coreSettings)) + ? MavenDistributionsCache.getInstance(project).getMavenDistribution(workingDirPath).getMavenHome() : null; + } + static @Nullable String getRunVmOptions(@Nullable MavenRunnerSettings runnerSettings, @Nullable Project project, @NotNull String workingDirPath) { @@ -438,7 +447,7 @@ public final class MavenExternalParameters { @NotNull public static String resolveMavenHome(@NotNull MavenGeneralSettings coreSettings) throws ExecutionException { - return resolveMavenHome(coreSettings, null, null); + return resolveMavenHome(coreSettings, null, null, null); } /** @@ -452,8 +461,9 @@ public final class MavenExternalParameters { @NlsSafe public static String resolveMavenHome(@NotNull MavenGeneralSettings coreSettings, @Nullable Project project, - @Nullable MavenRunConfiguration runConfiguration) throws ExecutionException { - final File file = MavenUtil.resolveMavenHomeDirectory(coreSettings.getMavenHome()); + @Nullable MavenRunConfiguration runConfiguration, + @Nullable File mavenWrapperFile) throws ExecutionException { + final File file = mavenWrapperFile != null ? mavenWrapperFile : MavenUtil.resolveMavenHomeDirectory(coreSettings.getMavenHome()); if (file == null) { throw createExecutionException(RunnerBundle.message("external.maven.home.no.default"), diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfigurationType.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfigurationType.java index c0a4490fcb11..e4d5bd373e89 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfigurationType.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunConfigurationType.java @@ -19,8 +19,6 @@ import com.intellij.openapi.util.NlsSafe; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.ObjectUtils; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -218,7 +216,7 @@ public final class MavenRunConfigurationType implements ConfigurationType { runConfiguration.setBeforeRunTasks(Collections.emptyList()); } MavenGeneralSettings generalSettingsToRun = - generalSettings != null ? generalSettings : MavenWorkspaceSettingsComponent.getInstance(project).getSettings().generalSettings; + generalSettings != null ? generalSettings : MavenWorkspaceSettingsComponent.getInstance(project).getSettings().getGeneralSettings(); runConfiguration.setRunnerParameters(params); runConfiguration.setGeneralSettings(generalSettingsToRun); MavenRunnerSettings runnerSettingsToRun = diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/RunBuildAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/RunBuildAction.java index 7c346f3388ed..319362b13861 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/RunBuildAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/RunBuildAction.java @@ -17,6 +17,7 @@ package org.jetbrains.idea.maven.project.actions; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.execution.MavenRunConfigurationType; @@ -24,7 +25,10 @@ import org.jetbrains.idea.maven.execution.MavenRunnerParameters; import org.jetbrains.idea.maven.model.MavenExplicitProfiles; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; +import org.jetbrains.idea.maven.project.MavenWorkspaceSettingsComponent; +import org.jetbrains.idea.maven.server.MavenDistributionsCache; import org.jetbrains.idea.maven.utils.MavenDataKeys; +import org.jetbrains.idea.maven.utils.MavenUtil; import org.jetbrains.idea.maven.utils.actions.MavenAction; import org.jetbrains.idea.maven.utils.actions.MavenActionUtil; @@ -62,9 +66,23 @@ public class RunBuildAction extends MavenAction { explicitProfiles.getEnabledProfiles(), explicitProfiles.getDisabledProfiles()); - MavenRunConfigurationType.runConfiguration(project, params, null); - - + boolean needDownloadWrapper = needDownloadWrapper(project, mavenProject.getDirectory()); + if (needDownloadWrapper) { + ApplicationManager.getApplication().executeOnPooledThread(() -> { + MavenDistributionsCache.getInstance(project).checkOrInstallMavenWrapper(mavenProject.getDirectory()); + MavenRunConfigurationType.runConfiguration(project, params, null); + }); + } else { + MavenRunConfigurationType.runConfiguration(project, params, null); + } return true; } -} + + private static boolean needDownloadWrapper(@NotNull Project project, @NotNull String workinDir) { + if (MavenUtil.isWrapper(MavenWorkspaceSettingsComponent.getInstance(project).getSettings().getGeneralSettings())) { + MavenDistributionsCache instance = MavenDistributionsCache.getInstance(project); + return instance.getWrapper(workinDir) == null; + } + return false; + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenDistributionsCache.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenDistributionsCache.java index e5b025b26409..027980c88e63 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenDistributionsCache.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenDistributionsCache.java @@ -18,7 +18,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.buildtool.MavenSyncConsole; import org.jetbrains.idea.maven.execution.MavenExternalParameters; import org.jetbrains.idea.maven.execution.SyncBundle; -import org.jetbrains.idea.maven.project.MavenProjectBundle; import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.project.MavenWorkspaceSettings; import org.jetbrains.idea.maven.project.MavenWorkspaceSettingsComponent; @@ -92,6 +91,12 @@ public class MavenDistributionsCache { return (distributionUrl == null) ? resolveEmbeddedMavenHome() : getMavenWrapper(distributionUrl); } + public @Nullable MavenDistribution getWrapper(@NotNull String workingDirectory) { + String multiModuleDir = myWorkingDirToMultimoduleMap.computeIfAbsent(workingDirectory, this::resolveMultimoduleDirectory); + String distributionUrl = getWrapperDistributionUrl(multiModuleDir); + return (distributionUrl != null) ? MavenWrapperSupport.getCurrentDistribution(distributionUrl) : null; + } + private static MavenDistribution getMavenWrapper(String distributionUrl) { MavenDistribution distribution = MavenWrapperSupport.getCurrentDistribution(distributionUrl); if (distribution == null) { @@ -105,7 +110,10 @@ public class MavenDistributionsCache { String multiModuleDir = getMultimoduleDirectory(workingDir); String distributionUrl = getWrapperDistributionUrl(multiModuleDir); - if (distributionUrl == null) return; + if (distributionUrl == null) { + MavenWrapperEventLogNotification.noDistributionUrlEvent(myProject, multiModuleDir); + return; + } MavenDistribution distribution = MavenWrapperSupport.getCurrentDistribution(distributionUrl); if (distribution != null) return; @@ -114,6 +122,7 @@ public class MavenDistributionsCache { MavenSyncConsole console = MavenProjectsManager.getInstance(myProject).getSyncConsole(); console.startWrapperResolving(); + MavenWrapperEventLogNotification.informationEvent(myProject, SyncBundle.message("maven.wrapper.notification.downloading.start")); Task.Backgroundable task = getTaskInfo(); BackgroundableProcessIndicator indicator = console.progressIndicatorForWrapper(myProject, task); try { @@ -123,10 +132,12 @@ public class MavenDistributionsCache { } myMultimoduleDirToWrapperedMavenDistributionsMap.put(multiModuleDir, distribution); console.finishWrapperResolving(null); + MavenWrapperEventLogNotification.informationEvent(myProject, SyncBundle.message("maven.wrapper.notification.downloading.finish")); } catch (Exception e) { LOG.warn("error install wrapper", e); console.finishWrapperResolving(e); + MavenWrapperEventLogNotification.errorDownloading(myProject, e.getLocalizedMessage()); MavenWorkspaceSettings settings = MavenWorkspaceSettingsComponent.getInstance(myProject).getSettings(); settings.getGeneralSettings().setMavenHome(MavenServerManager.BUNDLED_MAVEN_3); } finally { @@ -136,7 +147,7 @@ public class MavenDistributionsCache { } @NotNull - private Task.Backgroundable getTaskInfo() { + private static Task.Backgroundable getTaskInfo() { return new Task.Backgroundable(null, SyncBundle.message("maven.sync.wrapper.downloading")) { @Override public void run(@NotNull ProgressIndicator indicator) { } @@ -208,7 +219,6 @@ public class MavenDistributionsCache { private boolean useWrapper() { MavenWorkspaceSettings settings = MavenWorkspaceSettingsComponent.getInstance(myProject).getSettings(); - return MavenServerManager.WRAPPED_MAVEN.equals(settings.getGeneralSettings().getMavenHome()) || - StringUtil.equals(settings.getGeneralSettings().getMavenHome(), MavenProjectBundle.message("maven.wrapper.version.title")); + return MavenUtil.isWrapper(settings.getGeneralSettings()); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenWrapperEventLogNotification.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenWrapperEventLogNotification.kt new file mode 100644 index 000000000000..9b89d62113c4 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenWrapperEventLogNotification.kt @@ -0,0 +1,99 @@ +// Copyright 2000-2021 JetBrains s.r.o. and contributors. 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.issue.quickfix.OpenFileQuickFix.Companion.showFile +import com.intellij.notification.NotificationAction +import com.intellij.notification.NotificationGroup +import com.intellij.notification.NotificationGroupManager +import com.intellij.notification.NotificationType +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.options.ShowSettingsUtil +import com.intellij.openapi.project.Project +import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.openapi.vfs.VirtualFile +import org.jetbrains.annotations.Nls +import org.jetbrains.idea.maven.execution.SyncBundle.message +import org.jetbrains.idea.maven.project.MavenProjectBundle +import org.jetbrains.idea.maven.server.MavenWrapperSupport.Companion.getWrapperProperties + +class MavenWrapperEventLogNotification { + companion object { + @JvmStatic + fun noDistributionUrlEvent(project: Project, multiModuleDir: String) { + val notificationGroup = NotificationGroupManager.getInstance().getNotificationGroup("Maven") ?: return + ApplicationManager.getApplication().invokeLater { + val wrapperPropertyFile = LocalFileSystem.getInstance().findFileByPath(multiModuleDir)?.let { getWrapperProperties(it) } + if (wrapperPropertyFile == null) { + wrapperPropertyFileNotFound(notificationGroup, project) + } + else { + distributionUrlEmpty(notificationGroup, project, wrapperPropertyFile) + } + } + } + + @JvmStatic + fun informationEvent(project: Project, @Nls content: String) { + val notificationGroup = NotificationGroupManager.getInstance().getNotificationGroup("Maven") ?: return + ApplicationManager.getApplication().invokeLater { + notificationGroup + .createNotification( + message("maven.wrapper.notification.title"), content, NotificationType.INFORMATION + ) + .notify(project) + } + } + + @JvmStatic + fun errorDownloading(project: Project, error: String) { + val notificationGroup = NotificationGroupManager.getInstance().getNotificationGroup("Maven") ?: return + ApplicationManager.getApplication().invokeLater { + notificationGroup + .createNotification( + message("maven.wrapper.notification.title"), + message("maven.wrapper.notification.downloading.error.content", error), + NotificationType.ERROR + ) + .addAction(NotificationAction.createSimple(message("maven.wrapper.notification.downloading.error.action")) { + ShowSettingsUtil.getInstance().showSettingsDialog(project, + MavenProjectBundle.message("configurable.MavenSettings.display.name")) + }) + .notify(project) + } + } + + private fun wrapperPropertyFileNotFound(notificationGroup: NotificationGroup, + project: Project) { + notificationGroup + .createNotification( + message("maven.wrapper.notification.title"), + message("maven.wrapper.notification.empty.url.contant.file.not.found"), + NotificationType.WARNING + ) + .addAction(NotificationAction.createSimple(message("maven.wrapper.notification.empty.url.action.disable")) { + ShowSettingsUtil.getInstance().showSettingsDialog(project, + MavenProjectBundle.message("configurable.MavenSettings.display.name")) + }) + .notify(project) + } + + private fun distributionUrlEmpty(notificationGroup: NotificationGroup, + project: Project, + wrapperPropertyFile: VirtualFile) { + notificationGroup + .createNotification( + message("maven.wrapper.notification.title"), + message("maven.wrapper.notification.empty.url.content"), + NotificationType.WARNING + ) + .addAction(NotificationAction.createSimple(message("maven.wrapper.notification.empty.url.action.check")) { + showFile(project, wrapperPropertyFile.toNioPath(), null) + }) + .addAction(NotificationAction.createSimple(message("maven.wrapper.notification.empty.url.action.disable")) { + ShowSettingsUtil.getInstance().showSettingsDialog(project, + MavenProjectBundle.message("configurable.MavenSettings.display.name")) + }) + .notify(project) + } + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenWrapperSupport.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenWrapperSupport.kt index c954d35be185..9f3b5ed39928 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenWrapperSupport.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenWrapperSupport.kt @@ -213,7 +213,8 @@ internal class MavenWrapperSupport { return null } - private fun getWrapperProperties(baseDir: VirtualFile?) = + @JvmStatic + fun getWrapperProperties(baseDir: VirtualFile?) = baseDir?.findChild(".mvn")?.findChild("wrapper")?.findChild("maven-wrapper.properties") } } \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/statistics/MavenSettingsCollector.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/statistics/MavenSettingsCollector.kt index cd49e5b553e2..2daf03f19fbc 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/statistics/MavenSettingsCollector.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/statistics/MavenSettingsCollector.kt @@ -13,7 +13,9 @@ import org.jetbrains.idea.maven.execution.MavenExternalParameters.resolveMavenHo import org.jetbrains.idea.maven.execution.MavenRunner import org.jetbrains.idea.maven.project.MavenImportingSettings import org.jetbrains.idea.maven.project.MavenProjectsManager +import org.jetbrains.idea.maven.server.MavenDistributionsCache import org.jetbrains.idea.maven.utils.MavenUtil +import java.io.File class MavenSettingsCollector : ProjectUsagesCollector() { override fun getGroupId() = "build.maven.state" @@ -41,7 +43,8 @@ class MavenSettingsCollector : ProjectUsagesCollector() { @Suppress("DEPRECATION") usages.add(newMetric("loggingLevel", generalSettings.loggingLevel)) try { - var mavenVersion = MavenUtil.getMavenVersion(resolveMavenHome(generalSettings, project, null)) + val mavenWrapperFile = getMavenWrapper(manager, project) + var mavenVersion = MavenUtil.getMavenVersion(resolveMavenHome(generalSettings, project, null, mavenWrapperFile)) mavenVersion = mavenVersion?.let { Version.parseVersion(it)?.toCompactString() } ?: "unknown" usages.add(newMetric("mavenVersion", mavenVersion)) } @@ -93,4 +96,10 @@ class MavenSettingsCollector : ProjectUsagesCollector() { usages.add(newBooleanMetric("hasRunnerMavenProperties", !runnerSettings.mavenProperties.isNullOrEmpty())) return usages } + + private fun getMavenWrapper(manager: MavenProjectsManager, + project: Project): File? { + return if (manager.rootProjects.size == 1) + MavenDistributionsCache.getInstance(project).getWrapper(manager.rootProjects.first().directory)?.mavenHome else null + } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java index 7300e18fafe7..6e0e90bc7f8a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java @@ -72,9 +72,7 @@ import org.jetbrains.idea.maven.execution.MavenRunnerSettings; import org.jetbrains.idea.maven.execution.SyncBundle; import org.jetbrains.idea.maven.externalSystemIntegration.output.importproject.quickfixes.CleanBrokenArtifactsAndReimportQuickFix; import org.jetbrains.idea.maven.model.*; -import org.jetbrains.idea.maven.project.MavenProject; -import org.jetbrains.idea.maven.project.MavenProjectReaderResult; -import org.jetbrains.idea.maven.project.MavenProjectsManager; +import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.server.*; import org.jetbrains.idea.maven.wizards.MavenProjectBuilder; import org.xml.sax.Attributes; @@ -1473,4 +1471,9 @@ public class MavenUtil { MavenPlugin plugin = mavenProject.findPlugin("org.apache.maven.plugins", "maven-compiler-plugin"); return plugin != null ? plugin.getVersion() : StringUtils.EMPTY; } + + public static boolean isWrapper(@NotNull MavenGeneralSettings settings) { + return MavenServerManager.WRAPPED_MAVEN.equals(settings.getMavenHome()) || + StringUtil.equals(settings.getMavenHome(), MavenProjectBundle.message("maven.wrapper.version.title")); + } } diff --git a/plugins/maven/src/main/resources/messages/MavenSyncBundle.properties b/plugins/maven/src/main/resources/messages/MavenSyncBundle.properties index f6d0ba03e5ed..514bbb7a1ad1 100644 --- a/plugins/maven/src/main/resources/messages/MavenSyncBundle.properties +++ b/plugins/maven/src/main/resources/messages/MavenSyncBundle.properties @@ -54,6 +54,15 @@ maven.sync.wrapper.downloading.from=Downloading Maven wrapper from {0} maven.sync.wrapper.downloading.progress=Downloading Maven wrapper {0}/{1}% maven.sync.wrapper.downloading=Downloading Maven wrapper maven.sync.wrapper.downloading.canceled=Downloading Maven wrapper was canceled +maven.wrapper.notification.title=Maven wrapper +maven.wrapper.notification.empty.url.content=DistributionUrl is empty. The Maven bundled version will be used instead. +maven.wrapper.notification.empty.url.action.check=Check your distribution url. +maven.wrapper.notification.empty.url.action.disable=Disable maven wrapper in settings. +maven.wrapper.notification.empty.url.contant.file.not.found=File .mvn/wrapper/maven-wrapper.properties not found. The Maven bundled version will be used instead. +maven.wrapper.notification.downloading.start=Start downloading. Please wait. +maven.wrapper.notification.downloading.finish=Successfully installed. +maven.wrapper.notification.downloading.error.content={0}
The Maven wrapper was disabled. The Maven bundled version will be used instead. +maven.wrapper.notification.downloading.error.action=Enable back Maven wrapper in settings/ build.event.title.error=Error build.event.title.internal.server.error=Maven Server Error importing.jdk.changed=JDK for importer was changed