aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-batch
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2013-04-25 15:10:11 +0200
committerJulien HENRY <julien.henry@sonarsource.com>2013-04-25 15:11:11 +0200
commit5cb418acb77eed5c9d53dadec145c60724e2cdf8 (patch)
tree7c34939cd7a216dc1faea5dd693bfe61f249b2a0 /sonar-batch
parent24602a48a343ae45bef05cec37110e142dca1cda (diff)
downloadsonarqube-5cb418acb77eed5c9d53dadec145c60724e2cdf8.tar.gz
sonarqube-5cb418acb77eed5c9d53dadec145c60724e2cdf8.zip
SONAR-4221 Restore settings between each consecutive project analysis
Diffstat (limited to 'sonar-batch')
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/bootstrap/BatchSettings.java10
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java99
-rw-r--r--sonar-batch/src/test/java/org/sonar/batch/scan/ProjectScanContainerTest.java35
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 {