aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsimonbrandhof <simon.brandhof@gmail.com>2010-09-26 21:46:58 +0000
committersimonbrandhof <simon.brandhof@gmail.com>2010-09-26 21:46:58 +0000
commit36e81898a5a6e2b2029a2279a257d2ac06345f73 (patch)
treeb52bf836e5698b1e4f2df79b2d144ad8e23ea64e
parent1723690eeb56a709c9ba87c0be94117186cead2a (diff)
downloadsonarqube-36e81898a5a6e2b2029a2279a257d2ac06345f73.tar.gz
sonarqube-36e81898a5a6e2b2029a2279a257d2ac06345f73.zip
SONAR-1711 Allow to exclude sources from code analysis based on cutoff date
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/MavenProjectBuilder.java (renamed from sonar-batch/src/main/java/org/sonar/batch/ProjectBuilder.java)4
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/ProjectBatch.java14
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/ProjectTree.java6
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/MavenProjectBuilderTest.java (renamed from sonar-batch/src/test/java/org/sonar/batch/ProjectBuilderTest.java)6
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/ProjectTreeTest.java4
-rw-r--r--sonar-batch/src/test/resources/org/sonar/batch/MavenProjectBuilderTest/isLatestAnalysis.xml (renamed from sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isLatestAnalysis.xml)0
-rw-r--r--sonar-batch/src/test/resources/org/sonar/batch/MavenProjectBuilderTest/isLatestAnalysisIfNeverAnalysed.xml (renamed from sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isLatestAnalysisIfNeverAnalysed.xml)0
-rw-r--r--sonar-batch/src/test/resources/org/sonar/batch/MavenProjectBuilderTest/isNotLatestAnalysis.xml (renamed from sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isNotLatestAnalysis.xml)0
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/DefaultFormulaData.java4
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/FileFilter.java26
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/batch/ProjectClasspath.java6
-rw-r--r--sonar-plugin-api/src/main/java/org/sonar/api/resources/DefaultProjectFileSystem.java23
-rw-r--r--sonar-plugin-api/src/test/java/org/sonar/api/resources/DefaultProjectFileSystemTest.java19
13 files changed, 91 insertions, 21 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/ProjectBuilder.java b/sonar-batch/src/main/java/org/sonar/batch/MavenProjectBuilder.java
index 3389db5e268..3feb2258463 100644
--- a/sonar-batch/src/main/java/org/sonar/batch/ProjectBuilder.java
+++ b/sonar-batch/src/main/java/org/sonar/batch/MavenProjectBuilder.java
@@ -36,11 +36,11 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
-public class ProjectBuilder {
+public class MavenProjectBuilder {
private DatabaseSession databaseSession;
- public ProjectBuilder(DatabaseSession databaseSession) {
+ public MavenProjectBuilder(DatabaseSession databaseSession) {
this.databaseSession = databaseSession;
}
diff --git a/sonar-batch/src/main/java/org/sonar/batch/ProjectBatch.java b/sonar-batch/src/main/java/org/sonar/batch/ProjectBatch.java
index fbe69040a35..eb0f9b18db8 100644
--- a/sonar-batch/src/main/java/org/sonar/batch/ProjectBatch.java
+++ b/sonar-batch/src/main/java/org/sonar/batch/ProjectBatch.java
@@ -22,13 +22,14 @@ package org.sonar.batch;
import org.picocontainer.Characteristics;
import org.picocontainer.MutablePicoContainer;
import org.sonar.api.batch.BatchExtensionDictionnary;
+import org.sonar.api.batch.FileFilter;
import org.sonar.api.batch.ProjectClasspath;
-import org.sonar.api.batch.ResourceCreationLock;
import org.sonar.api.batch.SensorContext;
import org.sonar.api.database.DatabaseSession;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.Metric;
import org.sonar.api.measures.Metrics;
+import org.sonar.api.resources.DefaultProjectFileSystem;
import org.sonar.api.resources.Languages;
import org.sonar.api.resources.Project;
import org.sonar.api.rules.DefaultRulesManager;
@@ -38,6 +39,8 @@ import org.sonar.core.qualitymodel.DefaultModelFinder;
import org.sonar.core.rule.DefaultRuleFinder;
import org.sonar.jpa.dao.*;
+import java.util.List;
+
public class ProjectBatch {
private MutablePicoContainer globalContainer;
@@ -98,8 +101,15 @@ public class ProjectBatch {
batchContainer.start();
// post-initializations
+ prepareProject(project, index);
+ }
+
+ private void prepareProject(Project project, DefaultSonarIndex index) {
project.setLanguage(getComponent(Languages.class).get(project.getLanguageKey()));
index.selectProject(project, getComponent(ResourceFilters.class), getComponent(ViolationFilters.class), getComponent(MeasuresDao.class), getComponent(ViolationsDao.class));
+
+ List<FileFilter> fileFilters = batchContainer.getComponents(FileFilter.class);
+ ((DefaultProjectFileSystem)project.getFileSystem()).addFileFilters(fileFilters);
}
private void loadCoreComponents(MutablePicoContainer container) {
@@ -122,7 +132,7 @@ public class ProjectBatch {
try {
globalContainer.removeChildContainer(batchContainer);
batchContainer.stop();
- batchContainer=null;
+ batchContainer = null;
} catch (Exception e) {
// do not log
}
diff --git a/sonar-batch/src/main/java/org/sonar/batch/ProjectTree.java b/sonar-batch/src/main/java/org/sonar/batch/ProjectTree.java
index 497c4656f58..e586106b310 100644
--- a/sonar-batch/src/main/java/org/sonar/batch/ProjectTree.java
+++ b/sonar-batch/src/main/java/org/sonar/batch/ProjectTree.java
@@ -35,17 +35,17 @@ public class ProjectTree {
private List<Project> projects;
private List<MavenProject> poms;
- private ProjectBuilder projectBuilder;
+ private MavenProjectBuilder projectBuilder;
public ProjectTree(MavenSession mavenSession, DatabaseSession databaseSession) {
this.poms = mavenSession.getSortedProjects();
- this.projectBuilder = new ProjectBuilder(databaseSession);
+ this.projectBuilder = new MavenProjectBuilder(databaseSession);
}
/**
* for unit tests
*/
- protected ProjectTree(ProjectBuilder projectBuilder, List<MavenProject> poms) {
+ protected ProjectTree(MavenProjectBuilder projectBuilder, List<MavenProject> poms) {
this.projectBuilder = projectBuilder;
this.poms = poms;
}
diff --git a/sonar-batch/src/test/java/org/sonar/batch/ProjectBuilderTest.java b/sonar-batch/src/test/java/org/sonar/batch/MavenProjectBuilderTest.java
index 586edaa9300..a35b692270a 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/ProjectBuilderTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/MavenProjectBuilderTest.java
@@ -35,13 +35,13 @@ import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-public class ProjectBuilderTest extends AbstractDbUnitTestCase {
+public class MavenProjectBuilderTest extends AbstractDbUnitTestCase {
- private ProjectBuilder builder = null;
+ private MavenProjectBuilder builder = null;
@Before
public void before() {
- builder = new ProjectBuilder(getSession());
+ builder = new MavenProjectBuilder(getSession());
}
@Test
diff --git a/sonar-batch/src/test/java/org/sonar/batch/ProjectTreeTest.java b/sonar-batch/src/test/java/org/sonar/batch/ProjectTreeTest.java
index 8473b959f3d..8030c946b19 100644
--- a/sonar-batch/src/test/java/org/sonar/batch/ProjectTreeTest.java
+++ b/sonar-batch/src/test/java/org/sonar/batch/ProjectTreeTest.java
@@ -203,7 +203,7 @@ public class ProjectTreeTest extends AbstractDbUnitTestCase {
return pom;
}
- private ProjectBuilder newProjectBuilder() {
- return new ProjectBuilder(getSession());
+ private MavenProjectBuilder newProjectBuilder() {
+ return new MavenProjectBuilder(getSession());
}
}
diff --git a/sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isLatestAnalysis.xml b/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectBuilderTest/isLatestAnalysis.xml
index 0d69b6587a4..0d69b6587a4 100644
--- a/sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isLatestAnalysis.xml
+++ b/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectBuilderTest/isLatestAnalysis.xml
diff --git a/sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isLatestAnalysisIfNeverAnalysed.xml b/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectBuilderTest/isLatestAnalysisIfNeverAnalysed.xml
index 0eecd371324..0eecd371324 100644
--- a/sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isLatestAnalysisIfNeverAnalysed.xml
+++ b/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectBuilderTest/isLatestAnalysisIfNeverAnalysed.xml
diff --git a/sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isNotLatestAnalysis.xml b/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectBuilderTest/isNotLatestAnalysis.xml
index 98d5825cc37..98d5825cc37 100644
--- a/sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isNotLatestAnalysis.xml
+++ b/sonar-batch/src/test/resources/org/sonar/batch/MavenProjectBuilderTest/isNotLatestAnalysis.xml
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/DefaultFormulaData.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/DefaultFormulaData.java
index 79a4d3ff634..3fa3da535c6 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/DefaultFormulaData.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/DefaultFormulaData.java
@@ -19,12 +19,12 @@
*/
package org.sonar.api.batch;
+import com.google.common.collect.Lists;
import org.sonar.api.measures.FormulaData;
import org.sonar.api.measures.Measure;
import org.sonar.api.measures.MeasuresFilter;
import org.sonar.api.measures.Metric;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -56,7 +56,7 @@ public class DefaultFormulaData implements FormulaData {
}
public Collection<FormulaData> getChildren() {
- List<FormulaData> result = new ArrayList<FormulaData>();
+ List<FormulaData> result = Lists.newArrayList();
for (DecoratorContext childContext : decoratorContext.getChildren()) {
result.add(new DefaultFormulaData(childContext));
}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/FileFilter.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/FileFilter.java
new file mode 100644
index 00000000000..5be1d69f32d
--- /dev/null
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/FileFilter.java
@@ -0,0 +1,26 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2009 SonarSource SA
+ * 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.api.batch;
+
+import org.sonar.api.BatchExtension;
+
+public abstract class FileFilter implements java.io.FileFilter, BatchExtension {
+
+}
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/ProjectClasspath.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/ProjectClasspath.java
index 18a86fd9893..03337afa5e7 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/ProjectClasspath.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/ProjectClasspath.java
@@ -19,6 +19,7 @@
*/
package org.sonar.api.batch;
+import com.google.common.collect.Lists;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.project.MavenProject;
import org.sonar.api.BatchComponent;
@@ -28,7 +29,6 @@ import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -63,7 +63,7 @@ public class ProjectClasspath implements BatchComponent {
protected URLClassLoader createClassLoader() {
try {
- List<URL> urls = new ArrayList<URL>();
+ List<URL> urls = Lists.newArrayList();
for (File file : getElements()) {
urls.add(file.toURI().toURL());
}
@@ -76,7 +76,7 @@ public class ProjectClasspath implements BatchComponent {
protected List<File> createElements() {
try {
- List<File> files = new ArrayList<File>();
+ List<File> files = Lists.newArrayList();
if (pom.getCompileClasspathElements() != null) {
for (String classPathString : (List<String>) pom.getCompileClasspathElements()) {
files.add(new File(classPathString));
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/resources/DefaultProjectFileSystem.java b/sonar-plugin-api/src/main/java/org/sonar/api/resources/DefaultProjectFileSystem.java
index 1c04e67b0a5..d66011d11a1 100644
--- a/sonar-plugin-api/src/main/java/org/sonar/api/resources/DefaultProjectFileSystem.java
+++ b/sonar-plugin-api/src/main/java/org/sonar/api/resources/DefaultProjectFileSystem.java
@@ -19,11 +19,13 @@
*/
package org.sonar.api.resources;
+import com.google.common.collect.Lists;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.*;
import org.apache.commons.lang.CharEncoding;
import org.apache.commons.lang.StringUtils;
+import org.sonar.api.batch.FileFilter;
import org.sonar.api.batch.maven.MavenUtils;
import org.sonar.api.utils.SonarException;
import org.sonar.api.utils.WildcardPattern;
@@ -43,6 +45,7 @@ import java.util.List;
public class DefaultProjectFileSystem implements ProjectFileSystem {
private Project project;
+ private List<IOFileFilter> filters = Lists.newArrayList();
/**
* Creates a DefaultProjectFileSystem based on a project
@@ -61,6 +64,18 @@ public class DefaultProjectFileSystem implements ProjectFileSystem {
}
+ public DefaultProjectFileSystem addFileFilters(List<FileFilter> l) {
+ for (FileFilter fileFilter : l) {
+ addFileFilter(fileFilter);
+ }
+ return this;
+ }
+
+ public DefaultProjectFileSystem addFileFilter(FileFilter fileFilter) {
+ filters.add(new DelegateFileFilter(fileFilter));
+ return this;
+ }
+
/**
* Basedir is the project root directory.
*/
@@ -214,8 +229,9 @@ public class DefaultProjectFileSystem implements ProjectFileSystem {
if (dir.exists()) {
IOFileFilter exclusionFilter = new ExclusionFilter(dir, exclusionPatterns);
IOFileFilter visibleFileFilter = HiddenFileFilter.VISIBLE;
- AndFileFilter filters = new AndFileFilter(new AndFileFilter(exclusionFilter, suffixFilter), visibleFileFilter);
- result.addAll(FileUtils.listFiles(dir, filters, HiddenFileFilter.VISIBLE));
+ List dirFilters = Lists.newArrayList(visibleFileFilter, suffixFilter, exclusionFilter);
+ dirFilters.addAll(this.filters);
+ result.addAll(FileUtils.listFiles(dir, new AndFileFilter(dirFilters), HiddenFileFilter.VISIBLE));
}
}
return result;
@@ -233,7 +249,7 @@ public class DefaultProjectFileSystem implements ProjectFileSystem {
private IOFileFilter getFileSuffixFilter(Language... langs) {
IOFileFilter suffixFilter = FileFilterUtils.trueFileFilter();
- if (langs != null && langs.length>0) {
+ if (langs != null && langs.length > 0) {
List<String> suffixes = new ArrayList<String>();
for (Language lang : langs) {
if (lang.getFileSuffixes() != null) {
@@ -346,5 +362,4 @@ public class DefaultProjectFileSystem implements ProjectFileSystem {
}
return false;
}
-
}
diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/resources/DefaultProjectFileSystemTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/resources/DefaultProjectFileSystemTest.java
index 82e6574c544..4aa606b97e4 100644
--- a/sonar-plugin-api/src/test/java/org/sonar/api/resources/DefaultProjectFileSystemTest.java
+++ b/sonar-plugin-api/src/test/java/org/sonar/api/resources/DefaultProjectFileSystemTest.java
@@ -19,12 +19,14 @@
*/
package org.sonar.api.resources;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Before;
import org.junit.Test;
+import org.sonar.api.batch.FileFilter;
import org.sonar.api.test.MavenTestUtils;
import java.io.File;
@@ -32,6 +34,7 @@ import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertThat;
public class DefaultProjectFileSystemTest {
@@ -156,6 +159,22 @@ public class DefaultProjectFileSystemTest {
}
}
+
+ @Test
+ public void shouldAddExtendedFilters() {
+ DefaultProjectFileSystem fs = new DefaultProjectFileSystem(project);
+ assertThat(fs.getSourceFiles().size(), is(2));
+ assertThat(fs.getSourceFiles(), hasItem(named("Bar.java")));
+
+ fs.addFileFilter(new FileFilter() {
+ public boolean accept(File file) {
+ return !StringUtils.equals(file.getName(), "Bar.java");
+ }
+ });
+ assertThat(fs.getSourceFiles().size(), is(1));
+ assertThat(fs.getSourceFiles(), not(hasItem(named("Bar.java"))));
+ }
+
private static Matcher<java.io.File> named(final String name) {
return new TypeSafeMatcher<java.io.File>() {
java.io.File fileTested;