]> source.dussan.org Git - sonarqube.git/commitdiff
Separate project and analysis report concerns
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Thu, 30 Oct 2014 18:00:52 +0000 (19:00 +0100)
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>
Thu, 30 Oct 2014 18:00:52 +0000 (19:00 +0100)
27 files changed:
server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportLog.java
server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java
server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTask.java
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/ComputationStepRegistry.java
server/sonar-server/src/main/java/org/sonar/server/computation/DataCleanerStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/GetAndSetProjectStep.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/computation/IndexProjectIssuesStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/SwitchSnapshotStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActiveAnalysisReportsAction.java
server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportLogMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTaskTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/ComputationStepRegistryTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/DataCleanerStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/GetAndSetProjectStepTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/computation/IndexProjectIssuesStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/SwitchSnapshotStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/SynchronizeProjectPermissionsStepMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java
server/sonar-server/src/test/resources/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest/list_history_reports.json
sonar-core/src/main/java/org/sonar/core/component/ComponentDto.java
sonar-core/src/main/java/org/sonar/core/computation/db/AnalysisReportDto.java

index 0bc51ca440409d3bd2d3342eeaa453fbc2411158..30e3794ca7b80bd94500bfe3031a55a900e1bda1 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.server.computation;
 import com.google.common.collect.ImmutableMap;
 import org.sonar.api.utils.DateUtils;
 import org.sonar.core.activity.ActivityLog;
+import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 
 import java.util.Map;
