diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2013-04-25 15:10:11 +0200 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2013-04-25 15:11:11 +0200 |
commit | 5cb418acb77eed5c9d53dadec145c60724e2cdf8 (patch) | |
tree | 7c34939cd7a216dc1faea5dd693bfe61f249b2a0 /sonar-batch | |
parent | 24602a48a343ae45bef05cec37110e142dca1cda (diff) | |
download | sonarqube-5cb418acb77eed5c9d53dadec145c60724e2cdf8.tar.gz sonarqube-5cb418acb77eed5c9d53dadec145c60724e2cdf8.zip |
SONAR-4221 Restore settings between each consecutive project analysis
Diffstat (limited to 'sonar-batch')
3 files changed, 104 insertions, 40 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchSettings.java b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchSettings.java index 72d038aa58d..2bed616e8f6 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchSettings.java +++ b/sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchSettings.java @@ -43,6 +43,7 @@ public class BatchSettings extends Settings { private final BootstrapSettings bootstrapSettings; private final ServerClient client; + private Map<String, String> savedProperties; public BatchSettings(BootstrapSettings bootstrapSettings, PropertyDefinitions propertyDefinitions, ServerClient client, Configuration deprecatedConfiguration) { @@ -54,7 +55,7 @@ public class BatchSettings extends Settings { } public void init(@Nullable ProjectDefinition rootProject) { - clear(); + savedProperties = this.getProperties(); if (rootProject != null) { LoggerFactory.getLogger(BatchSettings.class).info("Load project settings"); @@ -78,6 +79,13 @@ public class BatchSettings extends Settings { addProperties(System.getProperties()); } + /** + * Restore properties like they were before call of the {@link #init(ProjectDefinition)} method + */ + public void restore() { + this.setProperties(savedProperties); + } + private void downloadSettings(ServerClient client, @Nullable String projectKey) { String url; if (StringUtils.isNotBlank(projectKey)) { diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java index 4da42dc8392..e73daf25d5b 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java @@ -19,6 +19,7 @@ */ package org.sonar.batch.scan; +import com.google.common.annotations.VisibleForTesting; import org.sonar.api.BatchExtension; import org.sonar.api.CoreProperties; import org.sonar.api.batch.InstantiationStrategy; @@ -34,8 +35,22 @@ import org.sonar.batch.bootstrap.ExtensionInstaller; import org.sonar.batch.bootstrap.ExtensionMatcher; import org.sonar.batch.bootstrap.ExtensionUtils; import org.sonar.batch.bootstrap.MetricProvider; -import org.sonar.batch.index.*; -import org.sonar.batch.issue.*; +import org.sonar.batch.index.Caches; +import org.sonar.batch.index.ComponentDataCache; +import org.sonar.batch.index.ComponentDataPersister; +import org.sonar.batch.index.DefaultIndex; +import org.sonar.batch.index.DefaultPersistenceManager; +import org.sonar.batch.index.DefaultResourcePersister; +import org.sonar.batch.index.DependencyPersister; +import org.sonar.batch.index.EventPersister; +import org.sonar.batch.index.LinkPersister; +import org.sonar.batch.index.MeasurePersister; +import org.sonar.batch.index.MemoryOptimizer; +import org.sonar.batch.index.SnapshotCache; +import org.sonar.batch.index.SourcePersister; +import org.sonar.batch.issue.DeprecatedViolations; +import org.sonar.batch.issue.IssueCache; +import org.sonar.batch.issue.IssuePersister; import org.sonar.batch.phases.GraphPersister; import org.sonar.batch.profiling.PhasesSumUpTimeProfiler; import org.sonar.batch.scan.maven.FakeMavenPluginExecutor; @@ -68,45 +83,44 @@ public class ProjectScanContainer extends ComponentContainer { private void addBatchComponents() { add( - DefaultResourceCreationLock.class, - DefaultPersistenceManager.class, - DependencyPersister.class, - EventPersister.class, - LinkPersister.class, - MeasurePersister.class, - MemoryOptimizer.class, - DefaultResourcePersister.class, - SourcePersister.class, - DefaultNotificationManager.class, - MetricProvider.class, - ProjectConfigurator.class, - DefaultIndex.class, - DefaultFileLinesContextFactory.class, - ProjectLock.class, - LastSnapshots.class, - Caches.class, - SnapshotCache.class, - ComponentDataCache.class, - ComponentDataPersister.class, + DefaultResourceCreationLock.class, + DefaultPersistenceManager.class, + DependencyPersister.class, + EventPersister.class, + LinkPersister.class, + MeasurePersister.class, + MemoryOptimizer.class, + DefaultResourcePersister.class, + SourcePersister.class, + DefaultNotificationManager.class, + MetricProvider.class, + ProjectConfigurator.class, + DefaultIndex.class, + DefaultFileLinesContextFactory.class, + ProjectLock.class, + LastSnapshots.class, + Caches.class, + SnapshotCache.class, + ComponentDataCache.class, + ComponentDataPersister.class, - // issues - IssueWorkflow.class, - DeprecatedViolations.class, - IssueCache.class, - IssuePersister.class, + // issues + IssueWorkflow.class, + DeprecatedViolations.class, + IssueCache.class, + IssuePersister.class, - // tests - TestPlanPerspectiveLoader.class, - TestablePerspectiveLoader.class, - TestPlanBuilder.class, - TestableBuilder.class, - ScanGraph.create(), - GraphPersister.class, + // tests + TestPlanPerspectiveLoader.class, + TestablePerspectiveLoader.class, + TestPlanBuilder.class, + TestableBuilder.class, + ScanGraph.create(), + GraphPersister.class, - // lang - HighlightableBuilder.class, - SymbolPerspectiveBuilder.class - ); + // lang + HighlightableBuilder.class, + SymbolPerspectiveBuilder.class); } private void fixMavenExecutor() { @@ -127,6 +141,12 @@ public class ProjectScanContainer extends ComponentContainer { scanRecursively(tree.getRootProject()); } + public void stop() { + // Remove project specific settings + BatchSettings settings = getComponentByType(BatchSettings.class); + settings.restore(); + } + private void scanRecursively(Project module) { for (Project subModules : module.getModules()) { scanRecursively(subModules); @@ -134,7 +154,8 @@ public class ProjectScanContainer extends ComponentContainer { scan(module); } - private void scan(Project module) { + @VisibleForTesting + void scan(Project module) { new ModuleScanContainer(this, module).execute(); } diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectScanContainerTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectScanContainerTest.java index 54e3e12ee9a..1c5964e4e61 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectScanContainerTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/ProjectScanContainerTest.java @@ -19,20 +19,30 @@ */ package org.sonar.batch.scan; +import com.google.common.collect.Lists; import org.junit.Test; import org.sonar.api.BatchExtension; import org.sonar.api.CoreProperties; import org.sonar.api.ServerExtension; import org.sonar.api.batch.InstantiationStrategy; +import org.sonar.api.batch.bootstrap.ProjectDefinition; import org.sonar.api.config.Settings; import org.sonar.api.platform.ComponentContainer; +import org.sonar.api.resources.Project; import org.sonar.api.task.TaskExtension; +import org.sonar.batch.ProjectTree; +import org.sonar.batch.bootstrap.BatchSettings; import org.sonar.batch.bootstrap.ExtensionInstaller; import org.sonar.batch.profiling.PhasesSumUpTimeProfiler; import org.sonar.batch.scan.maven.MavenPluginExecutor; import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; public class ProjectScanContainerTest { @@ -92,6 +102,31 @@ public class ProjectScanContainerTest { assertThat(filter.accept(MyTaskExtension.class)).isFalse(); } + @Test + public void should_isolate_project_settings() { + ComponentContainer parentContainer = new ComponentContainer(); + BatchSettings settings = mock(BatchSettings.class); + parentContainer.add(settings); + ProjectTree projectTree = mock(ProjectTree.class); + Project project = mock(Project.class); + when(project.getModules()).thenReturn(Lists.<Project> newArrayList()); + when(projectTree.getRootProject()).thenReturn(project); + ProjectDefinition definition = mock(ProjectDefinition.class); + when(projectTree.getProjectDefinition(project)).thenReturn(definition); + parentContainer.add(projectTree); + ProjectScanContainer container = new ProjectScanContainer(parentContainer); + container.add(mock(ExtensionInstaller.class)); + container.doBeforeStart(); + + container = spy(container); + doNothing().when(container).scan(any(Project.class)); + container.doAfterStart(); + verify(settings).init(definition); + + container.stop(); + verify(settings).restore(); + } + @InstantiationStrategy(InstantiationStrategy.PER_BATCH) static class MyBatchExtension implements BatchExtension { |