From e72512df5569a3b1f202f4a32053ef3c68d90448 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Thu, 1 Aug 2013 19:28:13 +0400 Subject: [PATCH] IDEA-64302 maven: insert..dependency: better support for managed versions --- .../generate/GenerateDependencyAction.java | 40 ++++++++++++--- .../GenerateManagedDependencyAction.java | 34 ++++++++----- .../indices/MavenArtifactSearchDialog.java | 30 +++++++++-- .../indices/MavenArtifactSearchPanel.java | 50 +++++++++++++++++-- 4 files changed, 123 insertions(+), 31 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java index 4d6012dceded..015029cab74e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateDependencyAction.java @@ -20,6 +20,7 @@ import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.xml.XmlElement; import com.intellij.psi.xml.XmlFile; @@ -27,9 +28,9 @@ import com.intellij.util.xml.DomUtil; import com.intellij.util.xml.ui.actions.generate.GenerateDomElementAction; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.dom.DependencyConflictId; import org.jetbrains.idea.maven.dom.MavenDomBundle; import org.jetbrains.idea.maven.dom.MavenDomUtil; -import org.jetbrains.idea.maven.dom.model.MavenDomDependencies; import org.jetbrains.idea.maven.dom.model.MavenDomDependency; import org.jetbrains.idea.maven.dom.model.MavenDomDependencyManagement; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; @@ -37,6 +38,7 @@ import org.jetbrains.idea.maven.indices.MavenArtifactSearchDialog; import org.jetbrains.idea.maven.model.MavenId; import java.util.List; +import java.util.Map; public class GenerateDependencyAction extends GenerateDomElementAction { public GenerateDependencyAction() { @@ -46,7 +48,9 @@ public class GenerateDependencyAction extends GenerateDomElementAction { protected MavenDomDependency doGenerate(@NotNull final MavenDomProjectModel mavenModel, final Editor editor) { Project project = mavenModel.getManager().getProject(); - final List ids = MavenArtifactSearchDialog.searchForArtifact(project); + final Map managedDependencies = GenerateManagedDependencyAction.collectManagingDependencies(mavenModel); + + final List ids = MavenArtifactSearchDialog.searchForArtifact(project, managedDependencies.values()); if (ids.isEmpty()) return null; PsiDocumentManager.getInstance(project).commitAllDocuments(); @@ -55,19 +59,39 @@ public class GenerateDependencyAction extends GenerateDomElementAction { return new WriteCommandAction(psiFile.getProject(), "Generate Dependency", psiFile) { @Override protected void run(Result result) throws Throwable { - MavenDomDependencies deps; + boolean isInsideManagedDependencies; MavenDomDependencyManagement dependencyManagement = mavenModel.getDependencyManagement(); - XmlElement managetDependencyXml = dependencyManagement.getXmlElement(); - if (managetDependencyXml != null && managetDependencyXml.getTextRange().contains(editor.getCaretModel().getOffset())) { - deps = dependencyManagement.getDependencies(); + XmlElement managedDependencyXml = dependencyManagement.getXmlElement(); + if (managedDependencyXml != null && managedDependencyXml.getTextRange().contains(editor.getCaretModel().getOffset())) { + isInsideManagedDependencies = true; } else { - deps = mavenModel.getDependencies(); + isInsideManagedDependencies = false; } for (MavenId each : ids) { - result.setResult(MavenDomUtil.createDomDependency(deps, editor, each)); + MavenDomDependency res; + if (isInsideManagedDependencies) { + res = MavenDomUtil.createDomDependency(dependencyManagement.getDependencies(), editor, each); + } + else { + DependencyConflictId conflictId = new DependencyConflictId(each.getGroupId(), each.getArtifactId(), null, null); + MavenDomDependency managedDependenciesDom = managedDependencies.get(conflictId); + + if (managedDependenciesDom != null + && Comparing.equal(each.getVersion(), managedDependenciesDom.getVersion().getStringValue())) { + // Generate dependency without tag + res = MavenDomUtil.createDomDependency(mavenModel.getDependencies(), editor); + + res.getGroupId().setStringValue(conflictId.getGroupId()); + res.getArtifactId().setStringValue(conflictId.getArtifactId()); + } + else { + res = MavenDomUtil.createDomDependency(mavenModel.getDependencies(), editor, each); + } + } + result.setResult(res); } } }.execute().getResultObject(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateManagedDependencyAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateManagedDependencyAction.java index 4909a488bf38..18250c395ee5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateManagedDependencyAction.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/GenerateManagedDependencyAction.java @@ -15,6 +15,8 @@ */ package org.jetbrains.idea.maven.dom.generate; +import com.google.common.base.Predicates; +import com.google.common.collect.Maps; import com.intellij.icons.AllIcons; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; @@ -32,7 +34,6 @@ import org.jetbrains.idea.maven.dom.MavenDomUtil; import org.jetbrains.idea.maven.dom.model.MavenDomDependency; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @@ -54,10 +55,14 @@ public class GenerateManagedDependencyAction extends GenerateDomElementAction { @Override protected MavenDomDependency doGenerate(@NotNull final MavenDomProjectModel mavenModel, final Editor editor) { - Collection managingDependencies = collectManagingDependencies(mavenModel); + Set existingDependencies = collectExistingDependencies(mavenModel); + Map managingDependencies = collectManagingDependencies(mavenModel); + + Map unexistManagingDeps = Maps.filterKeys(managingDependencies, + Predicates.not(Predicates.in(existingDependencies))); final List dependenciesToOverride = - GenerateDependencyUtil.chooseDependencies(managingDependencies, mavenModel.getManager().getProject()); + GenerateDependencyUtil.chooseDependencies(unexistManagingDeps.values(), mavenModel.getManager().getProject()); if (!dependenciesToOverride.isEmpty()) { return new WriteCommandAction(editor.getProject(), mavenModel.getXmlTag().getContainingFile()) { @@ -88,10 +93,7 @@ public class GenerateManagedDependencyAction extends GenerateDomElementAction { } } - @NotNull - public static Collection collectManagingDependencies(@NotNull final MavenDomProjectModel model) { - final Map dependencies = new HashMap(); - + private static Set collectExistingDependencies(@NotNull final MavenDomProjectModel model) { final Set existingDependencies = new HashSet(); for (MavenDomDependency dependency : model.getDependencies().getDependencies()) { DependencyConflictId id = DependencyConflictId.create(dependency); @@ -100,20 +102,26 @@ public class GenerateManagedDependencyAction extends GenerateDomElementAction { } } + return existingDependencies; + } + + @NotNull + public static Map collectManagingDependencies(@NotNull final MavenDomProjectModel model) { + final Map dependencies = new HashMap(); + Processor collectProcessor = new Processor() { public boolean process(MavenDomDependency dependency) { - if (!model.equals(dependency.getParentOfType(MavenDomProjectModel.class, true))) { - DependencyConflictId id = DependencyConflictId.create(dependency); - if (id != null && !existingDependencies.contains(id) && !dependencies.containsKey(id)) { - dependencies.put(id, dependency); - } + DependencyConflictId id = DependencyConflictId.create(dependency); + if (id != null && !dependencies.containsKey(id)) { + dependencies.put(id, dependency); } + return false; } }; MavenDomProjectProcessorUtils.processDependenciesInDependencyManagement(model, collectProcessor, model.getManager().getProject()); - return dependencies.values(); + return dependencies; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java index cd951e106f48..d4926d66a405 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchDialog.java @@ -17,18 +17,20 @@ package org.jetbrains.idea.maven.indices; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.TabbedPaneWrapper; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.dom.model.MavenDomDependency; import org.jetbrains.idea.maven.model.MavenId; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; -import java.util.Collections; +import java.util.*; import java.util.List; -import java.util.Map; public class MavenArtifactSearchDialog extends DialogWrapper { private List myResult = Collections.emptyList(); @@ -37,6 +39,8 @@ public class MavenArtifactSearchDialog extends DialogWrapper { private MavenArtifactSearchPanel myArtifactsPanel; private MavenArtifactSearchPanel myClassesPanel; + private final Map, String> myManagedDependenciesMap = new HashMap, String>(); + private final Map myOkButtonStates = new THashMap(); @NotNull @@ -49,14 +53,30 @@ public class MavenArtifactSearchDialog extends DialogWrapper { } @NotNull - public static List searchForArtifact(Project project) { + public static List searchForArtifact(Project project, Collection managedDependencies) { MavenArtifactSearchDialog d = new MavenArtifactSearchDialog(project, "", false); + d.setManagedDependencies(managedDependencies); + d.show(); if (!d.isOK()) return Collections.emptyList(); return d.getResult(); } + public void setManagedDependencies(Collection managedDependencies) { + myManagedDependenciesMap.clear(); + + for (MavenDomDependency dependency : managedDependencies) { + String groupId = dependency.getGroupId().getStringValue(); + String artifactId = dependency.getArtifactId().getStringValue(); + String version = dependency.getVersion().getStringValue(); + + if (StringUtil.isNotEmpty(groupId) && StringUtil.isNotEmpty(artifactId) && StringUtil.isNotEmpty(version)) { + myManagedDependenciesMap.put(Pair.create(groupId, artifactId), version); + } + } + } + private MavenArtifactSearchDialog(Project project, String initialText, boolean classMode) { super(project, true); @@ -84,8 +104,8 @@ public class MavenArtifactSearchDialog extends DialogWrapper { } }; - myArtifactsPanel = new MavenArtifactSearchPanel(project, !classMode ? initialText : "", false, listener, this); - myClassesPanel = new MavenArtifactSearchPanel(project, classMode ? initialText : "", true, listener, this); + myArtifactsPanel = new MavenArtifactSearchPanel(project, !classMode ? initialText : "", false, listener, this, myManagedDependenciesMap); + myClassesPanel = new MavenArtifactSearchPanel(project, classMode ? initialText : "", true, listener, this, myManagedDependenciesMap); myTabbedPane.addTab("Search for artifact", myArtifactsPanel); myTabbedPane.addTab("Search for class", myClassesPanel); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java index 211030b2c16f..de2de97c7051 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java @@ -19,6 +19,8 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorFontType; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Pair; import com.intellij.ui.*; import com.intellij.ui.treeStructure.Tree; import com.intellij.util.Alarm; @@ -41,7 +43,7 @@ import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; -import java.util.ArrayList; +import java.util.*; import java.util.List; public class MavenArtifactSearchPanel extends JPanel { @@ -55,15 +57,18 @@ public class MavenArtifactSearchPanel extends JPanel { private final Alarm myAlarm; + private final Map, String> myManagedDependenciesMap; + public MavenArtifactSearchPanel(Project project, String initialText, boolean classMode, Listener listener, - MavenArtifactSearchDialog dialog) { + MavenArtifactSearchDialog dialog, Map, String> managedDependenciesMap) { myProject = project; myDialog = dialog; myClassMode = classMode; myListener = listener; + myManagedDependenciesMap = managedDependenciesMap; initComponents(initialText); myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, dialog.getDisposable()); @@ -183,9 +188,34 @@ public class MavenArtifactSearchPanel extends JPanel { }, 500); } + private void resortUsingDependencyVersionMap(List result) { + for (MavenArtifactSearchResult searchResult : result) { + if (searchResult.versions.isEmpty()) continue; + + MavenArtifactInfo artifactInfo = searchResult.versions.get(0); + final String managedVersion = myManagedDependenciesMap.get(Pair.create(artifactInfo.getGroupId(), artifactInfo.getArtifactId())); + if (managedVersion != null) { + Collections.sort(searchResult.versions, new Comparator() { + @Override + public int compare(MavenArtifactInfo o1, MavenArtifactInfo o2) { + String v1 = o1.getVersion(); + String v2 = o2.getVersion(); + if (Comparing.equal(v1, v2)) return 0; + if (managedVersion.equals(v1)) return -1; + if (managedVersion.equals(v2)) return 1; + return 0; + } + }); + } + } + } + private void doSearch(String searchText) { MavenSearcher searcher = myClassMode ? new MavenClassSearcher() : new MavenArtifactSearcher(); List result = searcher.search(myProject, searchText, 200); + + resortUsingDependencyVersionMap(result); + final TreeModel model = new MyTreeModel(result); SwingUtilities.invokeLater(new Runnable() { @@ -273,7 +303,7 @@ public class MavenArtifactSearchPanel extends JPanel { } } - private static class MyArtifactCellRenderer extends JPanel implements TreeCellRenderer { + private class MyArtifactCellRenderer extends JPanel implements TreeCellRenderer { protected SimpleColoredComponent myLeftComponent = new SimpleColoredComponent(); protected SimpleColoredComponent myRightComponent = new SimpleColoredComponent(); @@ -350,7 +380,17 @@ public class MavenArtifactSearchPanel extends JPanel { } else if (value instanceof MavenArtifactInfo) { MavenArtifactInfo info = (MavenArtifactInfo)value; - myLeftComponent.append(info.getVersion(), SimpleTextAttributes.REGULAR_ATTRIBUTES); + String version = info.getVersion(); + + String managedVersion = myManagedDependenciesMap.get(Pair.create(info.getGroupId(), info.getArtifactId())); + + if (managedVersion != null && managedVersion.equals(version)) { + myLeftComponent.append(version, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES); + myLeftComponent.append(" (from )", SimpleTextAttributes.GRAYED_ATTRIBUTES); + } + else { + myLeftComponent.append(version, SimpleTextAttributes.REGULAR_ATTRIBUTES); + } } return this; @@ -373,7 +413,7 @@ public class MavenArtifactSearchPanel extends JPanel { } } - private static class MyClassCellRenderer extends MyArtifactCellRenderer { + private class MyClassCellRenderer extends MyArtifactCellRenderer { private MyClassCellRenderer(Tree tree) { super(tree);