From 99e61ab58b3bc76bbf9e3d9524c79282e046505d Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Tue, 21 Oct 2014 16:15:39 +0200 Subject: [PATCH] SONAR-5698 SONAR-5694 Add business dates finishedAt startedAt and submittedAt to analysis report --- .../server/computation/AnalysisReportLog.java | 6 ++- .../computation/AnalysisReportQueue.java | 7 ++- .../ws/ActiveAnalysisReportsAction.java | 15 ++++--- .../AnalysisReportLogMediumTest.java | 12 +++-- .../AnalysisReportQueueMediumTest.java | 9 +++- .../computation/db/AnalysisReportDaoTest.java | 44 ++++++++----------- .../ws/ActiveAnalysisReportsActionTest.java | 9 ++-- .../AnalysisReportDaoTest/insert-result.xml | 4 ++ .../one_analysis_report.xml | 2 + .../update-all-to-status-pending-result.xml | 6 +++ .../update-all-to-status-pending.xml | 6 +++ .../list_active_reports.json | 5 ++- ..._add_business_dates_to_analysis_reports.rb | 31 +++++++++++++ .../computation/db/AnalysisReportDto.java | 43 ++++++++++++++++-- .../computation/db/AnalysisReportMapper.java | 2 +- .../core/persistence/DatabaseVersion.java | 2 +- .../computation/db/AnalysisReportMapper.xml | 12 +++-- .../org/sonar/core/persistence/rows-h2.sql | 1 + .../org/sonar/core/persistence/schema-h2.ddl | 4 +- .../java/org/sonar/api/utils/DateUtils.java | 18 +++++--- 20 files changed, 176 insertions(+), 62 deletions(-) create mode 100644 server/sonar-web/src/main/webapp/WEB-INF/db/migrate/707_add_business_dates_to_analysis_reports.rb diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportLog.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportLog.java index 9f41a3fdfd8..025325e8999 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportLog.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportLog.java @@ -44,8 +44,10 @@ public class AnalysisReportLog implements ActivityLog { .put("projectKey", report.getProjectKey()) .put("projectName", report.getProjectName()) .put("status", String.valueOf(report.getStatus())) - .put("createdAt", DateUtils.formatDateTime(report.getCreatedAt())) - .put("updatedAt", DateUtils.formatDateTime(report.getUpdatedAt())) + .put("submittedAt", DateUtils.formatDateTimeNullSafe(report.getCreatedAt())) + .put("updatedAt", DateUtils.formatDateTimeNullSafe(report.getUpdatedAt())) + .put("startedAt", DateUtils.formatDateTimeNullSafe(report.getStartedAt())) + .put("finishedAt", DateUtils.formatDateTimeNullSafe(report.getFinishedAt())) .build(); } 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 64c2c2c146c..06a721129db 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 @@ -21,6 +21,7 @@ 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; @@ -33,6 +34,7 @@ import org.sonar.server.user.UserSession; import javax.annotation.CheckForNull; +import java.util.Date; import java.util.List; import static com.google.common.base.Preconditions.checkArgument; @@ -42,11 +44,13 @@ 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) { + public AnalysisReportQueue(DbClient dbClient, ActivityService activityService, System2 system2) { this.dbClient = dbClient; this.activityService = activityService; this.dao = dbClient.analysisReportDao(); + this.system2 = system2; } public AnalysisReportDto add(String projectKey, Long snapshotId) { @@ -86,6 +90,7 @@ public class AnalysisReportQueue implements ServerComponent { DbSession session = dbClient.openSession(false); try { + report.setFinishedAt(new Date(system2.now())); dao.delete(session, report); logActivity(report, session); session.commit(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActiveAnalysisReportsAction.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActiveAnalysisReportsAction.java index d37bcb2fcdf..3c559b9c3ab 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActiveAnalysisReportsAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ws/ActiveAnalysisReportsAction.java @@ -58,8 +58,9 @@ public class ActiveAnalysisReportsAction implements RequestHandler { json.prop("id", report.getId()); json.prop("project", report.getProjectKey()); json.prop("projectName", report.getProjectName()); - json.propDateTime("startDate", report.getCreatedAt()); - json.propDateTime("updateDate", report.getUpdatedAt()); + json.propDateTime("startedAt", report.getStartedAt()); + json.propDateTime("finishedAt", report.getFinishedAt()); + json.propDateTime("submittedAt", report.getCreatedAt()); json.prop("status", report.getStatus().toString()); json.endObject(); } @@ -68,11 +69,11 @@ public class ActiveAnalysisReportsAction implements RequestHandler { void define(WebService.NewController controller) { controller - .createAction("active") - .setDescription("List all the active analysis reports") - .setSince("5.0") - .setResponseExample(Resources.getResource(getClass(), "example-list.json")) - .setHandler(this); + .createAction("active") + .setDescription("List all the active analysis reports") + .setSince("5.0") + .setResponseExample(Resources.getResource(getClass(), "example-list.json")) + .setHandler(this); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportLogMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportLogMediumTest.java index e520d4bab3c..72ad3f443ae 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportLogMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportLogMediumTest.java @@ -66,9 +66,11 @@ public class AnalysisReportLogMediumTest { AnalysisReportDto report = AnalysisReportDto.newForTests(1L) .setProjectKey("projectKey") .setProjectName("projectName") - .setStatus(FAILED); - report.setCreatedAt(DateUtils.parseDate("2014-10-15")) - .setUpdatedAt(DateUtils.parseDate("2014-10-16")); + .setStatus(FAILED) + .setCreatedAt(DateUtils.parseDate("2014-10-15")) + .setUpdatedAt(DateUtils.parseDate("2014-10-16")) + .setStartedAt(DateUtils.parseDate("2014-10-17")) + .setFinishedAt(DateUtils.parseDate("2014-10-18")); service.write(dbSession, ANALYSIS_REPORT, new AnalysisReportLog(report)); dbSession.commit(); @@ -83,8 +85,10 @@ public class AnalysisReportLogMediumTest { assertThat(details.get("projectKey")).isEqualTo(report.getProjectKey()); assertThat(details.get("projectName")).isEqualTo(report.getProjectName()); assertThat(details.get("status")).isEqualTo("FAILED"); - assertThat(details.get("createdAt")).isEqualTo("2014-10-15T00:00:00+0200"); + assertThat(details.get("submittedAt")).isEqualTo("2014-10-15T00:00:00+0200"); assertThat(details.get("updatedAt")).isEqualTo("2014-10-16T00:00:00+0200"); + assertThat(details.get("startedAt")).isEqualTo("2014-10-17T00:00:00+0200"); + assertThat(details.get("finishedAt")).isEqualTo("2014-10-18T00:00:00+0200"); } } 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 84a1392e57e..050330acba4 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 @@ -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; @@ -40,6 +41,7 @@ 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; @@ -92,6 +94,7 @@ public class AnalysisReportQueueMediumTest { assertThat(reports).hasSize(1); assertThat(report.getProjectKey()).isEqualTo(DEFAULT_PROJECT_KEY); assertThat(report.getSnapshotId()).isEqualTo(123L); + assertThat(report.getCreatedAt()).isNotNull(); } private ComponentDto insertPermissionsForProject(String projectKey) { @@ -122,6 +125,7 @@ public class AnalysisReportQueueMediumTest { assertThat(firstBookedReport.getProjectKey()).isEqualTo(DEFAULT_PROJECT_KEY); assertThat(firstBookedReport.getStatus()).isEqualTo(WORKING); + assertThat(firstBookedReport.getStartedAt()).isNotNull(); assertThat(secondBookedReport.getProjectKey()).isEqualTo("2"); assertThat(thirdBookedReport.getProjectKey()).isEqualTo("3"); } @@ -156,7 +160,10 @@ public class AnalysisReportQueueMediumTest { sut.remove(report); assertThat(sut.all()).isEmpty(); - assertThat(tester.get(ActivityIndex.class).findAll().getHits()).hasSize(1); + List activities = tester.get(ActivityIndex.class).findAll().getHits(); + Map details = activities.get(0).details(); + assertThat(activities).hasSize(1); + assertThat(details.get("finishedAt")).isNotEmpty(); } @Test(expected = ForbiddenException.class) 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 6fd0a31bd02..5aa270e5bfb 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 @@ -75,8 +75,10 @@ public class AnalysisReportDaoTest { .setProjectName(DEFAULT_PROJECT_NAME) .setSnapshotId(DEFAULT_SNAPSHOT_ID) .setData("data-project") - .setStatus(PENDING); - report.setCreatedAt(DateUtils.parseDate("2014-09-24")) + .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); @@ -161,16 +163,20 @@ public class AnalysisReportDaoTest { } @Test - public void getById_maps_all_the_fields_except_report_data() { - db.prepareDbUnit(getClass(), "select.xml"); + public void getById_maps_all_the_fields_except_the_data() { + db.prepareDbUnit(getClass(), "one_analysis_report.xml"); AnalysisReportDto report = sut.getById(session, 1L); - assertThat(report.getId()).isEqualTo(1L); - assertThat(report.getStatus()).isEqualTo(WORKING); - assertThat(report.getProjectKey()).isEqualTo("123456789-987654321"); - assertThat(report.getData()).isNull(); + + assertThat(report.getProjectKey()).isEqualTo(DEFAULT_PROJECT_KEY); + assertThat(report.getProjectName()).isEqualTo(DEFAULT_PROJECT_NAME); assertThat(report.getCreatedAt()).isEqualTo(DateUtils.parseDate("2014-09-24")); assertThat(report.getUpdatedAt()).isEqualTo(DateUtils.parseDate("2014-09-25")); + assertThat(report.getStartedAt()).isEqualTo(DateUtils.parseDate("2014-09-26")); + assertThat(report.getFinishedAt()).isEqualTo(DateUtils.parseDate("2014-09-27")); + assertThat(report.getStatus()).isEqualTo(WORKING); + assertThat(report.getData()).isNull(); + assertThat(report.getKey()).isEqualTo("1"); } @Test @@ -208,7 +214,7 @@ public class AnalysisReportDaoTest { assertThat(reportBooked.getId()).isEqualTo(1L); assertThat(reportBooked.getStatus()).isEqualTo(WORKING); - assertThat(reportBooked.getUpdatedAt()).isEqualTo(mockedNow); + assertThat(reportBooked.getStartedAt()).isEqualTo(mockedNow); } @Test @@ -241,21 +247,6 @@ public class AnalysisReportDaoTest { db.assertDbUnit(getClass(), "truncate-result.xml", "analysis_reports"); } - @Test - public void getById_maps_all_the_fields_except_the_data() { - db.prepareDbUnit(getClass(), "one_analysis_report.xml"); - - AnalysisReportDto report = sut.getById(session, 1L); - - assertThat(report.getProjectKey()).isEqualTo(DEFAULT_PROJECT_KEY); - assertThat(report.getProjectName()).isEqualTo(DEFAULT_PROJECT_NAME); - assertThat(report.getCreatedAt()).isEqualTo(DateUtils.parseDate("2014-09-24")); - assertThat(report.getUpdatedAt()).isEqualTo(DateUtils.parseDate("2014-09-25")); - assertThat(report.getStatus()).isEqualTo(WORKING); - assertThat(report.getData()).isNull(); - assertThat(report.getKey()).isEqualTo("1"); - } - @Test public void findAll_one_analysis_report() { db.prepareDbUnit(getClass(), "one_analysis_report.xml"); @@ -301,9 +292,10 @@ public class AnalysisReportDaoTest { private AnalysisReportDto newDefaultReport() { AnalysisReportDto report = AnalysisReportDto.newForTests(1L) .setStatus(PENDING) - .setProjectKey(DEFAULT_PROJECT_KEY); - report + .setProjectKey(DEFAULT_PROJECT_KEY) .setCreatedAt(DateUtils.parseDate("2014-09-30")) + .setFinishedAt(DateUtils.parseDate("2014-09-30")) + .setStartedAt(DateUtils.parseDate("2014-09-30")) .setUpdatedAt(DateUtils.parseDate("2014-09-30")); return report; diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest.java index 7770b3ce1e0..56817de9884 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest.java @@ -54,14 +54,15 @@ public class ActiveAnalysisReportsActionTest { .setProjectName("Project Name") .setProjectKey("project-name") .setStatus(PENDING) - .setData(null); - report.setCreatedAt(DateUtils.parseDateTime("2014-10-13T00:00:00+0200")) - .setUpdatedAt(DateUtils.parseDateTime("2014-10-14T00:00:00+0200")); + .setData(null) + .setCreatedAt(DateUtils.parseDateTime("2014-10-13T00:00:00+0200")) + .setStartedAt(DateUtils.parseDateTime("2014-10-13T00:00:00+0200")) + .setFinishedAt(DateUtils.parseDateTime("2014-10-13T00:00:00+0200")); List reports = Lists.newArrayList(report); when(queue.all()).thenReturn(reports); WsTester.TestRequest request = tester.newGetRequest(AnalysisReportWebService.API_ENDPOINT, "active"); - request.execute().assertJson(getClass(), "list_active_reports.json"); + request.execute().assertJson(getClass(), "list_active_reports.json", false); } @Test diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml index 816774bdb21..189aa5a770c 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml @@ -7,6 +7,8 @@ report_data="data-project" report_status="PENDING" created_at="2014-09-24" + started_at="2014-09-25" + finished_at="2014-09-27" updated_at="2014-09-26" /> diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_analysis_report.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_analysis_report.xml index 7a384fef8bf..fad68c874f3 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_analysis_report.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_analysis_report.xml @@ -8,5 +8,7 @@ report_status="WORKING" created_at="2014-09-24" updated_at="2014-09-25" + started_at="2014-09-26" + finished_at="2014-09-27" /> \ No newline at end of file diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml index ee97b8c8c3b..4a32fbe8dd0 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml @@ -8,6 +8,8 @@ report_status="PENDING" created_at="2014-09-24" updated_at="2014-09-26" + started_at="2014-09-24" + finished_at="2014-09-24" /> \ No newline at end of file diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml index cb5e9a70c3f..71e67e7b911 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml +++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml @@ -8,6 +8,8 @@ report_status="WORKING" created_at="2014-09-24" updated_at="2014-09-24" + started_at="2014-09-24" + finished_at="2014-09-24" /> \ No newline at end of file diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest/list_active_reports.json b/server/sonar-server/src/test/resources/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest/list_active_reports.json index 1f30d284f52..e5bd54abf0a 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest/list_active_reports.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest/list_active_reports.json @@ -5,8 +5,9 @@ "status": "PENDING", "projectName": "Project Name", "project": "project-name", - "startDate": "2014-10-13T00:00:00+0200", - "updateDate": "2014-10-14T00:00:00+0200" + "submittedAt": "2014-10-13T00:00:00+0200", + "startedAt": "2014-10-13T00:00:00+0200", + "finishedAt": "2014-10-13T00:00:00+0200" } ] } \ No newline at end of file diff --git a/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/707_add_business_dates_to_analysis_reports.rb b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/707_add_business_dates_to_analysis_reports.rb new file mode 100644 index 00000000000..6456d78eb10 --- /dev/null +++ b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/707_add_business_dates_to_analysis_reports.rb @@ -0,0 +1,31 @@ +# +# 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. +# + +# +# SonarQube 5.0 +# SONAR-5698 SONAR-5694 +# +class AddBusinessDatesToAnalysisReports < ActiveRecord::Migration + def self.up + add_column 'analysis_reports', :started_at, :datetime, :null => true + add_column 'analysis_reports', :finished_at, :datetime, :null => true + end +end + 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 987b9b43fe5..82c4af9526d 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,8 @@ import org.sonar.core.persistence.Dto; import javax.annotation.Nullable; +import java.util.Date; + import static org.sonar.core.computation.db.AnalysisReportDto.Status.FAILED; import static org.sonar.core.computation.db.AnalysisReportDto.Status.SUCCESS; @@ -36,6 +38,8 @@ public class AnalysisReportDto extends Dto { private Status status; private String data; private Long snapshotId; + private Date startedAt; + private Date finishedAt; public AnalysisReportDto() { super(); @@ -95,12 +99,15 @@ public class AnalysisReportDto extends Dto { @Override public String toString() { - Objects.toStringHelper(this) + return Objects.toStringHelper(this) .add("id", getId()) .add("projectKey", getProjectKey()) .add("projectName", getProjectName()) - .add("status", getStatus()); - return String.format("analysis report {id:%s;project:'%s'}", getId(), getProjectKey()); + .add("status", getStatus()) + .add("createdAt", getCreatedAt()) + .add("startedAt", getStartedAt()) + .add("finishedAt", getFinishedAt()) + .toString(); } public String getProjectName() { @@ -121,6 +128,36 @@ public class AnalysisReportDto extends Dto { return this; } + public Date getStartedAt() { + return startedAt; + } + + public AnalysisReportDto setStartedAt(Date startedAt) { + this.startedAt = startedAt; + return this; + } + + public Date getFinishedAt() { + return finishedAt; + } + + public AnalysisReportDto setFinishedAt(Date finishedAt) { + this.finishedAt = finishedAt; + return this; + } + + @Override + public AnalysisReportDto setUpdatedAt(Date datetime) { + super.setUpdatedAt(datetime); + return this; + } + + @Override + public AnalysisReportDto setCreatedAt(Date datetime) { + super.setCreatedAt(datetime); + return this; + } + public enum Status { PENDING, WORKING, SUCCESS, FAILED; 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 aa0bf872bf7..ca950e1c1a2 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 @@ -43,7 +43,7 @@ public interface AnalysisReportMapper { int update(AnalysisReportDto report); - int updateWithBookingReport(@Param("id") Long id, @Param("updatedAt") Date updatedAt, + int updateWithBookingReport(@Param("id") Long id, @Param("startedAt") Date startedAt, @Param("availableStatus") AnalysisReportDto.Status availableStatus, @Param("busyStatus") AnalysisReportDto.Status busyStatus); diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java index 0df8f0e66c8..8bba4326899 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java @@ -33,7 +33,7 @@ import java.util.List; */ public class DatabaseVersion implements BatchComponent, ServerComponent { - public static final int LAST_VERSION = 706; + public static final int LAST_VERSION = 707; /** * List of all the tables. * This list is hardcoded because we didn't succeed in using java.sql.DatabaseMetaData#getTables() in the same way 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 8156be9ae65..e2166b7b36f 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 @@ -10,13 +10,17 @@ ar.report_status as status, ar.snapshot_id as snapshotId, ar.created_at as createdAt, - ar.updated_at as updatedAt + ar.updated_at as updatedAt, + ar.started_at as startedAt, + ar.finished_at as finishedAt insert into analysis_reports - (project_key, project_name, snapshot_id, report_status, report_data, created_at, updated_at) - values (#{projectKey}, #{projectName}, #{snapshotId}, #{status}, #{data}, #{createdAt}, #{updatedAt}) + (project_key, project_name, snapshot_id, report_status, report_data, created_at, updated_at, started_at, + finished_at) + values (#{projectKey}, #{projectName}, #{snapshotId}, #{status}, #{data}, #{createdAt}, #{updatedAt}, #{startedAt}, + #{finishedAt}) @@ -27,7 +31,7 @@ update analysis_reports set report_status=#{busyStatus}, - updated_at=#{updatedAt} + started_at=#{startedAt} where id=#{id} and report_status=#{availableStatus} diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql index a8b114dc8cd..e06d8bbef12 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql @@ -266,6 +266,7 @@ INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('703'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('704'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('705'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('706'); +INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('707'); INSERT INTO USERS(ID, LOGIN, NAME, EMAIL, CRYPTED_PASSWORD, SALT, CREATED_AT, UPDATED_AT, REMEMBER_TOKEN, REMEMBER_TOKEN_EXPIRES_AT) VALUES (1, 'admin', 'Administrator', '', 'a373a0e667abb2604c1fd571eb4ad47fe8cc0878', '48bc4b0d93179b5103fd3885ea9119498e9d161b', '2011-09-26 22:27:48.0', '2011-09-26 22:27:48.0', null, null); ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 2; diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl b/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl index 0c2d205daa4..67b1937b9d2 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl @@ -559,7 +559,9 @@ CREATE TABLE "ANALYSIS_REPORTS" ( "REPORT_STATUS" VARCHAR(20) NOT NULL, "REPORT_DATA" CLOB(2147483647), "CREATED_AT" TIMESTAMP NOT NULL, - "UPDATED_AT" TIMESTAMP + "UPDATED_AT" TIMESTAMP, + "STARTED_AT" TIMESTAMP, + "FINISHED_AT" TIMESTAMP ); -- ---------------------------------------------- diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/DateUtils.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/DateUtils.java index edbb024bdb7..3985ddafeb9 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/DateUtils.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/DateUtils.java @@ -20,6 +20,7 @@ package org.sonar.api.utils; import javax.annotation.Nullable; + import java.io.NotSerializableException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -55,6 +56,14 @@ public final class DateUtils { return THREAD_SAFE_DATETIME_FORMAT.format(d); } + public static String formatDateTimeNullSafe(@Nullable Date date) { + if (date == null) { + return ""; + } + + return THREAD_SAFE_DATETIME_FORMAT.format(date); + } + /** * @param s string in format {@link #DATE_FORMAT} * @throws SonarException when string cannot be parsed @@ -123,11 +132,6 @@ public final class DateUtils { static class ThreadSafeDateFormat extends DateFormat { private final String format; - - ThreadSafeDateFormat(String format) { - this.format = format; - } - private final ThreadLocal> cache = new ThreadLocal>() { @Override public Reference get() { @@ -140,6 +144,10 @@ public final class DateUtils { } }; + ThreadSafeDateFormat(String format) { + this.format = format; + } + private DateFormat getDateFormat() { return (DateFormat) ((Reference) cache.get()).get(); } -- 2.39.5