]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6589 make BatchReportReader a dependency of ComputationSteps
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Tue, 26 May 2015 12:22:27 +0000 (14:22 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 1 Jun 2015 15:08:28 +0000 (17:08 +0200)
move batch zip file extraction to new class ReportExtractor

48 files changed:
server/sonar-server-benchmarks/src/test/java/org/sonar/server/benchmark/PersistFileSourcesStepTest.java
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationContainer.java
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java
server/sonar-server/src/main/java/org/sonar/server/computation/activity/CEActivityManager.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/activity/package-info.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/batch/CEBatchReportReader.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/batch/FileBatchReportReader.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/computation/batch/ReportExtractor.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/component/ComponentImpl.java
server/sonar-server/src/main/java/org/sonar/server/computation/component/ComponentTreeBuilders.java
server/sonar-server/src/main/java/org/sonar/server/computation/container/CEContainer.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/container/package-info.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueComputation.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/ParseReportStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistDuplicationsStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistEventsStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistFileSourcesStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistNumberOfDaysSinceLastCommitStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistProjectLinksStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/SendIssueNotificationsStep.java
server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/activity/CEActivityManagerTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/batch/BatchReportReaderRule.java
server/sonar-server/src/test/java/org/sonar/server/computation/batch/ReportExtractorTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/issue/IssueComputationTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/IndexComponentsStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/IndexSourceLinesStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/IndexTestsStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/ParseReportStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistDuplicationsStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistEventsStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistFileSourcesStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistNumberOfDaysSinceLastCommitStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistProjectLinksStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistTestsStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/SendIssueNotificationsStepTest.java
server/sonar-server/src/test/resources/org/sonar/server/computation/ComputationServiceTest/shared.xml [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/computation/activity/CEActivityManagerTest/shared.xml [new file with mode: 0644]
sonar-core/src/main/java/org/sonar/core/platform/ComponentContainer.java

index e7a27afed6434b3093401818e13c7d2337460236..637a1b692e9a94027b9d8c322fbaa6ab0d4bcf5e 100644 (file)
@@ -76,7 +76,7 @@ public class PersistFileSourcesStepTest {
 
     long start = System.currentTimeMillis();
 
-    PersistFileSourcesStep step = new PersistFileSourcesStep(dbClient, System2.INSTANCE, dbComponentsRefCache);
+    PersistFileSourcesStep step = new PersistFileSourcesStep(dbClient, System2.INSTANCE, dbComponentsRefCache, reportReader);
     step.execute(new ComputationContext(reportReader, "PROJECT_KEY", new Settings(), dbClient, ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT),
       mock(LanguageRepository.class)));
 
index a669ba7778d2302f015ac31a0c370c2c2d302c6a..e8058874ca0f50b7c32dd2a5d50d048fd4546f83 100644 (file)
  */
 package org.sonar.server.computation;
 
+import java.util.Arrays;
+import java.util.List;
 import org.sonar.core.issue.db.UpdateConflictResolver;
 import org.sonar.core.platform.ComponentContainer;
+import org.sonar.server.computation.activity.CEActivityManager;
+import org.sonar.server.computation.batch.CEBatchReportReader;
+import org.sonar.server.computation.batch.ReportExtractor;
 import org.sonar.server.computation.component.DbComponentsRefCache;
 import org.sonar.server.computation.component.ProjectSettingsRepository;
+import org.sonar.server.computation.container.CEContainer;
 import org.sonar.server.computation.issue.IssueCache;
 import org.sonar.server.computation.issue.IssueComputation;
 import org.sonar.server.computation.issue.RuleCache;
@@ -36,9 +42,6 @@ import org.sonar.server.computation.step.ComputationSteps;
 import org.sonar.server.platform.Platform;
 import org.sonar.server.view.index.ViewIndex;
 
-import java.util.Arrays;
-import java.util.List;
-
 public class ComputationContainer {
 
   /**
@@ -47,14 +50,15 @@ public class ComputationContainer {
    */
   static List componentClasses() {
     return Arrays.asList(
-      // context-scope repositories
+      CEActivityManager.class,
+      ReportExtractor.class,
+      CEBatchReportReader.class,
+
+      // repositories
       PlatformLanguageRepository.class,
       ProjectSettingsRepository.class,
 
-      ComputationService.class,
-      ComputationSteps.class,
-
-      // component cache
+      // component caches
       DbComponentsRefCache.class,
 
       // issues
@@ -74,17 +78,20 @@ public class ComputationContainer {
 
   public void execute(ReportQueue.Item item) {
     ComponentContainer container = Platform.getInstance().getContainer();
-    ComponentContainer child = container.createChild();
-    child.addSingletons(componentClasses());
-    child.addSingletons(ComputationSteps.orderedStepClasses());
-    child.startComponents();
+
+    ComponentContainer ceContainer = new CEContainer(container);
+    ceContainer.add(ceContainer);
+    ceContainer.add(item);
+    ceContainer.addSingletons(componentClasses());
+    ceContainer.addSingletons(ComputationSteps.orderedStepClasses());
     try {
-      child.getComponentByType(ComputationService.class).process(item);
+      ceContainer.getComponentByType(ComputationService.class).process();
     } finally {
-      child.stopComponents();
+      ceContainer.stopComponents();
       // TODO not possible to have multiple children -> will be
       // a problem when we will have multiple concurrent computation workers
       container.removeChild();
     }
   }
+
 }
index 0c934542a72874fdc64892e12938a2acef35c9d1..5646d2f6efb8f7d5826ae5af448ba397edc9c588 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-
 package org.sonar.server.computation;
 
 import com.google.common.base.Throwables;
-import java.io.File;
-import java.io.IOException;
-import javax.annotation.CheckForNull;
-import org.apache.commons.io.FileUtils;
 import org.sonar.api.server.ServerSide;
 import org.sonar.api.utils.System2;
-import org.sonar.api.utils.TempFolder;
-import org.sonar.api.utils.ZipUtils;
 import org.sonar.api.utils.log.Logger;
 import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.utils.log.Profiler;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.computation.db.AnalysisReportDto;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.core.persistence.MyBatis;
-import org.sonar.server.activity.Activity;
-import org.sonar.server.activity.ActivityService;
+import org.sonar.server.computation.activity.CEActivityManager;
 import org.sonar.server.computation.batch.BatchReportReader;
-import org.sonar.server.computation.batch.FileBatchReportReader;
 import org.sonar.server.computation.component.ComponentTreeBuilders;
 import org.sonar.server.computation.language.LanguageRepository;
 import org.sonar.server.computation.step.ComputationStep;
 import org.sonar.server.computation.step.ComputationSteps;
 import org.sonar.server.db.DbClient;
 
-import static org.sonar.api.utils.DateUtils.formatDateTimeNullSafe;
-import static org.sonar.api.utils.DateUtils.longToDate;
 import static org.sonar.core.computation.db.AnalysisReportDto.Status.FAILED;
 import static org.sonar.core.computation.db.AnalysisReportDto.Status.SUCCESS;
 
@@ -56,33 +41,35 @@ public class ComputationService {
 
   private static final Logger LOG = Loggers.get(ComputationService.class);
 
-  private final DbClient dbClient;
+  private final ReportQueue.Item item;
   private final ComputationSteps steps;
-  private final ActivityService activityService;
-  private final TempFolder tempFolder;
+  private final BatchReportReader reportReader;
+  private final CEActivityManager activityManager;
   private final System2 system;
+  private final DbClient dbClient;
   private final LanguageRepository languageRepository;
 
-  public ComputationService(DbClient dbClient, ComputationSteps steps, ActivityService activityService,
-    TempFolder tempFolder, System2 system, LanguageRepository languageRepository) {
-    this.dbClient = dbClient;
+  public ComputationService(ReportQueue.Item item, ComputationSteps steps, CEActivityManager activityManager, System2 system,
+    BatchReportReader reportReader, DbClient dbClient, LanguageRepository languageRepository) {
+    this.item = item;
     this.steps = steps;
-    this.activityService = activityService;
-    this.tempFolder = tempFolder;
+    this.reportReader = reportReader;
+    this.activityManager = activityManager;
     this.system = system;
+    this.dbClient = dbClient;
     this.languageRepository = languageRepository;
   }
 
-  public void process(ReportQueue.Item item) {
+  public void process() {
     String projectKey = item.dto.getProjectKey();
-    Profiler profiler = Profiler.create(LOG).startDebug(String.format(
-      "Analysis of project %s (report %d)", projectKey, item.dto.getId()));
+    Profiler profiler = Profiler.create(LOG).startDebug(
+      String.format("Analysis of project %s (report %d)", projectKey, item.dto.getId())
+      );
 
     try {
-      File reportDir = extractReportInDir(item);
-      BatchReportReader reader = new FileBatchReportReader(new org.sonar.batch.protocol.output.BatchReportReader(reportDir));
-      ComputationContext context = new ComputationContext(reader, null, null, dbClient, ComponentTreeBuilders.from(reader), languageRepository);
-      for (ComputationStep step : steps.orderedSteps()) {
+      ComputationContext context = new ComputationContext(reportReader, null, null, dbClient, ComponentTreeBuilders.from(reportReader), languageRepository);
+
+      for (ComputationStep step : steps.instances()) {
         Profiler stepProfiler = Profiler.createIfDebug(LOG).startDebug(step.getDescription());
         step.execute(context);
         stepProfiler.stopDebug();
@@ -93,54 +80,8 @@ public class ComputationService {
       throw Throwables.propagate(e);
     } finally {
       item.dto.setFinishedAt(system.now());
-      saveActivity(item.dto);
+      activityManager.saveActivity(item.dto);
       profiler.stopInfo();
     }
   }
-
-  private File extractReportInDir(ReportQueue.Item item) {
-    File dir = tempFolder.newDir();
-    try {
-      Profiler profiler = Profiler.createIfDebug(LOG).start();
-      ZipUtils.unzip(item.zipFile, dir);
-      if (profiler.isDebugEnabled()) {
-        String message = String.format("Report extracted | size=%s | project=%s",
-          FileUtils.byteCountToDisplaySize(FileUtils.sizeOf(dir)), item.dto.getProjectKey());
-        profiler.stopDebug(message);
-      }
-      return dir;
-    } catch (IOException e) {
-      throw new IllegalStateException(String.format("Fail to unzip %s into %s", item.zipFile, dir), e);
-    }
-  }
-
-  private void saveActivity(AnalysisReportDto report) {
-    ComponentDto project = loadProject(report.getProjectKey());
-    Activity activity = new Activity();
-    activity.setType(Activity.Type.ANALYSIS_REPORT);
-    activity.setAction("LOG_ANALYSIS_REPORT");
-    activity
-      .setData("key", String.valueOf(report.getId()))
-      .setData("projectKey", report.getProjectKey())
-      .setData("status", String.valueOf(report.getStatus()))
-      .setData("submittedAt", formatDateTimeNullSafe(longToDate(report.getCreatedAt())))
-      .setData("startedAt", formatDateTimeNullSafe(longToDate(report.getStartedAt())))
-      .setData("finishedAt", formatDateTimeNullSafe(longToDate(report.getFinishedAt())));
-    if (project != null) {
-      activity
-        .setData("projectName", project.name())
-        .setData("projectUuid", project.uuid());
-    }
-    activityService.save(activity);
-  }
-
-  @CheckForNull
-  private ComponentDto loadProject(String projectKey) {
-    DbSession session = dbClient.openSession(false);
-    try {
-      return dbClient.componentDao().selectNullableByKey(session, projectKey);
-    } finally {
-      MyBatis.closeQuietly(session);
-    }
-  }
 }
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/activity/CEActivityManager.java b/server/sonar-server/src/main/java/org/sonar/server/computation/activity/CEActivityManager.java
new file mode 100644 (file)
index 0000000..c77700a
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.computation.activity;
+
+import javax.annotation.CheckForNull;
+import org.sonar.core.component.ComponentDto;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.server.activity.Activity;
+import org.sonar.server.activity.ActivityService;
+import org.sonar.server.db.DbClient;
+
+import static org.sonar.api.utils.DateUtils.formatDateTimeNullSafe;
+import static org.sonar.api.utils.DateUtils.longToDate;
+
+public class CEActivityManager {
+  private final ActivityService activityService;
+  private final DbClient dbClient;
+
+  public CEActivityManager(ActivityService activityService, DbClient dbClient) {
+    this.activityService = activityService;
+    this.dbClient = dbClient;
+  }
+
+  public void saveActivity(AnalysisReportDto report) {
+    ComponentDto project = loadProject(report.getProjectKey());
+    Activity activity = new Activity();
+    activity.setType(Activity.Type.ANALYSIS_REPORT);
+    activity.setAction("LOG_ANALYSIS_REPORT");
+    activity
+        .setData("key", String.valueOf(report.getId()))
+        .setData("projectKey", report.getProjectKey())
+        .setData("status", String.valueOf(report.getStatus()))
+        .setData("submittedAt", formatDateTimeNullSafe(longToDate(report.getCreatedAt())))
+        .setData("startedAt", formatDateTimeNullSafe(longToDate(report.getStartedAt())))
+        .setData("finishedAt", formatDateTimeNullSafe(longToDate(report.getFinishedAt())));
+    if (project != null) {
+      activity
+          .setData("projectName", project.name())
+          .setData("projectUuid", project.uuid());
+    }
+    activityService.save(activity);
+  }
+
+  @CheckForNull
+  private ComponentDto loadProject(String projectKey) {
+    DbSession session = dbClient.openSession(false);
+    try {
+      return dbClient.componentDao().selectNullableByKey(session, projectKey);
+    } finally {
+      MyBatis.closeQuietly(session);
+    }
+  }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/activity/package-info.java b/server/sonar-server/src/main/java/org/sonar/server/computation/activity/package-info.java
new file mode 100644 (file)
index 0000000..84449c5
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+@ParametersAreNonnullByDefault
+package org.sonar.server.computation.activity;
+
+import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/batch/CEBatchReportReader.java b/server/sonar-server/src/main/java/org/sonar/server/computation/batch/CEBatchReportReader.java
new file mode 100644 (file)
index 0000000..810443e
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.computation.batch;
+
+import com.google.common.base.Throwables;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.Parser;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import javax.annotation.CheckForNull;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.LineIterator;
+import org.sonar.batch.protocol.output.BatchReport;
+import org.sonar.server.computation.ReportQueue;
+import org.sonar.server.util.CloseableIterator;
+
+public class CEBatchReportReader implements BatchReportReader {
+  private final org.sonar.batch.protocol.output.BatchReportReader delegate;
+
+  public CEBatchReportReader(ReportExtractor reportExtractor, ReportQueue.Item item) {
+    this.delegate = new org.sonar.batch.protocol.output.BatchReportReader(reportExtractor.extractReportInDir(item));
+  }
+
+  @Override
+  public BatchReport.Metadata readMetadata() {
+    return delegate.readMetadata();
+  }
+
+  @Override
+  public List<BatchReport.Measure> readComponentMeasures(int componentRef) {
+    return delegate.readComponentMeasures(componentRef);
+  }
+
+  @Override
+  @CheckForNull
+  public BatchReport.Changesets readChangesets(int componentRef) {
+    return delegate.readChangesets(componentRef);
+  }
+
+  @Override
+  public BatchReport.Component readComponent(int componentRef) {
+    return delegate.readComponent(componentRef);
+  }
+
+  @Override
+  public List<BatchReport.Issue> readComponentIssues(int componentRef) {
+    return delegate.readComponentIssues(componentRef);
+  }
+
+  @Override
+  public BatchReport.Issues readDeletedComponentIssues(int deletedComponentRef) {
+    return delegate.readDeletedComponentIssues(deletedComponentRef);
+  }
+
+  @Override
+  public List<BatchReport.Duplication> readComponentDuplications(int componentRef) {
+    return delegate.readComponentDuplications(componentRef);
+  }
+
+  @Override
+  public List<BatchReport.Symbols.Symbol> readComponentSymbols(int componentRef) {
+    return delegate.readComponentSymbols(componentRef);
+  }
+
+  @Override
+  @CheckForNull
+  public CloseableIterator<BatchReport.SyntaxHighlighting> readComponentSyntaxHighlighting(int fileRef) {
+    File file = delegate.readComponentSyntaxHighlighting(fileRef);
+    if (file == null) {
+      return CloseableIterator.emptyCloseableIterator();
+    }
+
+    try {
+      return new ParserCloseableIterator<>(BatchReport.SyntaxHighlighting.PARSER, FileUtils.openInputStream(file));
+    } catch (IOException e) {
+      Throwables.propagate(e);
+      // actually never reached
+      return CloseableIterator.emptyCloseableIterator();
+    }
+  }
+
+  @Override
+  public CloseableIterator<BatchReport.Coverage> readComponentCoverage(int fileRef) {
+    File file = delegate.readComponentCoverage(fileRef);
+    if (file == null) {
+      return CloseableIterator.emptyCloseableIterator();
+    }
+
+    try {
+      return new ParserCloseableIterator<>(BatchReport.Coverage.PARSER, FileUtils.openInputStream(file));
+    } catch (IOException e) {
+      Throwables.propagate(e);
+      // actually never reached
+      return CloseableIterator.emptyCloseableIterator();
+    }
+  }
+
+  @Override
+  public CloseableIterator<String> readFileSource(int fileRef) {
+    File file = delegate.readFileSource(fileRef);
+    if (file == null) {
+      throw new IllegalStateException("Unable to find source for file #" + fileRef + ". File does not exist: " + file);
+    }
+
+    try {
+      final LineIterator lineIterator = IOUtils.lineIterator(FileUtils.openInputStream(file), StandardCharsets.UTF_8);
+      return new CloseableIterator<String>() {
+        @Override
+        public boolean hasNext() {
+          return lineIterator.hasNext();
+        }
+
+        @Override
+        protected String doNext() {
+          return lineIterator.next();
+        }
+
+        @Override
+        protected void doClose() throws Exception {
+          lineIterator.close();
+        }
+      };
+    } catch (IOException e) {
+      throw new IllegalStateException("Fail to traverse file: " + file, e);
+    }
+  }
+
+  @Override
+  public CloseableIterator<BatchReport.Test> readTests(int testFileRef) {
+    File file = delegate.readTests(testFileRef);
+    if (file == null) {
+      return CloseableIterator.emptyCloseableIterator();
+    }
+
+    try {
+      return new ParserCloseableIterator<>(BatchReport.Test.PARSER, FileUtils.openInputStream(file));
+    } catch (IOException e) {
+      Throwables.propagate(e);
+      // actually never reached
+      return CloseableIterator.emptyCloseableIterator();
+    }
+  }
+
+  @Override
+  public CloseableIterator<BatchReport.CoverageDetail> readCoverageDetails(int testFileRef) {
+    File file = delegate.readCoverageDetails(testFileRef);
+    if (file == null) {
+      return CloseableIterator.emptyCloseableIterator();
+    }
+
+    try {
+      return new ParserCloseableIterator<>(BatchReport.CoverageDetail.PARSER, FileUtils.openInputStream(file));
+    } catch (IOException e) {
+      Throwables.propagate(e);
+      // actually never reached
+      return CloseableIterator.emptyCloseableIterator();
+    }
+  }
+
+  private static class ParserCloseableIterator<T> extends CloseableIterator<T> {
+    private final Parser<T> parser;
+    private final FileInputStream fileInputStream;
+
+    public ParserCloseableIterator(Parser<T> parser, FileInputStream fileInputStream) {
+      this.parser = parser;
+      this.fileInputStream = fileInputStream;
+    }
+
+    @Override
+    protected T doNext() {
+      try {
+        return parser.parseDelimitedFrom(fileInputStream);
+      } catch (InvalidProtocolBufferException e) {
+        Throwables.propagate(e);
+        // actually never reached
+        return null;
+      }
+    }
+
+    @Override
+    protected void doClose() throws Exception {
+      fileInputStream.close();
+    }
+  }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/batch/FileBatchReportReader.java b/server/sonar-server/src/main/java/org/sonar/server/computation/batch/FileBatchReportReader.java
deleted file mode 100644 (file)
index ae838b8..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube 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.
- *
- * SonarQube 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 this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.computation.batch;
-
-import com.google.common.base.Throwables;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.protobuf.Parser;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import javax.annotation.CheckForNull;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.LineIterator;
-import org.sonar.batch.protocol.output.BatchReport;
-import org.sonar.server.util.CloseableIterator;
-
-public class FileBatchReportReader implements BatchReportReader {
-  private final org.sonar.batch.protocol.output.BatchReportReader delegate;
-
-  public FileBatchReportReader(org.sonar.batch.protocol.output.BatchReportReader delegate) {
-    this.delegate = delegate;
-  }
-
-  @Override
-  public BatchReport.Metadata readMetadata() {
-    return delegate.readMetadata();
-  }
-
-  @Override
-  public List<BatchReport.Measure> readComponentMeasures(int componentRef) {
-    return delegate.readComponentMeasures(componentRef);
-  }
-
-  @Override
-  @CheckForNull
-  public BatchReport.Changesets readChangesets(int componentRef) {
-    return delegate.readChangesets(componentRef);
-  }
-
-  @Override
-  public BatchReport.Component readComponent(int componentRef) {
-    return delegate.readComponent(componentRef);
-  }
-
-  @Override
-  public List<BatchReport.Issue> readComponentIssues(int componentRef) {
-    return delegate.readComponentIssues(componentRef);
-  }
-
-  @Override
-  public BatchReport.Issues readDeletedComponentIssues(int deletedComponentRef) {
-    return delegate.readDeletedComponentIssues(deletedComponentRef);
-  }
-
-  @Override
-  public List<BatchReport.Duplication> readComponentDuplications(int componentRef) {
-    return delegate.readComponentDuplications(componentRef);
-  }
-
-  @Override
-  public List<BatchReport.Symbols.Symbol> readComponentSymbols(int componentRef) {
-    return delegate.readComponentSymbols(componentRef);
-  }
-
-  @Override
-  @CheckForNull
-  public CloseableIterator<BatchReport.SyntaxHighlighting> readComponentSyntaxHighlighting(int fileRef) {
-    File file = delegate.readComponentSyntaxHighlighting(fileRef);
-    if (file == null) {
-      return CloseableIterator.emptyCloseableIterator();
-    }
-
-    try {
-      return new ParserCloseableIterator<>(BatchReport.SyntaxHighlighting.PARSER, FileUtils.openInputStream(file));
-    } catch (IOException e) {
-      Throwables.propagate(e);
-      // actually never reached
-      return CloseableIterator.emptyCloseableIterator();
-    }
-  }
-
-  @Override
-  public CloseableIterator<BatchReport.Coverage> readComponentCoverage(int fileRef) {
-    File file = delegate.readComponentCoverage(fileRef);
-    if (file == null) {
-      return CloseableIterator.emptyCloseableIterator();
-    }
-
-    try {
-      return new ParserCloseableIterator<>(BatchReport.Coverage.PARSER, FileUtils.openInputStream(file));
-    } catch (IOException e) {
-      Throwables.propagate(e);
-      // actually never reached
-      return CloseableIterator.emptyCloseableIterator();
-    }
-  }
-
-  @Override
-  public CloseableIterator<String> readFileSource(int fileRef) {
-    File file = delegate.readFileSource(fileRef);
-    if (file == null) {
-      throw new IllegalStateException("Unable to find source for file #" + fileRef + ". File does not exist: " + file);
-    }
-
-    try {
-      final LineIterator lineIterator = IOUtils.lineIterator(FileUtils.openInputStream(file), StandardCharsets.UTF_8);
-      return new CloseableIterator<String>() {
-        @Override
-        public boolean hasNext() {
-          return lineIterator.hasNext();
-        }
-
-        @Override
-        protected String doNext() {
-          return lineIterator.next();
-        }
-
-        @Override
-        protected void doClose() throws Exception {
-          lineIterator.close();
-        }
-      };
-    } catch (IOException e) {
-      throw new IllegalStateException("Fail to traverse file: " + file, e);
-    }
-  }
-
-  @Override
-  public CloseableIterator<BatchReport.Test> readTests(int testFileRef) {
-    File file = delegate.readTests(testFileRef);
-    if (file == null) {
-      return CloseableIterator.emptyCloseableIterator();
-    }
-
-    try {
-      return new ParserCloseableIterator<>(BatchReport.Test.PARSER, FileUtils.openInputStream(file));
-    } catch (IOException e) {
-      Throwables.propagate(e);
-      // actually never reached
-      return CloseableIterator.emptyCloseableIterator();
-    }
-  }
-
-  @Override
-  public CloseableIterator<BatchReport.CoverageDetail> readCoverageDetails(int testFileRef) {
-    File file = delegate.readCoverageDetails(testFileRef);
-    if (file == null) {
-      return CloseableIterator.emptyCloseableIterator();
-    }
-
-    try {
-      return new ParserCloseableIterator<>(BatchReport.CoverageDetail.PARSER, FileUtils.openInputStream(file));
-    } catch (IOException e) {
-      Throwables.propagate(e);
-      // actually never reached
-      return CloseableIterator.emptyCloseableIterator();
-    }
-  }
-
-  private static class ParserCloseableIterator<T> extends CloseableIterator<T> {
-    private final Parser<T> parser;
-    private final FileInputStream fileInputStream;
-
-    public ParserCloseableIterator(Parser<T> parser, FileInputStream fileInputStream) {
-      this.parser = parser;
-      this.fileInputStream = fileInputStream;
-    }
-
-    @Override
-    protected T doNext() {
-      try {
-        return parser.parseDelimitedFrom(fileInputStream);
-      } catch (InvalidProtocolBufferException e) {
-        Throwables.propagate(e);
-        // actually never reached
-        return null;
-      }
-    }
-
-    @Override
-    protected void doClose() throws Exception {
-      fileInputStream.close();
-    }
-  }
-}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/batch/ReportExtractor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/batch/ReportExtractor.java
new file mode 100644 (file)
index 0000000..61aa6a9
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.computation.batch;
+
+import java.io.File;
+import java.io.IOException;
+import org.apache.commons.io.FileUtils;
+import org.sonar.api.utils.TempFolder;
+import org.sonar.api.utils.ZipUtils;
+import org.sonar.api.utils.log.Logger;
+import org.sonar.api.utils.log.Loggers;
+import org.sonar.api.utils.log.Profiler;
+import org.sonar.server.computation.ReportQueue;
+
+public class ReportExtractor {
+  private static final Logger LOG = Loggers.get(ReportExtractor.class);
+
+  private final TempFolder tempFolder;
+
+  public ReportExtractor(TempFolder tempFolder) {
+    this.tempFolder = tempFolder;
+  }
+
+  public File extractReportInDir(ReportQueue.Item item) {
+    File dir = tempFolder.newDir();
+    try {
+      Profiler profiler = Profiler.createIfDebug(LOG).start();
+      ZipUtils.unzip(item.zipFile, dir);
+      if (profiler.isDebugEnabled()) {
+        String message = String.format("Report extracted | size=%s | project=%s",
+            FileUtils.byteCountToDisplaySize(FileUtils.sizeOf(dir)), item.dto.getProjectKey());
+        profiler.stopDebug(message);
+      }
+      return dir;
+    } catch (IOException e) {
+      throw new IllegalStateException(String.format("Fail to unzip %s into %s", item.zipFile, dir), e);
+    }
+  }
+}
index 92e67c3c62a969c7abc2b08d36e3de37e81db10b..c0690e03cbd73001bfe653ac85da98112b4df56c 100644 (file)
@@ -34,6 +34,7 @@ import org.sonar.batch.protocol.output.BatchReport;
 import org.sonar.core.measure.db.MeasureDto;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.server.computation.ComputationContext;
+import org.sonar.server.computation.batch.BatchReportReader;
 import org.sonar.server.computation.event.Event;
 import org.sonar.server.computation.event.EventRepository;
 import org.sonar.server.computation.measure.MeasureRepository;
@@ -49,15 +50,18 @@ public class ComponentImpl implements Component {
   private final Type type;
   private final BatchReport.Component component;
   private final List<Component> children;
+  private final BatchReportReader reportReader;
   private final EventRepository eventRepository = new SetEventRepository();
 
   // Mutable values
   private String key;
   private String uuid;
 
-  public ComponentImpl(ComputationContext context, BatchReport.Component component, @Nullable Iterable<Component> children) {
+  public ComponentImpl(ComputationContext context, BatchReport.Component component,
+    BatchReportReader reportReader, @Nullable Iterable<Component> children) {
     this.context = context;
     this.component = component;
+    this.reportReader = reportReader;
     this.type = convertType(component.getType());
     this.children = children == null ? Collections.<Component>emptyList() : copyOf(filter(children, notNull()));
   }
@@ -134,7 +138,8 @@ public class ComponentImpl implements Component {
         DbClient dbClient = context.getDbClient();
         try (DbSession dbSession = dbClient.openSession(false)) {
           return Optional.fromNullable(
-            // TODO replace component.getKey() by ${link #getKey} as component.getKey() is only for project/module and does not take into account usage of the branch
+            // TODO replace component.getKey() by ${link #getKey} as component.getKey() is only for project/module and does not take into
+            // account usage of the branch
             dbClient.measureDao().findByComponentKeyAndMetricKey(dbSession, component.getKey(), metric.getKey())
             );
         }
@@ -143,7 +148,7 @@ public class ComponentImpl implements Component {
       @Override
       public Optional<BatchReport.Measure> findCurrent(final Metric<?> metric) {
         return Optional.fromNullable(Iterables.find(
-          context.getReportReader().readComponentMeasures(component.getRef()),
+          reportReader.readComponentMeasures(component.getRef()),
           new Predicate<BatchReport.Measure>() {
             @Override
             public boolean apply(@Nonnull BatchReport.Measure input) {
index 957ade019caab73867dca0ef6d9d3dc8464a039e..3369a91e1a073b1584c8d06b71880f03255180d9 100644 (file)
@@ -66,18 +66,18 @@ public final class ComponentTreeBuilders {
     private Component buildComponentRoot(ComputationContext computationContext, BatchReportReader reportReader) {
       int rootComponentRef = computationContext.getReportMetadata().getRootComponentRef();
       BatchReport.Component component = reportReader.readComponent(rootComponentRef);
-      return new ComponentImpl(computationContext, component, buildComponent(computationContext, rootComponentRef));
+      return new ComponentImpl(computationContext, component, reportReader, buildComponent(computationContext, rootComponentRef));
     }
 
     private Iterable<Component> buildComponent(final ComputationContext computationContext, int componentRef) {
-      BatchReport.Component component = computationContext.getReportReader().readComponent(componentRef);
+      BatchReport.Component component = reportReader.readComponent(componentRef);
       return Iterables.transform(
           component.getChildRefList(),
           new Function<Integer, Component>() {
             @Override
             public Component apply(@Nonnull Integer componentRef) {
-              BatchReport.Component component = computationContext.getReportReader().readComponent(componentRef);
-              return new ComponentImpl(computationContext, component, buildComponent(computationContext, componentRef));
+              BatchReport.Component component = reportReader.readComponent(componentRef);
+              return new ComponentImpl(computationContext, component, reportReader, buildComponent(computationContext, componentRef));
             }
           }
       );
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/container/CEContainer.java b/server/sonar-server/src/main/java/org/sonar/server/computation/container/CEContainer.java
new file mode 100644 (file)
index 0000000..770376b
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.computation.container;
+
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.DefaultPicoContainer;
+import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.behaviors.OptInCaching;
+import org.picocontainer.lifecycle.ReflectionLifecycleStrategy;
+import org.picocontainer.monitors.NullComponentMonitor;
+import org.sonar.api.utils.log.Loggers;
+import org.sonar.api.utils.log.Profiler;
+import org.sonar.core.platform.ComponentContainer;
+
+public class CEContainer extends ComponentContainer {
+  public CEContainer(ComponentContainer parent) {
+    super(createContainer(parent), parent);
+  }
+
+  private static MutablePicoContainer createContainer(ComponentContainer parent) {
+    ReflectionLifecycleStrategy lifecycleStrategy = new ReflectionLifecycleStrategy(new NullComponentMonitor(), "start", "stop", "close") {
+      @Override
+      public boolean isLazy(ComponentAdapter<?> adapter) {
+        return true;
+      }
+
+      @Override
+      public void start(Object component) {
+        Profiler profiler = Profiler.createIfTrace(Loggers.get(ComponentContainer.class));
+        profiler.start();
+        super.start(component);
+        profiler.stopTrace(component.getClass().getCanonicalName() + " started");
+      }
+    };
+
+    return new DefaultPicoContainer(new OptInCaching(), lifecycleStrategy, parent.getPicoContainer());
+  }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/container/package-info.java b/server/sonar-server/src/main/java/org/sonar/server/computation/container/package-info.java
new file mode 100644 (file)
index 0000000..de45519
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+@ParametersAreNonnullByDefault
+package org.sonar.server.computation.container;
+
+import javax.annotation.ParametersAreNonnullByDefault;
index 17b8cfd64684ce59063c06094dcc829eb67938bf..568d2b9982d37fba4ec8b48ae1affcf6a19c50e6 100644 (file)
@@ -21,6 +21,8 @@ package org.sonar.server.computation.issue;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.Sets;
+import java.util.Date;
+import javax.annotation.Nullable;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.FieldDiffs;
@@ -32,15 +34,12 @@ import org.sonar.api.utils.log.Loggers;
 import org.sonar.batch.protocol.output.BatchReport;
 import org.sonar.core.rule.RuleDto;
 import org.sonar.server.computation.ComputationContext;
+import org.sonar.server.computation.batch.BatchReportReader;
 import org.sonar.server.computation.component.ProjectSettingsRepository;
 import org.sonar.server.user.index.UserDoc;
 import org.sonar.server.user.index.UserIndex;
 import org.sonar.server.util.cache.DiskCache;
 
-import javax.annotation.Nullable;
-
-import java.util.Date;
-
 public class IssueComputation {
 
   private static final Logger LOG = Loggers.get(IssueComputation.class);
@@ -51,22 +50,24 @@ public class IssueComputation {
   private final DiskCache<DefaultIssue>.DiskAppender diskIssuesAppender;
   private final UserIndex userIndex;
   private final ProjectSettingsRepository projectSettingsRepository;
+  private final BatchReportReader reportReader;
   private boolean hasAssigneeBeenComputed = false;
   private String defaultAssignee = null;
 
   public IssueComputation(RuleCache ruleCache, SourceLinesCache linesCache, ScmAccountCache scmAccountCache,
-    IssueCache issueCache, UserIndex userIndex, ProjectSettingsRepository projectSettingsRepository) {
+    IssueCache issueCache, UserIndex userIndex, ProjectSettingsRepository projectSettingsRepository, BatchReportReader reportReader) {
     this.ruleCache = ruleCache;
     this.linesCache = linesCache;
     this.scmAccountCache = scmAccountCache;
     this.userIndex = userIndex;
+    this.reportReader = reportReader;
     this.projectSettingsRepository = projectSettingsRepository;
     this.diskIssuesAppender = issueCache.newAppender();
   }
 
   public void processComponentIssues(ComputationContext context, Iterable<BatchReport.Issue> issues, String componentUuid, @Nullable Integer componentReportRef,
-                                     String projectKey, String projectUuid) {
-    linesCache.init(componentUuid, componentReportRef, context.getReportReader());
+    String projectKey, String projectUuid) {
+    linesCache.init(componentUuid, componentReportRef, reportReader);
     computeDefaultAssignee(projectSettingsRepository.getProjectSettings(projectKey).getString(CoreProperties.DEFAULT_ISSUE_ASSIGNEE));
     for (BatchReport.Issue reportIssue : issues) {
       DefaultIssue issue = toDefaultIssue(context, componentUuid, reportIssue, projectKey, projectUuid);
index c1052d65fdfb5677a19e29c342859b0494e3d9ae..7360cd2b20cf474cda254f8fa3ff5f23723d3427 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-
 package org.sonar.server.computation.step;
 
-import com.google.common.collect.Lists;
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
 import java.util.Arrays;
 import java.util.List;
-import org.sonar.server.computation.ComputationContainer;
+import org.sonar.server.computation.container.CEContainer;
 
 /**
  * Ordered list of steps to be executed
@@ -71,30 +71,23 @@ public class ComputationSteps {
       SendIssueNotificationsStep.class);
   }
 
-  private final List<ComputationStep> orderedSteps;
-
-  public ComputationSteps(ComputationStep... s) {
-    this.orderedSteps = order(s);
-  }
-
-  public List<ComputationStep> orderedSteps() {
-    return orderedSteps;
-  }
+  private final CEContainer ceContainer;
 
-  private static List<ComputationStep> order(ComputationStep[] steps) {
-    List<ComputationStep> result = Lists.newArrayList();
-    for (Class<? extends ComputationStep> clazz : orderedStepClasses()) {
-      result.add(find(steps, clazz));
-    }
-    return result;
+  public ComputationSteps(CEContainer ceContainer) {
+    this.ceContainer = ceContainer;
   }
 
-  private static ComputationStep find(ComputationStep[] steps, Class<? extends ComputationStep> clazz) {
-    for (ComputationStep step : steps) {
-      if (clazz.isInstance(step)) {
-        return step;
+  public Iterable<ComputationStep> instances() {
+    return Iterables.transform(orderedStepClasses(), new Function<Class<? extends ComputationStep>, ComputationStep>() {
+      @Override
+      public ComputationStep apply(Class<? extends ComputationStep> input) {
+        ComputationStep computationStepType = ceContainer.getComponentByType(input);
+        if (computationStepType == null) {
+          throw new IllegalStateException(String.format("Component not found: %s", input));
+        }
+        return computationStepType;
       }
-    }
-    throw new IllegalStateException("Component not found: " + clazz + ". Check " + ComputationContainer.class);
+    });
   }
+
 }
index f17085e67be86cd981f0a83ecda9ed241a7e0410..78a46f3c9ec95d2ee5bcb442d6153b95c85e1cd3 100644 (file)
@@ -23,17 +23,19 @@ package org.sonar.server.computation.step;
 import java.util.List;
 import org.sonar.batch.protocol.output.BatchReport;
 import org.sonar.server.computation.ComputationContext;
+import org.sonar.server.computation.batch.BatchReportReader;
 import org.sonar.server.computation.component.Component;
 import org.sonar.server.computation.component.DepthTraversalTypeAwareVisitor;
-import org.sonar.server.computation.batch.BatchReportReader;
 import org.sonar.server.computation.issue.IssueComputation;
 
 public class ParseReportStep implements ComputationStep {
 
   private final IssueComputation issueComputation;
+  private final BatchReportReader reportReader;
 
-  public ParseReportStep(IssueComputation issueComputation) {
+  public ParseReportStep(IssueComputation issueComputation, BatchReportReader reportReader) {
     this.issueComputation = issueComputation;
+    this.reportReader = reportReader;
   }
 
   @Override
@@ -47,7 +49,7 @@ public class ParseReportStep implements ComputationStep {
   private void processDeletedComponents(ComputationContext context, IssueDepthTraversalTypeAwareVisitor visitor) {
     int deletedComponentsCount = context.getReportMetadata().getDeletedComponentsCount();
     for (int componentRef = 1; componentRef <= deletedComponentsCount; componentRef++) {
-      BatchReport.Issues issues = context.getReportReader().readDeletedComponentIssues(componentRef);
+      BatchReport.Issues issues = reportReader.readDeletedComponentIssues(componentRef);
       issueComputation.processComponentIssues(context, issues.getIssueList(), issues.getComponentUuid(), null, visitor.projectKey, visitor.projectUuid);
     }
   }
@@ -60,14 +62,12 @@ public class ParseReportStep implements ComputationStep {
   private class IssueDepthTraversalTypeAwareVisitor extends DepthTraversalTypeAwareVisitor {
 
     private final ComputationContext context;
-    private final BatchReportReader reportReader;
 
     private String projectKey;
     private String projectUuid;
 
     public IssueDepthTraversalTypeAwareVisitor(ComputationContext context) {
       super(Component.Type.FILE, Order.PRE_ORDER);
-      this.reportReader = context.getReportReader();
       this.context = context;
     }
 
index 16c0466c73dc499509159b1210820db8cb92ea7d..df2dfad32c9b828853fd714e7bdb99a20a9b0784 100644 (file)
@@ -42,10 +42,12 @@ public class PersistComponentsStep implements ComputationStep {
 
   private final DbClient dbClient;
   private final DbComponentsRefCache dbComponentsRefCache;
+  private final BatchReportReader reportReader;
 
-  public PersistComponentsStep(DbClient dbClient, DbComponentsRefCache dbComponentsRefCache) {
+  public PersistComponentsStep(DbClient dbClient, DbComponentsRefCache dbComponentsRefCache, BatchReportReader reportReader) {
     this.dbClient = dbClient;
     this.dbComponentsRefCache = dbComponentsRefCache;
+    this.reportReader = reportReader;
   }
 
   @Override
@@ -55,9 +57,9 @@ public class PersistComponentsStep implements ComputationStep {
       Component root = context.getRoot();
       List<ComponentDto> components = dbClient.componentDao().selectComponentsFromProjectKey(session, root.getKey());
       Map<String, ComponentDto> componentDtosByKey = componentDtosByKey(components);
-      ComponentContext componentContext = new ComponentContext(context.getReportReader(), session, componentDtosByKey);
+      ComponentContext componentContext = new ComponentContext(session, componentDtosByKey);
 
-      ComponentDto projectDto = processProject(root, componentContext.reportReader.readComponent(root.getRef()), componentContext);
+      ComponentDto projectDto = processProject(root, reportReader.readComponent(root.getRef()), componentContext);
       processChildren(componentContext, root, projectDto, projectDto);
       session.commit();
     } finally {
@@ -66,7 +68,6 @@ public class PersistComponentsStep implements ComputationStep {
   }
 
   private void recursivelyProcessComponent(ComponentContext componentContext, Component component, ComponentDto parentModule, ComponentDto project) {
-    BatchReportReader reportReader = componentContext.reportReader;
     BatchReport.Component reportComponent = reportReader.readComponent(component.getRef());
 
     switch (component.getType()) {
@@ -94,7 +95,7 @@ public class PersistComponentsStep implements ComputationStep {
   }
 
   public ComponentDto processProject(Component project, BatchReport.Component reportComponent, ComponentContext componentContext) {
-    ComponentDto componentDto = createComponentDto(reportComponent, project);
+    ComponentDto componentDto = createComponentDto(project);
 
     componentDto.setScope(Scopes.PROJECT);
     componentDto.setQualifier(Qualifiers.PROJECT);
@@ -110,7 +111,7 @@ public class PersistComponentsStep implements ComputationStep {
   }
 
   public ComponentDto processModule(Component module, BatchReport.Component reportComponent, ComponentContext componentContext, ComponentDto lastModule, long projectId) {
-    ComponentDto componentDto = createComponentDto(reportComponent, module);
+    ComponentDto componentDto = createComponentDto(module);
 
     componentDto.setScope(Scopes.PROJECT);
     componentDto.setQualifier(Qualifiers.MODULE);
@@ -131,7 +132,7 @@ public class PersistComponentsStep implements ComputationStep {
   }
 
   public void processDirectory(Component directory, BatchReport.Component reportComponent, ComponentContext componentContext, ComponentDto lastModule, long projectId) {
-    ComponentDto componentDto = createComponentDto(reportComponent, directory);
+    ComponentDto componentDto = createComponentDto(directory);
 
     componentDto.setScope(Scopes.DIRECTORY);
     componentDto.setQualifier(Qualifiers.DIRECTORY);
@@ -150,7 +151,7 @@ public class PersistComponentsStep implements ComputationStep {
   }
 
   public void processFile(Component file, BatchReport.Component reportComponent, ComponentContext componentContext, ComponentDto lastModule, long projectId) {
-    ComponentDto componentDto = createComponentDto(reportComponent, file);
+    ComponentDto componentDto = createComponentDto(file);
 
     componentDto.setScope(Scopes.FILE);
     componentDto.setQualifier(getFileQualifier(reportComponent));
@@ -171,7 +172,7 @@ public class PersistComponentsStep implements ComputationStep {
     persistComponent(file.getRef(), componentDto, componentContext);
   }
 
-  private ComponentDto createComponentDto(BatchReport.Component reportComponent, Component component) {
+  private ComponentDto createComponentDto(Component component) {
     String componentKey = component.getKey();
     String componentUuid = component.getUuid();
 
@@ -241,12 +242,10 @@ public class PersistComponentsStep implements ComputationStep {
   }
 
   private static class ComponentContext {
-    private final BatchReportReader reportReader;
     private final Map<String, ComponentDto> componentDtosByKey;
     private final DbSession dbSession;
 
-    public ComponentContext(BatchReportReader reportReader, DbSession dbSession, Map<String, ComponentDto> componentDtosByKey) {
-      this.reportReader = reportReader;
+    public ComponentContext(DbSession dbSession, Map<String, ComponentDto> componentDtosByKey) {
       this.componentDtosByKey = componentDtosByKey;
       this.dbSession = dbSession;
     }
index 3e9ed86b7f8a07e8cfc308f33447d9629659ff66..5c5ba3067109fee557e18a0d86907043648053fb 100644 (file)
@@ -41,10 +41,12 @@ public class PersistDuplicationsStep implements ComputationStep {
 
   private final DbClient dbClient;
   private final DbComponentsRefCache dbComponentsRefCache;
+  private final BatchReportReader reportReader;
 
-  public PersistDuplicationsStep(DbClient dbClient, DbComponentsRefCache dbComponentsRefCache) {
+  public PersistDuplicationsStep(DbClient dbClient, DbComponentsRefCache dbComponentsRefCache, BatchReportReader reportReader) {
     this.dbClient = dbClient;
     this.dbComponentsRefCache = dbComponentsRefCache;
+    this.reportReader = reportReader;
   }
 
   @Override
@@ -62,7 +64,6 @@ public class PersistDuplicationsStep implements ComputationStep {
   }
 
   private void recursivelyProcessComponent(DuplicationContext duplicationContext, int componentRef) {
-    BatchReportReader reportReader = duplicationContext.context().getReportReader();
     BatchReport.Component component = reportReader.readComponent(componentRef);
     List<BatchReport.Duplication> duplications = reportReader.readComponentDuplications(componentRef);
     if (!duplications.isEmpty()) {
@@ -111,7 +112,7 @@ public class PersistDuplicationsStep implements ComputationStep {
     } else {
       if (duplicate.hasOtherFileRef()) {
         // Duplication is on a different file
-        BatchReport.Component duplicationComponent = duplicationContext.context().getReportReader().readComponent(duplicate.getOtherFileRef());
+        BatchReport.Component duplicationComponent = reportReader.readComponent(duplicate.getOtherFileRef());
         DbComponentsRefCache.DbComponent dbComponent = dbComponentsRefCache.getByRef(duplicationComponent.getRef());
         appendDuplication(xml, dbComponent.getKey(), duplicate);
       } else {
index 1c7e7229b8fcc93a9422d8f1c143ab597aa8249a..aa8d40d295caaf276d4bb483ea0e64bb6a1c34b6 100644 (file)
@@ -37,11 +37,13 @@ public class PersistEventsStep implements ComputationStep {
   private final DbClient dbClient;
   private final System2 system2;
   private final DbComponentsRefCache dbComponentsRefCache;
+  private final BatchReportReader reportReader;
 
-  public PersistEventsStep(DbClient dbClient, System2 system2, DbComponentsRefCache dbComponentsRefCache) {
+  public PersistEventsStep(DbClient dbClient, System2 system2, DbComponentsRefCache dbComponentsRefCache, BatchReportReader reportReader) {
     this.dbClient = dbClient;
     this.system2 = system2;
     this.dbComponentsRefCache = dbComponentsRefCache;
+    this.reportReader = reportReader;
   }
 
   @Override
@@ -57,7 +59,6 @@ public class PersistEventsStep implements ComputationStep {
   }
 
   private void recursivelyProcessComponent(DbSession session, ComputationContext context, int componentRef) {
-    BatchReportReader reportReader = context.getReportReader();
     BatchReport.Component component = reportReader.readComponent(componentRef);
     processEvents(session, component, context.getReportMetadata().getAnalysisDate());
     saveVersionEvent(session, component, context.getReportMetadata().getAnalysisDate());
index c9ec5efce69356079a19d78aaff9e064d5277e86..b06f5a087ca0447b614482e1624e7381301c322d 100644 (file)
@@ -54,11 +54,13 @@ public class PersistFileSourcesStep implements ComputationStep {
   private final DbClient dbClient;
   private final System2 system2;
   private final DbComponentsRefCache dbComponentsRefCache;
+  private final BatchReportReader reportReader;
 
-  public PersistFileSourcesStep(DbClient dbClient, System2 system2, DbComponentsRefCache dbComponentsRefCache) {
+  public PersistFileSourcesStep(DbClient dbClient, System2 system2, DbComponentsRefCache dbComponentsRefCache, BatchReportReader reportReader) {
     this.dbClient = dbClient;
     this.system2 = system2;
     this.dbComponentsRefCache = dbComponentsRefCache;
+    this.reportReader = reportReader;
   }
 
   @Override
@@ -85,7 +87,6 @@ public class PersistFileSourcesStep implements ComputationStep {
   }
 
   private void recursivelyProcessComponent(FileSourcesContext fileSourcesContext, int componentRef) {
-    BatchReportReader reportReader = fileSourcesContext.context.getReportReader();
     BatchReport.Component component = reportReader.readComponent(componentRef);
     if (component.getType().equals(Constants.ComponentType.FILE)) {
       CloseableIterator<String> linesIterator = reportReader.readFileSource(componentRef);
index cb83e6e2ec203b328cbbf23cec64513f35b5f504..8c42e477423f72eb0bff487bfcba692cae293575 100644 (file)
@@ -48,12 +48,15 @@ public class PersistMeasuresStep implements ComputationStep {
   private final RuleCache ruleCache;
   private final MetricCache metricCache;
   private final DbComponentsRefCache dbComponentsRefCache;
+  private final BatchReportReader reportReader;
 
-  public PersistMeasuresStep(DbClient dbClient, RuleCache ruleCache, MetricCache metricCache, DbComponentsRefCache dbComponentsRefCache) {
+  public PersistMeasuresStep(DbClient dbClient, RuleCache ruleCache, MetricCache metricCache,
+    DbComponentsRefCache dbComponentsRefCache, BatchReportReader reportReader) {
     this.dbClient = dbClient;
     this.ruleCache = ruleCache;
     this.metricCache = metricCache;
     this.dbComponentsRefCache = dbComponentsRefCache;
+    this.reportReader = reportReader;
   }
 
   @Override
@@ -71,7 +74,6 @@ public class PersistMeasuresStep implements ComputationStep {
   }
 
   private void recursivelyProcessComponent(DbSession dbSession, ComputationContext context, int componentRef) {
-    BatchReportReader reportReader = context.getReportReader();
     BatchReport.Component component = reportReader.readComponent(componentRef);
     List<BatchReport.Measure> measures = reportReader.readComponentMeasures(componentRef);
     persistMeasures(dbSession, measures, component);
index 6f3ca621fc23b4ee5c39ed05911f4facf9c9c2f5..1c794d58e0ade023ed2e5791bc4375cc3a53d634 100644 (file)
@@ -48,16 +48,18 @@ public class PersistNumberOfDaysSinceLastCommitStep implements ComputationStep {
   private final MetricCache metricCache;
   private final System2 system;
   private final DbComponentsRefCache dbComponentsRefCache;
+  private final BatchReportReader reportReader;
 
   private long lastCommitTimestamp = 0L;
 
   public PersistNumberOfDaysSinceLastCommitStep(System2 system, DbClient dbClient, SourceLineIndex sourceLineIndex, MetricCache metricCache,
-    DbComponentsRefCache dbComponentsRefCache) {
+                                                DbComponentsRefCache dbComponentsRefCache, BatchReportReader reportReader) {
     this.dbClient = dbClient;
     this.sourceLineIndex = sourceLineIndex;
     this.metricCache = metricCache;
     this.system = system;
     this.dbComponentsRefCache = dbComponentsRefCache;
+    this.reportReader = reportReader;
   }
 
   @Override
@@ -81,7 +83,6 @@ public class PersistNumberOfDaysSinceLastCommitStep implements ComputationStep {
   }
 
   private void recursivelyProcessComponent(ComputationContext context, int componentRef) {
-    BatchReportReader reportReader = context.getReportReader();
     BatchReport.Component component = reportReader.readComponent(componentRef);
     BatchReport.Changesets scm = reportReader.readChangesets(componentRef);
     processScm(scm);
index c56388b1a2da782619ddcf1cac138527aa5f1cf6..7fd436b36ee8de91633d776ebf5c162e13f505c0 100644 (file)
@@ -49,6 +49,7 @@ public class PersistProjectLinksStep implements ComputationStep {
   private final DbClient dbClient;
   private final I18n i18n;
   private final DbComponentsRefCache dbComponentsRefCache;
+  private final BatchReportReader reportReader;
 
   private static final Map<Constants.ComponentLinkType, String> typesConverter = ImmutableMap.of(
     Constants.ComponentLinkType.HOME, ComponentLinkDto.TYPE_HOME_PAGE,
@@ -58,10 +59,11 @@ public class PersistProjectLinksStep implements ComputationStep {
     Constants.ComponentLinkType.ISSUE, ComponentLinkDto.TYPE_ISSUE_TRACKER
     );
 
-  public PersistProjectLinksStep(DbClient dbClient, I18n i18n, DbComponentsRefCache dbComponentsRefCache) {
+  public PersistProjectLinksStep(DbClient dbClient, I18n i18n, DbComponentsRefCache dbComponentsRefCache, BatchReportReader reportReader) {
     this.dbClient = dbClient;
     this.i18n = i18n;
     this.dbComponentsRefCache = dbComponentsRefCache;
+    this.reportReader = reportReader;
   }
 
   @Override
@@ -77,7 +79,6 @@ public class PersistProjectLinksStep implements ComputationStep {
   }
 
   private void recursivelyProcessComponent(DbSession session, ComputationContext context, int componentRef) {
-    BatchReportReader reportReader = context.getReportReader();
     BatchReport.Component component = reportReader.readComponent(componentRef);
     processLinks(session, component);
 
index f7f6b4c136a6ab1f09c72f9fb55a1f6d66d28492..fe4a9e3cb0863472eb938c697470072493b5c5fa 100644 (file)
@@ -61,11 +61,13 @@ public class PersistTestsStep implements ComputationStep {
   private final DbClient dbClient;
   private final System2 system;
   private final DbComponentsRefCache dbComponentsRefCache;
+  private final BatchReportReader reportReader;
 
-  public PersistTestsStep(DbClient dbClient, System2 system, DbComponentsRefCache dbComponentsRefCache) {
+  public PersistTestsStep(DbClient dbClient, System2 system, DbComponentsRefCache dbComponentsRefCache, BatchReportReader reportReader) {
     this.dbClient = dbClient;
     this.system = system;
     this.dbComponentsRefCache = dbComponentsRefCache;
+    this.reportReader = reportReader;
   }
 
   @Override
@@ -91,7 +93,6 @@ public class PersistTestsStep implements ComputationStep {
 
   private class TestDepthTraversalTypeAwareVisitor extends DepthTraversalTypeAwareVisitor {
     final DbSession session;
-    final BatchReportReader reader;
     final DbComponentsRefCache dbComponentsRefCache;
     final Map<String, FileSourceDto> existingFileSourcesByUuid;
     final String projectUuid;
@@ -101,7 +102,6 @@ public class PersistTestsStep implements ComputationStep {
       super(Component.Type.FILE, Order.PRE_ORDER);
       this.session = session;
       this.dbComponentsRefCache = dbComponentsRefCache;
-      this.reader = context.getReportReader();
       this.existingFileSourcesByUuid = new HashMap<>();
       this.projectUuid = context.getRoot().getUuid();
       session.select("org.sonar.core.source.db.FileSourceMapper.selectHashesForProject",
@@ -117,7 +117,7 @@ public class PersistTestsStep implements ComputationStep {
 
     @Override
     public void visitFile(Component file) {
-      BatchReport.Component batchComponent = reader.readComponent(file.getRef());
+      BatchReport.Component batchComponent = reportReader.readComponent(file.getRef());
       if (batchComponent.getIsTest()) {
         persistTestResults(batchComponent);
       }
@@ -188,7 +188,7 @@ public class PersistTestsStep implements ComputationStep {
     private Multimap<String, FileSourceDb.Test.Builder> buildDbTests(BatchReport.Component component) {
       Multimap<String, FileSourceDb.Test.Builder> tests = ArrayListMultimap.create();
 
-      try (CloseableIterator<BatchReport.Test> testIterator = reader.readTests(component.getRef())) {
+      try (CloseableIterator<BatchReport.Test> testIterator = reportReader.readTests(component.getRef())) {
         while (testIterator.hasNext()) {
           BatchReport.Test batchTest = testIterator.next();
           FileSourceDb.Test.Builder dbTest = FileSourceDb.Test.newBuilder();
@@ -220,7 +220,7 @@ public class PersistTestsStep implements ComputationStep {
     private Table<String, String, FileSourceDb.Test.CoveredFile.Builder> loadCoverageDetails(int testFileRef) {
       Table<String, String, FileSourceDb.Test.CoveredFile.Builder> nameToCoveredFiles = HashBasedTable.create();
 
-      try (CloseableIterator<BatchReport.CoverageDetail> coverageIterator = reader.readCoverageDetails(testFileRef)) {
+      try (CloseableIterator<BatchReport.CoverageDetail> coverageIterator = reportReader.readCoverageDetails(testFileRef)) {
         while (coverageIterator.hasNext()) {
           BatchReport.CoverageDetail batchCoverageDetail = coverageIterator.next();
           for (BatchReport.CoverageDetail.CoveredFile batchCoveredFile : batchCoverageDetail.getCoveredFileList()) {
index 4249a7097d7b29a673a559a7649a477bf666297d..406f50d2c4b301e7abe4864177e12e3b89478397 100644 (file)
@@ -41,16 +41,17 @@ import org.sonar.server.db.DbClient;
 public class PopulateComponentsUuidAndKeyStep implements ComputationStep {
 
   private final DbClient dbClient;
+  private final BatchReportReader reportReader;
 
-  public PopulateComponentsUuidAndKeyStep(DbClient dbClient) {
+  public PopulateComponentsUuidAndKeyStep(DbClient dbClient, BatchReportReader reportReader) {
     this.dbClient = dbClient;
+    this.reportReader = reportReader;
   }
 
   @Override
   public void execute(ComputationContext context) {
     DbSession session = dbClient.openSession(false);
     try {
-      BatchReportReader reportReader = context.getReportReader();
       String branch = context.getReportMetadata().hasBranch() ? context.getReportMetadata().getBranch() : null;
       BatchReport.Component project = reportReader.readComponent(context.getReportMetadata().getRootComponentRef());
       String projectKey = ComponentKeys.createKey(project.getKey(), branch);
index 3586229fce8a625928e08c9e8cfa900f09c2bc3c..5a9ca7ff37a10d3fe897523f7c03e5aae2518cd2 100644 (file)
 package org.sonar.server.computation.step;
 
 import com.google.common.collect.ImmutableSet;
+import java.util.Date;
+import java.util.Map;
+import java.util.Set;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.server.computation.ComputationContext;
+import org.sonar.server.computation.batch.BatchReportReader;
 import org.sonar.server.computation.component.DbComponentsRefCache;
 import org.sonar.server.computation.component.DbComponentsRefCache.DbComponent;
 import org.sonar.server.computation.issue.IssueCache;
@@ -34,10 +38,6 @@ import org.sonar.server.issue.notification.NewIssuesStatistics;
 import org.sonar.server.notifications.NotificationService;
 import org.sonar.server.util.CloseableIterator;
 
-import java.util.Date;
-import java.util.Map;
-import java.util.Set;
-
 /**
  * Reads issues from disk cache and send related notifications. For performance reasons,
  * the standard notification DB queue is not used as a temporary storage. Notifications
@@ -53,14 +53,16 @@ public class SendIssueNotificationsStep implements ComputationStep {
   private final RuleCache rules;
   private final DbComponentsRefCache dbComponentsRefCache;
   private final NotificationService service;
+  private final BatchReportReader reportReader;
   private NewIssuesNotificationFactory newIssuesNotificationFactory;
 
   public SendIssueNotificationsStep(IssueCache issueCache, RuleCache rules, DbComponentsRefCache dbComponentsRefCache, NotificationService service,
-    NewIssuesNotificationFactory newIssuesNotificationFactory) {
+    BatchReportReader reportReader, NewIssuesNotificationFactory newIssuesNotificationFactory) {
     this.issueCache = issueCache;
     this.rules = rules;
     this.dbComponentsRefCache = dbComponentsRefCache;
     this.service = service;
+    this.reportReader = reportReader;
     this.newIssuesNotificationFactory = newIssuesNotificationFactory;
   }
 
@@ -75,7 +77,7 @@ public class SendIssueNotificationsStep implements ComputationStep {
   private void doExecute(ComputationContext context, DbComponent project) {
     NewIssuesStatistics newIssuesStats = new NewIssuesStatistics();
     CloseableIterator<DefaultIssue> issues = issueCache.traverse();
-    String projectName = context.getReportReader().readComponent(context.getReportMetadata().getRootComponentRef()).getName();
+    String projectName = reportReader.readComponent(context.getReportMetadata().getRootComponentRef()).getName();
     try {
       while (issues.hasNext()) {
         DefaultIssue issue = issues.next();
index 6e0c2781ba8acad1e75093372417fe17d6eedd8e..eaeaa3dc09fe0c4e45a9b0effd2a811ce9293196 100644 (file)
  */
 package org.sonar.server.computation;
 
+import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.io.IOException;
 import java.util.Arrays;
-import org.apache.commons.io.FileUtils;
+import java.util.Collections;
 import org.apache.commons.lang.RandomStringUtils;
 import org.junit.Before;
-import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
 import org.sonar.api.utils.System2;
-import org.sonar.api.utils.ZipUtils;
-import org.sonar.api.utils.internal.JUnitTempFolder;
 import org.sonar.api.utils.log.LogTester;
 import org.sonar.api.utils.log.LoggerLevel;
 import org.sonar.batch.protocol.Constants;
 import org.sonar.batch.protocol.output.BatchReport;
-import org.sonar.batch.protocol.output.BatchReportWriter;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.computation.db.AnalysisReportDto.Status;
-import org.sonar.core.persistence.DbTester;
-import org.sonar.server.activity.Activity;
-import org.sonar.server.activity.ActivityService;
-import org.sonar.server.component.db.ComponentDao;
-import org.sonar.server.component.db.SnapshotDao;
+import org.sonar.server.computation.activity.CEActivityManager;
+import org.sonar.server.computation.batch.BatchReportReaderRule;
 import org.sonar.server.computation.language.LanguageRepository;
 import org.sonar.server.computation.step.ComputationStep;
 import org.sonar.server.computation.step.ComputationSteps;
 import org.sonar.server.db.DbClient;
-import org.sonar.server.properties.ProjectSettingsFactory;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -62,75 +50,44 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-@RunWith(MockitoJUnitRunner.class)
 public class ComputationServiceTest {
 
-  @ClassRule
-  public static DbTester dbTester = new DbTester();
-
   @Rule
-  public JUnitTempFolder tempFolder = new JUnitTempFolder();
-
+  public BatchReportReaderRule reportReader = new BatchReportReaderRule();
   @Rule
   public LogTester logTester = new LogTester();
 
-  @Captor
-  ArgumentCaptor<Activity> activityArgumentCaptor;
-
   ComputationStep projectStep1 = mockStep();
   ComputationStep projectStep2 = mockStep();
   ComputationSteps steps = mock(ComputationSteps.class);
-  ActivityService activityService = mock(ActivityService.class);
+  CEActivityManager activityManager = mock(CEActivityManager.class);
   System2 system = mock(System2.class);
+  AnalysisReportDto dto = AnalysisReportDto.newForTests(1L).setProjectKey("P1").setUuid("U1").setStatus(Status.PENDING);
   ComputationService sut;
-  ProjectSettingsFactory settingsFactory = mock(ProjectSettingsFactory.class, Mockito.RETURNS_DEEP_STUBS);
 
   @Before
-  public void setUp() {
-    dbTester.truncateTables();
-    DbClient dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new ComponentDao(), new SnapshotDao(system));
-    sut = new ComputationService(dbClient, steps, activityService, tempFolder, system, mock(LanguageRepository.class));
-  }
-
-  @Test
-  public void process_new_project() throws Exception {
-    logTester.setLevel(LoggerLevel.INFO);
-
-    when(steps.orderedSteps()).thenReturn(Arrays.asList(projectStep1, projectStep2));
-    AnalysisReportDto dto = newDefaultReport();
-    File zip = generateZip();
-
-    sut.process(new ReportQueue.Item(dto, zip));
-
-    // report is integrated -> status is set to SUCCESS
-    assertThat(dto.getStatus()).isEqualTo(Status.SUCCESS);
-    assertThat(dto.getFinishedAt()).isNotNull();
-
-    // one info log at the end
-    assertThat(logTester.logs(LoggerLevel.INFO)).hasSize(1);
-    assertThat(logTester.logs(LoggerLevel.INFO).get(0)).startsWith("Analysis of project P1 (report 1) (done) | time=");
-
-    // execute only the steps supporting the project qualifier
-    verify(projectStep1).execute(any(ComputationContext.class));
-    verify(projectStep2).execute(any(ComputationContext.class));
-    verify(activityService).save(activityArgumentCaptor.capture());
+  public void setUp() throws IOException {
+    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
+      .setRootComponentRef(1)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey("project key")
+      .setName("Project name")
+      .build());
 
-    assertThat(activityArgumentCaptor.getValue().getType()).isEqualTo(Activity.Type.ANALYSIS_REPORT);
-    assertThat(activityArgumentCaptor.getValue().getAction()).isEqualTo("LOG_ANALYSIS_REPORT");
-    assertThat(activityArgumentCaptor.getValue().getData()).containsEntry("projectKey", "P1");
+    sut = new ComputationService(new ReportQueue.Item(dto, new File("Do_not_care")), steps, activityManager, system,
+      reportReader, mock(DbClient.class), mock(LanguageRepository.class));
   }
 
   @Test
-  public void process_existing_project() throws Exception {
-    dbTester.prepareDbUnit(getClass(), "shared.xml");
-
+  public void process_new_project() throws Exception {
     logTester.setLevel(LoggerLevel.INFO);
 
-    when(steps.orderedSteps()).thenReturn(Arrays.asList(projectStep1, projectStep2));
-    AnalysisReportDto dto = newDefaultReport();
-    File zip = generateZip();
+    when(steps.instances()).thenReturn(Arrays.asList(projectStep1, projectStep2));
 
-    sut.process(new ReportQueue.Item(dto, zip));
+    sut.process();
 
     // report is integrated -> status is set to SUCCESS
     assertThat(dto.getStatus()).isEqualTo(Status.SUCCESS);
@@ -143,41 +100,30 @@ public class ComputationServiceTest {
     // execute only the steps supporting the project qualifier
     verify(projectStep1).execute(any(ComputationContext.class));
     verify(projectStep2).execute(any(ComputationContext.class));
-    verify(activityService).save(activityArgumentCaptor.capture());
-
-    assertThat(activityArgumentCaptor.getValue().getType()).isEqualTo(Activity.Type.ANALYSIS_REPORT);
-    assertThat(activityArgumentCaptor.getValue().getAction()).isEqualTo("LOG_ANALYSIS_REPORT");
-    assertThat(activityArgumentCaptor.getValue().getData()).containsEntry("projectKey", "P1");
-    assertThat(activityArgumentCaptor.getValue().getData()).containsEntry("projectName", "Project 1");
-    assertThat(activityArgumentCaptor.getValue().getData().get("projectUuid")).isEqualTo("ABCD");
-  }
-
-  private AnalysisReportDto newDefaultReport() {
-    return AnalysisReportDto.newForTests(1L).setProjectKey("P1").setUuid("U1").setStatus(Status.PENDING);
+    verify(activityManager).saveActivity(dto);
   }
 
   @Test
   public void debug_logs() throws Exception {
+    when(steps.instances()).thenReturn(Collections.<ComputationStep>emptyList());
     logTester.setLevel(LoggerLevel.DEBUG);
 
-    AnalysisReportDto dto = newDefaultReport();
-    File zip = generateZip();
-    sut.process(new ReportQueue.Item(dto, zip));
+    sut.process();
 
     assertThat(logTester.logs(LoggerLevel.DEBUG)).isNotEmpty();
   }
 
   @Test
-  public void fail_if_corrupted_zip() throws Exception {
-    AnalysisReportDto dto = newDefaultReport();
-    File zip = tempFolder.newFile();
-    FileUtils.write(zip, "not a file");
+  public void fail_if_step_throws_error() throws Exception {
+    String errorMessage = "Failed to unzip";
+    when(steps.instances()).thenReturn(ImmutableList.of(projectStep1));
+    doThrow(new IllegalStateException(errorMessage)).when(projectStep1).execute(any(ComputationContext.class));
 
     try {
-      sut.process(new ReportQueue.Item(dto, zip));
+      sut.process();
       fail();
     } catch (IllegalStateException e) {
-      assertThat(e.getMessage()).startsWith("Fail to unzip " + zip.getAbsolutePath() + " into ");
+      assertThat(e.getMessage()).isEqualTo(errorMessage);
       assertThat(dto.getStatus()).isEqualTo(Status.FAILED);
       assertThat(dto.getFinishedAt()).isNotNull();
     }
@@ -185,14 +131,11 @@ public class ComputationServiceTest {
 
   @Test
   public void step_error() throws Exception {
-    when(steps.orderedSteps()).thenReturn(Arrays.asList(projectStep1));
+    when(steps.instances()).thenReturn(Arrays.asList(projectStep1));
     doThrow(new IllegalStateException("pb")).when(projectStep1).execute(any(ComputationContext.class));
 
-    AnalysisReportDto dto = newDefaultReport();
-    File zip = generateZip();
-
     try {
-      sut.process(new ReportQueue.Item(dto, zip));
+      sut.process();
       fail();
     } catch (IllegalStateException e) {
       assertThat(e.getMessage()).isEqualTo("pb");
@@ -207,27 +150,4 @@ public class ComputationServiceTest {
     return step;
   }
 
-  private File generateZip() throws IOException {
-    return generateZip(110L);
-  }
-
-  private File generateZip(long snapshotId) throws IOException {
-    File dir = tempFolder.newDir();
-    BatchReportWriter writer = new BatchReportWriter(dir);
-    writer.writeMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .setProjectKey("PROJECT_KEY")
-      .setAnalysisDate(150000000L)
-      .setSnapshotId(snapshotId)
-      .build());
-    writer.writeComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey("PROJECT_KEY")
-      .setSnapshotId(snapshotId)
-      .build());
-    File zip = tempFolder.newFile();
-    ZipUtils.zipDir(dir, zip);
-    return zip;
-  }
 }
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/activity/CEActivityManagerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/activity/CEActivityManagerTest.java
new file mode 100644 (file)
index 0000000..82b267f
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.computation.activity;
+
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.mockito.ArgumentCaptor;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbTester;
+import org.sonar.server.activity.Activity;
+import org.sonar.server.activity.ActivityService;
+import org.sonar.server.component.db.ComponentDao;
+import org.sonar.server.db.DbClient;
+import org.sonar.test.DbTests;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+@Category(DbTests.class)
+public class CEActivityManagerTest {
+  @ClassRule
+  public static DbTester dbTester = new DbTester();
+
+  ArgumentCaptor<Activity> activityArgumentCaptor = ArgumentCaptor.forClass(Activity.class);
+
+  AnalysisReportDto reportDto = AnalysisReportDto.newForTests(1L).setProjectKey("P1").setUuid("U1").setStatus(AnalysisReportDto.Status.PENDING);
+
+  ActivityService activityService = mock(ActivityService.class);
+  CEActivityManager underTest;
+
+  @Before
+  public void setup() throws Exception {
+    dbTester.truncateTables();
+    DbClient dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new ComponentDao());
+
+    underTest = new CEActivityManager(activityService, dbClient);
+  }
+
+  @Test
+  public void process_existing_project() throws Exception {
+    dbTester.prepareDbUnit(getClass(), "shared.xml");
+
+    underTest.saveActivity(reportDto);
+
+    verify(activityService).save(activityArgumentCaptor.capture());
+
+    assertThat(activityArgumentCaptor.getValue().getType()).isEqualTo(Activity.Type.ANALYSIS_REPORT);
+    assertThat(activityArgumentCaptor.getValue().getAction()).isEqualTo("LOG_ANALYSIS_REPORT");
+    assertThat(activityArgumentCaptor.getValue().getData()).containsEntry("projectKey", "P1");
+    assertThat(activityArgumentCaptor.getValue().getData()).containsEntry("projectName", "Project 1");
+    assertThat(activityArgumentCaptor.getValue().getData().get("projectUuid")).isEqualTo("ABCD");
+  }
+
+  @Test
+  public void process_new_project() throws Exception {
+    underTest.saveActivity(reportDto);
+
+    // execute only the steps supporting the project qualifier
+    verify(activityService).save(activityArgumentCaptor.capture());
+
+    assertThat(activityArgumentCaptor.getValue().getType()).isEqualTo(Activity.Type.ANALYSIS_REPORT);
+    assertThat(activityArgumentCaptor.getValue().getAction()).isEqualTo("LOG_ANALYSIS_REPORT");
+    assertThat(activityArgumentCaptor.getValue().getData()).containsEntry("projectKey", "P1");
+  }
+
+}
index 4c48e205bc432dd1e041ebb32398864f47336706..baa3f16435b464326ca90de8254c7228bfee7f2a 100644 (file)
@@ -25,6 +25,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
@@ -100,6 +101,7 @@ public class BatchReportReaderRule implements TestRule, BatchReportReader {
   }
 
   @Override
+  @CheckForNull
   public BatchReport.Changesets readChangesets(int componentRef) {
     return changesets.get(componentRef);
   }
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/batch/ReportExtractorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/batch/ReportExtractorTest.java
new file mode 100644 (file)
index 0000000..d25761f
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.computation.batch;
+
+import java.io.File;
+import org.apache.commons.io.FileUtils;
+import org.junit.Rule;
+import org.junit.Test;
+import org.sonar.api.utils.internal.JUnitTempFolder;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.server.computation.ReportQueue;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.fail;
+
+public class ReportExtractorTest {
+
+  @Rule
+  public JUnitTempFolder tempFolder = new JUnitTempFolder();
+
+  ReportExtractor underTest = new ReportExtractor(tempFolder);
+
+
+  @Test
+  public void fail_if_corrupted_zip() throws Exception {
+    AnalysisReportDto dto = newDefaultReport();
+    File zip = tempFolder.newFile();
+    FileUtils.write(zip, "not a file");
+
+    try {
+      underTest.extractReportInDir(new ReportQueue.Item(dto, zip));
+      fail();
+    } catch (IllegalStateException e) {
+      assertThat(e.getMessage()).startsWith("Fail to unzip " + zip.getAbsolutePath() + " into ");
+    }
+  }
+
+  private AnalysisReportDto newDefaultReport() {
+    return AnalysisReportDto.newForTests(1L).setProjectKey("P1").setUuid("U1").setStatus(AnalysisReportDto.Status.PENDING);
+  }
+}
index f4e0ff6145a8d0992fa170a9b9be5abe600c1db2..44759320a3e3a6b1ae4645dc05f663afeb5bf1c6 100644 (file)
@@ -21,6 +21,8 @@ package org.sonar.server.computation.issue;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterators;
+import java.io.IOException;
+import java.util.Arrays;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -37,13 +39,11 @@ import org.sonar.api.utils.log.LogTester;
 import org.sonar.batch.protocol.output.BatchReport;
 import org.sonar.core.rule.RuleDto;
 import org.sonar.server.computation.ComputationContext;
+import org.sonar.server.computation.batch.BatchReportReaderRule;
 import org.sonar.server.computation.component.ProjectSettingsRepository;
 import org.sonar.server.user.index.UserDoc;
 import org.sonar.server.user.index.UserIndex;
 
-import java.io.IOException;
-import java.util.Arrays;
-
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verifyZeroInteractions;
@@ -56,9 +56,10 @@ public class IssueComputationTest {
 
   @Rule
   public TemporaryFolder temp = new TemporaryFolder();
-
   @Rule
   public LogTester logTester = new LogTester();
+  @Rule
+  public BatchReportReaderRule reportReader = new BatchReportReaderRule();
 
   IssueComputation sut;
 
@@ -86,7 +87,7 @@ public class IssueComputationTest {
     outputIssues = new IssueCache(temp.newFile(), System2.INSTANCE);
     projectSettings = new Settings();
     when(projectSettingsRepository.getProjectSettings(PROJECT_KEY)).thenReturn(projectSettings);
-    sut = new IssueComputation(ruleCache, lineCache, scmAccountCache, outputIssues, userIndex, projectSettingsRepository);
+    sut = new IssueComputation(ruleCache, lineCache, scmAccountCache, outputIssues, userIndex, projectSettingsRepository, reportReader);
   }
 
   @After
index 188773c5c410b4f9ffa2b115a578441e19a45143..72cf7bb897b4c5634e928a1e04b9fe940375d254 100644 (file)
 
 package org.sonar.server.computation.step;
 
+import com.google.common.collect.Lists;
+import java.util.List;
 import org.junit.Test;
+import org.sonar.core.platform.ComponentContainer;
+import org.sonar.server.computation.container.CEContainer;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
@@ -30,7 +34,8 @@ public class ComputationStepsTest {
 
   @Test
   public void ordered_steps() {
-    ComputationSteps registry = new ComputationSteps(
+    CEContainer ceContainer = new CEContainer(new ComponentContainer());
+    ceContainer.add(
       // unordered
       mock(ApplyPermissionsStep.class),
       mock(ParseReportStep.class),
@@ -51,20 +56,21 @@ public class ComputationStepsTest {
       mock(IndexTestsStep.class),
       mock(PopulateComponentsUuidAndKeyStep.class),
       mock(PersistComponentsStep.class),
-      mock(IndexTestsStep.class),
       mock(QualityProfileEventsStep.class),
       mock(ValidateProjectStep.class)
       );
+    ComputationSteps computationSteps = new ComputationSteps(ceContainer);
 
-    assertThat(registry.orderedSteps()).hasSize(21);
-    assertThat(registry.orderedSteps().get(0)).isInstanceOf(PopulateComponentsUuidAndKeyStep.class);
-    assertThat(registry.orderedSteps().get(20)).isInstanceOf(SendIssueNotificationsStep.class);
+    List<ComputationStep> steps = Lists.newArrayList(computationSteps.instances());
+    assertThat(steps).hasSize(21);
+    assertThat(steps.get(0)).isInstanceOf(PopulateComponentsUuidAndKeyStep.class);
+    assertThat(steps.get(20)).isInstanceOf(SendIssueNotificationsStep.class);
   }
 
   @Test
   public void fail_if_a_step_is_not_registered_in_picocontainer() {
     try {
-      new ComputationSteps(mock(ParseReportStep.class));
+      Lists.newArrayList(new ComputationSteps(new CEContainer(new ComponentContainer())).instances());
       fail();
     } catch (IllegalStateException e) {
       assertThat(e).hasMessageContaining("Component not found");
index 58a94e0fa69bbd1686981caf562e1d08a4798a82..ccf6b1be883d144120d278846dc9756c8d2dd5d2 100644 (file)
 
 package org.sonar.server.computation.step;
 
+import java.io.IOException;
 import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.config.Settings;
-import org.junit.rules.TemporaryFolder;
 import org.sonar.batch.protocol.output.BatchReport;
-import org.sonar.batch.protocol.output.BatchReportReader;
-import org.sonar.batch.protocol.output.BatchReportWriter;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.resource.ResourceIndexerDao;
 import org.sonar.server.computation.ComputationContext;
-import org.sonar.server.computation.batch.FileBatchReportReader;
+import org.sonar.server.computation.batch.BatchReportReaderRule;
+import org.sonar.server.computation.component.ComponentTreeBuilders;
 import org.sonar.server.computation.component.DbComponentsRefCache;
 import org.sonar.server.computation.component.DbComponentsRefCache.DbComponent;
-import org.sonar.server.computation.component.ComponentTreeBuilders;
 import org.sonar.server.computation.component.DumbComponent;
 import org.sonar.server.computation.language.LanguageRepository;
 import org.sonar.server.db.DbClient;
 
-import java.io.File;
-import java.io.IOException;
-
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -50,7 +45,7 @@ public class IndexComponentsStepTest extends BaseStepTest {
   private static final String PROJECT_KEY = "PROJECT_KEY";
 
   @Rule
-  public TemporaryFolder temp = new TemporaryFolder();
+  public BatchReportReaderRule reportReader = new BatchReportReaderRule();
 
   ResourceIndexerDao resourceIndexerDao = mock(ResourceIndexerDao.class);
   DbComponentsRefCache dbComponentsRefCache = new DbComponentsRefCache();
@@ -60,15 +55,14 @@ public class IndexComponentsStepTest extends BaseStepTest {
   public void call_indexProject_of_dao() throws IOException {
     dbComponentsRefCache.addComponent(1, new DbComponent(123L, PROJECT_KEY, "PROJECT_UUID"));
 
-    File reportDir = temp.newFolder();
-    BatchReportWriter writer = new BatchReportWriter(reportDir);
-    writer.writeMetadata(BatchReport.Metadata.newBuilder()
+    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
       .setRootComponentRef(1)
       .build());
 
     ComponentDto project = mock(ComponentDto.class);
     when(project.getId()).thenReturn(123L);
-    ComputationContext context = new ComputationContext(new FileBatchReportReader(new BatchReportReader(reportDir)), PROJECT_KEY, new Settings(), mock(DbClient.class), ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), mock(LanguageRepository.class));
+    ComputationContext context = new ComputationContext(reportReader, PROJECT_KEY, new Settings(), mock(DbClient.class), ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT),
+      mock(LanguageRepository.class));
 
     sut.execute(context);
 
index 24a746723c6db3b4c8e9c465b2d377134a3b47eb..1d7586d2ae7e64aba23f1074f5c43ab7d8a4f0ad 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.server.computation.step;
 
-import java.io.File;
 import java.sql.Connection;
 import java.util.List;
 import org.elasticsearch.search.SearchHit;
@@ -27,14 +26,12 @@ import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.sonar.api.config.Settings;
+import org.sonar.batch.protocol.Constants;
 import org.sonar.batch.protocol.output.BatchReport;
-import org.sonar.batch.protocol.output.BatchReportReader;
-import org.sonar.batch.protocol.output.BatchReportWriter;
 import org.sonar.core.persistence.DbTester;
 import org.sonar.server.computation.ComputationContext;
-import org.sonar.server.computation.batch.FileBatchReportReader;
+import org.sonar.server.computation.batch.BatchReportReaderRule;
 import org.sonar.server.computation.component.ComponentTreeBuilders;
 import org.sonar.server.computation.component.DbComponentsRefCache;
 import org.sonar.server.computation.component.DumbComponent;
@@ -54,14 +51,12 @@ public class IndexSourceLinesStepTest extends BaseStepTest {
 
   private static final String PROJECT_KEY = "PROJECT_KEY";
 
-  @Rule
-  public TemporaryFolder temp = new TemporaryFolder();
-
   @ClassRule
   public static DbTester dbTester = new DbTester();
-
   @ClassRule
   public static EsTester esTester = new EsTester().addDefinitions(new SourceLineIndexDefinition(new Settings()));
+  @Rule
+  public BatchReportReaderRule reportReader = new BatchReportReaderRule();
 
   DbClient dbClient;
 
@@ -89,14 +84,12 @@ public class IndexSourceLinesStepTest extends BaseStepTest {
     FileSourceTesting.updateDataColumn(connection, "FILE1_UUID", FileSourceTesting.newRandomData(1).build());
     connection.close();
 
-    File reportDir = temp.newFolder();
-    BatchReportWriter writer = new BatchReportWriter(reportDir);
-    writer.writeMetadata(BatchReport.Metadata.newBuilder()
+    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
       .setRootComponentRef(1)
       .build());
 
-    step().execute(new ComputationContext(new FileBatchReportReader(new BatchReportReader(reportDir)), PROJECT_KEY, new Settings(), dbClient,
-        ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), mock(LanguageRepository.class)));
+    step().execute(new ComputationContext(reportReader, PROJECT_KEY, new Settings(), dbClient,
+      ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), mock(LanguageRepository.class)));
 
     List<SearchHit> docs = esTester.getDocuments(SourceLineIndexDefinition.INDEX, SourceLineIndexDefinition.TYPE);
     assertThat(docs).hasSize(1);
index 2d28cabfbea946792aa1d4648d8b05966dd05ef2..edb4ff90efae146261f8d77faa53339e114bd247 100644 (file)
@@ -20,7 +20,6 @@
 
 package org.sonar.server.computation.step;
 
-import java.io.File;
 import java.sql.Connection;
 import java.util.List;
 import org.elasticsearch.search.SearchHit;
@@ -28,14 +27,11 @@ import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.sonar.api.config.Settings;
 import org.sonar.batch.protocol.output.BatchReport;
-import org.sonar.batch.protocol.output.BatchReportReader;
-import org.sonar.batch.protocol.output.BatchReportWriter;
 import org.sonar.core.persistence.DbTester;
 import org.sonar.server.computation.ComputationContext;
-import org.sonar.server.computation.batch.FileBatchReportReader;
+import org.sonar.server.computation.batch.BatchReportReaderRule;
 import org.sonar.server.computation.component.ComponentTreeBuilders;
 import org.sonar.server.computation.component.DbComponentsRefCache;
 import org.sonar.server.computation.component.DumbComponent;
@@ -53,17 +49,14 @@ import static org.mockito.Mockito.mock;
 
 public class IndexTestsStepTest extends BaseStepTest {
 
-  @Rule
-  public TemporaryFolder temp = new TemporaryFolder();
-
   @ClassRule
   public static DbTester dbTester = new DbTester();
-
   @ClassRule
   public static EsTester esTester = new EsTester().addDefinitions(new TestIndexDefinition(new Settings()));
+  @Rule
+  public BatchReportReaderRule reportReader = new BatchReportReaderRule();
 
   DbClient dbClient;
-  ComputationContext underTest;
 
   DbComponentsRefCache dbComponentsRefCache;
 
@@ -90,13 +83,11 @@ public class IndexTestsStepTest extends BaseStepTest {
     TestTesting.updateDataColumn(connection, "FILE1_UUID", TestTesting.newRandomTests(1));
     connection.close();
 
-    File reportDir = temp.newFolder();
-    BatchReportWriter writer = new BatchReportWriter(reportDir);
-    writer.writeMetadata(BatchReport.Metadata.newBuilder()
+    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
       .setRootComponentRef(1)
       .build());
 
-    step().execute(new ComputationContext(new FileBatchReportReader(new BatchReportReader(reportDir)), "PROJECT_KEY", new Settings(), dbClient,
+    step().execute(new ComputationContext(reportReader, "PROJECT_KEY", new Settings(), dbClient,
         ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), mock(LanguageRepository.class)));
 
     List<SearchHit> docs = esTester.getDocuments(TestIndexDefinition.INDEX, TestIndexDefinition.TYPE);
index f4787434a23d2a67d691f45aaf8c112c25bf1349..c7574ebc8c7d506d1ed7ac46afc263a0bcb937ce 100644 (file)
@@ -62,7 +62,7 @@ public class ParseReportStepTest extends BaseStepTest {
 
   IssueComputation issueComputation = mock(IssueComputation.class);
 
-  ParseReportStep sut = new ParseReportStep(issueComputation);
+  ParseReportStep sut = new ParseReportStep(issueComputation, reportReader);
 
   @Test
   public void extract_report_from_db_and_browse_components() throws Exception {
index be55b3c03e8b0a809f6f578f20d2934428ee2f38..cbe6093a88d0c468211e0b386d88ed60cad388fa 100644 (file)
@@ -76,7 +76,7 @@ public class PersistComponentsStepTest extends BaseStepTest {
     projectSettings = new Settings();
     languageRepository = mock(LanguageRepository.class);
     dbComponentsRefCache = new DbComponentsRefCache();
-    sut = new PersistComponentsStep(dbClient, dbComponentsRefCache);
+    sut = new PersistComponentsStep(dbClient, dbComponentsRefCache, reportReader);
   }
 
   @Override
index 539d3a994a22c148e96f0ea1e8451253ebfa4f7a..28cca616ef26c5f6141848928fa608a4ba655156 100644 (file)
@@ -82,7 +82,7 @@ public class PersistDuplicationsStepTest extends BaseStepTest {
     projectSettings = new Settings();
     dbComponentsRefCache = new DbComponentsRefCache();
     languageRepository = mock(LanguageRepository.class);
-    sut = new PersistDuplicationsStep(dbClient, dbComponentsRefCache);
+    sut = new PersistDuplicationsStep(dbClient, dbComponentsRefCache, reportReader);
   }
 
   @Override
index c455396ee71d4bba02eca028fbdd72d1b4b5839f..b7aa3f9228c90c6d73e8e162769399b8edba9e84 100644 (file)
@@ -83,7 +83,7 @@ public class PersistEventsStepTest extends BaseStepTest {
     languageRepository = mock(LanguageRepository.class);
 
     dbComponentsRefCache = new DbComponentsRefCache();
-    step = new PersistEventsStep(dbClient, system2, dbComponentsRefCache);
+    step = new PersistEventsStep(dbClient, system2, dbComponentsRefCache, reportReader);
   }
 
   @Override
index 10f1c69d33022942aa2775df1178abd6a5932b03..3e07b59a06280300956d761716a46a0316b1bf65 100644 (file)
@@ -99,7 +99,7 @@ public class PersistFileSourcesStepTest extends BaseStepTest {
     system2 = mock(System2.class);
     when(system2.now()).thenReturn(now);
     dbComponentsRefCache = new DbComponentsRefCache();
-    sut = new PersistFileSourcesStep(dbClient, system2, dbComponentsRefCache);
+    sut = new PersistFileSourcesStep(dbClient, system2, dbComponentsRefCache, reportReader);
   }
 
   @Override
index 661733feef694c618c2f08afb5675a5c91edc261..49429676dcc1d8a3e20dfdae0448e359c4533a8b 100644 (file)
@@ -110,7 +110,7 @@ public class PersistMeasuresStepTest extends BaseStepTest {
     metricCache = new MetricCache(dbClient);
     session.commit();
 
-    sut = new PersistMeasuresStep(dbClient, ruleCache, metricCache, dbComponentsRefCache);
+    sut = new PersistMeasuresStep(dbClient, ruleCache, metricCache, dbComponentsRefCache, reportReader);
   }
 
   @After
index 2cb1937fe29a89293185f44a450a49f240f23ab7..16a16f913a423c8e393d5ab5066baeca54c7a98f 100644 (file)
@@ -75,7 +75,7 @@ public class PersistNumberOfDaysSinceLastCommitStepTest extends BaseStepTest {
     when(metricCache.get(anyString())).thenReturn(new MetricDto().setId(10));
     dbComponentsRefCache = new DbComponentsRefCache();
 
-    sut = new PersistNumberOfDaysSinceLastCommitStep(System2.INSTANCE, dbClient, sourceLineIndex, metricCache, dbComponentsRefCache);
+    sut = new PersistNumberOfDaysSinceLastCommitStep(System2.INSTANCE, dbClient, sourceLineIndex, metricCache, dbComponentsRefCache, reportReader);
   }
 
   @Override
index 46a5c95cfd9ee94e0458548940c843b016d4cfb8..d273b04c6863b59d953e31e6e5d65cd429139e46 100644 (file)
@@ -88,7 +88,7 @@ public class PersistProjectLinksStepTest extends BaseStepTest {
     when(i18n.message(Locale.ENGLISH, "project_links.issue", null)).thenReturn("Issues");
 
     dbComponentsRefCache = new DbComponentsRefCache();
-    step = new PersistProjectLinksStep(dbClient, i18n, dbComponentsRefCache);
+    step = new PersistProjectLinksStep(dbClient, i18n, dbComponentsRefCache, reportReader);
   }
 
   @Override
@@ -110,26 +110,26 @@ public class PersistProjectLinksStepTest extends BaseStepTest {
 
     // project and 1 module
     reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .setProjectKey(PROJECT_KEY)
-      .setAnalysisDate(150000000L)
-      .build());
+        .setRootComponentRef(1)
+        .setProjectKey(PROJECT_KEY)
+        .setAnalysisDate(150000000L)
+        .build());
 
     reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .addChildRef(2)
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.SCM).setHref("https://github.com/SonarSource/sonar").build())
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.SCM_DEV).setHref("scm:git:git@github.com:SonarSource/sonar.git/sonar").build())
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.ISSUE).setHref("http://jira.sonarsource.com/").build())
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.CI).setHref("http://bamboo.ci.codehaus.org/browse/SONAR").build())
-      .build());
+        .setRef(1)
+        .setType(Constants.ComponentType.PROJECT)
+        .addChildRef(2)
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.SCM).setHref("https://github.com/SonarSource/sonar").build())
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.SCM_DEV).setHref("scm:git:git@github.com:SonarSource/sonar.git/sonar").build())
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.ISSUE).setHref("http://jira.sonarsource.com/").build())
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.CI).setHref("http://bamboo.ci.codehaus.org/browse/SONAR").build())
+        .build());
     reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.SCM).setHref("https://github.com/SonarSource/sonar/server").build())
-      .build());
+        .setRef(2)
+        .setType(Constants.ComponentType.MODULE)
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.SCM).setHref("https://github.com/SonarSource/sonar/server").build())
+        .build());
 
     step.execute(new ComputationContext(reportReader, PROJECT_KEY, projectSettings, dbClient, ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), languageRepository));
 
@@ -143,15 +143,15 @@ public class PersistProjectLinksStepTest extends BaseStepTest {
     dbComponentsRefCache.addComponent(1, new DbComponentsRefCache.DbComponent(1L, PROJECT_KEY, "ABCD"));
 
     reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .setProjectKey(PROJECT_KEY)
-      .build());
+        .setRootComponentRef(1)
+        .setProjectKey(PROJECT_KEY)
+        .build());
 
     reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
-      .build());
+        .setRef(1)
+        .setType(Constants.ComponentType.PROJECT)
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
+        .build());
 
     step.execute(new ComputationContext(reportReader, PROJECT_KEY, projectSettings, dbClient, ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), languageRepository));
 
@@ -165,15 +165,15 @@ public class PersistProjectLinksStepTest extends BaseStepTest {
     dbComponentsRefCache.addComponent(1, new DbComponentsRefCache.DbComponent(1L, PROJECT_KEY, "ABCD"));
 
     reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .setProjectKey(PROJECT_KEY)
-      .build());
+        .setRootComponentRef(1)
+        .setProjectKey(PROJECT_KEY)
+        .build());
 
     reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.FILE)
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
-      .build());
+        .setRef(1)
+        .setType(Constants.ComponentType.FILE)
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
+        .build());
 
     step.execute(new ComputationContext(reportReader, PROJECT_KEY, projectSettings, dbClient, ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), languageRepository));
 
@@ -187,15 +187,15 @@ public class PersistProjectLinksStepTest extends BaseStepTest {
     dbComponentsRefCache.addComponent(1, new DbComponentsRefCache.DbComponent(1L, PROJECT_KEY, "ABCD"));
 
     reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .setProjectKey(PROJECT_KEY)
-      .build());
+        .setRootComponentRef(1)
+        .setProjectKey(PROJECT_KEY)
+        .build());
 
     reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
-      .build());
+        .setRef(1)
+        .setType(Constants.ComponentType.PROJECT)
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
+        .build());
 
     step.execute(new ComputationContext(reportReader, PROJECT_KEY, projectSettings, dbClient, ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), languageRepository));
 
@@ -209,14 +209,14 @@ public class PersistProjectLinksStepTest extends BaseStepTest {
     dbComponentsRefCache.addComponent(1, new DbComponentsRefCache.DbComponent(1L, PROJECT_KEY, "ABCD"));
 
     reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .setProjectKey(PROJECT_KEY)
-      .build());
+        .setRootComponentRef(1)
+        .setProjectKey(PROJECT_KEY)
+        .build());
 
     reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .build());
+        .setRef(1)
+        .setType(Constants.ComponentType.PROJECT)
+        .build());
 
     step.execute(new ComputationContext(reportReader, PROJECT_KEY, projectSettings, dbClient, ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), languageRepository));
 
