IDEA-77897 (Maven dependency marked wrongly as duplicate although dependencies have different scopes)

This commit is contained in:
Sergey Evdokimov
2012-04-04 15:09:30 +04:00
parent b2fb7415c5
commit ffab2ea413
2 changed files with 138 additions and 11 deletions
@@ -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<MavenDomProjectModel> {
public MavenDuplicateDependenciesInspection() {
@@ -47,15 +45,12 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec
@Override
public void checkFileElement(DomFileElement<MavenDomProjectModel> 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<String, Set<MavenDomDependency>> allDuplicates = getDuplicateDependenciesMap(projectModel);
@@ -64,16 +59,36 @@ public class MavenDuplicateDependenciesInspection extends BasicDomElementsInspec
if (id != null) {
Set<MavenDomDependency> dependencies = allDuplicates.get(id);
if (dependencies != null && dependencies.size() > 1) {
addProblem(dependency, dependencies, holder);
List<MavenDomDependency> duplicatedDependencies = new ArrayList<MavenDomDependency>();
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<MavenDomDependency> dependencies,
@NotNull Collection<MavenDomDependency> dependencies,
@NotNull DomElementAnnotationHolder holder) {
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
Set<MavenDomProjectModel> processed = new HashSet<MavenDomProjectModel>();
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);
@@ -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("""
<groupId>mavenParent</groupId>
<artifactId>childA</artifactId>
<version>1.0</version>
<dependencies>
<<warning>dependency</warning>>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>LATEST</version>
<scope>provided</scope>
</dependency>
<<warning>dependency</warning>>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>LATEST</version>
</dependency>
</dependencies>
""")
checkHighlighting()
}
public void testDuplicatedInParent() {
myFixture.enableInspections(MavenDuplicateDependenciesInspection)
def m = createModulePom("child", """
<groupId>mavenParent</groupId>
<artifactId>child</artifactId>
<version>1.0</version>
<parent>
<groupId>mavenParent</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
</parent>
<dependencies>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>LATEST</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>LATEST</version>
<scope>compile</scope>
</dependency>
</dependencies>
""")
createProjectPom("""
<groupId>mavenParent</groupId>
<artifactId>parent</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>child</module>
</modules>
<dependencies>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>LATEST</version>
<scope>provided</scope>
</dependency>
<<warning>dependency</warning>>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>LATEST</version>
</dependency>
</dependencies>
""")
importProject()
checkHighlighting(myProjectPom, true, false, true)
}
}