]> source.dussan.org Git - sonarqube.git/commitdiff
Improve ProjectFileSystem
authorEvgeny Mandrikov <mandrikov@gmail.com>
Wed, 6 Apr 2011 21:02:25 +0000 (01:02 +0400)
committerEvgeny Mandrikov <mandrikov@gmail.com>
Tue, 12 Apr 2011 04:48:51 +0000 (08:48 +0400)
* Use ProjectFileSystem instead of DefaultProjectFileSystem in tests
* Use InputFileUtils in DefaultProjectFileSystem
* Add MavenProjectFileSystem

plugins/sonar-cobertura-plugin/src/test/java/org/sonar/plugins/cobertura/api/CoberturaUtilsTest.java
plugins/sonar-findbugs-plugin/src/test/java/org/sonar/plugins/findbugs/FindbugsSensorTest.java
plugins/sonar-pmd-plugin/src/test/java/org/sonar/plugins/pmd/PmdViolationsXmlParserTest.java
sonar-batch/src/main/java/org/sonar/batch/MavenProjectFileSystem.java [new file with mode: 0644]
sonar-batch/src/main/java/org/sonar/batch/ProjectBatch.java
sonar-plugin-api/src/main/java/org/sonar/api/resources/DefaultProjectFileSystem.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/AbstractSourceImporterTest.java

index 59192a3a25882a3b7b1d210c261a4ba41b3e663c..90a288e058f622847b4cd3604855118c65e91d32 100644 (file)
@@ -27,7 +27,7 @@ import static org.mockito.Mockito.when;
 import org.apache.maven.project.MavenProject;
 import org.junit.Test;
 import org.sonar.api.CoreProperties;
-import org.sonar.api.resources.DefaultProjectFileSystem;
+import org.sonar.api.resources.ProjectFileSystem;
 import org.sonar.api.resources.Project;
 import org.sonar.api.test.MavenTestUtils;
 