@@ -230,14 +230,14 @@ public class PersistProjectLinksStepTest extends BaseStepTest {
     dbComponentsRefCache.addComponent(1, new DbComponentsRefCache.DbComponent(1L, PROJECT_KEY, "ABCD"));
 
     reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .setProjectKey(PROJECT_KEY)
-      .build());
+        .setRootComponentRef(1)
+        .setProjectKey(PROJECT_KEY)
+        .build());
 
     reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .build());
+        .setRef(1)
+        .setType(Constants.ComponentType.PROJECT)
+        .build());
 
     step.execute(new ComputationContext(reportReader, PROJECT_KEY, projectSettings, dbClient, ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), languageRepository));
 
@@ -251,16 +251,16 @@ public class PersistProjectLinksStepTest extends BaseStepTest {
     dbComponentsRefCache.addComponent(1, new DbComponentsRefCache.DbComponent(1L, PROJECT_KEY, "ABCD"));
 
     reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .setProjectKey(PROJECT_KEY)
-      .build());
+        .setRootComponentRef(1)
+        .setProjectKey(PROJECT_KEY)
+        .build());
 
     reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
-      .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
-      .build());
+        .setRef(1)
+        .setType(Constants.ComponentType.PROJECT)
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
+        .addLink(BatchReport.ComponentLink.newBuilder().setType(Constants.ComponentLinkType.HOME).setHref("http://www.sonarqube.org").build())
+        .build());
 
     try {
       step.execute(new ComputationContext(reportReader, PROJECT_KEY, projectSettings, dbClient, ComponentTreeBuilders.from(DumbComponent.DUMB_PROJECT), languageRepository));
index 471c7623c365e08d4e5f55c7bdd2e8e7a1d90ad1..259d740444d66b7e37a2ab1a4a2d802d6d6ac938 100644 (file)
@@ -104,7 +104,7 @@ public class PersistTestsStepTest extends BaseStepTest {
     when(system2.now()).thenReturn(now);
 
     dbComponentsRefCache = new DbComponentsRefCache();
-    sut = new PersistTestsStep(dbClient, system2, dbComponentsRefCache);
+    sut = new PersistTestsStep(dbClient, system2, dbComponentsRefCache, reportReader);
 
     initBasicReport();
 
@@ -227,8 +227,8 @@ public class PersistTestsStepTest extends BaseStepTest {
   public void aggregate_coverage_details() {
     reportReader.putTests(TEST_FILE_REF_1, Arrays.asList(newTest(1)));
     reportReader.putCoverageDetails(TEST_FILE_REF_1, Arrays.asList(
-      newCoverageDetailWithLines(1, MAIN_FILE_REF_1, 1, 3),
-      newCoverageDetailWithLines(1, MAIN_FILE_REF_1, 2, 4)));
+        newCoverageDetailWithLines(1, MAIN_FILE_REF_1, 1, 3),
+        newCoverageDetailWithLines(1, MAIN_FILE_REF_1, 2, 4)));
 
     sut.execute(new ComputationContext(reportReader, PROJECT_KEY, projectSettings, dbClient, ComponentTreeBuilders.from(root), languageRepository));
 
index 385d00354bedb78c28882be17a4050ded185a079..c279f784df637bd565e692c4ae966d0d44827765 100644 (file)
@@ -74,7 +74,7 @@ public class PopulateComponentsUuidAndKeyStepTest extends BaseStepTest {
     dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new ComponentDao());
 
     projectSettings = new Settings();
-    sut = new PopulateComponentsUuidAndKeyStep(dbClient);
+    sut = new PopulateComponentsUuidAndKeyStep(dbClient, reportReader);
   }
 
   @After
index a6ffa61757b8a4edfa20002c2ee81ee83584b78e..8e2c17c2d9c3dc3804b4da516291e3f8a14798e7 100644 (file)
@@ -76,7 +76,7 @@ public class SendIssueNotificationsStepTest extends BaseStepTest {
   public void setUp() throws Exception {
     issueCache = new IssueCache(temp.newFile(), System2.INSTANCE);
     dbComponentsRefCache = new DbComponentsRefCache();
-    sut = new SendIssueNotificationsStep(issueCache, ruleCache, dbComponentsRefCache, notifService, newIssuesNotificationFactory);
+    sut = new SendIssueNotificationsStep(issueCache, ruleCache, dbComponentsRefCache, notifService, reportReader, newIssuesNotificationFactory);
 
     dbComponentsRefCache.addComponent(1, new DbComponentsRefCache.DbComponent(1L, PROJECT_KEY, PROJECT_UUID));
 
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/ComputationServiceTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/ComputationServiceTest/shared.xml
deleted file mode 100644 (file)
index 885f3d2..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<dataset>
-  <projects id="10" kee="P1" qualifier="TRK" uuid="ABCD" name="Project 1"/>
-  <snapshots
-      id="110" project_id="10" parent_snapshot_id="[null]" root_project_id="10" root_snapshot_id="[null]"
-      purge_status="[null]" period1_mode="[null]" period1_param="[null]" period1_date="[null]"
-      period2_mode="[null]" period2_param="[null]" period2_date="[null]" period3_mode="[null]"
-      period3_param="[null]" period3_date="[null]" period4_mode="[null]" period4_param="[null]"
-      period4_date="[null]" period5_mode="[null]" period5_param="[null]" period5_date="[null]"
-      scope="PRJ" qualifier="TRK" created_at="1225544280000" build_date="1225544280000" version="[null]" path=""
-      status="P" islast="false" depth="0"/>
-</dataset>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/activity/CEActivityManagerTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/activity/CEActivityManagerTest/shared.xml
new file mode 100644 (file)
index 0000000..2ac38c2
--- /dev/null
@@ -0,0 +1,11 @@
+<dataset>
+  <projects id="10" kee="P1" qualifier="TRK" uuid="ABCD" name="Project 1"/>
+  <snapshots
+      id="110" project_id="10" parent_snapshot_id="[null]" root_project_id="10" root_snapshot_id="[null]"
+      purge_status="[null]" period1_mode="[null]" period1_param="[null]" period1_date="[null]"
+      period2_mode="[null]" period2_param="[null]" period2_date="[null]" period3_mode="[null]"
+      period3_param="[null]" period3_date="[null]" period4_mode="[null]" period4_param="[null]"
+      period4_date="[null]" period5_mode="[null]" period5_param="[null]" period5_date="[null]"
+      scope="PRJ" qualifier="TRK" created_at="1225544280000" build_date="1225544280000" version="[null]" path=""
+      status="P" islast="[false]" depth="0"/>
+</dataset>
index 3f06b041ec1f5b1aa12d0b1e3ec53f269fcffbcf..e0bafcf8e9c179eeb94a173d83702f3d7fbe1ae7 100644 (file)
  */
 package org.sonar.core.platform;
 
+import com.google.common.collect.Iterables;
 import java.util.Collection;
 import java.util.List;
-
 import javax.annotation.Nullable;
-
 import org.picocontainer.Characteristics;
 import org.picocontainer.ComponentAdapter;
 import org.picocontainer.DefaultPicoContainer;
@@ -32,13 +31,11 @@ import org.picocontainer.behaviors.OptInCaching;
 import org.picocontainer.lifecycle.ReflectionLifecycleStrategy;
 import org.picocontainer.monitors.NullComponentMonitor;
 import org.sonar.api.batch.BatchSide;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.config.PropertyDefinitions;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.utils.log.Loggers;
 import org.sonar.api.utils.log.Profiler;
 
-import com.google.common.collect.Iterables;
-
 @BatchSide
 @ServerSide
 public class ComponentContainer {
@@ -66,8 +63,15 @@ public class ComponentContainer {
    * Create child container
    */
   protected ComponentContainer(ComponentContainer parent) {
+    this(parent.pico.makeChildContainer(), parent);
+  }
+
+  /**
+   * Create child container
+   */
+  protected ComponentContainer(MutablePicoContainer picoContainer, ComponentContainer parent) {
     this.parent = parent;
-    this.pico = parent.pico.makeChildContainer();
+    this.pico = picoContainer;
     this.parent.child = this;
     this.propertyDefinitions = parent.propertyDefinitions;
     this.componentKeys = new ComponentKeys();