]> source.dussan.org Git - sonarqube.git/commitdiff
Fix loading of file exclusions - do not cache exclusions in Project
authorsimonbrandhof <simon.brandhof@gmail.com>
Fri, 11 Nov 2011 14:20:42 +0000 (15:20 +0100)
committersimonbrandhof <simon.brandhof@gmail.com>
Fri, 11 Nov 2011 14:31:15 +0000 (15:31 +0100)
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/batch/ExcludedResourceFilter.java
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/batch/ExcludedResourceFilterTest.java
sonar-batch/src/main/java/org/sonar/batch/ProjectConfigurator.java
sonar-batch/src/main/java/org/sonar/batch/bootstrap/ProjectModule.java
sonar-batch/src/main/java/org/sonar/batch/config/DeprecatedConfigurationProvider.java [deleted file]
sonar-batch/src/main/java/org/sonar/batch/config/ProjectSettings.java
sonar-batch/src/test/java/org/sonar/batch/ProjectConfiguratorTest.java
sonar-plugin-api/src/main/java/org/sonar/api/resources/Project.java
sonar-plugin-api/src/test/java/org/sonar/api/resources/DefaultProjectFileSystemTest.java
sonar-plugin-api/src/test/java/org/sonar/api/resources/ProjectTest.java

index f7bc914d5fe4be848729e5df157f593eeb709821..4326b2169df8077e6d288bae5e77c1e5c114ad50 100644 (file)
@@ -19,9 +19,8 @@
  */
 package org.sonar.plugins.core.batch;
 
-import org.apache.commons.configuration.Configuration;
-import org.sonar.api.CoreProperties;
 import org.sonar.api.batch.ResourceFilter;
+import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.resources.ResourceUtils;
 
