package com.lightd.ideap.maven.actions; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.lightd.ideap.maven.MvnBundle; import com.lightd.ideap.maven.settings.MvnRunConfigurationSettings; import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.model.MavenPlugin; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.utils.MavenArtifactUtil; import org.jetbrains.idea.maven.utils.MavenPluginInfo; import java.io.File; import java.util.*; public class MvnPluginGoalSwitchAction extends MvnQuickPopupAction { public static final String defaultGroup = "org.apache.maven.plugins"; public static final List<String> defaultPlugins; private static final Map<MavenId, MavenPluginInfo> plugins = new HashMap<MavenId, MavenPluginInfo>(); static { String[] corePhases = new String[]{"clean", "compiler", "deploy", "failsafe", "install", "resources", "site", "surefire", "verifier"}; for (int i = 0; i < corePhases.length; i++) { corePhases[i] = "maven-" + corePhases[i] + "-plugin"; } defaultPlugins = Arrays.asList(corePhases); } @Override protected String getPopupTitle(String moduleName) { return MvnBundle.message("maven.quick.popup.goal.title", moduleName); } @Override protected void buildActions(DefaultActionGroup toGroup, MavenProject mavenProject) { Map<MavenPlugin, AnAction[]> pluginActions = buildAllPlugins(mavenProject); List<AnAction> defaultPluginGroups = new ArrayList<AnAction>(); List<AnAction> customPluginGroups = new ArrayList<AnAction>(); for (Map.Entry<MavenPlugin, AnAction[]> plgActions : pluginActions.entrySet()) { String name = plgActions.getKey().getArtifactId(); AnAction popupGroup = addPopupGroup(name, plgActions.getValue()); if (defaultPlugins.contains(name)) defaultPluginGroups.add(popupGroup); else customPluginGroups.add(popupGroup); } if (!defaultPluginGroups.isEmpty()) addActionGroup(toGroup, "Default Plugins", defaultPluginGroups); if (!customPluginGroups.isEmpty()) addActionGroup(toGroup, "Custom Plugins", customPluginGroups); } private Map<MavenPlugin, AnAction[]> buildAllPlugins(MavenProject mavenProject) { File localRepository = mavenProject.getLocalRepository(); MvnRunConfigurationSettings settings = MvnRunConfigurationSettings.getInstance(); boolean withPrefix = settings.isWithPrefix(); boolean ignoreDefault = settings.isIgnoreCorePlugin(); Map<MavenPlugin, AnAction[]> pluginActions = new TreeMap<MavenPlugin, AnAction[]>(new MavenPluginComparator()); for (MavenPlugin plugin : mavenProject.getDeclaredPlugins()) { loadPluginInfo(localRepository, plugin.getMavenId()); if (ignoreDefault && skipPlugin(plugin.getMavenId())) continue; AnAction[] actions = buildPluginActions(plugin.getMavenId(), withPrefix); if (actions.length > 0) { pluginActions.put(plugin, actions); } } return pluginActions; } private void loadPluginInfo(File repos, final MavenId mavenId) { if (!plugins.containsKey(mavenId)) { MavenPluginInfo info = MavenArtifactUtil.readPluginInfo(repos, mavenId); plugins.put(mavenId, info); } } private boolean skipPlugin(final MavenId mavenId) { if (defaultGroup.equals(mavenId.getGroupId())) { if (defaultPlugins.contains(mavenId.getArtifactId())) return true; } MavenPluginInfo pluginInfo = plugins.get(mavenId); return pluginInfo == null || pluginInfo.getMojos().isEmpty(); } private AnAction[] buildPluginActions(MavenId mavenId, boolean withPrefix) { MavenPluginInfo pluginInfo = plugins.get(mavenId); if (pluginInfo == null || pluginInfo.getMojos().isEmpty()) return new AnAction[0]; List<AnAction> actions = new ArrayList<AnAction>(pluginInfo.getMojos().size()); for (MavenPluginInfo.Mojo mojo : pluginInfo.getMojos()) { actions.add(new MvnGoalAction(mojo, withPrefix)); } return actions.toArray(new AnAction[actions.size()]); } class MavenPluginComparator implements Comparator<MavenPlugin> { @Override public int compare(MavenPlugin o1, MavenPlugin o2) { if (defaultPlugins.contains(o1.getArtifactId()) && !defaultPlugins.contains(o2.getArtifactId())) return -1; if (!defaultPlugins.contains(o1.getArtifactId()) && defaultPlugins.contains(o2.getArtifactId())) return 1; return o1.getArtifactId().compareTo(o2.getArtifactId()); } } }