From 713061ca31d6fb75c39b111870ffcb151d98aabf Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Thu, 11 Dec 2014 09:15:28 +0100 Subject: [PATCH] SONAR-5910 persist report in database --- .../server/batch/UploadReportAction.java | 2 +- .../computation/AnalysisReportQueue.java | 11 +++-- .../computation/db/AnalysisReportDao.java | 47 ++++++++++++++++++- .../server/batch/UploadReportActionTest.java | 5 +- .../AnalysisReportQueueMediumTest.java | 23 +++++---- .../computation/db/AnalysisReportDaoTest.java | 24 ++++++---- ...isReportHistorySearchActionMediumTest.java | 10 ++-- .../sonar/server/ws/WebServiceEngineTest.java | 10 +--- .../computation/db/AnalysisReportDto.java | 7 +-- .../computation/db/AnalysisReportMapper.java | 2 - .../computation/db/AnalysisReportMapper.xml | 8 ---- 11 files changed, 95 insertions(+), 54 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java b/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java index a50ba5f9729..afd793e12ef 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java @@ -68,7 +68,7 @@ public class UploadReportAction implements RequestHandler { String projectKey = request.mandatoryParam(PARAM_PROJECT_KEY); String snapshotId = request.mandatoryParam(PARAM_SNAPSHOT); - analysisReportQueue.add(projectKey, Long.valueOf(snapshotId)); + analysisReportQueue.add(projectKey, Long.valueOf(snapshotId), null); analysisTaskLauncher.startAnalysisTaskNow(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java index 1193982672e..bfc80952dc4 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java @@ -32,6 +32,7 @@ import org.sonar.server.user.UserSession; import javax.annotation.CheckForNull; +import java.io.InputStream; import java.util.Date; import java.util.List; @@ -49,14 +50,16 @@ public class AnalysisReportQueue implements ServerComponent { this.system2 = system2; } - public AnalysisReportDto add(String projectKey, Long snapshotId) { + public AnalysisReportDto add(String projectKey, Long snapshotId, InputStream file) { UserSession.get().checkGlobalPermission(GlobalPermissions.SCAN_EXECUTION); - AnalysisReportDto report = newPendingAnalysisReport(projectKey).setSnapshotId(snapshotId); + AnalysisReportDto report = newPendingAnalysisReport(projectKey) + .setSnapshotId(snapshotId) + .setData(file); DbSession session = dbClient.openSession(false); try { checkThatProjectExistsInDatabase(projectKey, session); - return insertInDatabase(report, session); + return insertInDb(report, session); } finally { MyBatis.closeQuietly(session); } @@ -72,7 +75,7 @@ public class AnalysisReportQueue implements ServerComponent { dbClient.componentDao().getByKey(session, projectKey); } - private AnalysisReportDto insertInDatabase(AnalysisReportDto reportTemplate, DbSession session) { + private AnalysisReportDto insertInDb(AnalysisReportDto reportTemplate, DbSession session) { AnalysisReportDto report = dao.insert(session, reportTemplate); session.commit(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/db/AnalysisReportDao.java b/server/sonar-server/src/main/java/org/sonar/server/computation/db/AnalysisReportDao.java index 5ea9eb3e96c..d419cb2d69a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/db/AnalysisReportDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/db/AnalysisReportDao.java @@ -21,6 +21,7 @@ package org.sonar.server.computation.db; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Charsets; import org.sonar.api.utils.System2; import org.sonar.core.computation.db.AnalysisReportDto; import org.sonar.core.computation.db.AnalysisReportMapper; @@ -30,6 +31,11 @@ import org.sonar.server.db.BaseDao; import javax.annotation.CheckForNull; +import java.io.InputStreamReader; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Timestamp; import java.util.Date; import java.util.List; import java.util.Map; @@ -40,6 +46,10 @@ import static org.sonar.core.computation.db.AnalysisReportDto.Status.WORKING; public class AnalysisReportDao extends BaseDao implements DaoComponent { + private static final String INSERT_QUERY = "insert into analysis_reports\n" + + " (project_key, snapshot_id, report_status, report_data, created_at, updated_at, started_at, finished_at)\n" + + " values (?, ?, ?, ?, ?, ?, ?, ?)"; + private System2 system2; public AnalysisReportDao() { @@ -114,15 +124,50 @@ public class AnalysisReportDao extends BaseDao getSynchronizationParams(Date date, Map params) { throw new UnsupportedOperationException(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionTest.java index 2c792c94f34..9399bd2eca5 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionTest.java @@ -26,7 +26,6 @@ import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.server.computation.AnalysisReportQueue; import org.sonar.server.computation.AnalysisReportTaskLauncher; -import org.sonar.server.computation.ComputationService; import static org.mockito.Mockito.*; @@ -35,13 +34,11 @@ public class UploadReportActionTest { private static final String DEFAULT_PROJECT_KEY = "123456789-987654321"; private UploadReportAction sut; - private ComputationService computationService; private AnalysisReportTaskLauncher analysisTaskLauncher; private AnalysisReportQueue queue; @Before public void before() { - computationService = mock(ComputationService.class); analysisTaskLauncher = mock(AnalysisReportTaskLauncher.class); queue = mock(AnalysisReportQueue.class); @@ -57,7 +54,7 @@ public class UploadReportActionTest { sut.handle(request, response); - verify(queue).add(DEFAULT_PROJECT_KEY, 123L); + verify(queue).add(DEFAULT_PROJECT_KEY, 123L, null); verify(analysisTaskLauncher).startAnalysisTaskNow(); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java index c3926a41227..14744b85422 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java @@ -20,6 +20,7 @@ package org.sonar.server.computation; +import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; @@ -38,6 +39,7 @@ import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.tester.ServerTester; import org.sonar.server.user.MockUserSession; +import java.io.InputStream; import java.util.List; import static org.fest.assertions.Assertions.assertThat; @@ -83,7 +85,7 @@ public class AnalysisReportQueueMediumTest { @Test public void create_analysis_report_and_retrieve_it() { insertPermissionsForProject(DEFAULT_PROJECT_KEY); - sut.add(DEFAULT_PROJECT_KEY, 123L); + sut.add(DEFAULT_PROJECT_KEY, 123L, defaultReportData()); List reports = sut.findByProjectKey(DEFAULT_PROJECT_KEY); AnalysisReportDto report = reports.get(0); @@ -112,9 +114,9 @@ public class AnalysisReportQueueMediumTest { insertPermissionsForProject("2"); insertPermissionsForProject("3"); - sut.add(DEFAULT_PROJECT_KEY, 123L); - sut.add("2", 123L); - sut.add("3", 123L); + sut.add(DEFAULT_PROJECT_KEY, 123L, defaultReportData()); + sut.add("2", 123L, defaultReportData()); + sut.add("3", 123L, defaultReportData()); AnalysisReportDto firstBookedReport = sut.bookNextAvailable(); AnalysisReportDto secondBookedReport = sut.bookNextAvailable(); @@ -138,9 +140,9 @@ public class AnalysisReportQueueMediumTest { public void all() { insertPermissionsForProject(DEFAULT_PROJECT_KEY); - sut.add(DEFAULT_PROJECT_KEY, 123L); - sut.add(DEFAULT_PROJECT_KEY, 123L); - sut.add(DEFAULT_PROJECT_KEY, 123L); + sut.add(DEFAULT_PROJECT_KEY, 123L, defaultReportData()); + sut.add(DEFAULT_PROJECT_KEY, 123L, defaultReportData()); + sut.add(DEFAULT_PROJECT_KEY, 123L, defaultReportData()); List reports = sut.all(); @@ -150,7 +152,7 @@ public class AnalysisReportQueueMediumTest { @Test public void remove_remove_from_queue() { insertPermissionsForProject(DEFAULT_PROJECT_KEY); - sut.add(DEFAULT_PROJECT_KEY, 123L); + sut.add(DEFAULT_PROJECT_KEY, 123L, defaultReportData()); AnalysisReportDto report = sut.bookNextAvailable(); report.setStatus(SUCCESS); @@ -168,7 +170,10 @@ public class AnalysisReportQueueMediumTest { MockUserSession.set().setLogin("gandalf").addProjectPermissions(UserRole.USER, project.key()); - sut.add(project.getKey(), 123L); + sut.add(project.getKey(), 123L, defaultReportData()); } + private InputStream defaultReportData() { + return IOUtils.toInputStream("default-project"); + } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java index ebee96f8537..29a69ecaa4d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java @@ -20,6 +20,7 @@ package org.sonar.server.computation.db; +import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -69,24 +70,29 @@ public class AnalysisReportDaoTest { } @Test - public void insert_multiple_reports() { + public void insert_multiple_reports() throws Exception { db.prepareDbUnit(getClass(), "empty.xml"); - AnalysisReportDto report = new AnalysisReportDto() + AnalysisReportDto report1 = newDefaultAnalysisReport(); + AnalysisReportDto report2 = newDefaultAnalysisReport(); + + sut.insert(session, report1); + sut.insert(session, report2); + session.commit(); + + db.assertDbUnit(getClass(), "insert-result.xml", "analysis_reports"); + } + + private AnalysisReportDto newDefaultAnalysisReport() { + return new AnalysisReportDto() .setProjectKey(DEFAULT_PROJECT_KEY) .setSnapshotId(DEFAULT_SNAPSHOT_ID) - .setData("data-project") + .setData(IOUtils.toInputStream("data-project")) .setStatus(PENDING) .setStartedAt(DateUtils.parseDate("2014-09-25")) .setFinishedAt(DateUtils.parseDate("2014-09-27")) .setCreatedAt(DateUtils.parseDate("2014-09-24")) .setUpdatedAt(DateUtils.parseDate("2014-09-25")); - - sut.insert(session, report); - sut.insert(session, report); - session.commit(); - - db.assertDbUnit(getClass(), "insert-result.xml", "analysis_reports"); } @Test diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java index 969f7c2c9fe..b25a1f5180d 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java @@ -20,6 +20,7 @@ package org.sonar.server.computation.ws; +import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.ClassRule; @@ -52,6 +53,7 @@ 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"; + private static final String DEFAULT_REPORT_DATA = "default-project"; @ClassRule public static ServerTester tester = new ServerTester(); @@ -90,9 +92,9 @@ public class AnalysisReportHistorySearchActionMediumTest { @Test public void add_and_try_to_retrieve_activities() throws Exception { insertPermissionsForProject(DEFAULT_PROJECT_KEY); - queue.add(DEFAULT_PROJECT_KEY, 123L); - queue.add(DEFAULT_PROJECT_KEY, 123L); - queue.add(DEFAULT_PROJECT_KEY, 123L); + queue.add(DEFAULT_PROJECT_KEY, 123L, IOUtils.toInputStream(DEFAULT_REPORT_DATA)); + queue.add(DEFAULT_PROJECT_KEY, 123L, IOUtils.toInputStream(DEFAULT_REPORT_DATA)); + queue.add(DEFAULT_PROJECT_KEY, 123L, IOUtils.toInputStream(DEFAULT_REPORT_DATA)); List reports = queue.all(); ComponentDto project = ComponentTesting.newProjectDto() @@ -129,7 +131,7 @@ public class AnalysisReportHistorySearchActionMediumTest { @Test(expected = ForbiddenException.class) public void user_rights_is_not_enough_throw_ForbiddenException() throws Exception { insertPermissionsForProject(DEFAULT_PROJECT_KEY); - queue.add(DEFAULT_PROJECT_KEY, 123L); + queue.add(DEFAULT_PROJECT_KEY, 123L, IOUtils.toInputStream(DEFAULT_REPORT_DATA)); AnalysisReportDto report = queue.all().get(0); report.succeed(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/ws/WebServiceEngineTest.java b/server/sonar-server/src/test/java/org/sonar/server/ws/WebServiceEngineTest.java index c9d2af8c3fb..57fa20c9d84 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/ws/WebServiceEngineTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/ws/WebServiceEngineTest.java @@ -24,8 +24,6 @@ import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import org.sonar.api.i18n.I18n; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.RequestHandler; @@ -37,19 +35,13 @@ import org.sonar.server.exceptions.Errors; import org.sonar.server.exceptions.Message; import org.sonar.server.plugins.MimeTypes; import org.sonar.server.user.MockUserSession; -import org.sonar.server.user.UserSession; import javax.annotation.Nullable; - import java.io.IOException; import java.util.Locale; import java.util.Map; import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyObject; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -242,7 +234,7 @@ public class WebServiceEngineTest { assertThat(response.stream().outputAsString()).isEqualTo( "{\"errors\":[{\"msg\":\"reason #0\"}]}" - ); + ); assertThat(response.stream().httpStatus()).isEqualTo(400); assertThat(response.stream().mediaType()).isEqualTo(MimeTypes.JSON); } diff --git a/sonar-core/src/main/java/org/sonar/core/computation/db/AnalysisReportDto.java b/sonar-core/src/main/java/org/sonar/core/computation/db/AnalysisReportDto.java index 52b563dcd7a..8d9a90397fd 100644 --- a/sonar-core/src/main/java/org/sonar/core/computation/db/AnalysisReportDto.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/db/AnalysisReportDto.java @@ -25,6 +25,7 @@ import org.sonar.core.persistence.Dto; import javax.annotation.Nullable; +import java.io.InputStream; import java.util.Date; public class AnalysisReportDto extends Dto { @@ -32,7 +33,7 @@ public class AnalysisReportDto extends Dto { private Long id; private String projectKey; private Status status; - private String data; + private InputStream data; private Long snapshotId; private Date startedAt; private Date finishedAt; @@ -75,11 +76,11 @@ public class AnalysisReportDto extends Dto { this.status = Status.SUCCESS; } - public String getData() { + public InputStream getData() { return data; } - public AnalysisReportDto setData(@Nullable String data) { + public AnalysisReportDto setData(@Nullable InputStream data) { this.data = data; return this; } diff --git a/sonar-core/src/main/java/org/sonar/core/computation/db/AnalysisReportMapper.java b/sonar-core/src/main/java/org/sonar/core/computation/db/AnalysisReportMapper.java index ca950e1c1a2..f9841b5a9e2 100644 --- a/sonar-core/src/main/java/org/sonar/core/computation/db/AnalysisReportMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/db/AnalysisReportMapper.java @@ -25,8 +25,6 @@ import java.util.Date; import java.util.List; public interface AnalysisReportMapper { - void insert(AnalysisReportDto report); - List selectByProjectKey(String projectKey); List selectNextAvailableReport(@Param("availableStatus") AnalysisReportDto.Status availableStatus, @Param("busyStatus") AnalysisReportDto.Status busyStatus); diff --git a/sonar-core/src/main/resources/org/sonar/core/computation/db/AnalysisReportMapper.xml b/sonar-core/src/main/resources/org/sonar/core/computation/db/AnalysisReportMapper.xml index 16613e4a946..2fd0bd74625 100644 --- a/sonar-core/src/main/resources/org/sonar/core/computation/db/AnalysisReportMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/computation/db/AnalysisReportMapper.xml @@ -14,14 +14,6 @@ ar.finished_at as finishedAt - - insert into analysis_reports - (project_key, snapshot_id, report_status, report_data, created_at, updated_at, started_at, - finished_at) - values (#{projectKey}, #{snapshotId}, #{status}, #{data}, #{createdAt}, #{updatedAt}, #{startedAt}, - #{finishedAt}) - - update analysis_reports set report_status=#{status}, updated_at=#{updatedAt} -- 2.39.5