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;
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()))
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;
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;
}
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
*/
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) {
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
*/
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 a 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));
+ }
}
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();
}
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() {
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;
}
@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();
}
+++ /dev/null
-/*
- * 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";
- }
-}
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;
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;
}
@Override
- public void execute(DbSession session, AnalysisReportDto report) {
- indexProjectIssues(session, report);
+ public void execute(DbSession session, AnalysisReportDto report, ComponentDto project) {
+ indexProjectIssues(session, project);
}
@Override
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));
+ }
}
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;
}
@Override
- public void execute(DbSession session, AnalysisReportDto report) {
+ public void execute(DbSession session, AnalysisReportDto report, ComponentDto project) {
disablePreviousSnapshot(session, report);
enableCurrentSnapshot(session, report);
}
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;
}
@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
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);
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());
// 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);
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;
.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
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");
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;
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;
}
@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)
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 {
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);
- }
}
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;
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
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));
}
}
public class ComputationStepRegistryTest {
private ComputationStepRegistry sut;
- private GetAndSetProjectStep getAndSetProjectStep;
private SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep;
private IndexProjectIssuesStep indexProjectIssuesStep;
private SwitchSnapshotStep switchSnapshotStep;
@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);
}
}
@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));
+++ /dev/null
-/*
- * 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);
- }
-
-}
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();
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();
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;
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");
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());
}
}
private SynchronizeProjectPermissionsStep sut;
private AnalysisReportQueue queue;
- private GetAndSetProjectStep getAndSetProjectStep;
private DbClient db;
private DbSession session;
- private MockUserSession userSession;
@Before
public void setUp() throws Exception {
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();
}
@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();
@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);
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;
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;
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();
private WsTester wsTester;
private AnalysisReportQueue queue;
private MockUserSession userSession;
+ private ComputationService computationService;
+ private ActivityService activityService;
@Before
public void before() {
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);
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);
"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"
}
]
private boolean enabled = true;
private Date authorizationUpdatedAt;
-
public Long getId() {
return id;
}
return kee;
}
- public ComponentDto setKey(String key) {
- this.kee = key;
- return this;
- }
-
public String scope() {
return scope;
}
@Override
public String getKey() {
- return kee;
+ return key();
+ }
+
+ public ComponentDto setKey(String key) {
+ this.kee = key;
+ return this;
}
@Override
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;
private Long snapshotId;
private Date startedAt;
private Date finishedAt;
- private ComponentDto project;
public AnalysisReportDto() {
super();
}
public void fail() {
- this.status = FAILED;
+ this.status = Status.FAILED;
}
public void succeed() {
- this.status = SUCCESS;
+ this.status = Status.SUCCESS;
}
public String getData() {
.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;
}
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;