2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org
.jetbrains
.idea
.maven
.tasks
;
18 import com
.intellij
.execution
.ExecutionException
;
19 import com
.intellij
.openapi
.actionSystem
.ActionManager
;
20 import com
.intellij
.openapi
.actionSystem
.AnAction
;
21 import com
.intellij
.openapi
.actionSystem
.AnActionEvent
;
22 import com
.intellij
.openapi
.actionSystem
.Presentation
;
23 import com
.intellij
.openapi
.keymap
.KeymapExtension
;
24 import com
.intellij
.openapi
.keymap
.KeymapGroup
;
25 import com
.intellij
.openapi
.keymap
.KeymapGroupFactory
;
26 import com
.intellij
.openapi
.project
.Project
;
27 import com
.intellij
.openapi
.util
.Condition
;
28 import com
.intellij
.openapi
.util
.Pair
;
29 import org
.jetbrains
.annotations
.TestOnly
;
30 import org
.jetbrains
.idea
.maven
.embedder
.MavenEmbedderFactory
;
31 import org
.jetbrains
.idea
.maven
.project
.MavenPlugin
;
32 import org
.jetbrains
.idea
.maven
.project
.MavenProject
;
33 import org
.jetbrains
.idea
.maven
.project
.MavenProjectsManager
;
34 import org
.jetbrains
.idea
.maven
.execution
.MavenRunConfigurationType
;
35 import org
.jetbrains
.idea
.maven
.execution
.MavenRunnerParameters
;
36 import org
.jetbrains
.idea
.maven
.utils
.actions
.MavenAction
;
37 import org
.jetbrains
.idea
.maven
.utils
.actions
.MavenActionUtil
;
38 import org
.jetbrains
.idea
.maven
.utils
.MavenArtifactUtil
;
39 import org
.jetbrains
.idea
.maven
.utils
.MavenLog
;
40 import org
.jetbrains
.idea
.maven
.utils
.MavenPluginInfo
;
41 import org
.jetbrains
.idea
.maven
.utils
.MavenIcons
;
46 public class MavenKeymapExtension
implements KeymapExtension
{
47 public KeymapGroup
createGroup(Condition
<AnAction
> condition
, Project project
) {
48 KeymapGroup result
= KeymapGroupFactory
.getInstance().createGroup(TasksBundle
.message("maven.tasks.action.group.name"),
49 MavenIcons
.OPEN_PHASES_ICON
,
50 MavenIcons
.CLOSED_PHASES_ICON
);
51 if (project
== null) return result
;
53 Comparator
<MavenProject
> projectComparator
= new Comparator
<MavenProject
>() {
54 public int compare(MavenProject o1
, MavenProject o2
) {
55 return o1
.getDisplayName().compareToIgnoreCase(o2
.getDisplayName());
58 Map
<MavenProject
, Set
<Pair
<String
, String
>>> projectToActionsMapping
59 = new TreeMap
<MavenProject
, Set
<Pair
<String
, String
>>>(projectComparator
);
61 ActionManager actionManager
= ActionManager
.getInstance();
62 for (String eachId
: actionManager
.getActionIds(getActionPrefix(project
, null))) {
63 AnAction eachAction
= actionManager
.getAction(eachId
);
65 if (!(eachAction
instanceof MavenGoalAction
)) continue;
66 if (condition
!= null && !condition
.value(actionManager
.getActionOrStub(eachId
))) continue;
68 MavenGoalAction mavenAction
= (MavenGoalAction
)eachAction
;
69 MavenProject mavenProject
= mavenAction
.getMavenProject();
70 Set
<Pair
<String
, String
>> actions
= projectToActionsMapping
.get(mavenProject
);
71 if (actions
== null) {
72 final List
<String
> projectGoals
= collectGoals(mavenProject
);
73 actions
= new TreeSet
<Pair
<String
, String
>>(new Comparator
<Pair
<String
, String
>>() {
74 public int compare(Pair
<String
, String
> o1
, Pair
<String
, String
> o2
) {
75 String goal1
= o1
.getFirst();
76 String goal2
= o2
.getFirst();
77 int index1
= projectGoals
.indexOf(goal1
);
78 int index2
= projectGoals
.indexOf(goal2
);
79 if (index1
== index2
) return goal1
.compareToIgnoreCase(goal2
);
80 return (index1
< index2 ?
-1 : 1);
83 projectToActionsMapping
.put(mavenProject
, actions
);
85 actions
.add(Pair
.create(mavenAction
.getGoal(), eachId
));
88 for (Map
.Entry
<MavenProject
, Set
<Pair
<String
, String
>>> each
: projectToActionsMapping
.entrySet()) {
89 MavenProject mavenProject
= each
.getKey();
90 Set
<Pair
<String
, String
>> goalsToActionIds
= each
.getValue();
91 if (goalsToActionIds
.isEmpty()) continue;
92 KeymapGroup group
= KeymapGroupFactory
.getInstance().createGroup(mavenProject
.getDisplayName(),
93 MavenIcons
.OPEN_MODULES_ICON
,
94 MavenIcons
.CLOSED_MODULES_ICON
);
95 result
.addGroup(group
);
96 for (Pair
<String
, String
> eachGoalToActionId
: goalsToActionIds
) {
97 group
.addActionId(eachGoalToActionId
.getSecond());
104 public static void updateActions(Project project
) {
105 clearActions(project
);
106 doUpdateActions(project
, MavenProjectsManager
.getInstance(project
).getNonIgnoredProjects());
109 public static void updateActions(Project project
, List
<MavenProject
> mavenProjects
) {
110 clearActions(project
, mavenProjects
);
111 doUpdateActions(project
, mavenProjects
);
114 private static void doUpdateActions(Project project
, List
<MavenProject
> mavenProjects
) {
115 ActionManager manager
= ActionManager
.getInstance();
116 for (MavenProject eachProject
: mavenProjects
) {
117 String actionIdPrefix
= getActionPrefix(project
, eachProject
);
118 for (MavenGoalAction eachAction
: collectActions(eachProject
)) {
119 manager
.registerAction(actionIdPrefix
+ eachAction
.getGoal(), eachAction
);
124 private static List
<MavenGoalAction
> collectActions(MavenProject mavenProject
) {
125 List
<MavenGoalAction
> result
= new ArrayList
<MavenGoalAction
>();
126 for (String eachGoal
: collectGoals(mavenProject
)) {
127 result
.add(new MavenGoalAction(mavenProject
, eachGoal
));
132 public static void clearActions(Project project
) {
133 ActionManager manager
= ActionManager
.getInstance();
134 for (String each
: manager
.getActionIds(getActionPrefix(project
, null))) {
135 manager
.unregisterAction(each
);
139 public static void clearActions(Project project
, List
<MavenProject
> mavenProjects
) {
140 ActionManager manager
= ActionManager
.getInstance();
141 for (MavenProject eachProject
: mavenProjects
) {
142 for (String eachAction
: manager
.getActionIds(getActionPrefix(project
, eachProject
))) {
143 manager
.unregisterAction(eachAction
);
148 private static List
<String
> collectGoals(MavenProject project
) {
149 LinkedHashSet
<String
> result
= new LinkedHashSet
<String
>(); // may contains similar plugins or somethig
150 result
.addAll(MavenEmbedderFactory
.getPhasesList());
152 for (MavenPlugin each
: project
.getPlugins()) {
153 collectGoals(project
.getLocalRepository(), each
, result
);
156 return new ArrayList
<String
>(result
);
159 private static void collectGoals(File repository
, MavenPlugin plugin
, LinkedHashSet
<String
> list
) {
160 MavenPluginInfo info
= MavenArtifactUtil
.readPluginInfo(repository
, plugin
.getMavenId());
161 if (info
== null) return;
163 for (MavenPluginInfo
.Mojo m
: info
.getMojos()) {
164 list
.add(m
.getQualifiedGoal());
169 public static String
getActionPrefix(Project project
, MavenProject mavenProject
) {
170 String pomPath
= mavenProject
== null ?
null : mavenProject
.getPath();
171 return MavenShortcutsManager
.getInstance(project
).getActionId(pomPath
, null);
174 private static class MavenGoalAction
extends MavenAction
{
175 private final MavenProject myMavenProject
;
176 private final String myGoal
;
178 public MavenGoalAction(MavenProject mavenProject
, String goal
) {
179 myMavenProject
= mavenProject
;
181 Presentation template
= getTemplatePresentation();
182 template
.setText(goal
, false);
183 template
.setIcon(MavenIcons
.PHASE_ICON
);
186 public void actionPerformed(AnActionEvent e
) {
188 MavenRunnerParameters params
= new MavenRunnerParameters(true,
189 myMavenProject
.getDirectory(),
190 Arrays
.asList(myGoal
),
191 MavenActionUtil
.getProjectsManager(e
).getActiveProfiles());
192 MavenRunConfigurationType
.runConfiguration(MavenActionUtil
.getProject(e
), params
, e
.getDataContext());
194 catch (ExecutionException ex
) {
195 MavenLog
.LOG
.warn(ex
);
199 public MavenProject
getMavenProject() {
200 return myMavenProject
;
203 public String
getGoal() {
207 public String
toString() {
208 return myMavenProject
+ ":" + myGoal
;