From c0802407e42e82018f5f5a6b9a45f0197c0e62d2 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Wed, 7 Nov 2018 19:43:19 +0300 Subject: [PATCH] Report statistics for actions invoked from build tool windows (FUS-171) --- .../action/ExternalSystemActionUtil.java | 6 +- .../action/task/ExternalSystemTaskMenu.kt | 64 ++++++++++++++++++ .../ExternalSystemActionsCollector.kt | 48 +++++++++++--- .../view/ExternalProjectsViewImpl.java | 8 ++- .../view/RunConfigurationNode.java | 6 ++ .../src/idea/ExternalSystemActions.xml | 5 +- .../GradleActionsUsagesCollector.kt | 2 +- .../statistics/GradleSettingsCollector.kt | 6 +- .../navigator/MavenProjectsNavigator.java | 1 + .../MavenProjectsNavigatorPanel.java | 4 +- .../navigator/MavenProjectsStructure.java | 5 +- .../maven/navigator/actions/MavenBuildMenu.kt | 66 +++++++++++++++++++ .../statistics/MavenActionsUsagesCollector.kt | 28 ++++++-- .../idea/maven/utils/MavenUIUtil.java | 22 ++----- .../src/main/resources/META-INF/plugin.xml | 5 +- 15 files changed, 234 insertions(+), 42 deletions(-) create mode 100644 platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/task/ExternalSystemTaskMenu.kt create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenBuildMenu.kt diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/ExternalSystemActionUtil.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/ExternalSystemActionUtil.java index 98e11635097d..0f8d79008c24 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/ExternalSystemActionUtil.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/ExternalSystemActionUtil.java @@ -43,12 +43,16 @@ import java.util.*; public class ExternalSystemActionUtil { public static void executeAction(final String actionId, final InputEvent e) { + executeAction(actionId, "", e); + } + + public static void executeAction(final String actionId, @NotNull final String place, final InputEvent e) { final ActionManager actionManager = ActionManager.getInstance(); final AnAction action = actionManager.getAction(actionId); if (action != null) { final Presentation presentation = new Presentation(); final AnActionEvent event = - new AnActionEvent(e, DataManager.getInstance().getDataContext(e.getComponent()), "", presentation, actionManager, 0); + new AnActionEvent(e, DataManager.getInstance().getDataContext(e.getComponent()), place, presentation, actionManager, 0); action.update(event); if (presentation.isEnabled()) { action.actionPerformed(event); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/task/ExternalSystemTaskMenu.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/task/ExternalSystemTaskMenu.kt new file mode 100644 index 000000000000..ccf64753a860 --- /dev/null +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/task/ExternalSystemTaskMenu.kt @@ -0,0 +1,64 @@ +// Copyright 2000-2018 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 com.intellij.openapi.externalSystem.action.task + +import com.intellij.execution.Executor +import com.intellij.execution.ExecutorRegistry +import com.intellij.execution.actions.RunContextAction +import com.intellij.openapi.actionSystem.* +import com.intellij.openapi.externalSystem.model.ExternalSystemDataKeys +import com.intellij.openapi.externalSystem.statistics.ExternalSystemActionsCollector +import com.intellij.openapi.project.DumbAware + +class ExternalSystemTaskMenu : DefaultActionGroup(), DumbAware { + + override fun update(e: AnActionEvent) { + val project = AnAction.getEventProject(e) ?: return + + childActionsOrStubs + .filter { it is MyDelegatingAction } + .forEach { remove(it) } + + ExecutorRegistry.getInstance().registeredExecutors + .filter { it.isApplicable(project) } + .reversed() + .forEach { add(wrap(RunContextAction(it), it), Constraints.FIRST) } + } + + private interface MyDelegatingAction + + private class DelegatingActionGroup internal constructor(action: ActionGroup, private val executor: Executor) : + EmptyAction.MyDelegatingActionGroup(action), MyDelegatingAction { + + override fun getChildren(e: AnActionEvent?): Array { + val children = super.getChildren(e) + return children.map { wrap(it, executor) }.toTypedArray() + } + + override fun actionPerformed(e: AnActionEvent) { + reportUsage(e, executor) + super.actionPerformed(e) + } + } + + private class DelegatingAction internal constructor(action: AnAction, private val executor: Executor) : + EmptyAction.MyDelegatingAction(action), MyDelegatingAction { + + override fun actionPerformed(e: AnActionEvent) { + reportUsage(e, executor) + super.actionPerformed(e) + } + } + + companion object { + private fun wrap(action: AnAction, executor: Executor): AnAction = if (action is ActionGroup) DelegatingActionGroup(action, executor) + else DelegatingAction(action, executor) + + private fun reportUsage(e: AnActionEvent, executor: Executor) { + val project = e.project + val systemId = ExternalSystemDataKeys.EXTERNAL_SYSTEM_ID.getData(e.dataContext) + ExternalSystemActionsCollector.trigger(project, systemId, "RunExternalSystemTaskAction", e, executor.id) + } + } + + +} \ No newline at end of file diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/statistics/ExternalSystemActionsCollector.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/statistics/ExternalSystemActionsCollector.kt index 080e265d1770..2154a9960e34 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/statistics/ExternalSystemActionsCollector.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/statistics/ExternalSystemActionsCollector.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.externalSystem.model.ProjectSystemId import com.intellij.openapi.project.Project +import com.intellij.util.text.nullize class ExternalSystemActionsCollector : ProjectUsageTriggerCollector() { override fun getGroupId(): String { @@ -18,21 +19,52 @@ class ExternalSystemActionsCollector : ProjectUsageTriggerCollector() { companion object { @JvmStatic fun trigger(project: Project?, + fusClass: Class, systemId: ProjectSystemId?, - action: AnAction, - event: AnActionEvent?) { + featureId: String, + place: String?, + isFromContextMenu: Boolean, + vararg additionalContextData: String) { if (project == null) return // preserve context data ordering val context = FUSUsageContext.create( - "from.${event?.place ?: "undefined.place"}", - "fromContextMenu.${event?.isFromContextMenu?.toString() ?: "false"}", - systemId?.let { escapeSystemId(it) } ?: "undefined.system" + place.nullize() ?: "undefined place", + "fromContextMenu.$isFromContextMenu", + systemId?.let { escapeSystemId(it) } ?: "undefined.system", + *additionalContextData ) - FUSProjectUsageTrigger.getInstance(project).trigger( - ExternalSystemActionsCollector::class.java, - UsageDescriptorKeyValidator.ensureProperKey(action.javaClass.simpleName), context) + FUSProjectUsageTrigger.getInstance(project).trigger(fusClass, UsageDescriptorKeyValidator.ensureProperKey(featureId), context) + } + + @JvmStatic + fun trigger(project: Project?, + systemId: ProjectSystemId?, + featureId: String, + place: String?, + isFromContextMenu: Boolean, + vararg additionalContextData: String) { + trigger(project, ExternalSystemActionsCollector::class.java, systemId, featureId, place, isFromContextMenu, *additionalContextData) + } + + + @JvmStatic + fun trigger(project: Project?, + systemId: ProjectSystemId?, + action: AnAction, + event: AnActionEvent?, + vararg additionalContextData: String) { + trigger(project, systemId, action.javaClass.simpleName, event, *additionalContextData) + } + + @JvmStatic + fun trigger(project: Project?, + systemId: ProjectSystemId?, + featureId: String, + event: AnActionEvent?, + vararg additionalContextData: String) { + trigger(project, systemId, featureId, event?.place, event?.isFromContextMenu ?: false, *additionalContextData) } } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ExternalProjectsViewImpl.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ExternalProjectsViewImpl.java index d8999e31ae51..41c8bb7ffa28 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ExternalProjectsViewImpl.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ExternalProjectsViewImpl.java @@ -53,8 +53,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.tree.TreeSelectionModel; import java.awt.*; import java.awt.event.InputEvent; -import java.util.*; import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -103,6 +103,8 @@ public class ExternalProjectsViewImpl extends SimpleToolWindowPanel implements D .filter(c -> ProjectSystemId.IDE.equals(c.getSystemId()) || myExternalSystemId.equals(c.getSystemId())) .collect(Collectors.toList()); + + setName(myExternalSystemId.getReadableName() + " tool window"); } @Nullable @@ -257,7 +259,7 @@ public class ExternalProjectsViewImpl extends SimpleToolWindowPanel implements D @Override public void handleDoubleClickOrEnter(@NotNull ExternalSystemNode node, @Nullable String actionId, InputEvent inputEvent) { if (actionId != null) { - ExternalSystemActionUtil.executeAction(actionId, inputEvent); + ExternalSystemActionUtil.executeAction(actionId, getName(), inputEvent); } for (Listener listener : listeners) { listener.onDoubleClickOrEnter(node, inputEvent); @@ -315,7 +317,7 @@ public class ExternalProjectsViewImpl extends SimpleToolWindowPanel implements D if (id != null) { final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(id); if (actionGroup != null) { - actionManager.createActionPopupMenu("", actionGroup).getComponent().show(comp, x, y); + actionManager.createActionPopupMenu(ExternalProjectsViewImpl.this.getName(), actionGroup).getComponent().show(comp, x, y); } } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/RunConfigurationNode.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/RunConfigurationNode.java index 1e0176356eb5..3b148415cc8e 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/RunConfigurationNode.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/RunConfigurationNode.java @@ -23,12 +23,14 @@ import com.intellij.execution.impl.EditConfigurationsDialog; import com.intellij.ide.projectView.PresentationData; import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings; import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunConfiguration; +import com.intellij.openapi.externalSystem.statistics.ExternalSystemActionsCollector; import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.Navigatable; import com.intellij.ui.treeStructure.SimpleTree; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.awt.*; import java.awt.event.InputEvent; import static com.intellij.openapi.externalSystem.service.project.manage.ExternalSystemTaskActivator.getRunConfigurationActivationTaskName; @@ -98,6 +100,10 @@ public class RunConfigurationNode extends ExternalSystemNode { @Override public void handleDoubleClickOrEnter(SimpleTree tree, InputEvent inputEvent) { + ExternalProjectsView projectsView = getExternalProjectsView(); + String place = projectsView instanceof Component ? ((Component)projectsView).getName() : "unknown"; + ExternalSystemActionsCollector.trigger(myProject, projectsView.getSystemId(), + "ExecuteExternalSystemRunConfigurationAction", place, false); ProgramRunnerUtil.executeConfiguration(mySettings, DefaultRunExecutor.getRunExecutorInstance()); RunManager.getInstance(mySettings.getConfiguration().getProject()).setSelectedConfiguration(mySettings); } diff --git a/platform/platform-resources/src/idea/ExternalSystemActions.xml b/platform/platform-resources/src/idea/ExternalSystemActions.xml index df2c1c5c657e..2bc779001022 100644 --- a/platform/platform-resources/src/idea/ExternalSystemActions.xml +++ b/platform/platform-resources/src/idea/ExternalSystemActions.xml @@ -158,8 +158,9 @@ - - + + + diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/statistics/GradleActionsUsagesCollector.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/statistics/GradleActionsUsagesCollector.kt index 493a2d7755d2..da5d5a98f2d3 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/statistics/GradleActionsUsagesCollector.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/statistics/GradleActionsUsagesCollector.kt @@ -19,7 +19,7 @@ class GradleActionsUsagesCollector : ProjectUsageTriggerCollector() { // preserve context data ordering val context = FUSUsageContext.create( - "from.${event?.place ?: "undefined.place"}", + event?.place ?: "undefined.place", "fromContextMenu.${event?.isFromContextMenu?.toString() ?: "false"}" ) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/statistics/GradleSettingsCollector.kt b/plugins/gradle/src/org/jetbrains/plugins/gradle/statistics/GradleSettingsCollector.kt index 0f261b51686d..e880407908b2 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/statistics/GradleSettingsCollector.kt +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/statistics/GradleSettingsCollector.kt @@ -27,7 +27,7 @@ class GradleSettingsCollector : ProjectUsagesCollector() { // project settings for (setting in gradleSettings.linkedProjectsSettings) { - usages.add(getBooleanUsage("useCompositeBuilds", setting.compositeBuild != null)) + usages.add(getYesNoUsage("isCompositeBuilds", setting.compositeBuild != null)) usages.add(getEnumUsage("distributionType", setting.distributionType)) usages.add(getEnumUsage("storeProjectFilesExternally", setting.storeProjectFilesExternally)) usages.add(getBooleanUsage("disableWrapperSourceDistributionNotification", setting.isDisableWrapperSourceDistributionNotification)) @@ -42,4 +42,8 @@ class GradleSettingsCollector : ProjectUsagesCollector() { usages.add(getEnumUsage("preferredTestRunner", runningSettings.preferredTestRunner)) return usages } + + private fun getYesNoUsage(key: String, value: Boolean): UsageDescriptor { + return UsageDescriptor(key + if (value) ".yes" else ".no", 1) + } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java index af69caf1e366..195b209d6107 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java @@ -49,6 +49,7 @@ import java.util.List; public class MavenProjectsNavigator extends MavenSimpleProjectComponent implements PersistentStateComponent, Disposable, ProjectComponent { public static final String TOOL_WINDOW_ID = "Maven"; + public static final String TOOL_WINDOW_PLACE_ID = "Maven tool window"; private MavenProjectsNavigatorState myState = new MavenProjectsNavigatorState(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorPanel.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorPanel.java index 821c181f8ed1..ddb0cf9b7b91 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorPanel.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorPanel.java @@ -53,6 +53,8 @@ import java.io.File; import java.util.List; import java.util.*; +import static org.jetbrains.idea.maven.navigator.MavenProjectsNavigator.TOOL_WINDOW_PLACE_ID; + public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implements DataProvider { private final Project myProject; private final SimpleTree myTree; @@ -103,7 +105,7 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement if (id != null) { final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(id); if (actionGroup != null) { - actionManager.createActionPopupMenu("", actionGroup).getComponent().show(comp, x, y); + actionManager.createActionPopupMenu(TOOL_WINDOW_PLACE_ID, actionGroup).getComponent().show(comp, x, y); } } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java index b2e073480fa8..f3a855b01d90 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java @@ -44,6 +44,7 @@ import org.jetbrains.idea.maven.execution.MavenRunner; import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; +import org.jetbrains.idea.maven.statistics.MavenActionsUsagesCollector; import org.jetbrains.idea.maven.tasks.MavenShortcutsManager; import org.jetbrains.idea.maven.tasks.MavenTasksManager; import org.jetbrains.idea.maven.utils.*; @@ -57,6 +58,7 @@ import java.net.URL; import java.util.List; import java.util.*; +import static org.jetbrains.idea.maven.navigator.MavenProjectsNavigator.TOOL_WINDOW_PLACE_ID; import static org.jetbrains.idea.maven.project.ProjectBundle.message; public class MavenProjectsStructure extends SimpleTreeStructure { @@ -495,7 +497,7 @@ public class MavenProjectsStructure extends SimpleTreeStructure { public void handleDoubleClickOrEnter(SimpleTree tree, InputEvent inputEvent) { String actionId = getActionId(); if (actionId != null) { - MavenUIUtil.executeAction(actionId, inputEvent); + MavenUIUtil.executeAction(actionId, TOOL_WINDOW_PLACE_ID, inputEvent); } } } @@ -1524,6 +1526,7 @@ public class MavenProjectsStructure extends SimpleTreeStructure { @Override public void handleDoubleClickOrEnter(SimpleTree tree, InputEvent inputEvent) { + MavenActionsUsagesCollector.trigger(myProject, "ExecuteMavenRunConfigurationAction", TOOL_WINDOW_PLACE_ID, false); ProgramRunnerUtil.executeConfiguration(mySettings, DefaultRunExecutor.getRunExecutorInstance()); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenBuildMenu.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenBuildMenu.kt new file mode 100644 index 000000000000..65587f96dfec --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/actions/MavenBuildMenu.kt @@ -0,0 +1,66 @@ +// Copyright 2000-2018 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.navigator.actions + +import com.intellij.execution.Executor +import com.intellij.execution.ExecutorRegistry +import com.intellij.execution.actions.RunContextAction +import com.intellij.openapi.actionSystem.* +import com.intellij.openapi.project.DumbAware +import org.jetbrains.idea.maven.project.actions.RunBuildAction +import org.jetbrains.idea.maven.statistics.MavenActionsUsagesCollector + +class MavenBuildMenu : DefaultActionGroup(), DumbAware { + + override fun update(e: AnActionEvent) { + val project = AnAction.getEventProject(e) ?: return + + childActionsOrStubs + .filter { it is MyDelegatingAction || it is RunBuildAction } + .forEach { remove(it) } + + ExecutorRegistry.getInstance().registeredExecutors + .filter { it.isApplicable(project) } + .reversed() + .forEach { add(wrap(RunContextAction(it), it), Constraints.FIRST) } + + ActionManager.getInstance().getAction("Maven.RunBuild")?.let { + add(it, Constraints.FIRST) + } + } + + private interface MyDelegatingAction + + private class DelegatingActionGroup internal constructor(action: ActionGroup, private val executor: Executor) : + EmptyAction.MyDelegatingActionGroup(action), MyDelegatingAction { + + override fun getChildren(e: AnActionEvent?): Array { + val children = super.getChildren(e) + return children.map { wrap(it, executor) }.toTypedArray() + } + + override fun actionPerformed(e: AnActionEvent) { + reportUsage(e, executor) + super.actionPerformed(e) + } + } + + private class DelegatingAction internal constructor(action: AnAction, private val executor: Executor) : + EmptyAction.MyDelegatingAction(action), MyDelegatingAction { + + override fun actionPerformed(e: AnActionEvent) { + reportUsage(e, executor) + super.actionPerformed(e) + } + } + + companion object { + private fun wrap(action: AnAction, executor: Executor): AnAction = if (action is ActionGroup) DelegatingActionGroup(action, executor) + else DelegatingAction(action, executor) + + private fun reportUsage(e: AnActionEvent, executor: Executor) { + MavenActionsUsagesCollector.trigger(e.project, "RunBuildAction", e, executor.id) + } + } + + +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/statistics/MavenActionsUsagesCollector.kt b/plugins/maven/src/main/java/org/jetbrains/idea/maven/statistics/MavenActionsUsagesCollector.kt index 70882c1954b9..254396b56910 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/statistics/MavenActionsUsagesCollector.kt +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/statistics/MavenActionsUsagesCollector.kt @@ -8,22 +8,40 @@ import com.intellij.internal.statistic.service.fus.collectors.UsageDescriptorKey import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.project.Project +import com.intellij.util.text.nullize class MavenActionsUsagesCollector : ProjectUsageTriggerCollector() { override fun getGroupId() = "statistics.build.maven.actions" companion object { + @JvmStatic - fun trigger(project: Project?, action: AnAction, event: AnActionEvent?) { + fun trigger(project: Project?, + featureId: String, + place: String?, + isFromContextMenu: Boolean, + vararg additionalContextData: String) { if (project == null) return // preserve context data ordering val context = FUSUsageContext.create( - "from.${event?.place ?: "undefined.place"}", - "fromContextMenu.${event?.isFromContextMenu?.toString() ?: "false"}" + place.nullize() ?: "undefined place", + "fromContextMenu.$isFromContextMenu", + *additionalContextData ) - val actionClassName = UsageDescriptorKeyValidator.ensureProperKey(action.javaClass.simpleName) - FUSProjectUsageTrigger.getInstance(project).trigger(MavenActionsUsagesCollector::class.java, actionClassName, context) + + FUSProjectUsageTrigger.getInstance(project).trigger(MavenActionsUsagesCollector::class.java, + UsageDescriptorKeyValidator.ensureProperKey(featureId), context) + } + + @JvmStatic + fun trigger(project: Project?, action: AnAction, event: AnActionEvent?, vararg additionalContextData: String) { + trigger(project, action.javaClass.simpleName, event?.place, event?.isFromContextMenu ?: false, *additionalContextData) + } + + @JvmStatic + fun trigger(project: Project?, featureId: String, event: AnActionEvent?, vararg additionalContextData: String) { + trigger(project, featureId, event?.place, event?.isFromContextMenu ?: false, *additionalContextData) } @JvmStatic diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUIUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUIUtil.java index 976636b0738e..8a631d9ab154 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUIUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUIUtil.java @@ -15,12 +15,8 @@ */ package org.jetbrains.idea.maven.utils; -import com.intellij.ide.DataManager; import com.intellij.ide.util.ElementsChooser; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.externalSystem.action.ExternalSystemActionUtil; import com.intellij.ui.treeStructure.SimpleTree; import com.intellij.util.ui.UIUtil; @@ -37,17 +33,11 @@ import java.util.TreeSet; public class MavenUIUtil { public static void executeAction(final String actionId, final InputEvent e) { - final ActionManager actionManager = ActionManager.getInstance(); - final AnAction action = actionManager.getAction(actionId); - if (action != null) { - final Presentation presentation = new Presentation(); - final AnActionEvent event = - new AnActionEvent(e, DataManager.getInstance().getDataContext(e.getComponent()), "", presentation, actionManager, 0); - action.update(event); - if (presentation.isEnabled()) { - action.actionPerformed(event); - } - } + executeAction(actionId, "", e); + } + + public static void executeAction(final String actionId, final String place, final InputEvent e) { + ExternalSystemActionUtil.executeAction(actionId, place, e); } public static void setElements(ElementsChooser chooser, Collection all, Collection selected, Comparator comparator) { diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index 29664429d646..2c93c575ae21 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -602,9 +602,8 @@ - - - + +