]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-926 Update SourceScanner to work with multi-language projects
authorJulien HENRY <julien.henry@sonarsource.com>
Fri, 24 Jan 2014 15:39:15 +0000 (16:39 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Fri, 24 Jan 2014 15:39:58 +0000 (16:39 +0100)
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/issue/ignore/scanner/SourceScanner.java
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/issue/ignore/scanner/SourceScannerTest.java
sonar-plugin-api/src/main/java/org/sonar/api/scan/filesystem/internal/InputFile.java

index 4a5d87eb5d6ead2a72f7dfae866096d1bbbcf013..f8b3b0014537bd54ed246b0a95004952b328390c 100644 (file)
@@ -59,27 +59,15 @@ public final class SourceScanner implements Sensor {
    * {@inheritDoc}
    */
   public void analyse(Project project, SensorContext context) {
-    parseDirs(project, false);
-    parseDirs(project, true);
-  }
-
-  protected void parseDirs(Project project, boolean isTest) {
     Charset sourcesEncoding = fileSystem.sourceCharset();
 
-    Iterable<InputFile> files;
-    if (isTest) {
-      files = fileSystem.inputFiles(FileQuery.onTest().onLanguage(project.getLanguageKey()));
-    } else {
-      files = fileSystem.inputFiles(FileQuery.onSource().onLanguage(project.getLanguageKey()));
-    }
-
-    for (InputFile inputFile : files) {
+    for (InputFile inputFile : fileSystem.inputFiles(FileQuery.all())) {
       try {
         String componentEffectiveKey = inputFile.attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY);
         if (componentEffectiveKey != null) {
-          String relativePathFromSource = inputFile.attribute(InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH);
-          inclusionPatternInitializer.initializePatternsForPath(relativePathFromSource, componentEffectiveKey);
-          exclusionPatternInitializer.initializePatternsForPath(relativePathFromSource, componentEffectiveKey);
+          String path = inputFile.path();
+          inclusionPatternInitializer.initializePatternsForPath(path, componentEffectiveKey);
+          exclusionPatternInitializer.initializePatternsForPath(path, componentEffectiveKey);
           if (exclusionPatternInitializer.hasFileContentPattern()) {
             regexpScanner.scan(componentEffectiveKey, inputFile.file(), sourcesEncoding);
           }
index 39d80f75112db472cbce1a3a58a4f3e3c157fd48..98ec8ec805cf78c77f6475b22f3bbf159a0a975f 100644 (file)
@@ -29,11 +29,9 @@ import org.junit.rules.TemporaryFolder;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.sonar.api.resources.Java;
 import org.sonar.api.resources.Project;
 import org.sonar.api.scan.filesystem.FileQuery;
 import org.sonar.api.scan.filesystem.internal.DefaultInputFile;
-import org.sonar.api.scan.filesystem.internal.InputFile;
 import org.sonar.api.scan.filesystem.internal.InputFileBuilder;
 import org.sonar.api.utils.SonarException;
 import org.sonar.batch.scan.filesystem.DefaultModuleFileSystem;
@@ -116,106 +114,62 @@ public class SourceScannerTest {
   }
 
   @Test
-  public void shouldAnalyseJavaProject() throws IOException {
+  public void shouldAnalyseProject() throws IOException {
     File javaFile1 = new File(baseDir, "src/main/java/Foo.java");
-    when(fs.inputFiles(FileQuery.onSource().onLanguage(Java.KEY))).thenReturn((Iterable) Arrays.asList(
+    File javaTestFile1 = new File(baseDir, "src/test/java/FooTest.java");
+    when(fs.inputFiles(FileQuery.all())).thenReturn((Iterable) Arrays.asList(
       new InputFileBuilder(javaFile1, Charsets.UTF_8, "src/main/java/Foo.java")
-        .attribute(InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "Foo.java")
-        .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:/src/main/java/Foo.java")
+        .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:src/main/java/Foo.java")
+        .build(),
+      new InputFileBuilder(javaTestFile1, Charsets.UTF_8, "src/test/java/FooTest.java")
+        .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:src/test/java/FooTest.java")
         .build()));
-    File javaTestFile1 = new File(baseDir, "src/test/java/FooTest.java");
-    when(fs.inputFiles(FileQuery.onTest().onLanguage(Java.KEY))).thenReturn(
-      (Iterable) Arrays.asList(
-        new InputFileBuilder(javaTestFile1, Charsets.UTF_8, "src/test/java/FooTest.java")
-          .attribute(InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "FooTest.java")
-          .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:/src/test/java/FooTest.java")
-          .build()));
-    when(project.getLanguageKey()).thenReturn(Java.KEY);
 
     when(exclusionPatternInitializer.hasFileContentPattern()).thenReturn(true);
 
     scanner.analyse(project, null);
 
-    verify(inclusionPatternInitializer).initializePatternsForPath("Foo.java", "polop:/src/main/java/Foo.java");
-    verify(inclusionPatternInitializer).initializePatternsForPath("FooTest.java", "polop:/src/test/java/FooTest.java");
-    verify(exclusionPatternInitializer).initializePatternsForPath("Foo.java", "polop:/src/main/java/Foo.java");
-    verify(exclusionPatternInitializer).initializePatternsForPath("FooTest.java", "polop:/src/test/java/FooTest.java");
-    verify(regexpScanner).scan("polop:/src/main/java/Foo.java", javaFile1, UTF_8);
-    verify(regexpScanner).scan("polop:/src/test/java/FooTest.java", javaTestFile1, UTF_8);
+    verify(inclusionPatternInitializer).initializePatternsForPath("src/main/java/Foo.java", "polop:src/main/java/Foo.java");
+    verify(inclusionPatternInitializer).initializePatternsForPath("src/test/java/FooTest.java", "polop:src/test/java/FooTest.java");
+    verify(exclusionPatternInitializer).initializePatternsForPath("src/main/java/Foo.java", "polop:src/main/java/Foo.java");
+    verify(exclusionPatternInitializer).initializePatternsForPath("src/test/java/FooTest.java", "polop:src/test/java/FooTest.java");
+    verify(regexpScanner).scan("polop:src/main/java/Foo.java", javaFile1, UTF_8);
+    verify(regexpScanner).scan("polop:src/test/java/FooTest.java", javaTestFile1, UTF_8);
   }
 
   @Test
   public void shouldAnalyseFilesOnlyWhenRegexConfigured() throws IOException {
     File javaFile1 = new File(baseDir, "src/main/java/Foo.java");
-    when(fs.inputFiles(FileQuery.onSource().onLanguage(Java.KEY))).thenReturn((Iterable) Arrays.asList(
+    File javaTestFile1 = new File(baseDir, "src/test/java/FooTest.java");
+    when(fs.inputFiles(FileQuery.all())).thenReturn((Iterable) Arrays.asList(
       new InputFileBuilder(javaFile1, Charsets.UTF_8, "src/main/java/Foo.java")
-        .attribute(InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "Foo.java")
-        .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:/src/main/java/Foo.java")
+        .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:src/main/java/Foo.java")
+        .build(),
+      new InputFileBuilder(javaTestFile1, Charsets.UTF_8, "src/test/java/FooTest.java")
+        .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:src/test/java/FooTest.java")
         .build()));
-    File javaTestFile1 = new File(baseDir, "src/test/java/FooTest.java");
-    when(fs.inputFiles(FileQuery.onTest().onLanguage(Java.KEY))).thenReturn(
-      (Iterable) Arrays.asList(
-        new InputFileBuilder(javaTestFile1, Charsets.UTF_8, "src/test/java/FooTest.java")
-          .attribute(InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "FooTest.java")
-          .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:/src/test/java/FooTest.java")
-          .build()));
-    when(project.getLanguageKey()).thenReturn(Java.KEY);
 
     when(exclusionPatternInitializer.hasFileContentPattern()).thenReturn(false);
 
     scanner.analyse(project, null);
 
-    verify(inclusionPatternInitializer).initializePatternsForPath("Foo.java", "polop:/src/main/java/Foo.java");
-    verify(inclusionPatternInitializer).initializePatternsForPath("FooTest.java", "polop:/src/test/java/FooTest.java");
-    verify(exclusionPatternInitializer).initializePatternsForPath("Foo.java", "polop:/src/main/java/Foo.java");
-    verify(exclusionPatternInitializer).initializePatternsForPath("FooTest.java", "polop:/src/test/java/FooTest.java");
+    verify(inclusionPatternInitializer).initializePatternsForPath("src/main/java/Foo.java", "polop:src/main/java/Foo.java");
+    verify(inclusionPatternInitializer).initializePatternsForPath("src/test/java/FooTest.java", "polop:src/test/java/FooTest.java");
+    verify(exclusionPatternInitializer).initializePatternsForPath("src/main/java/Foo.java", "polop:src/main/java/Foo.java");
+    verify(exclusionPatternInitializer).initializePatternsForPath("src/test/java/FooTest.java", "polop:src/test/java/FooTest.java");
     verifyZeroInteractions(regexpScanner);
   }
 
-  @Test
-  public void shouldAnalyseOtherProject() throws Exception {
-    File phpFile1 = new File(baseDir, "src/Foo.php");
-    when(fs.inputFiles(FileQuery.onSource().onLanguage("php"))).thenReturn((Iterable) Arrays.asList(
-      new InputFileBuilder(phpFile1, Charsets.UTF_8, "src/Foo.php")
-        .attribute(InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "Foo.php")
-        .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:/src/Foo.php")
-        .build()));
-    File phpTestFile1 = new File(baseDir, "src/test/FooTest.php");
-    when(fs.inputFiles(FileQuery.onTest().onLanguage("php"))).thenReturn(
-      (Iterable) Arrays.asList(
-        new InputFileBuilder(phpTestFile1, Charsets.UTF_8, "src/test/FooTest.php")
-          .attribute(InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "FooTest.php")
-          .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:/src/test/FooTest.php")
-          .build()));
-
-    when(project.getLanguageKey()).thenReturn("php");
-
-    when(exclusionPatternInitializer.hasFileContentPattern()).thenReturn(true);
-
-    scanner.analyse(project, null);
-
-    verify(inclusionPatternInitializer).initializePatternsForPath("Foo.php", "polop:/src/Foo.php");
-    verify(inclusionPatternInitializer).initializePatternsForPath("FooTest.php", "polop:/src/test/FooTest.php");
-    verify(exclusionPatternInitializer).initializePatternsForPath("Foo.php", "polop:/src/Foo.php");
-    verify(exclusionPatternInitializer).initializePatternsForPath("FooTest.php", "polop:/src/test/FooTest.php");
-    verify(regexpScanner).scan("polop:/src/Foo.php", phpFile1, UTF_8);
-    verify(regexpScanner).scan("polop:/src/test/FooTest.php", phpTestFile1, UTF_8);
-  }
-
   @Test
   public void shouldReportFailure() throws IOException {
     File phpFile1 = new File(baseDir, "src/Foo.php");
-    when(fs.inputFiles(FileQuery.onSource().onLanguage("php"))).thenReturn((Iterable) Arrays.asList(
+    when(fs.inputFiles(FileQuery.all())).thenReturn((Iterable) Arrays.asList(
       new InputFileBuilder(phpFile1, Charsets.UTF_8, "src/Foo.php")
-        .attribute(InputFile.ATTRIBUTE_SOURCE_RELATIVE_PATH, "Foo.php")
-        .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:/src/Foo.php")
+        .attribute(DefaultInputFile.ATTRIBUTE_COMPONENT_KEY, "polop:src/Foo.php")
         .build()));
-    when(fs.inputFiles(FileQuery.onTest().onLanguage("php"))).thenReturn(
-      (Iterable) Arrays.asList());
 
-    when(project.getLanguageKey()).thenReturn("php");
     when(exclusionPatternInitializer.hasFileContentPattern()).thenReturn(true);
-    doThrow(new IOException("BUG")).when(regexpScanner).scan("polop:/src/Foo.php", phpFile1, UTF_8);
+    doThrow(new IOException("BUG")).when(regexpScanner).scan("polop:src/Foo.php", phpFile1, UTF_8);
 
     thrown.expect(SonarException.class);
     thrown.expectMessage("Unable to read the source file");
index d2679f3e89a0628f6a93b2e66979a3cede405f3a..0503db1dffdccdb9c77f9228503bb465de755f01 100644 (file)
@@ -31,13 +31,17 @@ public interface InputFile extends Serializable {
   /**
    * Canonical path of source directory.
    * Example: <code>/path/to/module/src/main/java</code> or <code>C:\path\to\module\src\main\java</code>
+   * @deprecated since 4.2 No more sonar.sources
    */
+  @Deprecated
   String ATTRIBUTE_SOURCEDIR_PATH = "SRC_DIR_PATH";
 
   /**
    * Relative path from source directory. File separator is the forward slash ('/'),
    * even on MSWindows.
+   * @deprecated since 4.2 No more sonar.sources
    */
+  @Deprecated
   String ATTRIBUTE_SOURCE_RELATIVE_PATH = "SRC_REL_PATH";
 
   /**