]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3843 Unable to determine structure of Maven project
authorJulien Lancelot <julien.lancelot@gmail.com>
Mon, 11 Feb 2013 14:10:55 +0000 (15:10 +0100)
committerJulien Lancelot <julien.lancelot@gmail.com>
Mon, 11 Feb 2013 14:10:55 +0000 (15:10 +0100)
sonar-batch/src/main/java/org/sonar/batch/MavenProjectConverter.java
sonar-batch/src/test/java/org/sonar/batch/MavenProjectConverterTest.java
sonar-batch/src/test/resources/org/sonar/batch/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/module/pom_having_different_name.xml [new file with mode: 0644]
sonar-batch/src/test/resources/org/sonar/batch/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/pom.xml [new file with mode: 0644]
sonar-maven3-plugin/src/main/java/org/sonar/maven3/SonarMojo.java

index 5f203f3eae78181b1a03a6ddca44f9d0fe1f7eb8..024c357ecbc18f64961a3697059a375d4292845a 100644 (file)
@@ -38,7 +38,11 @@ import java.util.Map;
 public final class MavenProjectConverter {
 
   private static final String UNABLE_TO_DETERMINE_PROJECT_STRUCTURE_EXCEPTION_MESSAGE = "Unable to determine structure of project." +
-    " Probably you use Maven Advanced Reactor Options, which is not supported by Sonar and should not be used.";
+      " Probably you use Maven Advanced Reactor Options, which is not supported by Sonar and should not be used.";
+
+  private MavenProjectConverter() {
+    // only static methods
+  }
 
   public static ProjectDefinition convert(List<MavenProject> poms, MavenProject root) {
     Map<String, MavenProject> paths = Maps.newHashMap(); // projects by canonical path to pom.xml
@@ -55,16 +59,13 @@ public final class MavenProjectConverter {
         for (Object m : pom.getModules()) {
           String moduleId = (String) m;
           File modulePath = new File(pom.getBasedir(), moduleId);
-          if (modulePath.exists() && modulePath.isDirectory()) {
-            modulePath = new File(modulePath, "pom.xml");
-          }
-          MavenProject module = paths.get(modulePath.getCanonicalPath());
+          MavenProject module = findMavenProject(modulePath, paths);
 
           ProjectDefinition parentProject = defs.get(pom);
-          ProjectDefinition subProject = defs.get(module);
           if (parentProject == null) {
             throw new IllegalStateException(UNABLE_TO_DETERMINE_PROJECT_STRUCTURE_EXCEPTION_MESSAGE);
           }
+          ProjectDefinition subProject = defs.get(module);
           if (subProject == null) {
             throw new IllegalStateException(UNABLE_TO_DETERMINE_PROJECT_STRUCTURE_EXCEPTION_MESSAGE);
           }
@@ -83,6 +84,19 @@ public final class MavenProjectConverter {
     return rootProject;
   }
 
+  private static MavenProject findMavenProject(final File modulePath, Map<String, MavenProject> paths) throws IOException {
+    if (modulePath.exists() && modulePath.isDirectory()) {
+      for (Map.Entry<String, MavenProject> entry : paths.entrySet()) {
+        if (entry.getKey().contains(modulePath.getCanonicalPath())) {
+          return entry.getValue();
+        }
+      }
+      return null;
+    } else {
+      return paths.get(modulePath.getCanonicalPath());
+    }
+  }
+
   @VisibleForTesting
   static ProjectDefinition convert(MavenProject pom) {
     String key = new StringBuilder().append(pom.getGroupId()).append(":").append(pom.getArtifactId()).toString();
@@ -153,8 +167,4 @@ public final class MavenProjectConverter {
     }
     return file;
   }
-
-  private MavenProjectConverter() {
-    // only static methods
-  }
 }
index 91c77da73fa3e86a12ad134e286b3e5b6604c49a..325fbdd4a53b850337ff081fd495b94d8c2297f6 100644 (file)
@@ -138,6 +138,26 @@ public class MavenProjectConverterTest {
     assertThat(module1Def.getSubProjects().size(), Is.is(0));
   }
 
+  @Test
+  public void should_find_module_with_maven_project_file_naming_different_from_pom_xml() throws Exception {
+    File rootDir = TestUtils.getResource("/org/sonar/batch/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/");
+    MavenProject parent = loadPom("/org/sonar/batch/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/pom.xml", true);
+    MavenProject module = loadPom("/org/sonar/batch/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/module/pom_having_different_name.xml", false);
+
+    ProjectDefinition rootDef = MavenProjectConverter.convert(Arrays.asList(parent, module), parent);
+
+    assertThat(rootDef.getSubProjects().size(), Is.is(1));
+    assertThat(rootDef.getKey(), Is.is("org.test:parent"));
+    assertNull(rootDef.getParent());
+    assertThat(rootDef.getBaseDir(), is(rootDir));
+
+    ProjectDefinition module1Def = rootDef.getSubProjects().get(0);
+    assertThat(module1Def.getKey(), Is.is("org.test:module"));
+    assertThat(module1Def.getParent(), Is.is(rootDef));
+    assertThat(module1Def.getBaseDir(), Is.is(new File(rootDir, "module")));
+    assertThat(module1Def.getSubProjects().size(), Is.is(0));
+  }
+
   @Test
   public void testSingleProjectWithoutModules() throws Exception {
     File rootDir = TestUtils.getResource("/org/sonar/batch/MavenProjectConverterTest/singleProjectWithoutModules/");
diff --git a/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/module/pom_having_different_name.xml b/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/module/pom_having_different_name.xml
new file mode 100644 (file)
index 0000000..7b49562
--- /dev/null
@@ -0,0 +1,11 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.test</groupId>
+    <artifactId>parent</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+  <artifactId>module</artifactId>
+  <packaging>jar</packaging>
+</project>
\ No newline at end of file
diff --git a/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/pom.xml b/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectConverterTest/mavenProjectFileNameNotEqualsToPomXml/pom.xml
new file mode 100644 (file)
index 0000000..9d2244e
--- /dev/null
@@ -0,0 +1,11 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.test</groupId>
+  <artifactId>parent</artifactId>
+  <version>0.1-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  <modules>
+    <module>module</module>
+  </modules>
+</project>
\ No newline at end of file
index 15e9aa6f08f867409ff94d4dffff887b8746f13f..55a43090520a15e975ab0b73ba185f712aed54fb 100644 (file)
@@ -127,7 +127,7 @@ public final class SonarMojo extends AbstractMojo {
   private RuntimeInformation runtimeInformation;
 
   public void execute() throws MojoExecutionException, MojoFailureException {
-    ProjectDefinition def = MavenProjectConverter.convert(session.getSortedProjects(), project);
+    ProjectDefinition def = MavenProjectConverter.convert(session.getProjects(), project);
     ProjectReactor reactor = new ProjectReactor(def);
 
     Batch batch = Batch.builder()