@@ -32,18 +33,20 @@ public class AnalysisReportLog implements ActivityLog {
   private static final String ACTION = "LOG_ANALYSIS_REPORT";
 
   private final AnalysisReportDto report;
+  private final ComponentDto project;
 
-  public AnalysisReportLog(AnalysisReportDto report) {
+  public AnalysisReportLog(AnalysisReportDto report, ComponentDto project) {
     this.report = report;
+    this.project = project;
   }
 
   @Override
   public Map<String, String> getDetails() {
     return ImmutableMap.<String, String>builder()
       .put("id", String.valueOf(report.getId()))
-      .put("projectKey", report.getProjectKey())
-      .put("projectName", report.getProjectName())
-      .put("projectUuid", report.getProjectUuid())
+      .put("projectKey", project.key())
+      .put("projectName", project.name())
+      .put("projectUuid", project.uuid())
       .put("status", String.valueOf(report.getStatus()))
       .put("submittedAt", DateUtils.formatDateTimeNullSafe(report.getCreatedAt()))
       .put("startedAt", DateUtils.formatDateTimeNullSafe(report.getStartedAt()))
index 77593ec52f98b32d703645d0b3cb24e321392869..1193982672e4e78138ee041e786b86ecfbb343c3 100644 (file)
@@ -22,12 +22,10 @@ package org.sonar.server.computation;
 
 import org.sonar.api.ServerComponent;
 import org.sonar.api.utils.System2;
-import org.sonar.core.activity.Activity;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.permission.GlobalPermissions;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
-import org.sonar.server.activity.ActivityService;
 import org.sonar.server.computation.db.AnalysisReportDao;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.user.UserSession;
@@ -43,12 +41,10 @@ import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING;
 public class AnalysisReportQueue implements ServerComponent {
   private final DbClient dbClient;
   private final AnalysisReportDao dao;
-  private final ActivityService activityService;
   private final System2 system2;
 
-  public AnalysisReportQueue(DbClient dbClient, ActivityService activityService, System2 system2) {
+  public AnalysisReportQueue(DbClient dbClient, System2 system2) {
     this.dbClient = dbClient;
-    this.activityService = activityService;
     this.dao = dbClient.analysisReportDao();
     this.system2 = system2;
   }
@@ -91,17 +87,12 @@ public class AnalysisReportQueue implements ServerComponent {
     try {
       report.setFinishedAt(new Date(system2.now()));
       dao.delete(session, report);
-      logActivity(report, session);
       session.commit();
     } finally {
       MyBatis.closeQuietly(session);
     }
   }
 
-  private void logActivity(AnalysisReportDto report, DbSession session) {
-    activityService.write(session, Activity.Type.ANALYSIS_REPORT, new AnalysisReportLog(report));
-  }
-
   /**
    * @return a booked analysis report if one is available, null otherwise
    */
index 1399b94468fe78f945977d8a7140d769ae8852dc..8b74f57af7b12892699587ced2189c50a427724b 100644 (file)
@@ -41,17 +41,15 @@ public class AnalysisReportTask implements Runnable {
     if (report != null) {
       try {
         service.analyzeReport(report);
-        report.succeed();
       } catch (Exception exception) {
         LOG.error(String.format("Analysis of report %s failed", report), exception);
-        report.fail();
       } finally {
-        removeFromQueue(report);
+        removeSilentlyFromQueue(report);
       }
     }
   }
 
-  private void removeFromQueue(AnalysisReportDto report) {
+  private void removeSilentlyFromQueue(AnalysisReportDto report) {
     try {
       queue.remove(report);
     } catch (Exception exception) {
index e620106eaa4fd3a2e1517cd045b9bef945eb09bf..9069f9d63f2ca2c1835faee5729b40d31a52a5db 100644 (file)
 
 package org.sonar.server.computation;
 
+import com.google.common.base.Throwables;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonar.api.ServerComponent;
+import org.sonar.api.utils.System2;
+import org.sonar.core.activity.Activity;
+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.ActivityService;
 import org.sonar.server.db.DbClient;
 
+import java.util.Date;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * since 5.0
  */
@@ -36,28 +45,48 @@ public class ComputationService implements ServerComponent {
 
   private final DbClient dbClient;
   private final ComputationStepRegistry stepRegistry;
+  private final ActivityService activityService;
 
-  public ComputationService(DbClient dbClient, ComputationStepRegistry stepRegistry) {
+  public ComputationService(DbClient dbClient, ComputationStepRegistry stepRegistry, ActivityService activityService) {
     this.dbClient = dbClient;
     this.stepRegistry = stepRegistry;
+    this.activityService = activityService;
   }
 
   public void analyzeReport(AnalysisReportDto report) {
     LOG.info(String.format("#%s - %s - Analysis report processing started", report.getId(), report.getProjectKey()));
 
-    // Synchronization of lot of data can only be done with a batch session for the moment
+    // Synchronization of lot of data can only be done with a batch session for the moment
     DbSession session = dbClient.openSession(true);
 
+    ComponentDto project = findProject(report, session);
+
     try {
+      report.succeed();
       for (ComputationStep step : stepRegistry.steps()) {
         LOG.info(String.format("%s step started", step.description()));
-        step.execute(session, report);
+        step.execute(session, report, project);
         session.commit();
         LOG.info(String.format("%s step finished", step.description()));
       }
+
+    } catch (Exception exception) {
+      report.fail();
+      Throwables.propagate(exception);
     } finally {
+      logActivity(session, report, project);
+      session.commit();
       MyBatis.closeQuietly(session);
       LOG.info(String.format("#%s - %s - Analysis report processing finished", report.getId(), report.getProjectKey()));
     }
   }
+
+  private ComponentDto findProject(AnalysisReportDto report, DbSession session) {
+    return checkNotNull(dbClient.componentDao().getByKey(session, report.getProjectKey()));
+  }
+
+  private void logActivity(DbSession session, AnalysisReportDto report, ComponentDto project) {
+    report.setFinishedAt(new Date(System2.INSTANCE.now()));
+    activityService.write(session, Activity.Type.ANALYSIS_REPORT, new AnalysisReportLog(report, project));
+  }
 }
index 8cfb03e372d7de025336933e5fb8ef7c8a85b08f..a451f09da94c18764358fe01cff779d31eefcac8 100644 (file)
 package org.sonar.server.computation;
 
 import org.sonar.api.ServerComponent;
+import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.persistence.DbSession;
 
 public interface ComputationStep extends ServerComponent {
 
-  void execute(DbSession session, AnalysisReportDto analysisReportDto);
+  void execute(DbSession session, AnalysisReportDto analysisReportDto, ComponentDto project);
 
   String description();
 }
index 00548e7eb4269a491fc7e1ee9a6bf21c7245c6df..e4a2d573bc4d97d92a3922e18b3854a89099e81e 100644 (file)
@@ -30,12 +30,11 @@ public class ComputationStepRegistry implements ServerComponent {
   private final List<ComputationStep> steps;
 
   public ComputationStepRegistry(
-    GetAndSetProjectStep getAndSetProjectStep,
     SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep,
     IndexProjectIssuesStep indexProjectIssuesStep,
     SwitchSnapshotStep switchSnapshotStep,
     DataCleanerStep dataCleanerStep) {
-    steps = ImmutableList.of(getAndSetProjectStep, synchronizeProjectPermissionsStep, switchSnapshotStep, dataCleanerStep, indexProjectIssuesStep);
+    steps = ImmutableList.of(synchronizeProjectPermissionsStep, switchSnapshotStep, dataCleanerStep, indexProjectIssuesStep);
   }
 
   public List<ComputationStep> steps() {
index 7d87bbef0acc589fbf457ca4e51983d65499c932..fcd0de2e2b49896e32ead6d58ef0a5da6349e065 100644 (file)
@@ -21,6 +21,7 @@
 package org.sonar.server.computation;
 
 import org.sonar.api.config.Settings;
+import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.computation.dbcleaner.DefaultPurgeTask;
 import org.sonar.core.persistence.DbSession;
@@ -41,13 +42,13 @@ public class DataCleanerStep implements ComputationStep {
   }
 
   @Override
-  public void execute(DbSession session, AnalysisReportDto report) {
-    Long projectId = report.getProject().getId();
+  public void execute(DbSession session, AnalysisReportDto report, ComponentDto project) {
+    Long projectId = project.getId();
     purgeTask.purge(projectId);
-    issueIndex.deleteClosedIssuesOfProjectBefore(report.getProjectUuid(), deleteIssuesBeforeThisDate(projectId));
+    issueIndex.deleteClosedIssuesOfProjectBefore(project.uuid(), dateBeforeWhichDeleteClosedIssues(projectId));
   }
 
-  private Date deleteIssuesBeforeThisDate(Long resourceId) {
+  private Date dateBeforeWhichDeleteClosedIssues(Long resourceId) {
     return PurgeConfiguration.newDefaultPurgeConfiguration(resourceId, settings).maxLiveDateOfClosedIssues();
   }
 
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/GetAndSetProjectStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/GetAndSetProjectStep.java
deleted file mode 100644 (file)
index 4277cb2..0000000
+++ /dev/null
@@ -1,46 +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;
-
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.computation.db.AnalysisReportDto;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.server.db.DbClient;
-
-public class GetAndSetProjectStep implements ComputationStep {
-
-  private final DbClient dbClient;
-
-  public GetAndSetProjectStep(DbClient dbClient) {
-    this.dbClient = dbClient;
-  }
-
-  @Override
-  public void execute(DbSession session, AnalysisReportDto report) {
-    ComponentDto project = dbClient.componentDao().getByKey(session, report.getProjectKey());
-    report.setProject(project);
-  }
-
-  @Override
-  public String description() {
-    return "Retrieve project based on identifier";
-  }
-}
index 51bb0f364f32945f408677fc7cf2f37796f99ee1..d84cff541ac42bd9a03bfba5fb0f5908145e3e03 100644 (file)
@@ -21,6 +21,7 @@
 package org.sonar.server.computation;
 
 import com.google.common.collect.ImmutableMap;
+import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.server.db.DbClient;
@@ -28,6 +29,8 @@ import org.sonar.server.issue.index.IssueIndex;
 import org.sonar.server.issue.index.IssueNormalizer;
 import org.sonar.server.search.IndexClient;
 
+import java.util.Date;
+
 public class IndexProjectIssuesStep implements ComputationStep {
 
   private final DbClient dbClient;
@@ -39,8 +42,8 @@ public class IndexProjectIssuesStep implements ComputationStep {
   }
 
   @Override
-  public void execute(DbSession session, AnalysisReportDto report) {
-    indexProjectIssues(session, report);
+  public void execute(DbSession session, AnalysisReportDto report, ComponentDto project) {
+    indexProjectIssues(session, project);
   }
 
   @Override
@@ -48,10 +51,18 @@ public class IndexProjectIssuesStep implements ComputationStep {
     return "Update issues index";
   }
 
-  private void indexProjectIssues(DbSession session, AnalysisReportDto report) {
+  private void indexProjectIssues(DbSession session, ComponentDto project) {
     dbClient.issueDao().synchronizeAfter(session,
-      index.get(IssueIndex.class).getLastSynchronization(ImmutableMap.of(IssueNormalizer.IssueField.PROJECT.field(), report.getProject().uuid())),
-      ImmutableMap.of(IssueNormalizer.IssueField.PROJECT.field(), report.getProject().uuid()));
+      getLastIndexSynchronizationDate(project),
+      parameters(project));
     session.commit();
   }
+
+  private ImmutableMap<String, String> parameters(ComponentDto project) {
+    return ImmutableMap.of(IssueNormalizer.IssueField.PROJECT.field(), project.uuid());
+  }
+
+  private Date getLastIndexSynchronizationDate(ComponentDto project) {
+    return index.get(IssueIndex.class).getLastSynchronization(parameters(project));
+  }
 }
index a078a77ee0b9b44e5221468288df8c4caa3b4367..1fe6f0a29b9404a53264dbdbe7bdb3cf7c1ee487 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.sonar.server.computation;
 
+import org.sonar.core.component.ComponentDto;
 import org.sonar.core.component.SnapshotDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.persistence.DbSession;
@@ -36,7 +37,7 @@ public class SwitchSnapshotStep implements ComputationStep {
   }
 
   @Override
-  public void execute(DbSession session, AnalysisReportDto report) {
+  public void execute(DbSession session, AnalysisReportDto report, ComponentDto project) {
     disablePreviousSnapshot(session, report);
     enableCurrentSnapshot(session, report);
   }
index a529ccf59f036da0212a424e4b064ba14b88b262..7d388dd8e085351bb57ffea20af11e0dadb93ada 100644 (file)
@@ -21,6 +21,7 @@
 package org.sonar.server.computation;
 
 import com.google.common.collect.ImmutableMap;
+import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.server.db.DbClient;
@@ -41,8 +42,8 @@ public class SynchronizeProjectPermissionsStep implements ComputationStep {
   }
 
   @Override
-  public void execute(DbSession session, AnalysisReportDto report) {
-    synchronizeProjectPermissionsIfNotFound(session, report);
+  public void execute(DbSession session, AnalysisReportDto report, ComponentDto project) {
+    synchronizeProjectPermissionsIfNotFound(session, report, project);
   }
 
   @Override
@@ -50,8 +51,8 @@ public class SynchronizeProjectPermissionsStep implements ComputationStep {
     return "Synchronize project permissions";
   }
 
-  private void synchronizeProjectPermissionsIfNotFound(DbSession session, AnalysisReportDto report) {
-    String projectUuid = report.getProject().uuid();
+  private void synchronizeProjectPermissionsIfNotFound(DbSession session, AnalysisReportDto report, ComponentDto project) {
+    String projectUuid = project.uuid();
     if (index.get(IssueAuthorizationIndex.class).getNullableByKey(projectUuid) == null) {
       Map<String, String> params = ImmutableMap.of(IssueAuthorizationNormalizer.IssueAuthorizationField.PROJECT.field(), projectUuid);
       dbClient.issueAuthorizationDao().synchronizeAfter(session, null, params);
index 3c559b9c3ab959e1fc4080f1615dd7b31ee79f77..7c1c4e9bc98562c94ed95c5d515b9502bf407e5b 100644 (file)
@@ -57,7 +57,8 @@ public class ActiveAnalysisReportsAction implements RequestHandler {
       json.beginObject();
       json.prop("id", report.getId());
       json.prop("project", report.getProjectKey());
-      json.prop("projectName", report.getProjectName());
+      // TODO give the project name !
+      json.prop("projectName", report.getProjectKey());
       json.propDateTime("startedAt", report.getStartedAt());
       json.propDateTime("finishedAt", report.getFinishedAt());
       json.propDateTime("submittedAt", report.getCreatedAt());
index e80acf843004a942133246093f0778ceb436681e..52de0619f018948e0ce58d4d6708417a53903263 100644 (file)
@@ -590,7 +590,6 @@ class ServerComponents {
     // Compute engine
     pico.addSingleton(ComputationService.class);
     pico.addSingleton(ComputationStepRegistry.class);
-    pico.addSingleton(GetAndSetProjectStep.class);
     pico.addSingleton(SynchronizeProjectPermissionsStep.class);
     pico.addSingleton(IndexProjectIssuesStep.class);
     pico.addSingleton(SwitchSnapshotStep.class);
index e8863d54143470a0e4416c75e67e6163206e9855..cf9876282d2a3e6cf67d253dfb7aefe904c80d82 100644 (file)
@@ -27,6 +27,7 @@ import org.junit.ClassRule;
 import org.junit.Test;
 import org.sonar.api.utils.DateUtils;
 import org.sonar.core.activity.Activity;
+import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.server.activity.ActivityService;
@@ -70,10 +71,10 @@ public class AnalysisReportLogMediumTest {
       .setCreatedAt(DateUtils.parseDate("2014-10-15"))
       .setUpdatedAt(DateUtils.parseDate("2014-10-16"))
       .setStartedAt(DateUtils.parseDate("2014-10-17"))
-      .setFinishedAt(DateUtils.parseDate("2014-10-18"))
-      .setProject(ComponentTesting.newProjectDto());
+      .setFinishedAt(DateUtils.parseDate("2014-10-18"));
+    ComponentDto project = ComponentTesting.newProjectDto();
 
-    service.write(dbSession, ANALYSIS_REPORT, new AnalysisReportLog(report));
+    service.write(dbSession, ANALYSIS_REPORT, new AnalysisReportLog(report, project));
     dbSession.commit();
 
     // 0. AssertBase case
@@ -83,9 +84,9 @@ public class AnalysisReportLogMediumTest {
     assertThat(activity).isNotNull();
     Map<String, String> details = activity.details();
     assertThat(details.get("id")).isEqualTo(String.valueOf(report.getId()));
-    assertThat(details.get("projectKey")).isEqualTo(report.getProjectKey());
-    assertThat(details.get("projectName")).isEqualTo(report.getProjectName());
-    assertThat(details.get("projectUuid")).isEqualTo(report.getProjectUuid());
+    assertThat(details.get("projectKey")).isEqualTo(project.key());
+    assertThat(details.get("projectName")).isEqualTo(project.name());
+    assertThat(details.get("projectUuid")).isEqualTo(project.uuid());
     assertThat(details.get("status")).isEqualTo("FAILED");
     assertThat(details.get("submittedAt")).isEqualTo("2014-10-15T00:00:00+0200");
     assertThat(details.get("startedAt")).isEqualTo("2014-10-17T00:00:00+0200");
index 2e12107a20b579b3f12851294f3548c4df65043d..c3926a41227a474fa02f4e9b6c5652acb394f5de 100644 (file)
@@ -26,7 +26,6 @@ import org.junit.ClassRule;
 import org.junit.Test;
 import org.sonar.api.security.DefaultGroups;
 import org.sonar.api.web.UserRole;
-import org.sonar.core.activity.Activity;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.permission.GlobalPermissions;
@@ -34,15 +33,12 @@ import org.sonar.core.permission.PermissionFacade;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.user.UserDto;
-import org.sonar.server.activity.index.ActivityIndex;
-import org.sonar.server.component.ComponentTesting;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.tester.ServerTester;
 import org.sonar.server.user.MockUserSession;
 
 import java.util.List;
-import java.util.Map;
 
 import static org.fest.assertions.Assertions.assertThat;
 import static org.sonar.core.computation.db.AnalysisReportDto.Status.SUCCESS;
@@ -152,20 +148,15 @@ public class AnalysisReportQueueMediumTest {
   }
 
   @Test
-  public void remove_remove_from_queue_and_log_a_new_activity() {
+  public void remove_remove_from_queue() {
     insertPermissionsForProject(DEFAULT_PROJECT_KEY);
     sut.add(DEFAULT_PROJECT_KEY, 123L);
     AnalysisReportDto report = sut.bookNextAvailable();
-    report.setProject(ComponentTesting.newProjectDto());
     report.setStatus(SUCCESS);
 
     sut.remove(report);
 
     assertThat(sut.all()).isEmpty();
-    List<Activity> activities = tester.get(ActivityIndex.class).findAll().getHits();
-    Map<String, String> details = activities.get(0).details();
-    assertThat(activities).hasSize(1);
-    assertThat(details.get("finishedAt")).isNotEmpty();
   }
 
   @Test(expected = ForbiddenException.class)
index 52c5457fa21c6b1c3f06525053a9c25a5fecb60a..ccbec7100666ec26f2fcbf5ce5fa7e047548e8b3 100644 (file)
@@ -24,11 +24,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.sonar.core.computation.db.AnalysisReportDto;
 
-import static org.fest.assertions.Assertions.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.*;
-import static org.sonar.core.computation.db.AnalysisReportDto.Status.FAILED;
-import static org.sonar.core.computation.db.AnalysisReportDto.Status.SUCCESS;
 
 public class AnalysisReportTaskTest {
 
@@ -58,19 +55,7 @@ public class AnalysisReportTaskTest {
 
     sut.run();
 
-    assertThat(report.getStatus()).isEqualTo(SUCCESS);
     verify(queue).bookNextAvailable();
     verify(service).analyzeReport(report);
   }
-
-  @Test
-  public void report_failed_if_analyze_report_throws_an_exception() {
-    AnalysisReportDto report = AnalysisReportDto.newForTests(1L);
-    when(queue.bookNextAvailable()).thenReturn(report);
-    doThrow(Exception.class).when(service).analyzeReport(report);
-
-    sut.run();
-
-    assertThat(report.getStatus()).isEqualTo(FAILED);
-  }
 }
index 991f2a240e47946e0783de4590118934d2b08dad..304b6dff320ec9f5e2a553cf207cb3d35954cea1 100644 (file)
@@ -24,8 +24,12 @@ import com.google.common.collect.Lists;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.InOrder;
+import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.persistence.DbSession;
+import org.sonar.server.activity.ActivityService;
+import org.sonar.server.component.ComponentTesting;
+import org.sonar.server.component.db.ComponentDao;
 import org.sonar.server.db.DbClient;
 
 import static org.mockito.Matchers.any;
@@ -37,14 +41,19 @@ public class ComputationServiceTest {
 
   private DbClient dbClient;
   private ComputationStepRegistry stepRegistry;
+  private ActivityService activityService;
 
   @Before
   public void before() {
     this.stepRegistry = mock(ComputationStepRegistry.class);
+    this.activityService = mock(ActivityService.class);
     this.dbClient = mock(DbClient.class);
     when(dbClient.openSession(anyBoolean())).thenReturn(mock(DbSession.class));
+    ComponentDao componentDao = mock(ComponentDao.class);
+    when(dbClient.componentDao()).thenReturn(componentDao);
+    when(componentDao.getByKey(any(DbSession.class), anyString())).thenReturn(ComponentTesting.newProjectDto());
 
-    this.sut = new ComputationService(dbClient, stepRegistry);
+    this.sut = new ComputationService(dbClient, stepRegistry, activityService);
   }
 
   @Test
@@ -59,8 +68,8 @@ public class ComputationServiceTest {
 
     InOrder order = inOrder(firstStep, secondStep, thirdStep);
 
-    order.verify(firstStep).execute(any(DbSession.class), any(AnalysisReportDto.class));
-    order.verify(secondStep).execute(any(DbSession.class), any(AnalysisReportDto.class));
-    order.verify(thirdStep).execute(any(DbSession.class), any(AnalysisReportDto.class));
+    order.verify(firstStep).execute(any(DbSession.class), any(AnalysisReportDto.class), any(ComponentDto.class));
+    order.verify(secondStep).execute(any(DbSession.class), any(AnalysisReportDto.class), any(ComponentDto.class));
+    order.verify(thirdStep).execute(any(DbSession.class), any(AnalysisReportDto.class), any(ComponentDto.class));
   }
 }
index f2cdc8ce10d8530802d96a5205a4d3a0df516d5a..8bf1607c54fae11f7caf337347617c45164ee752 100644 (file)
@@ -29,7 +29,6 @@ import static org.mockito.Mockito.mock;
 public class ComputationStepRegistryTest {
 
   private ComputationStepRegistry sut;
-  private GetAndSetProjectStep getAndSetProjectStep;
   private SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep;
   private IndexProjectIssuesStep indexProjectIssuesStep;
   private SwitchSnapshotStep switchSnapshotStep;
@@ -37,17 +36,16 @@ public class ComputationStepRegistryTest {
 
   @Before
   public void before() {
-    getAndSetProjectStep = mock(GetAndSetProjectStep.class);
     synchronizeProjectPermissionsStep = mock(SynchronizeProjectPermissionsStep.class);
     indexProjectIssuesStep = mock(IndexProjectIssuesStep.class);
     switchSnapshotStep = mock(SwitchSnapshotStep.class);
     dataCleanerStep = mock(DataCleanerStep.class);
 
-    sut = new ComputationStepRegistry(getAndSetProjectStep, synchronizeProjectPermissionsStep, indexProjectIssuesStep, switchSnapshotStep, dataCleanerStep);
+    sut = new ComputationStepRegistry(synchronizeProjectPermissionsStep, indexProjectIssuesStep, switchSnapshotStep, dataCleanerStep);
   }
 
   @Test
   public void steps_returned_in_the_right_order() throws Exception {
-    assertThat(sut.steps()).containsExactly(getAndSetProjectStep, synchronizeProjectPermissionsStep, switchSnapshotStep, dataCleanerStep, indexProjectIssuesStep);
+    assertThat(sut.steps()).containsExactly(synchronizeProjectPermissionsStep, switchSnapshotStep, dataCleanerStep, indexProjectIssuesStep);
   }
 }
index d2f76c270e3633bc4e94fdea8950390e8c76dec3..6e90a48cff87d6e40980d2b8e368637b2c9685c0 100644 (file)
@@ -53,9 +53,9 @@ public class DataCleanerStepTest {
   @Test
   public void call_purge_method_of_the_purge_task() {
     AnalysisReportDto report = mock(AnalysisReportDto.class);
-    when(report.getProject()).thenReturn(mock(ComponentDto.class));
+    ComponentDto project = mock(ComponentDto.class);
 
-    sut.execute(mock(DbSession.class), report);
+    sut.execute(mock(DbSession.class), report, project);
 
     verify(purgeTask).purge(any(Long.class));
     verify(issueIndex).deleteClosedIssuesOfProjectBefore(anyString(), any(Date.class));
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/GetAndSetProjectStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/GetAndSetProjectStepTest.java
deleted file mode 100644 (file)
index 561559d..0000000
+++ /dev/null
@@ -1,67 +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;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.computation.db.AnalysisReportDto;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.server.component.ComponentTesting;
-import org.sonar.server.component.db.ComponentDao;
-import org.sonar.server.db.DbClient;
-
-import static org.fest.assertions.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class GetAndSetProjectStepTest {
-
-  private GetAndSetProjectStep sut;
-  private DbClient dbClient;
-  private ComponentDto project;
-  private DbSession session;
-
-  @Before
-  public void before() {
-    this.dbClient = mock(DbClient.class);
-    this.session = mock(DbSession.class);
-    this.project = ComponentTesting.newProjectDto();
-
-    ComponentDao componentDao = mock(ComponentDao.class);
-    when(dbClient.componentDao()).thenReturn(componentDao);
-    when(componentDao.getByKey(any(DbSession.class), anyString())).thenReturn(project);
-
-    this.sut = new GetAndSetProjectStep(dbClient);
-  }
-
-  @Test
-  public void set_project_return_by_dbclient() {
-    AnalysisReportDto report = new AnalysisReportDto().setProjectKey("123-456-789");
-
-    sut.execute(session, report);
-
-    assertThat(report.getProject()).isEqualTo(project);
-  }
-
-}
index 88b3f432762461d11e30bc72d9a16bfc7400fafd..5fdde8786a14671bcfa4024dc25a43d7acb6db7e 100644 (file)
@@ -118,9 +118,8 @@ public class IndexProjectIssuesStepTest {
 
     queue.add(DEFAULT_PROJECT_KEY, 123L);
     AnalysisReportDto report = queue.bookNextAvailable();
-    report.setProject(project);
 
-    sut.execute(session, report);
+    sut.execute(session, report, project);
 
     // Check that the issue has well be indexed in E/S
     assertThat(tester.get(IssueIndex.class).getNullableByKey(issue.getKey())).isNotNull();
@@ -153,10 +152,9 @@ public class IndexProjectIssuesStepTest {
     queue.add(DEFAULT_PROJECT_KEY, 123L);
     List<AnalysisReportDto> reports = queue.findByProjectKey(DEFAULT_PROJECT_KEY);
     AnalysisReportDto reportDto = reports.get(0);
-    reportDto.setProject(project);
 
     // ACT
-    sut.execute(session, reportDto);
+    sut.execute(session, reportDto, project);
 
     session.commit();
     session.clearCache();
index c07035e79751d88c74483701e4266e72329fff26..19ce4de5f1f32d52f6097ede3409544bf6cf2b79 100644 (file)
@@ -30,6 +30,7 @@ import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.persistence.TestDatabase;
+import org.sonar.server.component.ComponentTesting;
 import org.sonar.server.component.db.SnapshotDao;
 
 import static org.mockito.Mockito.mock;
@@ -60,7 +61,7 @@ public class SwitchSnapshotStepTest {
   public void one_switch_with_a_snapshot_and_his_children() {
     db.prepareDbUnit(getClass(), "snapshots.xml");
 
-    sut.execute(session, AnalysisReportDto.newForTests(1L).setSnapshotId(1L));
+    sut.execute(session, AnalysisReportDto.newForTests(1L).setSnapshotId(1L), ComponentTesting.newProjectDto());
     session.commit();
 
     db.assertDbUnit(getClass(), "snapshots-result.xml", "snapshots");
@@ -70,6 +71,6 @@ public class SwitchSnapshotStepTest {
   public void throw_IllegalStateException_when_not_finding_snapshot() {
     db.prepareDbUnit(getClass(), "empty.xml");
 
-    sut.execute(session, AnalysisReportDto.newForTests(1L).setSnapshotId(1L));
+    sut.execute(session, AnalysisReportDto.newForTests(1L).setSnapshotId(1L), ComponentTesting.newProjectDto());
   }
 }
index cf354cf0e69c4ad41e89538573e073bed8c1a8f9..5e91f0dac4aaa7dbb7b1a7165c9a121c6a4fd781 100644 (file)
@@ -54,10 +54,8 @@ public class SynchronizeProjectPermissionsStepMediumTest {
   private SynchronizeProjectPermissionsStep sut;
 
   private AnalysisReportQueue queue;
-  private GetAndSetProjectStep getAndSetProjectStep;
   private DbClient db;
   private DbSession session;
-  private MockUserSession userSession;
 
   @Before
   public void setUp() throws Exception {
@@ -65,18 +63,15 @@ public class SynchronizeProjectPermissionsStepMediumTest {
     db = tester.get(DbClient.class);
     session = db.openSession(false);
     queue = tester.get(AnalysisReportQueue.class);
-    getAndSetProjectStep = tester.get(GetAndSetProjectStep.class);
-
-    sut = tester.get(SynchronizeProjectPermissionsStep.class);
-
     UserDto connectedUser = new UserDto().setLogin("gandalf").setName("Gandalf");
     db.userDao().insert(session, connectedUser);
-
-    userSession = MockUserSession.set()
+    MockUserSession.set()
       .setLogin(connectedUser.getLogin())
       .setUserId(connectedUser.getId().intValue())
       .setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
 
+    sut = tester.get(SynchronizeProjectPermissionsStep.class);
+
     session.commit();
   }
 
@@ -87,13 +82,12 @@ public class SynchronizeProjectPermissionsStepMediumTest {
 
   @Test
   public void add_project_issue_permission_in_index() throws Exception {
-    ComponentDto project = insertPermissionsForProject(DEFAULT_PROJECT_KEY);
+    ComponentDto project = insertProjectWithPermissions(DEFAULT_PROJECT_KEY);
 
     queue.add(DEFAULT_PROJECT_KEY, 123L);
     List<AnalysisReportDto> reports = queue.findByProjectKey(DEFAULT_PROJECT_KEY);
-    getAndSetProjectStep.execute(session, reports.get(0));
 
-    sut.execute(session, reports.get(0));
+    sut.execute(session, reports.get(0), project);
 
     IssueAuthorizationDoc issueAuthorizationIndex = tester.get(IssueAuthorizationIndex.class).getNullableByKey(project.uuid());
     assertThat(issueAuthorizationIndex).isNotNull();
@@ -102,25 +96,25 @@ public class SynchronizeProjectPermissionsStepMediumTest {
 
   @Test
   public void not_add_project_issue_permission_if_already_existing() throws Exception {
-    ComponentDto project = insertPermissionsForProject(DEFAULT_PROJECT_KEY);
+    ComponentDto project = insertProjectWithPermissions(DEFAULT_PROJECT_KEY);
     // Synchronisation on project is already done
     db.issueAuthorizationDao().synchronizeAfter(session, null, ImmutableMap.of("project", project.uuid()));
 
-    // To check that permission will not be synchronized again, add a new permission on the project in db, this permission should not be in the index
+    // To check that permission will not be synchronized again, add a new permission on the project in db, this permission should not be in
+    // the index
     tester.get(PermissionFacade.class).insertGroupPermission(project.getId(), DefaultGroups.USERS, UserRole.USER, session);
 
     queue.add(DEFAULT_PROJECT_KEY, 123L);
     List<AnalysisReportDto> reports = queue.findByProjectKey(DEFAULT_PROJECT_KEY);
-    getAndSetProjectStep.execute(session, reports.get(0));
 
-    sut.execute(session, reports.get(0));
+    sut.execute(session, reports.get(0), project);
 
     IssueAuthorizationDoc issueAuthorizationIndex = tester.get(IssueAuthorizationIndex.class).getNullableByKey(project.uuid());
     assertThat(issueAuthorizationIndex).isNotNull();
     assertThat(issueAuthorizationIndex.groups()).containsExactly(DefaultGroups.ANYONE);
   }
 
-  private ComponentDto insertPermissionsForProject(String projectKey) {
+  private ComponentDto insertProjectWithPermissions(String projectKey) {
     ComponentDto project = ComponentTesting.newProjectDto().setKey(projectKey);
     db.componentDao().insert(session, project);
 
index fe9231efe01fccf35d02b131f54dee2f9ebc656d..969f7c2c9fe3f2055ae092fa70f49e90e1cd1b6f 100644 (file)
@@ -26,6 +26,7 @@ import org.junit.ClassRule;
 import org.junit.Test;
 import org.sonar.api.security.DefaultGroups;
 import org.sonar.api.web.UserRole;
+import org.sonar.core.activity.Activity;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.computation.db.AnalysisReportDto;
 import org.sonar.core.permission.GlobalPermissions;
@@ -33,7 +34,11 @@ import org.sonar.core.permission.PermissionFacade;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.core.user.UserDto;
+import org.sonar.server.activity.ActivityService;
+import org.sonar.server.component.ComponentTesting;
+import org.sonar.server.computation.AnalysisReportLog;
 import org.sonar.server.computation.AnalysisReportQueue;
+import org.sonar.server.computation.ComputationService;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.tester.ServerTester;
@@ -46,6 +51,8 @@ import static org.fest.assertions.Assertions.assertThat;
 
 public class AnalysisReportHistorySearchActionMediumTest {
   private static final String DEFAULT_PROJECT_KEY = "DefaultProjectKey";
+  private static final String DEFAULT_PROJECT_NAME = "DefaultProjectName";
+
   @ClassRule
   public static ServerTester tester = new ServerTester();
 
@@ -54,6 +61,8 @@ public class AnalysisReportHistorySearchActionMediumTest {
   private WsTester wsTester;
   private AnalysisReportQueue queue;
   private MockUserSession userSession;
+  private ComputationService computationService;
+  private ActivityService activityService;
 
   @Before
   public void before() {
@@ -62,6 +71,7 @@ public class AnalysisReportHistorySearchActionMediumTest {
     wsTester = tester.get(WsTester.class);
     session = dbClient.openSession(false);
     queue = tester.get(AnalysisReportQueue.class);
+    activityService = tester.get(ActivityService.class);
 
     UserDto connectedUser = new UserDto().setLogin("gandalf").setName("Gandalf");
     dbClient.userDao().insert(session, connectedUser);
@@ -85,23 +95,26 @@ public class AnalysisReportHistorySearchActionMediumTest {
     queue.add(DEFAULT_PROJECT_KEY, 123L);
 
     List<AnalysisReportDto> reports = queue.all();
+    ComponentDto project = ComponentTesting.newProjectDto()
+      .setName(DEFAULT_PROJECT_NAME)
+      .setKey(DEFAULT_PROJECT_KEY);
     for (AnalysisReportDto report : reports) {
       report.succeed();
-      queue.remove(report);
+      activityService.write(session, Activity.Type.ANALYSIS_REPORT, new AnalysisReportLog(report, project));
     }
 
+    session.commit();
     userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
 
     WsTester.TestRequest request = wsTester.newGetRequest(AnalysisReportWebService.API_ENDPOINT, AnalysisReportHistorySearchAction.SEARCH_ACTION);
     WsTester.Result result = request.execute();
 
     assertThat(result).isNotNull();
-    // TODO add the createdAt and updatedAt field in the json file when System2 is easily mockable
     result.assertJson(getClass(), "list_history_reports.json", false);
   }
 
   private ComponentDto insertPermissionsForProject(String projectKey) {
-    ComponentDto project = new ComponentDto().setKey(projectKey);
+    ComponentDto project = new ComponentDto().setKey(projectKey).setId(1L);
     dbClient.componentDao().insert(session, project);
 
     tester.get(PermissionFacade.class).insertGroupPermission(project.getId(), DefaultGroups.ANYONE, UserRole.USER, session);
index 35b1d59b4bb5d014d59201d410da1509221a8dd0..b0ed60a0876192518ba951004a14ec8172ec74ac 100644 (file)
@@ -2,17 +2,17 @@
   "reports": [
     {
       "status": "SUCCESS",
-      "projectName": "DefaultProjectKey",
+      "projectName": "DefaultProjectName",
       "projectKey": "DefaultProjectKey"
     },
     {
       "status": "SUCCESS",
-      "projectName": "DefaultProjectKey",
+      "projectName": "DefaultProjectName",
       "projectKey": "DefaultProjectKey"
     },
     {
       "status": "SUCCESS",
-      "projectName": "DefaultProjectKey",
+      "projectName": "DefaultProjectName",
       "projectKey": "DefaultProjectKey"
     }
   ]
index 71ce1b8122c6b3420a214b573098aea33fc025ea..90e1e93f32d8ef572633a1382b6307eee281ff55 100644 (file)
@@ -48,7 +48,6 @@ public class ComponentDto extends Dto<String> implements Component {
   private boolean enabled = true;
   private Date authorizationUpdatedAt;
 
-
   public Long getId() {
     return id;
   }
@@ -71,11 +70,6 @@ public class ComponentDto extends Dto<String> implements Component {
     return kee;
   }
 
-  public ComponentDto setKey(String key) {
-    this.kee = key;
-    return this;
-  }
-
   public String scope() {
     return scope;
   }
@@ -217,7 +211,12 @@ public class ComponentDto extends Dto<String> implements Component {
 
   @Override
   public String getKey() {
-    return kee;
+    return key();
+  }
+
+  public ComponentDto setKey(String key) {
+    this.kee = key;
+    return this;
   }
 
   @Override
index 725a87f81a58f571e82444f5f87371de6fa6b296..52b563dcd7a6c8c10b46cfaeec73d53768f4dbb0 100644 (file)
@@ -21,18 +21,12 @@ package org.sonar.core.computation.db;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
-import com.google.common.base.Strings;
-import org.sonar.core.component.ComponentDto;
 import org.sonar.core.persistence.Dto;
 
 import javax.annotation.Nullable;
 
 import java.util.Date;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.sonar.core.computation.db.AnalysisReportDto.Status.FAILED;
-import static org.sonar.core.computation.db.AnalysisReportDto.Status.SUCCESS;
-
 public class AnalysisReportDto extends Dto<String> {
 
   private Long id;
@@ -42,7 +36,6 @@ public class AnalysisReportDto extends Dto<String> {
   private Long snapshotId;
   private Date startedAt;
   private Date finishedAt;
-  private ComponentDto project;
 
   public AnalysisReportDto() {
     super();
@@ -75,11 +68,11 @@ public class AnalysisReportDto extends Dto<String> {
   }
 
   public void fail() {
-    this.status = FAILED;
+    this.status = Status.FAILED;
   }
 
   public void succeed() {
-    this.status = SUCCESS;
+    this.status = Status.SUCCESS;
   }
 
   public String getData() {
@@ -113,22 +106,6 @@ public class AnalysisReportDto extends Dto<String> {
       .toString();
   }
 
-  public String getProjectName() {
-    if (project == null) {
-      return getProjectKey();
-    }
-
-    return Strings.nullToEmpty(project.name());
-  }
-
-  public String getProjectUuid() {
-    if (project == null) {
-      return getProjectKey();
-    }
-
-    return Strings.nullToEmpty(project.uuid());
-  }
-
   public Long getSnapshotId() {
     return snapshotId;
   }
@@ -168,15 +145,6 @@ public class AnalysisReportDto extends Dto<String> {
     return this;
   }
 
-  public ComponentDto getProject() {
-    return checkNotNull(project);
-  }
-
-  public AnalysisReportDto setProject(ComponentDto project) {
-    this.project = project;
-    return this;
-  }
-
   public enum Status {
     PENDING, WORKING, SUCCESS, FAILED;