@@ -37,7 +37,7 @@ import java.net.URISyntaxException;
 public class CoberturaUtilsTest {
   @Test
   public void shouldGetReportPathFromProperty() throws URISyntaxException {
-    DefaultProjectFileSystem fileSystem = mock(DefaultProjectFileSystem.class);
+    ProjectFileSystem fileSystem = mock(ProjectFileSystem.class);
     when(fileSystem.resolvePath("foo")).thenReturn(getCoverageReport());
 
     Project project = mock(Project.class);
@@ -53,7 +53,7 @@ public class CoberturaUtilsTest {
   public void shouldGetReportPathFromPom() {
     MavenProject pom = MavenTestUtils.loadPom("/org/sonar/plugins/cobertura/CoberturaSensorTest/shouldGetReportPathFromPom/pom.xml");
 
-    DefaultProjectFileSystem fileSystem = mock(DefaultProjectFileSystem.class);
+    ProjectFileSystem fileSystem = mock(ProjectFileSystem.class);
 
     Project project = mock(Project.class);
     when(project.getPom()).thenReturn(pom);
index 149ec5daeafc0c35353deefd5b28cd8c04f93fa9..c4f0d70b9f00247d128311401f4a023f3b326a01 100644 (file)
@@ -24,7 +24,7 @@ import org.junit.Test;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.batch.SensorContext;
 import org.sonar.api.profiles.RulesProfile;
-import org.sonar.api.resources.DefaultProjectFileSystem;
+import org.sonar.api.resources.ProjectFileSystem;
 import org.sonar.api.resources.JavaFile;
 import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
@@ -147,7 +147,7 @@ public class FindbugsSensorTest extends FindbugsTests {
   }
 
   private Project createProject() {
-    DefaultProjectFileSystem fileSystem = mock(DefaultProjectFileSystem.class);
+    ProjectFileSystem fileSystem = mock(ProjectFileSystem.class);
     when(fileSystem.hasJavaSourceFiles()).thenReturn(Boolean.TRUE);
 
     Project project = mock(Project.class);
index 5286fcd3df8260dee7acf1b6eddace35c759b4ad..4d6a4a0e73f67bb2a6b80c7c91018024790e9053 100644 (file)
@@ -39,7 +39,7 @@ import org.junit.Test;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.sonar.api.batch.SensorContext;
-import org.sonar.api.resources.DefaultProjectFileSystem;
+import org.sonar.api.resources.ProjectFileSystem;
 import org.sonar.api.resources.JavaFile;
 import org.sonar.api.resources.Project;
 import org.sonar.api.rules.Rule;
@@ -50,7 +50,7 @@ import org.sonar.api.test.IsViolation;
 public class PmdViolationsXmlParserTest {
 
   private void parse(SensorContext context, String xmlPath) throws URISyntaxException, XMLStreamException {
-    DefaultProjectFileSystem fileSystem = mock(DefaultProjectFileSystem.class);
+    ProjectFileSystem fileSystem = mock(ProjectFileSystem.class);
     when(fileSystem.getSourceDirs()).thenReturn(Arrays.asList(new File("/test/src/main/java")));
 
     Project project = mock(Project.class);
diff --git a/sonar-batch/src/main/java/org/sonar/batch/MavenProjectFileSystem.java b/sonar-batch/src/main/java/org/sonar/batch/MavenProjectFileSystem.java
new file mode 100644 (file)
index 0000000..39ac4ad
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * Sonar is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
+ */
+package org.sonar.batch;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.maven.project.MavenProject;
+import org.sonar.api.resources.DefaultProjectFileSystem;
+import org.sonar.api.resources.Languages;
+import org.sonar.api.resources.Project;
+import org.sonar.api.resources.ProjectFileSystem;
+import org.sonar.api.utils.SonarException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * Implementation of {@link ProjectFileSystem} based on {@link MavenProject}.
+ */
+public class MavenProjectFileSystem extends DefaultProjectFileSystem {
+
+  private MavenProject pom;
+
+  public MavenProjectFileSystem(Project project, Languages languages) {
+    super(project, languages);
+    this.pom = project.getPom();
+  }
+
+  @Override
+  public File getBasedir() {
+    return pom.getBasedir();
+  }
+
+  @Override
+  public File getBuildDir() {
+    return resolvePath(pom.getBuild().getDirectory());
+  }
+
+  @Override
+  public File getBuildOutputDir() {
+    return resolvePath(pom.getBuild().getOutputDirectory());
+  }
+
+  /**
+   * Maven can modify source directories during Sonar execution - see MavenPhaseExecutor.
+   */
+  @Override
+  public List<File> getSourceDirs() {
+    return resolvePaths(pom.getCompileSourceRoots());
+  }
+
+  @Override
+  public DefaultProjectFileSystem addSourceDir(File dir) {
+    if (dir == null) {
+      throw new IllegalArgumentException("Can not add null to project source dirs");
+    }
+    pom.getCompileSourceRoots().add(0, dir.getAbsolutePath());
+    return this;
+  }
+
+  /**
+   * Maven can modify test directories during Sonar execution - see MavenPhaseExecutor.
+   */
+  @Override
+  public List<File> getTestDirs() {
+    return resolvePaths(pom.getTestCompileSourceRoots());
+  }
+
+  /**
+   * @deprecated since 2.6, because should be immutable
+   */
+  @Override
+  public DefaultProjectFileSystem addTestDir(File dir) {
+    if (dir == null) {
+      throw new IllegalArgumentException("Can not add null to project test dirs");
+    }
+    pom.getTestCompileSourceRoots().add(0, dir.getAbsolutePath());
+    return this;
+  }
+
+  @Override
+  public File getReportOutputDir() {
+    return resolvePath(pom.getReporting().getOutputDirectory());
+  }
+
+  @Override
+  public File getSonarWorkingDirectory() {
+    try {
+      File dir = new File(getBuildDir(), "sonar");
+      FileUtils.forceMkdir(dir);
+      return dir;
+
+    } catch (IOException e) {
+      throw new SonarException("Unable to retrieve Sonar working directory.", e);
+    }
+  }
+}
index 109b098debf712ee4becc4aded5bb46a5607b6c0..95355bc08ef723cdc923ec71e5d0adb1b9843b1c 100644 (file)
@@ -25,7 +25,10 @@ import org.sonar.api.measures.CoreMetrics;
 import org.sonar.api.measures.Metric;
 import org.sonar.api.measures.Metrics;
 import org.sonar.api.profiles.RulesProfile;
-import org.sonar.api.resources.*;
+import org.sonar.api.resources.Language;
+import org.sonar.api.resources.Languages;
+import org.sonar.api.resources.Project;
+import org.sonar.api.resources.ProjectFileSystem;
 import org.sonar.api.rules.DefaultRulesManager;
 import org.sonar.api.utils.SonarException;
 import org.sonar.batch.bootstrap.BatchPluginRepository;
@@ -103,7 +106,7 @@ public class ProjectBatch {
       addComponent(project);
       addComponent(project.getPom());
       addComponent(ProjectClasspath.class);
-      addComponent(DefaultProjectFileSystem.class);
+      addComponent(MavenProjectFileSystem.class);
       addComponent(project.getConfiguration());
 
       // need to be registered after the Configuration
index 0387bef2e5a1eebc3ee15df2f4f270f79cd78d77..9670a437af96a6ffd88753f01f7c2423a1811620 100644 (file)
@@ -152,7 +152,7 @@ public class DefaultProjectFileSystem implements ProjectFileSystem {
     return file;
   }
 
-  private List<File> resolvePaths(List<String> paths) {
+  protected List<File> resolvePaths(List<String> paths) {
     List<File> result = Lists.newArrayList();
     if (paths != null) {
       for (String path : paths) {
@@ -204,7 +204,7 @@ public class DefaultProjectFileSystem implements ProjectFileSystem {
         List<File> files = (List<File>) FileUtils.listFiles(dir, new AndFileFilter(dirFilters), HiddenFileFilter.VISIBLE);
         for (File file : files) {
           String relativePath = DefaultProjectFileSystem.getRelativePath(file, dir);
-          result.add(new DefaultInputFile(dir, relativePath));
+          result.add(InputFileUtils.create(dir, relativePath));
         }
       }
     }
@@ -362,26 +362,4 @@ public class DefaultProjectFileSystem implements ProjectFileSystem {
   public List<InputFile> testFiles(String... langs) {
     return getFiles(getTestDirs(), false /* FIXME should be true? */, langs);
   }
-
-  private static final class DefaultInputFile implements InputFile {
-    private File basedir;
-    private String relativePath;
-
-    DefaultInputFile(File basedir, String relativePath) {
-      this.basedir = basedir;
-      this.relativePath = relativePath;
-    }
-
-    public File getFileBaseDir() {
-      return basedir;
-    }
-
-    public File getFile() {
-      return new File(basedir, relativePath);
-    }
-
-    public String getRelativePath() {
-      return relativePath;
-    }
-  }
 }
index fa45f7abcc63aac6c0b03b4231fe11f4ce4b2746..64b868f559e39c364ca3e1baa52758fdbe414407 100644 (file)
@@ -53,7 +53,7 @@ import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.exceptions.verification.junit.ArgumentsAreDifferent;
 import org.sonar.api.CoreProperties;
-import org.sonar.api.resources.DefaultProjectFileSystem;
+import org.sonar.api.resources.ProjectFileSystem;
 import org.sonar.api.resources.Java;
 import org.sonar.api.resources.JavaFile;
 import org.sonar.api.resources.Language;
@@ -143,7 +143,7 @@ public class AbstractSourceImporterTest {
   }
 
   private void fileEncodingTest(Project project, SensorContext context, String encoding, String testFile) {
-    DefaultProjectFileSystem fileSystem = mock(DefaultProjectFileSystem.class);
+    ProjectFileSystem fileSystem = mock(ProjectFileSystem.class);
     when(project.getFileSystem()).thenReturn(fileSystem);
     when(fileSystem.getSourceCharset()).thenReturn(Charset.forName(encoding));
     when(project.getConfiguration()).thenReturn(new MapConfiguration(new HashMap<String, String>()));