@@ -30,10 +29,10 @@ import org.sonar.api.resources.ResourceUtils;
  */
 public class ExcludedResourceFilter implements ResourceFilter {
 
-  private Configuration conf;
+  private Project project;
 
-  public ExcludedResourceFilter(Configuration conf) {
-    this.conf = conf;
+  public ExcludedResourceFilter(Project project) {
+    this.project = project;
   }
 
   public boolean isIgnored(Resource resource) {
@@ -42,7 +41,7 @@ public class ExcludedResourceFilter implements ResourceFilter {
       return false;
     }
 
-    String[] patterns = getExclusionPatterns();
+    String[] patterns = project.getExclusionPatterns();
     if (patterns != null) {
       for (String pattern : patterns) {
         if (resource.matchFilePattern(pattern)) {
@@ -52,8 +51,4 @@ public class ExcludedResourceFilter implements ResourceFilter {
     }
     return false;
   }
-
-  String[] getExclusionPatterns() {
-    return conf.getStringArray(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY);
-  }
 }
\ No newline at end of file
index dbbe8fd9e13d640f4a8a40e7a1c300a26fa41196..952b32c7641c33f0ae62a1da10c684152e42fe85 100644 (file)
@@ -22,6 +22,7 @@ package org.sonar.plugins.core.batch;
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.junit.Test;
 import org.sonar.api.CoreProperties;
+import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Qualifiers;
 import org.sonar.api.resources.Resource;
 
@@ -35,7 +36,8 @@ public class ExcludedResourceFilterTest {
   @Test
   public void doNotFailIfNoPatterns() {
     PropertiesConfiguration conf = new PropertiesConfiguration();
-    ExcludedResourceFilter filter = new ExcludedResourceFilter(conf);
+    Project project = new Project("foo").setConfiguration(conf);
+    ExcludedResourceFilter filter = new ExcludedResourceFilter(project);
     assertThat(filter.isIgnored(mock(Resource.class)), is(false));
   }
 
@@ -43,7 +45,8 @@ public class ExcludedResourceFilterTest {
   public void noPatternsMatch() {
     PropertiesConfiguration conf = new PropertiesConfiguration();
     conf.setProperty(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY, new String[]{"**/foo/*.java", "**/bar/*"});
-    ExcludedResourceFilter filter = new ExcludedResourceFilter(conf);
+    Project project = new Project("foo").setConfiguration(conf);
+    ExcludedResourceFilter filter = new ExcludedResourceFilter(project);
     assertThat(filter.isIgnored(mock(Resource.class)), is(false));
   }
 
@@ -54,7 +57,8 @@ public class ExcludedResourceFilterTest {
   public void ignoreResourceIfMatchesPattern() {
     PropertiesConfiguration conf = new PropertiesConfiguration();
     conf.setProperty(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY, new String[]{"**/foo/*.java", "**/bar/*"});
-    ExcludedResourceFilter filter = new ExcludedResourceFilter(conf);
+    Project project = new Project("foo").setConfiguration(conf);
+    ExcludedResourceFilter filter = new ExcludedResourceFilter(project);
 
     Resource resource = mock(Resource.class);
     when(resource.matchFilePattern("**/bar/*")).thenReturn(true);
@@ -66,7 +70,8 @@ public class ExcludedResourceFilterTest {
   public void doNotExcludeUnitTestFiles() {
     PropertiesConfiguration conf = new PropertiesConfiguration();
     conf.setProperty(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY, new String[]{"**/foo/*.java", "**/bar/*"});
-    ExcludedResourceFilter filter = new ExcludedResourceFilter(conf);
+    Project project = new Project("foo").setConfiguration(conf);
+    ExcludedResourceFilter filter = new ExcludedResourceFilter(project);
 
     Resource unitTest = mock(Resource.class);
     when(unitTest.getQualifier()).thenReturn(Qualifiers.UNIT_TEST_FILE);
index 06ce83b81de870e19d7e8668a1141253b652433f..43ca03aa5c086da38e6058357c871d1d80d62cca 100644 (file)
@@ -70,7 +70,6 @@ public class ProjectConfigurator implements BatchComponent {
     Date analysisDate = loadAnalysisDate();
     project
         .setConfiguration(new PropertiesConfiguration()) // will be populated by ProjectSettings
-        .setExclusionPatterns(loadExclusionPatterns())
         .setAnalysisDate(analysisDate)
         .setLatestAnalysis(isLatestAnalysis(project.getKey(), analysisDate))
         .setAnalysisVersion(loadAnalysisVersion())
@@ -79,14 +78,6 @@ public class ProjectConfigurator implements BatchComponent {
     return this;
   }
 
-  String[] loadExclusionPatterns() {
-    String[] exclusionPatterns = settings.getStringArray(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY);
-    for (int i = 0; i < exclusionPatterns.length; i++) {
-      exclusionPatterns[i] = StringUtils.trim(exclusionPatterns[i]);
-    }
-    return exclusionPatterns;
-  }
-
   boolean isLatestAnalysis(String projectKey, Date analysisDate) {
     ResourceModel persistedProject = databaseSession.getSingleResult(ResourceModel.class, "key", projectKey, "enabled", true);
     if (persistedProject != null) {
index 73997640662a7cd5a9c073a909e9bf9e4efa52dc..134c0b0f6d9d980c85648407c0869bf5a398ab82 100644 (file)
@@ -33,7 +33,6 @@ import org.sonar.api.utils.IocContainer;
 import org.sonar.api.utils.SonarException;
 import org.sonar.batch.*;
 import org.sonar.batch.components.TimeMachineConfiguration;
-import org.sonar.batch.config.DeprecatedConfigurationProvider;
 import org.sonar.batch.config.ProjectSettings;
 import org.sonar.batch.events.EventBus;
 import org.sonar.batch.index.DefaultIndex;
@@ -70,7 +69,6 @@ public class ProjectModule extends Module {
     addCoreSingleton(project);
     addCoreSingleton(project.getConfiguration());
     addCoreSingleton(ProjectSettings.class);
-    addAdapter(new DeprecatedConfigurationProvider());
     addCoreSingleton(IocContainer.class);
 
     for (Object component : projectDefinition.getContainerExtensions()) {
@@ -134,9 +132,9 @@ public class ProjectModule extends Module {
 
     DefaultIndex index = getComponentByType(DefaultIndex.class);
     index.setCurrentProject(project,
-        getComponentByType(ResourceFilters.class),
-        getComponentByType(ViolationFilters.class),
-        getComponentByType(RulesProfile.class));
+      getComponentByType(ResourceFilters.class),
+      getComponentByType(ViolationFilters.class),
+      getComponentByType(RulesProfile.class));
 
     // TODO See http://jira.codehaus.org/browse/SONAR-2126
     // previously MavenProjectBuilder was responsible for creation of ProjectFileSystem
diff --git a/sonar-batch/src/main/java/org/sonar/batch/config/DeprecatedConfigurationProvider.java b/sonar-batch/src/main/java/org/sonar/batch/config/DeprecatedConfigurationProvider.java
deleted file mode 100644 (file)
index 636a5ad..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.config;
-
-import org.apache.commons.configuration.Configuration;
-import org.picocontainer.injectors.ProviderAdapter;
-import org.sonar.api.resources.Project;
-
-public class DeprecatedConfigurationProvider extends ProviderAdapter {
-
-  public Configuration provide(Project project, ProjectSettings settings) {//NOSONAR the parameter ProjectSettings is declared to be sure that it is initialized
-    // configuration is valid because it has been updated by ProjectSettings
-    return project.getConfiguration();
-  }
-}
-
index 7a7fb5a1886449c33560898c2da9b1bd49eab45c..6a37e61e5a5cf467e41855c1c3402f9475b9f70f 100644 (file)
@@ -29,6 +29,7 @@ import org.sonar.api.resources.Project;
 import org.sonar.core.config.ConfigurationUtils;
 import org.sonar.jpa.session.DatabaseSessionFactory;
 
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -88,7 +89,19 @@ public class ProjectSettings extends Settings {
   }
 
   private void updateDeprecatedCommonsConfiguration() {
+    System.out.println("---------- SETTINGS -------------");
+    for (String s : properties.keySet()) {
+      System.out.println(s + "=" + properties.get(s));
+    }
     ConfigurationUtils.copyToCommonsConfiguration(properties, deprecatedCommonsConf);
+
+    System.out.println("---------- DEP CONF -------------");
+    Iterator keys = deprecatedCommonsConf.getKeys();
+    while(keys.hasNext()) {
+      String key = (String)keys.next();
+      System.out.println(key + "=" + deprecatedCommonsConf.getString(key));
+    }
+    System.out.println("----------------------------------");
   }
 
   /**
index 3d556413ee884dac4cf3bd283d0e620e6c96c252..ddeb6bd020400aaf52ac493b26d574a0555c401d 100644 (file)
@@ -36,44 +36,6 @@ import static org.junit.Assert.assertTrue;
 
 public class ProjectConfiguratorTest extends AbstractDbUnitTestCase {
 
-  @Test
-  public void testNoExclusionPatterns() {
-    Project project = new Project("key");
-    new ProjectConfigurator(getSession(), new Settings()).configure(project);
-    assertThat(project.getExclusionPatterns().length, is(0));
-  }
-
-  @Test
-  public void testManyExclusionPatterns() {
-    Settings settings = new Settings();
-    settings.setProperty(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY, "**/*,foo,*/bar");
-
-    Project project = new Project("key");
-    new ProjectConfigurator(getSession(), settings).configure(project);
-
-    assertThat(project.getExclusionPatterns().length, is(3));
-    assertThat(project.getExclusionPatterns()[0], is("**/*"));
-    assertThat(project.getExclusionPatterns()[1], is("foo"));
-    assertThat(project.getExclusionPatterns()[2], is("*/bar"));
-  }
-
-  /**
-   * See http://jira.codehaus.org/browse/SONAR-2261
-   * Note that several exclusions separated by comma would be correctly trimmed by commons-configuration library.
-   * So issue is only with a single pattern, which contains spaces.
-   */
-  @Test
-  public void trimExclusionPatterns() {
-    Settings configuration = new Settings();
-    configuration.setProperty(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY, " foo ");
-
-    Project project = new Project("key");
-    new ProjectConfigurator(getSession(), configuration).configure(project);
-
-    assertThat(project.getExclusionPatterns().length, is(1));
-    assertThat(project.getExclusionPatterns()[0], is("foo"));
-  }
-
   @Test
   public void getLanguageFromConfiguration() {
     Settings configuration = new Settings();
index 99432b0313f9b2c505305c9316c1b3b51b50dbdb..f2ef02f57461980f0f7bc6ef9b26d04d8993f343 100644 (file)
@@ -101,7 +101,6 @@ public class Project extends Resource {
   private String languageKey;
   private Date analysisDate;
   private AnalysisType analysisType;
-  private String[] exclusionPatterns;
   private String analysisVersion;
   private boolean latestAnalysis;
 
@@ -363,15 +362,21 @@ public class Project extends Resource {
    * Patterns of resource exclusion as defined in project settings page.
    */
   public String[] getExclusionPatterns() {
-    return exclusionPatterns;
+    String[] exclusions = configuration.getStringArray(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY);
+    for (int index=0 ; index<exclusions.length ; index++) {
+      // http://jira.codehaus.org/browse/SONAR-2261 - exclusion must be trimmed
+      exclusions[index]=StringUtils.trim(exclusions[index]);
+    }
+    return exclusions;
   }
 
   /**
    * Set exclusion patterns. Configuration is not saved, so this method must be used ONLY IN UNIT TESTS.
+   * @deprecated
    */
+  @Deprecated
   public Project setExclusionPatterns(String[] s) {
-    this.exclusionPatterns = s;
-    return this;
+    throw new UnsupportedOperationException("Unsupported since version 2.12");
   }
 
   /**
index 22731536df309aaa48452ea521087f372173b938..867464ce822f4f9e139f3e57c49fc923bd66e7fc 100644 (file)
@@ -27,6 +27,7 @@ import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import org.apache.commons.configuration.PropertiesConfiguration;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.SystemUtils;
 import org.apache.maven.project.MavenProject;
@@ -78,7 +79,9 @@ public class DefaultProjectFileSystemTest {
     final DefaultProjectFileSystem fs = newDefaultProjectFileSystem(project);
     assertThat(fs.hasJavaSourceFiles(), is(true));
 
-    project.setExclusionPatterns(new String[] { "**/*.java" });
+    PropertiesConfiguration conf = new PropertiesConfiguration();
+    conf.setProperty("sonar.exclusions", "**/*.java");
+    project.setConfiguration(conf);
     assertThat(fs.hasJavaSourceFiles(), is(false));
   }
 
@@ -92,7 +95,9 @@ public class DefaultProjectFileSystemTest {
 
   @Test
   public void applyExclusionPatternsToSourceFiles() {
-    project.setExclusionPatterns(new String[] { "**/B*.java" });
+    PropertiesConfiguration conf = new PropertiesConfiguration();
+    conf.setProperty("sonar.exclusions", "**/B*.java");
+    project.setConfiguration(conf);
 
     final DefaultProjectFileSystem fs = newDefaultProjectFileSystem(project);
 
@@ -105,7 +110,9 @@ public class DefaultProjectFileSystemTest {
    */
   @Test
   public void exclusionPatternOnAjFiles() {
-    project.setExclusionPatterns(new String[] { "**/*.aj" });
+    PropertiesConfiguration conf = new PropertiesConfiguration();
+    conf.setProperty("sonar.exclusions", "**/*.aj");
+    project.setConfiguration(conf);
 
     final DefaultProjectFileSystem fs = newDefaultProjectFileSystem(project);
 
@@ -116,7 +123,9 @@ public class DefaultProjectFileSystemTest {
 
   @Test
   public void doNotApplyExclusionPatternsToTestFiles() {
-    project.setExclusionPatterns(new String[] { "**/B*.java" });
+    PropertiesConfiguration conf = new PropertiesConfiguration();
+    conf.setProperty("sonar.exclusions", "**/B*.java");
+    project.setConfiguration(conf);
 
     final DefaultProjectFileSystem fs = newDefaultProjectFileSystem(project);
 
index 8df12c566730ba42f80fda27fde248530b88dff7..5b3e9bfe6f6c129f9e96a6b8e817cd77e00c789c 100644 (file)
  */
 package org.sonar.api.resources;
 
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.core.Is;
 import org.junit.Test;
+import org.sonar.api.CoreProperties;
+import org.sonar.api.config.Settings;
 import org.sonar.api.test.MavenTestUtils;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
+import static org.junit.internal.matchers.IsCollectionContaining.hasItems;
 
 public class ProjectTest {
   @Test
@@ -47,4 +54,42 @@ public class ProjectTest {
     Project project = Project.createFromMavenIds("my", "artifact");
     assertThat(project.getKey(), is("my:artifact"));
   }
+
+  /**
+   * See http://jira.codehaus.org/browse/SONAR-2261
+   * Note that several exclusions separated by comma would be correctly trimmed by commons-configuration library.
+   * So issue is only with a single pattern, which contains spaces.
+   */
+  @Test
+  public void shouldTrimExclusionPatterns() {
+    Configuration conf = new PropertiesConfiguration();
+    conf.setProperty("sonar.exclusions", "  **/*Foo.java   , **/Bar.java    ");
+    Project project = new Project("foo").setConfiguration(conf);
+
+    String[] exclusions = project.getExclusionPatterns();
+
+    assertThat(exclusions.length, Is.is(2));
+    assertThat(exclusions[0], Is.is("**/*Foo.java"));
+    assertThat(exclusions[1], Is.is("**/Bar.java"));
+  }
+
+  @Test
+  public void testNoExclusionPatterns() {
+    Project project = new Project("key").setConfiguration(new PropertiesConfiguration());
+
+    MatcherAssert.assertThat(project.getExclusionPatterns().length, Is.is(0));
+  }
+
+  @Test
+  public void testManyExclusionPatterns() {
+    PropertiesConfiguration conf = new PropertiesConfiguration();
+    conf.setProperty(CoreProperties.PROJECT_EXCLUSIONS_PROPERTY, "**/*,foo,*/bar");
+
+    Project project = new Project("key").setConfiguration(conf);
+
+    MatcherAssert.assertThat(project.getExclusionPatterns().length, Is.is(3));
+    MatcherAssert.assertThat(project.getExclusionPatterns()[0], Is.is("**/*"));
+    MatcherAssert.assertThat(project.getExclusionPatterns()[1], Is.is("foo"));
+    MatcherAssert.assertThat(project.getExclusionPatterns()[2], Is.is("*/bar"));
+  }
 }