From 5d2770ff129c747317d09e82c6e8a7d86eb8e141 Mon Sep 17 00:00:00 2001 From: "Anton.Makeev" Date: Thu, 3 Dec 2009 14:10:33 +0300 Subject: [PATCH] Maven: correctly update maven projects tree (IDEADEV-41650) Maven: improven notification bar + some fixes --- .../navigator/MavenProjectsNavigatorPanel.java | 16 +- .../maven/navigator/MavenProjectsStructure.java | 633 ++++++++++----------- .../navigator/SelectFromMavenProjectsDialog.java | 4 +- .../maven/navigator/SelectMavenProjectDialog.java | 2 +- .../idea/maven/utils/MavenImportNotifier.java | 30 +- .../idea/maven/utils/actions/MavenActionUtil.java | 8 +- .../src/main/resources/ProjectBundle.properties | 5 +- .../idea/maven/MavenImportingTestCase.java | 6 + .../execution/JavaClasspathConfigurationTest.java | 119 ++-- .../navigator/MavenProjectsNavigatorTest.java | 32 +- 10 files changed, 456 insertions(+), 399 deletions(-) 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 0aa838a106..72dde8a813 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 @@ -68,7 +68,7 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement myTree.addMouseListener(new PopupHandler() { public void invokePopup(final Component comp, final int x, final int y) { - final String id = getMenuId(getSelectedNodes(MavenProjectsStructure.CustomNode.class)); + final String id = getMenuId(getSelectedNodes(MavenProjectsStructure.MavenSimpleNode.class)); if (id != null) { final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(id); if (actionGroup != null) { @@ -78,9 +78,9 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement } @Nullable - private String getMenuId(Collection nodes) { + private String getMenuId(Collection nodes) { String id = null; - for (MavenProjectsStructure.CustomNode node : nodes) { + for (MavenProjectsStructure.MavenSimpleNode node : nodes) { String menuId = node.getMenuId(); if (menuId == null) { return null; @@ -124,7 +124,7 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement } private VirtualFile extractVirtualFile() { - for (MavenProjectsStructure.CustomNode each : getSelectedNodes(MavenProjectsStructure.CustomNode.class)) { + for (MavenProjectsStructure.MavenSimpleNode each : getSelectedNodes(MavenProjectsStructure.MavenSimpleNode.class)) { VirtualFile file = each.getVirtualFile(); if (file != null) return file; } @@ -138,7 +138,7 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement private Object extractVirtualFiles() { final List files = new ArrayList(); - for (MavenProjectsStructure.CustomNode each : getSelectedNodes(MavenProjectsStructure.CustomNode.class)) { + for (MavenProjectsStructure.MavenSimpleNode each : getSelectedNodes(MavenProjectsStructure.MavenSimpleNode.class)) { VirtualFile file = each.getVirtualFile(); if (file != null) files.add(file); } @@ -147,7 +147,7 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement private Object extractNavigatables() { final List navigatables = new ArrayList(); - for (MavenProjectsStructure.CustomNode each : getSelectedNodes(MavenProjectsStructure.CustomNode.class)) { + for (MavenProjectsStructure.MavenSimpleNode each : getSelectedNodes(MavenProjectsStructure.MavenSimpleNode.class)) { Navigatable navigatable = each.getNavigatable(); if (navigatable != null) navigatables.add(navigatable); } @@ -195,7 +195,7 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement return profiles; } - private List getSelectedNodes(Class aClass) { + private List getSelectedNodes(Class aClass) { return MavenProjectsStructure.getSelectedNodes(myTree, aClass); } @@ -213,7 +213,7 @@ public class MavenProjectsNavigatorPanel extends SimpleToolWindowPanel implement private MavenProjectsStructure.ProjectNode getContextProjectNode() { MavenProjectsStructure.ProjectNode projectNode = getSelectedProjectNode(); if (projectNode != null) return projectNode; - return MavenProjectsStructure.getCommonProjectNode(getSelectedNodes(MavenProjectsStructure.CustomNode.class)); + return MavenProjectsStructure.getCommonProjectNode(getSelectedNodes(MavenProjectsStructure.MavenSimpleNode.class)); } private int getStandardGoalOrder(String goal) { 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 5ceb14afba..267ca30d4a 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 @@ -19,11 +19,9 @@ import com.intellij.ide.projectView.impl.nodes.NamedLibraryElement; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEntry; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable; import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -35,6 +33,7 @@ import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; import org.jetbrains.idea.maven.embedder.MavenEmbedderFactory; import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; import org.jetbrains.idea.maven.project.*; @@ -54,16 +53,12 @@ import static org.jetbrains.idea.maven.project.ProjectBundle.message; public class MavenProjectsStructure extends SimpleTreeStructure { private static final URL ERROR_ICON_URL = MavenProjectsStructure.class.getResource("/images/error.png"); - private static final CustomNode[] EMPTY_NODES_ARRAY = new CustomNode[0]; private static final Collection BASIC_PHASES = MavenEmbedderFactory.getBasicPhasesList(); private static final Collection PHASES = MavenEmbedderFactory.getPhasesList(); - private static final Comparator NODE_COMPARATOR = new Comparator() { - public int compare(CustomNode o1, CustomNode o2) { - if (o1 instanceof ProfilesNode) return -1; - if (o2 instanceof ProfilesNode) return 1; - - return o1.getTemplateName().compareToIgnoreCase(o2.getTemplateName()); + private static final Comparator NODE_COMPARATOR = new Comparator() { + public int compare(MavenSimpleNode o1, MavenSimpleNode o2) { + return Comparing.compare(o1.getName(), o2.getName()); } }; @@ -136,6 +131,14 @@ public class MavenProjectsStructure extends SimpleTreeStructure { myTreeBuilder.addSubtreeToUpdateByElement(node); } + private void updateUpTo(SimpleNode node) { + SimpleNode each = node; + while (each != null) { + updateFrom(each); + each = each.getParent(); + } + } + public void updateProjects(List updated, List deleted) { for (MavenProject each : updated) { ProjectNode node = findNodeFor(each); @@ -149,9 +152,8 @@ public class MavenProjectsStructure extends SimpleTreeStructure { for (MavenProject each : deleted) { ProjectNode node = myProjectToNodeMapping.remove(each); if (node != null) { - ProjectsGroupNode parent = node.getStructuralParent(); + ProjectsGroupNode parent = node.getGroup(); parent.remove(node); - updateFrom(parent); } } @@ -173,44 +175,40 @@ public class MavenProjectsStructure extends SimpleTreeStructure { } } - node.updateNode(); + node.updateProject(); reconnectNode(node, newParentNode); ProjectsGroupNode newModulesParentNode = myProjectsNavigator.getGroupModules() && node.isVisible() ? node.getModulesNode() : myRoot; for (MavenProject each : myProjectsManager.getModules(project)) { ProjectNode moduleNode = findNodeFor(each); - if (moduleNode != null && !moduleNode.getStructuralParent().equals(newModulesParentNode)) { + if (moduleNode != null && !moduleNode.getParent().equals(newModulesParentNode)) { reconnectNode(moduleNode, newModulesParentNode); } } } private void reconnectNode(ProjectNode node, ProjectsGroupNode newParentNode) { - ProjectsGroupNode oldParentNode = node.getStructuralParent(); + ProjectsGroupNode oldParentNode = node.getGroup(); if (oldParentNode == null || !oldParentNode.equals(newParentNode)) { if (oldParentNode != null) { oldParentNode.remove(node); - updateFrom(oldParentNode); } newParentNode.add(node); - updateFrom(newParentNode); } else { newParentNode.sortProjects(); - updateFrom(newParentNode); } } public void setActiveProfiles(List profiles) { myRoot.setActiveProfiles(profiles); - updateFrom(myRoot.getProfilesNode()); } public void updateIgnored(List projects) { for (MavenProject each : projects) { ProjectNode node = findNodeFor(each); if (node == null) continue; - updateFrom(node.getStructuralParent()); + node.updateIgnored(); } } @@ -221,7 +219,6 @@ public class MavenProjectsStructure extends SimpleTreeStructure { public void updateGoals() { for (ProjectNode each : myProjectToNodeMapping.values()) { each.updateGoals(); - updateFrom(each); } } @@ -242,7 +239,7 @@ public class MavenProjectsStructure extends SimpleTreeStructure { ALWAYS, NEVER, NORMAL } - protected Class[] getVisibleNodesClasses() { + protected Class[] getVisibleNodesClasses() { return null; } @@ -254,7 +251,7 @@ public class MavenProjectsStructure extends SimpleTreeStructure { return myProjectsNavigator.getShowBasicPhasesOnly(); } - public static List getSelectedNodes(SimpleTree tree, Class nodeClass) { + public static List getSelectedNodes(SimpleTree tree, Class nodeClass) { final List filtered = new ArrayList(); for (SimpleNode node : getSelectedNodes(tree)) { if ((nodeClass != null) && (!nodeClass.isInstance(node))) { @@ -278,16 +275,11 @@ public class MavenProjectsStructure extends SimpleTreeStructure { return nodes; } - private static void insertSorted(List list, T newObject) { - int pos = Collections.binarySearch(list, newObject, NODE_COMPARATOR); - list.add(pos >= 0 ? pos : -pos - 1, newObject); - } - @Nullable - public static ProjectNode getCommonProjectNode(Collection nodes) { + public static ProjectNode getCommonProjectNode(Collection nodes) { ProjectNode parent = null; - for (CustomNode node : nodes) { - ProjectNode nextParent = node.getParent(ProjectNode.class); + for (MavenSimpleNode node : nodes) { + ProjectNode nextParent = node.findParent(ProjectNode.class); if (parent == null) { parent = nextParent; } @@ -302,35 +294,29 @@ public class MavenProjectsStructure extends SimpleTreeStructure { NONE, ERROR } - public abstract class CustomNode extends SimpleNode { - protected Project myProject; - private CustomNode myStructuralParent; - private ErrorLevel myNodeErrorLevel = ErrorLevel.NONE; - private ErrorLevel myOverallErrorLevelCache = null; - - public CustomNode(CustomNode parent) { - super(parent); - myProject = MavenProjectsStructure.this.myProject; - setStructuralParent(parent); - } + public abstract class MavenSimpleNode extends CachingSimpleNode { + private MavenSimpleNode myParent; + private ErrorLevel myErrorLevel = ErrorLevel.NONE; + private ErrorLevel myTotalErrorLevel = null; - public void setStructuralParent(CustomNode structuralParent) { - myStructuralParent = structuralParent; + public MavenSimpleNode(MavenSimpleNode parent) { + super(MavenProjectsStructure.this.myProject, null); + setParent(parent); } - public CustomNode getStructuralParent() { - return myStructuralParent; + public void setParent(MavenSimpleNode parent) { + myParent = parent; } @Override public NodeDescriptor getParentDescriptor() { - return myStructuralParent; + return myParent; } - public T getParent(Class parentClass) { - CustomNode node = this; + public T findParent(Class parentClass) { + MavenSimpleNode node = this; while (true) { - node = node.myStructuralParent; + node = node.myParent; if (node == null || parentClass.isInstance(node)) { //noinspection unchecked return (T)node; @@ -352,77 +338,68 @@ public class MavenProjectsStructure extends SimpleTreeStructure { return DisplayKind.NEVER; } - public CustomNode[] getChildren() { - List children = getStructuralChildren(); - if (children.isEmpty()) return EMPTY_NODES_ARRAY; - List result = new ArrayList(); - for (CustomNode each : children) { + @Override + protected SimpleNode[] buildChildren() { + List children = doGetChildren(); + if (children.isEmpty()) return NO_CHILDREN; + + List result = new ArrayList(); + for (MavenSimpleNode each : children) { if (each.isVisible()) result.add(each); } - return result.toArray(new CustomNode[result.size()]); + return result.toArray(new MavenSimpleNode[result.size()]); } - protected List getStructuralChildren() { + protected List doGetChildren() { return Collections.emptyList(); } - protected void resetChildrenCaches() { - myOverallErrorLevelCache = null; + @Override + public void cleanUpCache() { + super.cleanUpCache(); + myTotalErrorLevel = null; + } + + protected void childrenChanged() { + MavenSimpleNode each = this; + while (each != null) { + each.cleanUpCache(); + each = (MavenSimpleNode)each.getParent(); + } + updateUpTo(this); } - public ErrorLevel getOverallErrorLevel() { - if (myOverallErrorLevelCache == null) { - myOverallErrorLevelCache = calcOverallErrorLevel(); + public ErrorLevel getTotalErrorLevel() { + if (myTotalErrorLevel == null) { + myTotalErrorLevel = calcTotalErrorLevel(); } - return myOverallErrorLevelCache; + return myTotalErrorLevel; } - private ErrorLevel calcOverallErrorLevel() { + private ErrorLevel calcTotalErrorLevel() { ErrorLevel childrenErrorLevel = getChildrenErrorLevel(); - return childrenErrorLevel.compareTo(myNodeErrorLevel) > 0 ? childrenErrorLevel : myNodeErrorLevel; + return childrenErrorLevel.compareTo(myErrorLevel) > 0 ? childrenErrorLevel : myErrorLevel; } public ErrorLevel getChildrenErrorLevel() { ErrorLevel result = ErrorLevel.NONE; - for (CustomNode each : getStructuralChildren()) { - ErrorLevel eachLevel = each.getOverallErrorLevel(); + for (SimpleNode each : getChildren()) { + ErrorLevel eachLevel = ((MavenSimpleNode)each).getTotalErrorLevel(); if (eachLevel.compareTo(result) > 0) result = eachLevel; } return result; } - public String getTemplateName() { - if (getTemplatePresentation().getColoredText().size() > 0) { - StringBuilder result = new StringBuilder(""); - for (ColoredFragment each : getTemplatePresentation().getColoredText()) { - result.append(each.getText()); - } - return result.toString(); - } - else { - return myName; - } + public void setErrorLevel(ErrorLevel level) { + if (myErrorLevel == level) return; + myErrorLevel = level; + updateUpTo(this); } - public void setNodeErrorLevel(ErrorLevel level) { - if (myNodeErrorLevel == level) return; - myNodeErrorLevel = level; - - CustomNode each = this; - while (each != null) { - each.resetChildrenCaches(); - each.updateNameAndDescription(); - each = each.myStructuralParent; - } - } - - protected abstract void updateNameAndDescription(); - @Override protected void doUpdate() { - super.doUpdate(); - updateNameAndDescription(); + setNameAndTooltip(getName(), null); } protected void setNameAndTooltip(String name, @Nullable String tooltip) { @@ -434,7 +411,6 @@ public class MavenProjectsStructure extends SimpleTreeStructure { if (showDescriptions() && !StringUtil.isEmptyOrSpaces(hint)) { addColoredFragment(" (" + hint + ")", SimpleTextAttributes.GRAY_ATTRIBUTES); } - getTemplatePresentation().setTooltip(tooltip); } protected void setNameAndTooltip(String name, @Nullable String tooltip, SimpleTextAttributes attribs) { @@ -444,7 +420,7 @@ public class MavenProjectsStructure extends SimpleTreeStructure { } private SimpleTextAttributes prepareAttribs(SimpleTextAttributes from) { - ErrorLevel level = getOverallErrorLevel(); + ErrorLevel level = getTotalErrorLevel(); Color waveColor = level == ErrorLevel.NONE ? null : Color.RED; int style = from.getStyle(); if (waveColor != null) style |= SimpleTextAttributes.STYLE_WAVED; @@ -472,7 +448,7 @@ public class MavenProjectsStructure extends SimpleTreeStructure { public Navigatable getNavigatable() { VirtualFile file = getVirtualFile(); if (file == null || !file.isValid()) return null; - return PsiManager.getInstance(myProject).findFile(file); + return PsiManager.getInstance(getProject()).findFile(file); } public void handleDoubleClickOrEnter(SimpleTree tree, InputEvent inputEvent) { @@ -483,8 +459,8 @@ public class MavenProjectsStructure extends SimpleTreeStructure { } } - public abstract class GroupNode extends CustomNode { - public GroupNode(CustomNode parent) { + public abstract class GroupNode extends MavenSimpleNode { + public GroupNode(MavenSimpleNode parent) { super(parent); } @@ -492,45 +468,57 @@ public class MavenProjectsStructure extends SimpleTreeStructure { public boolean isVisible() { if (getDisplayKind() == DisplayKind.ALWAYS) return true; - for (CustomNode each : getStructuralChildren()) { - if (each.isVisible()) { - return true; - } + for (SimpleNode each : getChildren()) { + if (((MavenSimpleNode)each).isVisible()) return true; } return false; } + + protected void insertSorted(List list, T newObject) { + int pos = Collections.binarySearch(list, newObject, NODE_COMPARATOR); + list.add(pos >= 0 ? pos : -pos - 1, newObject); + } + + protected void sort(List list) { + Collections.sort(list, NODE_COMPARATOR); + } } public abstract class ProjectsGroupNode extends GroupNode { - protected final List myProjectNodes = new ArrayList(); + private final List myProjectNodes = new ArrayList(); - public ProjectsGroupNode(CustomNode parent) { + public ProjectsGroupNode(MavenSimpleNode parent) { super(parent); setIcons(MavenIcons.CLOSED_MODULES_ICON, MavenIcons.OPEN_MODULES_ICON); } - protected List getStructuralChildren() { + @Override + protected List doGetChildren() { return myProjectNodes; } - public List getProjectNodes() { + @TestOnly + public List getProjectNodesInTests() { return myProjectNodes; } protected void add(ProjectNode projectNode) { - projectNode.setStructuralParent(this); + projectNode.setParent(this); insertSorted(myProjectNodes, projectNode); - resetChildrenCaches(); + + childrenChanged(); } public void remove(ProjectNode projectNode) { - projectNode.setStructuralParent(null); + projectNode.setParent(null); myProjectNodes.remove(projectNode); - resetChildrenCaches(); + + childrenChanged(); } public void sortProjects() { - Collections.sort(myProjectNodes, NODE_COMPARATOR); + sort(myProjectNodes); + childrenChanged(); } } @@ -540,11 +528,6 @@ public class MavenProjectsStructure extends SimpleTreeStructure { public RootNode() { super(null); myProfilesNode = new ProfilesNode(this); - updateNameAndDescription(); - } - - protected void updateNameAndDescription() { - setNameAndTooltip(message("view.node.root"), null); } @Override @@ -552,12 +535,9 @@ public class MavenProjectsStructure extends SimpleTreeStructure { return true; } - protected List getStructuralChildren() { - return ContainerUtil.concat(Collections.singletonList(myProfilesNode), myProjectNodes); - } - - public ProfilesNode getProfilesNode() { - return myProfilesNode; + @Override + protected List doGetChildren() { + return ContainerUtil.concat(Collections.singletonList(myProfilesNode), super.doGetChildren()); } public void updateProfiles() { @@ -569,6 +549,87 @@ public class MavenProjectsStructure extends SimpleTreeStructure { } } + public class ProfilesNode extends GroupNode { + private final List myProfileNodes = new ArrayList(); + + public ProfilesNode(MavenSimpleNode parent) { + super(parent); + setIcons(MavenIcons.CLOSED_PROFILES_ICON, MavenIcons.OPEN_PROFILES_ICON); + } + + protected List doGetChildren() { + return myProfileNodes; + } + + @Override + public String getName() { + return message("view.node.profiles"); + } + + public void updateProfiles() { + List allProfiles = myProjectsManager.getAvailableProfiles(); + for (ProfileNode each : new ArrayList(myProfileNodes)) { + if (!allProfiles.contains(each.getProfileName())) myProfileNodes.remove(each); + } + for (String each : allProfiles) { + if (!hasNodeFor(each)) { + myProfileNodes.add(new ProfileNode(this, each)); + } + } + sort(myProfileNodes); + childrenChanged(); + + setActiveProfiles(myProjectsManager.getActiveProfiles()); + } + + private boolean hasNodeFor(String profileName) { + for (ProfileNode each : myProfileNodes) { + if (each.getProfileName().equals(profileName)) return true; + } + return false; + } + + public void setActiveProfiles(List activeProfiles) { + for (ProfileNode each : myProfileNodes) { + each.setActive(activeProfiles.contains(each.getProfileName())); + } + updateFrom(this); + } + } + + public class ProfileNode extends MavenSimpleNode { + private final String myProfileName; + private boolean isActive; + + public ProfileNode(ProfilesNode parent, String profileName) { + super(parent); + myProfileName = profileName; + } + + @Override + public String getName() { + return myProfileName; + } + + public String getProfileName() { + return myProfileName; + } + + public boolean isActive() { + return isActive; + } + + private void setActive(boolean active) { + isActive = active; + } + + @Nullable + @NonNls + protected String getActionId() { + return "Maven.ToggleProfile"; + } + } + public class ProjectNode extends GroupNode { private final MavenProject myMavenProject; private final LifecycleNode myLifecycleNode; @@ -576,6 +637,8 @@ public class MavenProjectsStructure extends SimpleTreeStructure { private final DependenciesNode myDependenciesNode; private final ModulesNode myModulesNode; + private String myTooltipCache; + public ProjectNode(MavenProject mavenProject) { super(null); myMavenProject = mavenProject; @@ -585,56 +648,61 @@ public class MavenProjectsStructure extends SimpleTreeStructure { myDependenciesNode = new DependenciesNode(this); myModulesNode = new ModulesNode(this); - updateNode(); setUniformIcon(MavenIcons.MAVEN_PROJECT_ICON); + updateProject(); } - @Override - public ProjectsGroupNode getStructuralParent() { - return (ProjectsGroupNode)super.getStructuralParent(); + public MavenProject getMavenProject() { + return myMavenProject; + } + + public ProjectsGroupNode getGroup() { + return (ProjectsGroupNode)super.getParent(); } @Override public boolean isVisible() { - return super.isVisible() && (myProjectsNavigator.getShowIgnored() || !myProjectsManager.isIgnored(myMavenProject)); + if (!myProjectsNavigator.getShowIgnored() && myProjectsManager.isIgnored(myMavenProject)) return false; + return super.isVisible(); } - protected List getStructuralChildren() { + @Override + protected List doGetChildren() { return Arrays.asList(myLifecycleNode, myPluginsNode, myDependenciesNode, myModulesNode); } + public ModulesNode getModulesNode() { return myModulesNode; } - public String getProjectName() { - return myMavenProject.getDisplayName(); - } + private void updateProject() { + setErrorLevel(myMavenProject.getProblems().isEmpty() ? ErrorLevel.NONE : ErrorLevel.ERROR); + myPluginsNode.updatePlugins(myMavenProject); + myDependenciesNode.updateDependencies(myMavenProject); - public MavenProject getMavenProject() { - return myMavenProject; + myTooltipCache = makeDescription(); + + updateFrom(getParent()); } - @Override - public VirtualFile getVirtualFile() { - return myMavenProject.getFile(); + public void updateIgnored() { + getGroup().childrenChanged(); } - @Nullable - @NonNls - protected String getMenuId() { - return "Maven.NavigatorProjectMenu"; + public void updateGoals() { + updateFrom(myLifecycleNode); + updateFrom(myPluginsNode); } - private void updateNode() { - updateErrorLevel(); - updateNameAndDescription(); - myPluginsNode.updatePlugins(myMavenProject); - myDependenciesNode.updateDependencies(myMavenProject); + @Override + public String getName() { + return myMavenProject.getDisplayName(); } - private void updateErrorLevel() { - setNodeErrorLevel(myMavenProject.getProblems().isEmpty() ? ErrorLevel.NONE : ErrorLevel.ERROR); + @Override + protected void doUpdate() { + setNameAndTooltip(getName(), myTooltipCache); } @Override @@ -645,11 +713,6 @@ public class MavenProjectsStructure extends SimpleTreeStructure { return super.getPlainAttributes(); } - @Override - protected void updateNameAndDescription() { - setNameAndTooltip(getProjectName(), makeDescription()); - } - private String makeDescription() { StringBuilder desc = new StringBuilder(); desc.append(""); @@ -670,26 +733,11 @@ public class MavenProjectsStructure extends SimpleTreeStructure { desc.append(""); appendProblems(desc); - if (getModulesErrorLevel() != ErrorLevel.NONE) { - desc.append(""); - desc.append("Some modules have problems."); - desc.append(""); - } - desc.append(""); desc.append(""); return desc.toString(); } - private ErrorLevel getModulesErrorLevel() { - ErrorLevel result = ErrorLevel.NONE; - for (ProjectNode each : myModulesNode.myProjectNodes) { - ErrorLevel moduleLevel = each.getOverallErrorLevel(); - if (moduleLevel.compareTo(result) > 0) result = moduleLevel; - } - return result; - } - private void appendProblems(StringBuilder desc) { List problems = myMavenProject.getProblems(); if (problems.isEmpty()) return; @@ -734,9 +782,15 @@ public class MavenProjectsStructure extends SimpleTreeStructure { return result.toString(); } - public void updateGoals() { - myLifecycleNode.updateGoals(); - myPluginsNode.updateGoals(); + @Override + public VirtualFile getVirtualFile() { + return myMavenProject.getFile(); + } + + @Nullable + @NonNls + protected String getMenuId() { + return "Maven.NavigatorProjectMenu"; } } @@ -747,40 +801,33 @@ public class MavenProjectsStructure extends SimpleTreeStructure { } @Override - protected void updateNameAndDescription() { - setNameAndTooltip(message("view.node.modules"), null); + public String getName() { + return message("view.node.modules"); } } public abstract class GoalsGroupNode extends GroupNode { protected final List myGoalNodes = new ArrayList(); - public GoalsGroupNode(CustomNode parent) { + public GoalsGroupNode(MavenSimpleNode parent) { super(parent); } - protected List getStructuralChildren() { + protected List doGetChildren() { return myGoalNodes; } - - public void updateGoals() { - for (GoalNode each : myGoalNodes) { - each.update(); - } - } } - public abstract class GoalNode extends CustomNode { + public abstract class GoalNode extends MavenSimpleNode { private final MavenProject myMavenProject; private final String myGoal; private final String myDisplayName; public GoalNode(GoalsGroupNode parent, String goal, String displayName) { super(parent); - myMavenProject = getParent(ProjectNode.class).getMavenProject(); + myMavenProject = findParent(ProjectNode.class).getMavenProject(); myGoal = goal; myDisplayName = displayName; - updateNameAndDescription(); setUniformIcon(MavenIcons.PHASE_ICON); } @@ -788,12 +835,20 @@ public class MavenProjectsStructure extends SimpleTreeStructure { return myMavenProject.getPath(); } + public String getGoal() { + return myGoal; + } + @Override - protected void updateNameAndDescription() { - String hint = StringUtil.join( - Arrays.asList(myShortcutsManager.getDescription(myMavenProject, myGoal), myTasksManager.getDescription(myMavenProject, myGoal)), - ", "); - setNameAndTooltip(myDisplayName, null, hint); + public String getName() { + return myDisplayName; + } + + @Override + protected void doUpdate() { + String hint = StringUtil.join(Arrays.asList(myShortcutsManager.getDescription(myMavenProject, myGoal), + myTasksManager.getDescription(myMavenProject, myGoal)), ", "); + setNameAndTooltip(getName(), null, hint); } @Override @@ -804,10 +859,6 @@ public class MavenProjectsStructure extends SimpleTreeStructure { return super.getPlainAttributes(); } - public String getGoal() { - return myGoal; - } - @Nullable @NonNls protected String getActionId() { @@ -828,13 +879,12 @@ public class MavenProjectsStructure extends SimpleTreeStructure { for (String goal : PHASES) { myGoalNodes.add(new StandardGoalNode(this, goal)); } - updateNameAndDescription(); setIcons(MavenIcons.CLOSED_PHASES_ICON, MavenIcons.OPEN_PHASES_ICON); } @Override - protected void updateNameAndDescription() { - setNameAndTooltip(message("view.node.lifecycle"), null); + public String getName() { + return message("view.node.lifecycle"); } } @@ -843,87 +893,10 @@ public class MavenProjectsStructure extends SimpleTreeStructure { super(parent, goal, goal); } - public boolean isVisible() { - return super.isVisible() && (!showOnlyBasicPhases() || BASIC_PHASES.contains(getGoal())); - } - } - - public class ProfilesNode extends GroupNode { - private final List myProfileNodes = new ArrayList(); - - public ProfilesNode(CustomNode parent) { - super(parent); - updateNameAndDescription(); - setIcons(MavenIcons.CLOSED_PROFILES_ICON, MavenIcons.OPEN_PROFILES_ICON); - } - @Override - protected void updateNameAndDescription() { - setNameAndTooltip(message("view.node.profiles"), null); - } - - protected List getStructuralChildren() { - return myProfileNodes; - } - - public void updateProfiles() { - List allProfiles = myProjectsManager.getAvailableProfiles(); - for (ProfileNode each : new ArrayList(myProfileNodes)) { - if (!allProfiles.contains(each.getProfileName())) myProfileNodes.remove(each); - } - for (String each : allProfiles) { - if (!hasNodeFor(each)) { - insertSorted(myProfileNodes, new ProfileNode(this, each)); - } - } - setActiveProfiles(myProjectsManager.getActiveProfiles()); - } - - private boolean hasNodeFor(String profileName) { - for (ProfileNode each : myProfileNodes) { - if (each.getProfileName().equals(profileName)) return true; - } - return false; - } - - public void setActiveProfiles(List activeProfiles) { - for (ProfileNode each : myProfileNodes) { - each.setActive(activeProfiles.contains(each.getProfileName())); - } - } - } - - public class ProfileNode extends CustomNode { - private final String myProfileName; - private boolean isActive; - - public ProfileNode(ProfilesNode parent, String profileName) { - super(parent); - myProfileName = profileName; - updateNameAndDescription(); - } - - @Override - protected void updateNameAndDescription() { - setNameAndTooltip(myProfileName, null); - } - - public String getProfileName() { - return myProfileName; - } - - @Nullable - @NonNls - protected String getActionId() { - return "Maven.ToggleProfile"; - } - - public boolean isActive() { - return isActive; - } - - private void setActive(boolean active) { - isActive = active; + public boolean isVisible() { + if (showOnlyBasicPhases() && !BASIC_PHASES.contains(getGoal())) return false; + return super.isVisible(); } } @@ -932,29 +905,35 @@ public class MavenProjectsStructure extends SimpleTreeStructure { public PluginsNode(ProjectNode parent) { super(parent); - updateNameAndDescription(); setIcons(MavenIcons.CLOSED_PLUGINS_ICON, MavenIcons.OPEN_PLUGINS_ICON); } @Override - protected void updateNameAndDescription() { - setNameAndTooltip(message("view.node.plugins"), null); + public String getName() { + return message("view.node.plugins"); } - protected List getStructuralChildren() { + protected List doGetChildren() { return myPluginNodes; } public void updatePlugins(MavenProject mavenProject) { List plugins = mavenProject.getPlugins(); for (PluginNode each : new ArrayList(myPluginNodes)) { - if (!plugins.contains(each.getPlugin())) myPluginNodes.remove(each); + if (plugins.contains(each.getPlugin())) { + each.updatePlugin(); + } + else { + myPluginNodes.remove(each); + } } for (MavenPlugin each : plugins) { if (!hasNodeFor(each)) { - insertSorted(myPluginNodes, new PluginNode(this, each)); + myPluginNodes.add(new PluginNode(this, each)); } } + sort(myPluginNodes); + childrenChanged(); } private boolean hasNodeFor(MavenPlugin plugin) { @@ -965,12 +944,6 @@ public class MavenProjectsStructure extends SimpleTreeStructure { } return false; } - - public void updateGoals() { - for (PluginNode each : myPluginNodes) { - each.updateGoals(); - } - } } public class PluginNode extends GoalsGroupNode { @@ -981,33 +954,50 @@ public class MavenProjectsStructure extends SimpleTreeStructure { super(parent); myPlugin = plugin; - updateNameAndDescription(); setUniformIcon(MavenIcons.PLUGIN_ICON); + updatePlugin(); + } + + public MavenPlugin getPlugin() { + return myPlugin; } @Override - protected void updateNameAndDescription() { + public String getName() { + return myPluginInfo == null ? myPlugin.getDisplayString() : myPluginInfo.getGoalPrefix(); + } + + @Override + protected void doUpdate() { + setNameAndTooltip(getName(), null, myPluginInfo != null ? myPlugin.getDisplayString() : null); + } + + public void updatePlugin() { boolean hadPluginInfo = myPluginInfo != null; myPluginInfo = MavenArtifactUtil.readPluginInfo(myProjectsManager.getLocalRepository(), myPlugin.getMavenId()); - if (myPluginInfo == null) { - setNameAndTooltip(myPlugin.getDisplayString(), null); - } - else { - setNameAndTooltip(myPluginInfo.getGoalPrefix(), null, myPlugin.getDisplayString()); - } - setNodeErrorLevel(myPluginInfo == null ? ErrorLevel.ERROR : ErrorLevel.NONE); - // there is no need to update goals since plugins do not change - if (hadPluginInfo || myPluginInfo == null) return; + boolean hasPluginInfo = myPluginInfo != null; - for (MavenPluginInfo.Mojo mojo : myPluginInfo.getMojos()) { - myGoalNodes.add(new PluginGoalNode(this, mojo.getQualifiedGoal(), mojo.getDisplayName())); + setErrorLevel(myPluginInfo == null ? ErrorLevel.ERROR : ErrorLevel.NONE); + + if (hadPluginInfo == hasPluginInfo) return; + + myGoalNodes.clear(); + if (myPluginInfo != null) { + for (MavenPluginInfo.Mojo mojo : myPluginInfo.getMojos()) { + myGoalNodes.add(new PluginGoalNode(this, mojo.getQualifiedGoal(), mojo.getDisplayName())); + } } + + updateFrom(this); + childrenChanged(); } - public MavenPlugin getPlugin() { - return myPlugin; + @Override + public boolean isVisible() { + // show regardless absence of children + return getDisplayKind() != DisplayKind.NEVER; } } @@ -1021,12 +1011,12 @@ public class MavenProjectsStructure extends SimpleTreeStructure { public abstract class BaseDependenciesNode extends GroupNode { private final List myChildren = new ArrayList(); - protected BaseDependenciesNode(CustomNode parent) { + protected BaseDependenciesNode(MavenSimpleNode parent) { super(parent); } @Override - protected List getStructuralChildren() { + protected List doGetChildren() { return myChildren; } @@ -1034,12 +1024,14 @@ public class MavenProjectsStructure extends SimpleTreeStructure { List newNodes = new ArrayList(children.size()); for (MavenArtifactNode each : children) { DependencyNode newNode = findOrCreateNodeFor(each, mavenProject); - newNode.updateNameAndDescription(); newNodes.add(newNode); newNode.updateChildren(each.getDependencies(), mavenProject); + newNode.updateDependency(); } myChildren.clear(); myChildren.addAll(newNodes); + + childrenChanged(); } private DependencyNode findOrCreateNodeFor(MavenArtifactNode artifact, MavenProject mavenProject) { @@ -1051,22 +1043,18 @@ public class MavenProjectsStructure extends SimpleTreeStructure { } public class DependenciesNode extends BaseDependenciesNode { - private final ProjectNode myProjectNode; - public DependenciesNode(ProjectNode parent) { super(parent); - myProjectNode = parent; setIcons(MavenIcons.CLOSED_DEPENDENCIES_ICON, MavenIcons.OPEN_DEPENDENCIES_ICON); - updateNameAndDescription(); } @Override - protected void updateNameAndDescription() { - setNameAndTooltip(message("view.node.dependencies"), null); + public String getName() { + return message("view.node.dependencies"); } public void updateDependencies(MavenProject mavenProject) { - updateChildren(mavenProject.getDependenciesNodes(), myProjectNode.getMavenProject()); + updateChildren(mavenProject.getDependenciesNodes(), mavenProject); } } @@ -1074,20 +1062,26 @@ public class MavenProjectsStructure extends SimpleTreeStructure { private final MavenArtifact myArtifact; private final MavenProject myMavenProject; - public DependencyNode(CustomNode parent, MavenArtifactNode artifactNode, MavenProject mavenProject) { + public DependencyNode(MavenSimpleNode parent, MavenArtifactNode artifactNode, MavenProject mavenProject) { super(parent); myMavenProject = mavenProject; myArtifact = artifactNode.getArtifact(); setUniformIcon(MavenIcons.DEPENDENCY_ICON); - updateNameAndDescription(); } @Override - protected void updateNameAndDescription() { + public String getName() { + return myArtifact.getDisplayStringForLibraryName(); + } + + @Override + protected void doUpdate() { String scope = myArtifact.getScope(); - setNameAndTooltip(myArtifact.getDisplayStringForLibraryName(), null, - MavenConstants.SCOPE_COMPILE.equals(scope) ? null : scope); - setNodeErrorLevel(myArtifact.isResolved() ? ErrorLevel.NONE : ErrorLevel.ERROR); + setNameAndTooltip(getName(), null, MavenConstants.SCOPE_COMPILE.equals(scope) ? null : scope); + } + + private void updateDependency() { + setErrorLevel(myArtifact.isResolved() ? ErrorLevel.NONE : ErrorLevel.ERROR); } @Override @@ -1113,6 +1107,7 @@ public class MavenProjectsStructure extends SimpleTreeStructure { @Override public boolean isVisible() { + // show regardless absence of children return getDisplayKind() != DisplayKind.NEVER; } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectFromMavenProjectsDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectFromMavenProjectsDialog.java index 6f34d7c608..6af883ec78 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectFromMavenProjectsDialog.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectFromMavenProjectsDialog.java @@ -36,7 +36,7 @@ public class SelectFromMavenProjectsDialog extends DialogWrapper { public SelectFromMavenProjectsDialog(Project project, String title, - final Class nodeClass, + final Class nodeClass, NodeSelector selector) { super(project, false); myProject = project; @@ -53,7 +53,7 @@ public class SelectFromMavenProjectsDialog extends DialogWrapper { MavenProjectsNavigator.getInstance(myProject), myTree) { @Override - protected Class[] getVisibleNodesClasses() { + protected Class[] getVisibleNodesClasses() { return new Class[]{nodeClass}; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectMavenProjectDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectMavenProjectDialog.java index 93699ef762..5c3c3c791e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectMavenProjectDialog.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectMavenProjectDialog.java @@ -57,7 +57,7 @@ public class SelectMavenProjectDialog extends SelectFromMavenProjectsDialog { if (node != null) { if (!(node instanceof MavenProjectsStructure.ProjectNode)) { - ((MavenProjectsStructure.CustomNode)node).getParent(MavenProjectsStructure.ProjectNode.class); + ((MavenProjectsStructure.MavenSimpleNode)node).findParent(MavenProjectsStructure.ProjectNode.class); } } myResult = node != null ? ((MavenProjectsStructure.ProjectNode)node).getMavenProject() : null; diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenImportNotifier.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenImportNotifier.java index d9acd3a371..b19a830ff7 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenImportNotifier.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenImportNotifier.java @@ -30,6 +30,7 @@ import org.jetbrains.idea.maven.project.MavenProjectsManager; import org.jetbrains.idea.maven.project.ProjectBundle; import javax.swing.*; +import javax.swing.border.LineBorder; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import java.awt.*; @@ -119,24 +120,17 @@ public class MavenImportNotifier extends SimpleProjectComponent { private JLabel myLabel; private NotifierPanel() { - super(new BorderLayout()); + super(new GridBagLayout()); setBackground(LightColors.YELLOW); setBorder(BorderFactory.createEmptyBorder(7, 15, 7, 15)); - myLabel = new JLabel(MavenIcons.MAVEN_ICON); - - add(myLabel, BorderLayout.WEST); + myLabel = new JLabel(MavenIcons.MAVEN_ICON, JLabel.LEFT); JComponent importChangedButton = createButton(ProjectBundle.message("maven.project.import.changed"), new Runnable() { public void run() { myMavenProjectsManager.performScheduledImport(); } }); - JComponent importAllButton = createButton(ProjectBundle.message("maven.project.import.all"), new Runnable() { - public void run() { - myMavenProjectsManager.forceUpdateAllProjectsOrFindAllAvailablePomFiles(); - } - }); JComponent enableAutoImportButton = createButton(ProjectBundle.message("maven.project.import.enable.auto"), new Runnable() { public void run() { myMavenProjectsManager.getImportingSettings().setImportAutomatically(true); @@ -146,12 +140,23 @@ public class MavenImportNotifier extends SimpleProjectComponent { JPanel buttonsPanel = new JPanel(); buttonsPanel.setOpaque(false); buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS)); + buttonsPanel.add(myLabel); buttonsPanel.add(importChangedButton); - buttonsPanel.add(importAllButton); buttonsPanel.add(Box.createHorizontalStrut(10)); buttonsPanel.add(enableAutoImportButton); - add(buttonsPanel, BorderLayout.EAST); + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.HORIZONTAL; + + c.gridx = 0; + c.anchor = GridBagConstraints.WEST; + c.weightx = 1; + add(myLabel, c); + + c.gridx = 1; + c.weightx = 0; + c.anchor = GridBagConstraints.EAST; + add(buttonsPanel, c); } private JComponent createButton(String text, final Runnable action) { @@ -174,9 +179,10 @@ public class MavenImportNotifier extends SimpleProjectComponent { s = ProjectBundle.message("maven.project.something.changed"); } else { - s = ProjectBundle.message("maven.project.changed", projectsCount, projectsCount == 1 ? " has" : "s have"); + s = ProjectBundle.message("maven.project.changed", projectsCount, projectsCount == 1 ? " is" : "s are"); } myLabel.setText(s); + myLabel.setToolTipText(s); } } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/actions/MavenActionUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/actions/MavenActionUtil.java index ad2fc1ab98..f5f9a53ff6 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/actions/MavenActionUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/actions/MavenActionUtil.java @@ -70,9 +70,11 @@ public class MavenActionUtil { MavenProject project = getProjectsManager(e).findProject(each); if (project != null) result.add(project); } - for (Module each : getModules(e)) { - MavenProject project = getProjectsManager(e).findProject(each); - if (project != null) result.add(project); + if (result.isEmpty()) { + for (Module each : getModules(e)) { + MavenProject project = getProjectsManager(e).findProject(each); + if (project != null) result.add(project); + } } return new ArrayList(result); } diff --git a/plugins/maven/src/main/resources/ProjectBundle.properties b/plugins/maven/src/main/resources/ProjectBundle.properties index 2731c61f00..b216fed374 100644 --- a/plugins/maven/src/main/resources/ProjectBundle.properties +++ b/plugins/maven/src/main/resources/ProjectBundle.properties @@ -18,8 +18,8 @@ maven.downloading.artifact=Downloading {0} maven.transfer.progress={0}/{1}K [{2}] {3} maven.transfer.start=Checking [{0}] {1} -maven.project.changed={0} Maven project{1} been changed. -maven.project.something.changed=Some settings have been changed that require reimport. +maven.project.changed={0} Maven project{1} ready to be imported +maven.project.something.changed=Changes have been made that require reimport maven.project.import.changed=Import Changes maven.project.import.all=Force Reimport All maven.project.import.enable.auto=Enable Auto-Import @@ -83,7 +83,6 @@ maven.select.maven.settings.file=Select Maven settings file maven.select.local.repository=Select Maven local repository maven.file.type.descr=Maven project files -view.node.root=Maven Projects view.node.lifecycle=Lifecycle view.node.profiles=Profiles view.node.plugins=Plugins diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java index 1121aefbc9..d74a311d49 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenImportingTestCase.java @@ -423,6 +423,12 @@ public abstract class MavenImportingTestCase extends MavenTestCase { FileUtil.delete(new File(getRepositoryPath(), relativePath)); } + protected void setupJdkForModules(String... moduleNames) { + for (String each : moduleNames) { + setupJdkForModule(each); + } + } + protected Sdk setupJdkForModule(String moduleName) { ModifiableRootModel m = ModuleRootManager.getInstance(getModule(moduleName)).getModifiableModel(); Sdk sdk = createJdk("Java 1.5"); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/JavaClasspathConfigurationTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/JavaClasspathConfigurationTest.java index 976a3f657b..5b500684a4 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/JavaClasspathConfigurationTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/execution/JavaClasspathConfigurationTest.java @@ -74,20 +74,17 @@ public class JavaClasspathConfigurationTest extends MavenImportingTestCase { assertModuleModuleDeps("m1", "m2", "m3"); assertModuleModuleDeps("m2", "m3", "m4"); - setupJdkForModule("m1"); - setupJdkForModule("m2"); - setupJdkForModule("m3"); - setupJdkForModule("m4"); + setupJdkForModules("m1", "m2", "m3", "m4"); assertModuleClasspath("m1", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getProjectPath() + "/m3/target/classes"); + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getProjectPath() + "/m3/target/classes"); assertModuleClasspath("m2", - getProjectPath() + "/m2/target/classes", - getProjectPath() + "/m3/target/classes", - getProjectPath() + "/m4/target/classes"); + getProjectPath() + "/m2/target/classes", + getProjectPath() + "/m3/target/classes", + getProjectPath() + "/m4/target/classes"); } public void testOptionalLibraryDependencies() throws Exception { @@ -128,18 +125,17 @@ public class JavaClasspathConfigurationTest extends MavenImportingTestCase { assertModuleLibDeps("m1", "Maven: jmock:jmock:1.0"); assertModuleLibDeps("m2", "Maven: jmock:jmock:1.0", "Maven: junit:junit:4.0"); - setupJdkForModule("m1"); - setupJdkForModule("m2"); + setupJdkForModules("m1", "m2"); assertModuleClasspath("m1", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar"); + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar"); assertModuleClasspath("m2", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); } public void testDoNotChangeClasspathForRegularModules() throws Exception { @@ -184,20 +180,18 @@ public class JavaClasspathConfigurationTest extends MavenImportingTestCase { assertModuleModuleDeps("user", "m1"); assertModuleLibDeps("user"); - setupJdkForModule("user"); - setupJdkForModule("m1"); - setupJdkForModule("m2"); + setupJdkForModules("m1", "m2", "user"); assertModuleClasspath("user", - getProjectPath() + "/user/output", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + getProjectPath() + "/user/output", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); assertModuleClasspath("m1", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); } public void testDoNotIncludeProvidedAndTestTransitiveDependencies() throws Exception { @@ -239,17 +233,72 @@ public class JavaClasspathConfigurationTest extends MavenImportingTestCase { assertModuleLibDeps("m1"); assertModuleLibDeps("m2", "Maven: jmock:jmock:1.0", "Maven: junit:junit:4.0"); - setupJdkForModule("m1"); - setupJdkForModule("m2"); + setupJdkForModules("m1", "m2"); assertModuleClasspath("m1", - getProjectPath() + "/m1/target/classes", - getProjectPath() + "/m2/target/classes"); + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes"); assertModuleClasspath("m2", - getProjectPath() + "/m2/target/classes", - getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar", - getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/jmock/jmock/1.0/jmock-1.0.jar", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar"); + } + + public void testDoNotIncludeConflictingTransitiveDependenciesInTheClasspath() throws Exception { + VirtualFile m1 = createModulePom("m1", "test" + + "m1" + + "1" + + + "" + + " " + + " test" + + " m2" + + " 1" + + " " + + " " + + " test" + + " m3" + + " 1" + + " " + + ""); + + VirtualFile m2 = createModulePom("m2", "test" + + "m2" + + "1" + + + "" + + " " + + " junit" + + " junit" + + " 4.0" + + " " + + ""); + VirtualFile m3 = createModulePom("m3", "test" + + "m3" + + "1" + + + "" + + " " + + " junit" + + " junit" + + " 4.5" + + " " + + ""); + + importProjects(m1, m2, m3); + assertModules("m1", "m2", "m3"); + + assertModuleModuleDeps("m1", "m2", "m3"); + assertModuleLibDeps("m1", "Maven: junit:junit:4.0"); + + setupJdkForModules("m1", "m2", "m3"); + + assertModuleClasspath("m1", + getProjectPath() + "/m1/target/classes", + getProjectPath() + "/m2/target/classes", + getRepositoryPath() + "/junit/junit/4.0/junit-4.0.jar", + getProjectPath() + "/m3/target/classes"); } private void assertModuleClasspath(String moduleName, String... paths) throws CantRunException { diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorTest.java index b19376c5d1..7d277c5c3d 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorTest.java @@ -55,7 +55,7 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase { myProjectsManager.fireActivatedInTests(); assertEquals(1, getRootNodes().size()); - assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodes().size()); + assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().size()); } public void testReconnectingModulesWhenModuleRead() throws Exception { @@ -72,7 +72,7 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase { assertEquals(1, getRootNodes().size()); assertEquals(myProjectPom, getRootNodes().get(0).getVirtualFile()); - assertEquals(0, getRootNodes().get(0).getModulesNode().getProjectNodes().size()); + assertEquals(0, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().size()); VirtualFile m = createModulePom("m", "test" + "m" + @@ -81,8 +81,8 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase { assertEquals(1, getRootNodes().size()); assertEquals(myProjectPom, getRootNodes().get(0).getVirtualFile()); - assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodes().size()); - assertEquals(m, getRootNodes().get(0).getModulesNode().getProjectNodes().get(0).getVirtualFile()); + assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().size()); + assertEquals(m, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().get(0).getVirtualFile()); } public void testReconnectingModulesWhenParentRead() throws Exception { @@ -107,8 +107,8 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase { assertEquals(1, getRootNodes().size()); assertEquals(myProjectPom, getRootNodes().get(0).getVirtualFile()); - assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodes().size()); - assertEquals(m, getRootNodes().get(0).getModulesNode().getProjectNodes().get(0).getVirtualFile()); + assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().size()); + assertEquals(m, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().get(0).getVirtualFile()); } public void testReconnectingModulesWhenProjectBecomesParent() throws Exception { @@ -136,8 +136,8 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase { assertEquals(1, getRootNodes().size()); assertEquals(myProjectPom, getRootNodes().get(0).getVirtualFile()); - assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodes().size()); - assertEquals(m, getRootNodes().get(0).getModulesNode().getProjectNodes().get(0).getVirtualFile()); + assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().size()); + assertEquals(m, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().get(0).getVirtualFile()); } public void testUpdatingWhenManagedFilesChange() throws Exception { @@ -180,16 +180,16 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase { readFiles(myProjectPom, m, mm); assertEquals(1, getRootNodes().size()); - assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodes().size()); - assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodes().get(0).getModulesNode().getProjectNodes().size()); + assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().size()); + assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().get(0).getModulesNode().getProjectNodesInTests().size()); myNavigator.setGroupModules(false); assertEquals(3, getRootNodes().size()); myNavigator.setGroupModules(true); assertEquals(1, getRootNodes().size()); - assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodes().size()); - assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodes().get(0).getModulesNode().getProjectNodes().size()); + assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().size()); + assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().get(0).getModulesNode().getProjectNodesInTests().size()); } public void testIgnoringProjects() throws Exception { @@ -242,14 +242,14 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase { assertEquals(1, myStructure.getRootElement().getChildren().length); MavenProjectsStructure.ProjectNode projectNode = (MavenProjectsStructure.ProjectNode)myStructure.getRootElement().getChildren()[0]; assertEquals(myProjectPom, projectNode.getVirtualFile()); - assertEquals(1, projectNode.getModulesNode().getProjectNodes().size()); + assertEquals(1, projectNode.getModulesNode().getProjectNodesInTests().size()); myNavigator.setShowIgnored(false); assertEquals(2, getRootNodes().size()); assertEquals(1, myStructure.getRootElement().getChildren().length); // only one of them is visible projectNode = (MavenProjectsStructure.ProjectNode)myStructure.getRootElement().getChildren()[0]; assertEquals(m, projectNode.getVirtualFile()); - assertEquals(0, projectNode.getModulesNode().getProjectNodes().size()); + assertEquals(0, projectNode.getModulesNode().getProjectNodesInTests().size()); } public void testReorderingProjectsWhenNameChanges() throws Exception { @@ -295,7 +295,7 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase { readFiles(myProjectPom, m); assertEquals(1, getRootNodes().size()); - assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodes().size()); + assertEquals(1, getRootNodes().get(0).getModulesNode().getProjectNodesInTests().size()); MavenProjectsNavigatorState newState = new MavenProjectsNavigatorState(); newState.groupStructurally = false; @@ -321,6 +321,6 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase { } private List getRootNodes() { - return myStructure.getRootElement().getProjectNodes(); + return myStructure.getRootElement().getProjectNodesInTests(); } } -- 2.11.4.GIT