From ffab2ea413c45d9d5a15450d36a87e068994b076 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Wed, 4 Apr 2012 15:09:03 +0400 Subject: [PATCH] IDEA-77897 (Maven dependency marked wrongly as duplicate although dependencies have different scopes) --- .../MavenDuplicateDependenciesInspection.java | 37 ++++-- .../MavenDuplicatedInspectionTest.groovy | 112 ++++++++++++++++++ 2 files changed, 138 insertions(+), 11 deletions(-) create mode 100644 plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java index f219ffc646ee..a8980f56e4a0 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/inspections/MavenDuplicateDependenciesInspection.java @@ -35,9 +35,7 @@ import org.jetbrains.idea.maven.dom.model.MavenDomDependency; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; import org.jetbrains.idea.maven.project.MavenProject; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspection { public MavenDuplicateDependenciesInspection() { @@ -47,15 +45,12 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec @Override public void checkFileElement(DomFileElement domFileElement, DomElementAnnotationHolder holder) { - - final XmlFile xmlFile = domFileElement.getFile(); MavenDomProjectModel projectModel = domFileElement.getRootElement(); - checkMavenProjectModel(projectModel, xmlFile, holder); + checkMavenProjectModel(projectModel, holder); } private static void checkMavenProjectModel(@NotNull MavenDomProjectModel projectModel, - @NotNull XmlFile xmlFile, @NotNull DomElementAnnotationHolder holder) { final Map> allDuplicates = getDuplicateDependenciesMap(projectModel); @@ -64,16 +59,36 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec if (id != null) { Set dependencies = allDuplicates.get(id); if (dependencies != null && dependencies.size() > 1) { - addProblem(dependency, dependencies, holder); + + List duplicatedDependencies = new ArrayList(); + + for (MavenDomDependency d : dependencies) { + if (d == dependency) continue; + + if (d.getParent() == dependency.getParent() || scope(d).equals(scope(dependency))) { + duplicatedDependencies.add(d); + } + } + + if (duplicatedDependencies.size() > 0) { + addProblem(dependency, duplicatedDependencies, holder); + } } } } } + private static String scope(MavenDomDependency dependency) { + String res = dependency.getScope().getRawText(); + if (StringUtil.isEmpty(res)) return "compile"; + + return res; + } + private static void addProblem(@NotNull MavenDomDependency dependency, - @NotNull Set dependencies, + @NotNull Collection dependencies, @NotNull DomElementAnnotationHolder holder) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); Set processed = new HashSet(); for (MavenDomDependency domDependency : dependencies) { if (dependency.equals(domDependency)) continue; @@ -90,7 +105,7 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec } private static String createLinkText(@NotNull MavenDomProjectModel model, @NotNull MavenDomDependency dependency) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); XmlTag tag = dependency.getXmlTag(); if (tag == null) return getProjectName(model); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy b/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy new file mode 100644 index 000000000000..8142c34dbed8 --- /dev/null +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/inspections/MavenDuplicatedInspectionTest.groovy @@ -0,0 +1,112 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.inspections + +import org.jetbrains.idea.maven.dom.MavenDomTestCase +import org.jetbrains.idea.maven.dom.inspections.MavenDuplicateDependenciesInspection + +/** + * @author Sergey Evdokimov + */ +class MavenDuplicatedInspectionTest extends MavenDomTestCase { + + public void testDuplicatedInOneFile() { + myFixture.enableInspections(MavenDuplicateDependenciesInspection) + + createProjectPom(""" + mavenParent + childA + 1.0 + + + <dependency> + commons-collections + commons-collections + LATEST + provided + + <dependency> + commons-collections + commons-collections + LATEST + + +""") + + checkHighlighting() + } + + public void testDuplicatedInParent() { + myFixture.enableInspections(MavenDuplicateDependenciesInspection) + + def m = createModulePom("child", """ + mavenParent + child + 1.0 + + + mavenParent + parent + 1.0 + + + + + commons-collections + commons-collections + LATEST + runtime + + + commons-io + commons-io + LATEST + compile + + +""") + + createProjectPom(""" + mavenParent + parent + 1.0 + pom + + + child + + + + + commons-collections + commons-collections + LATEST + provided + + <dependency> + commons-io + commons-io + LATEST + + +""") + + importProject() + + checkHighlighting(myProjectPom, true, false, true) + } + +}