From 36e81898a5a6e2b2029a2279a257d2ac06345f73 Mon Sep 17 00:00:00 2001 From: simonbrandhof Date: Sun, 26 Sep 2010 21:46:58 +0000 Subject: [PATCH] SONAR-1711 Allow to exclude sources from code analysis based on cutoff date --- ...tBuilder.java => MavenProjectBuilder.java} | 4 +-- .../java/org/sonar/batch/ProjectBatch.java | 14 ++++++++-- .../java/org/sonar/batch/ProjectTree.java | 6 ++--- ...Test.java => MavenProjectBuilderTest.java} | 6 ++--- .../java/org/sonar/batch/ProjectTreeTest.java | 4 +-- .../isLatestAnalysis.xml | 0 .../isLatestAnalysisIfNeverAnalysed.xml | 0 .../isNotLatestAnalysis.xml | 0 .../sonar/api/batch/DefaultFormulaData.java | 4 +-- .../java/org/sonar/api/batch/FileFilter.java | 26 +++++++++++++++++++ .../org/sonar/api/batch/ProjectClasspath.java | 6 ++--- .../resources/DefaultProjectFileSystem.java | 23 +++++++++++++--- .../DefaultProjectFileSystemTest.java | 19 ++++++++++++++ 13 files changed, 91 insertions(+), 21 deletions(-) rename sonar-batch/src/main/java/org/sonar/batch/{ProjectBuilder.java => MavenProjectBuilder.java} (98%) rename sonar-batch/src/test/java/org/sonar/batch/{ProjectBuilderTest.java => MavenProjectBuilderTest.java} (97%) rename sonar-batch/src/test/resources/org/sonar/batch/{ProjectBuilderTest => MavenProjectBuilderTest}/isLatestAnalysis.xml (100%) rename sonar-batch/src/test/resources/org/sonar/batch/{ProjectBuilderTest => MavenProjectBuilderTest}/isLatestAnalysisIfNeverAnalysed.xml (100%) rename sonar-batch/src/test/resources/org/sonar/batch/{ProjectBuilderTest => MavenProjectBuilderTest}/isNotLatestAnalysis.xml (100%) create mode 100644 sonar-plugin-api/src/main/java/org/sonar/api/batch/FileFilter.java diff --git a/sonar-batch/src/main/java/org/sonar/batch/ProjectBuilder.java b/sonar-batch/src/main/java/org/sonar/batch/MavenProjectBuilder.java similarity index 98% rename from sonar-batch/src/main/java/org/sonar/batch/ProjectBuilder.java rename to 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 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 projects; private List 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 poms) { + protected ProjectTree(MavenProjectBuilder projectBuilder, List 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 similarity index 97% rename from sonar-batch/src/test/java/org/sonar/batch/ProjectBuilderTest.java rename to 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 similarity index 100% rename from sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isLatestAnalysis.xml rename to 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 similarity index 100% rename from sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isLatestAnalysisIfNeverAnalysed.xml rename to 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 similarity index 100% rename from sonar-batch/src/test/resources/org/sonar/batch/ProjectBuilderTest/isNotLatestAnalysis.xml rename to 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 getChildren() { - List result = new ArrayList(); + List 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 urls = new ArrayList(); + List urls = Lists.newArrayList(); for (File file : getElements()) { urls.add(file.toURI().toURL()); } @@ -76,7 +76,7 @@ public class ProjectClasspath implements BatchComponent { protected List createElements() { try { - List files = new ArrayList(); + List files = Lists.newArrayList(); if (pom.getCompileClasspathElements() != null) { for (String classPathString : (List) 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 filters = Lists.newArrayList(); /** * Creates a DefaultProjectFileSystem based on a project @@ -61,6 +64,18 @@ public class DefaultProjectFileSystem implements ProjectFileSystem { } + public DefaultProjectFileSystem addFileFilters(List 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 suffixes = new ArrayList(); 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 named(final String name) { return new TypeSafeMatcher() { java.io.File fileTested; -- 2.39.5