From: Teryk Bellahsene Date: Wed, 1 Oct 2014 16:23:52 +0000 (+0200) Subject: SONAR-5626 get next report mecanism dao implemented and interfaces defined. Thread... X-Git-Tag: 5.0-RC1~835 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e7c236adf7c619a89876d04580b8215a550f5c96;p=sonarqube.git SONAR-5626 get next report mecanism dao implemented and interfaces defined. Thread management stub. --- diff --git a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/JavaCpdEngine.java b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/JavaCpdEngine.java index d7d94be4c57..fb128eddcc9 100644 --- a/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/JavaCpdEngine.java +++ b/plugins/sonar-cpd-plugin/src/main/java/org/sonar/plugins/cpd/JavaCpdEngine.java @@ -65,12 +65,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; +import java.util.concurrent.*; public class JavaCpdEngine extends CpdEngine { diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTask.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTask.java new file mode 100644 index 00000000000..083fa36b00a --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTask.java @@ -0,0 +1,58 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.server.computation; + +import org.sonar.core.computation.db.AnalysisReportDto; + +import java.util.concurrent.TimeUnit; + +public class AnalysisReportTask extends Thread { + private static final String TASK_NAME = "AnalysisReportTask"; + private static final int SLEEP_DURATION_IN_SECONDS = 10; + + private final ComputationService service; + + // TODO to improve – the computationService singleton should be retrieved directly in the pico container + public AnalysisReportTask(ComputationService service) { + super(TASK_NAME); + this.service = service; + } + + @Override + public void run() { + while (!this.isInterrupted()) { + AnalysisReportDto report = service.findAndBookNextAnalysisReport(); + if (report == null) { + sleepBeforeNextAttempt(); + } else { + service.analyzeReport(report); + } + } + } + + private void sleepBeforeNextAttempt() { + try { + TimeUnit.SECONDS.sleep(SLEEP_DURATION_IN_SECONDS); + } catch (InterruptedException e) { + // thread interrupted while sleeping, no action needed + } + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskCleaner.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskCleaner.java new file mode 100644 index 00000000000..cbed337b997 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskCleaner.java @@ -0,0 +1,62 @@ +/* + * 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.picocontainer.Startable; +import org.sonar.api.ServerComponent; +import org.sonar.api.platform.ServerUpgradeStatus; +import org.sonar.core.persistence.DbSession; +import org.sonar.core.persistence.MyBatis; +import org.sonar.server.computation.db.AnalysisReportDao; +import org.sonar.server.db.DbClient; + +public class AnalysisReportTaskCleaner implements Startable, ServerComponent { + private final ServerUpgradeStatus serverUpgradeStatus; + private final DbClient dbClient; + + public AnalysisReportTaskCleaner(ServerUpgradeStatus serverUpgradeStatus, DbClient dbClient) { + this.serverUpgradeStatus = serverUpgradeStatus; + this.dbClient = dbClient; + } + + @Override + public void start() { + DbSession session = dbClient.openSession(false); + AnalysisReportDao dao = dbClient.analysisReportDao(); + + try { + if (serverUpgradeStatus.isUpgraded()) { + dao.cleanWithTruncate(session); + } else { + dao.cleanWithUpdateAllToPendingStatus(session); + } + + session.commit(); + } finally { + MyBatis.closeQuietly(session); + } + } + + @Override + public void stop() { + // do nothing + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskLauncher.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskLauncher.java new file mode 100644 index 00000000000..06f07eda815 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskLauncher.java @@ -0,0 +1,47 @@ +/* + * 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.picocontainer.Startable; +import org.sonar.api.ServerComponent; + +public class AnalysisReportTaskLauncher implements Startable, ServerComponent { + + private final ComputationService service; + + private AnalysisReportTask task; + + public AnalysisReportTaskLauncher(ComputationService service) { + this.service = service; + } + + @Override + public void start() { + task = new AnalysisReportTask(service); + task.start(); + } + + @Override + public void stop() { + task.interrupt(); + } + +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTasksCleaner.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTasksCleaner.java deleted file mode 100644 index 77929d47b98..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTasksCleaner.java +++ /dev/null @@ -1,62 +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.picocontainer.Startable; -import org.sonar.api.ServerComponent; -import org.sonar.api.platform.ServerUpgradeStatus; -import org.sonar.core.persistence.DbSession; -import org.sonar.core.persistence.MyBatis; -import org.sonar.server.computation.db.AnalysisReportDao; -import org.sonar.server.db.DbClient; - -public class AnalysisReportTasksCleaner implements Startable, ServerComponent { - private final ServerUpgradeStatus serverUpgradeStatus; - private final DbClient dbClient; - - public AnalysisReportTasksCleaner(ServerUpgradeStatus serverUpgradeStatus, DbClient dbClient) { - this.serverUpgradeStatus = serverUpgradeStatus; - this.dbClient = dbClient; - } - - @Override - public void start() { - DbSession session = dbClient.openSession(false); - AnalysisReportDao dao = dbClient.analysisReportDao(); - - try { - if (serverUpgradeStatus.isUpgraded()) { - dao.cleanWithTruncate(session); - } else { - dao.cleanWithUpdateAllToPendingStatus(session); - } - - session.commit(); - } finally { - MyBatis.closeQuietly(session); - } - } - - @Override - public void stop() { - // do nothing - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java index 74112ddd24e..23acf45b2db 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java @@ -35,10 +35,12 @@ import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING; * since 5.0 */ public class ComputationService implements ServerComponent { - private DbClient dbClient; + private final DbClient dbClient; + private final AnalysisReportDao dao; public ComputationService(DbClient dbClient) { this.dbClient = dbClient; + dao = this.dbClient.analysisReportDao(); } public void create(String projectKey) { @@ -46,8 +48,6 @@ public class ComputationService implements ServerComponent { .setProjectKey(projectKey) .setStatus(PENDING); - AnalysisReportDao dao = dbClient.analysisReportDao(); - DbSession session = dbClient.openSession(false); try { dao.insert(session, report); @@ -58,8 +58,6 @@ public class ComputationService implements ServerComponent { } public List findByProjectKey(String projectKey) { - AnalysisReportDao dao = dbClient.analysisReportDao(); - DbSession session = dbClient.openSession(false); try { return dao.findByProjectKey(session, projectKey); @@ -67,4 +65,13 @@ public class ComputationService implements ServerComponent { MyBatis.closeQuietly(session); } } + + public AnalysisReportDto findAndBookNextAnalysisReport() { + // TODO TBE – implementation needed + return null; + } + + public void analyzeReport(AnalysisReportDto report) { + // TODO TBE – implementation needed + } } 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 726eebd22a0..a0f32d8d965 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 @@ -23,7 +23,6 @@ package org.sonar.server.computation.db; import com.google.common.annotations.VisibleForTesting; import org.sonar.api.utils.System2; import org.sonar.core.computation.db.AnalysisReportDto; -import org.sonar.core.computation.db.AnalysisReportDto.Status; import org.sonar.core.computation.db.AnalysisReportMapper; import org.sonar.core.persistence.DaoComponent; import org.sonar.core.persistence.DbSession; @@ -33,6 +32,9 @@ import java.util.Date; import java.util.List; import java.util.Map; +import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING; +import static org.sonar.core.computation.db.AnalysisReportDto.Status.WORKING; + public class AnalysisReportDao extends BaseDao implements DaoComponent { private System2 system2; @@ -51,7 +53,7 @@ public class AnalysisReportDao extends BaseDao reports = mapper(session).selectNextAvailableReport(PENDING, WORKING); + + if (reports.isEmpty()) { + return null; + } + + return reports.get(0); + } + + public int tryToBookReport(DbSession session, AnalysisReportDto report) { + // checkArgument(report.getId() != null); + // + // report.setStatus(WORKING); + // + // return mapper(session).update(report); + throw new UnsupportedOperationException(); + } + @Override protected AnalysisReportDto doGetNullableByKey(DbSession session, String projectKey) { throw new UnsupportedOperationException(); } @Override - protected AnalysisReportDto doUpdate(DbSession session, AnalysisReportDto issue) { + protected AnalysisReportDto doUpdate(DbSession session, AnalysisReportDto report) { + // int nbOfReportsChanged = mapper(session).update(report); + // checkState(nbOfReportsChanged < 2); + // + // if (nbOfReportsChanged == 0) { + // return null; + // } + // + // return report; throw new UnsupportedOperationException(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java index b55ff650787..03209170430 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java @@ -85,7 +85,7 @@ import org.sonar.server.component.DefaultRubyComponentService; import org.sonar.server.component.db.ComponentDao; import org.sonar.server.component.db.SnapshotDao; import org.sonar.server.component.ws.*; -import org.sonar.server.computation.AnalysisReportTasksCleaner; +import org.sonar.server.computation.AnalysisReportTaskCleaner; import org.sonar.server.computation.ComputationService; import org.sonar.server.computation.db.AnalysisReportDao; import org.sonar.server.config.ws.PropertiesWs; @@ -627,7 +627,7 @@ class ServerComponents { startupContainer.addSingleton(RegisterServletFilters.class); startupContainer.addSingleton(CleanPreviewAnalysisCache.class); startupContainer.addSingleton(CopyRequirementsFromCharacteristicsToRules.class); - startupContainer.addSingleton(AnalysisReportTasksCleaner.class); + startupContainer.addSingleton(AnalysisReportTaskCleaner.class); DoPrivileged.execute(new DoPrivileged.Task() { @Override diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTaskCleanerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTaskCleanerTest.java new file mode 100644 index 00000000000..6ee7c7e92bf --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTaskCleanerTest.java @@ -0,0 +1,67 @@ +/* + * 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.api.platform.ServerUpgradeStatus; +import org.sonar.core.persistence.DbSession; +import org.sonar.server.computation.db.AnalysisReportDao; +import org.sonar.server.db.DbClient; + +import static org.mockito.Mockito.*; + +public class AnalysisReportTaskCleanerTest { + + AnalysisReportTaskCleaner sut; + ServerUpgradeStatus serverUpgradeStatus; + DbClient dbClient; + AnalysisReportDao analysisReportDao; + DbSession session; + + @Before + public void before() { + analysisReportDao = mock(AnalysisReportDao.class); + serverUpgradeStatus = mock(ServerUpgradeStatus.class); + dbClient = mock(DbClient.class); + session = mock(DbSession.class); + + when(dbClient.analysisReportDao()).thenReturn(analysisReportDao); + when(dbClient.openSession(false)).thenReturn(session); + + sut = new AnalysisReportTaskCleaner(serverUpgradeStatus, dbClient); + } + + @Test + public void start_must_call_dao_clean_update_to_pending_by_default() { + sut.start(); + verify(analysisReportDao).cleanWithUpdateAllToPendingStatus(any(DbSession.class)); + sut.stop(); + } + + @Test + public void start_must_call_dao_truncate_when_upgrading() { + when(serverUpgradeStatus.isUpgraded()).thenReturn(Boolean.TRUE); + sut.start(); + verify(analysisReportDao).cleanWithTruncate(any(DbSession.class)); + sut.stop(); + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTasksCleanerTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTasksCleanerTest.java deleted file mode 100644 index e9ee75f1638..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportTasksCleanerTest.java +++ /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.api.platform.ServerUpgradeStatus; -import org.sonar.core.persistence.DbSession; -import org.sonar.server.computation.db.AnalysisReportDao; -import org.sonar.server.db.DbClient; - -import static org.mockito.Mockito.*; - -public class AnalysisReportTasksCleanerTest { - - AnalysisReportTasksCleaner sut; - ServerUpgradeStatus serverUpgradeStatus; - DbClient dbClient; - AnalysisReportDao analysisReportDao; - DbSession session; - - @Before - public void before() { - analysisReportDao = mock(AnalysisReportDao.class); - serverUpgradeStatus = mock(ServerUpgradeStatus.class); - dbClient = mock(DbClient.class); - session = mock(DbSession.class); - - when(dbClient.analysisReportDao()).thenReturn(analysisReportDao); - when(dbClient.openSession(false)).thenReturn(session); - - sut = new AnalysisReportTasksCleaner(serverUpgradeStatus, dbClient); - } - - @Test - public void start_must_call_dao_clean_update_to_pending_by_default() { - sut.start(); - verify(analysisReportDao).cleanWithUpdateAllToPendingStatus(any(DbSession.class)); - sut.stop(); - } - - @Test - public void start_must_call_dao_truncate_when_upgrading() { - when(serverUpgradeStatus.isUpgraded()).thenReturn(Boolean.TRUE); - sut.start(); - verify(analysisReportDao).cleanWithTruncate(any(DbSession.class)); - sut.stop(); - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java index cacc48e9483..11913814f73 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java @@ -28,6 +28,7 @@ import org.sonar.server.computation.db.AnalysisReportDao; import org.sonar.server.db.DbClient; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -52,8 +53,21 @@ public class ComputationServiceTest { } @Test - public void create_must_call_dao_insert() throws Exception { + public void create_must_call_dao_insert() { sut.create("ANY-KEY"); verify(analysisReportDao).insert(any(DbSession.class), any(AnalysisReportDto.class)); } + + @Test + public void findByProjectKey_call_corresponding_dao() { + sut.findByProjectKey("ANY_STRING"); + verify(analysisReportDao).findByProjectKey(any(DbSession.class), anyString()); + } + + @Test + public void test_unimplemented_methods_for_code_coverage_purpose_only() { + sut.analyzeReport(new AnalysisReportDto()); + sut.findAndBookNextAnalysisReport(); + } + } \ No newline at end of file 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 b11cb7cf478..8fa3fd39660 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 @@ -30,6 +30,8 @@ import org.sonar.core.computation.db.AnalysisReportDto; import org.sonar.core.persistence.DbSession; import org.sonar.core.persistence.TestDatabase; +import java.util.Date; +import java.util.HashMap; import java.util.List; import static org.fest.assertions.Assertions.assertThat; @@ -98,7 +100,7 @@ public class AnalysisReportDaoTest { } @Test - public void select_one_report_by_project_key() { + public void find_one_report_by_project_key() { db.prepareDbUnit(getClass(), "select.xml"); final String projectKey = "123456789-987654321"; @@ -111,7 +113,7 @@ public class AnalysisReportDaoTest { } @Test - public void select_several_reports_by_project_key() { + public void find_several_reports_by_project_key() { db.prepareDbUnit(getClass(), "select.xml"); final String projectKey = "987654321-123456789"; @@ -119,4 +121,56 @@ public class AnalysisReportDaoTest { assertThat(reports).hasSize(2); } + + @Test + public void get_oldest_available_report() { + db.prepareDbUnit(getClass(), "select_oldest_available_report.xml"); + + final String projectKey = "123456789-987654321"; + AnalysisReportDto nextAvailableReport = dao.getNextAvailableReport(session); + + assertThat(nextAvailableReport.getId()).isEqualTo(2); + assertThat(nextAvailableReport.getProjectKey()).isEqualTo(projectKey); + } + + @Test + public void get_oldest_available_report_with_working_reports_older() { + db.prepareDbUnit(getClass(), "select_oldest_available_report_with_working_reports_older.xml"); + + final String projectKey = "123456789-987654321"; + AnalysisReportDto nextAvailableReport = dao.getNextAvailableReport(session); + + assertThat(nextAvailableReport.getId()).isEqualTo(2); + assertThat(nextAvailableReport.getProjectKey()).isEqualTo(projectKey); + } + + @Test + public void null_when_no_available_pending_report_because_working_report_on_the_same_project() { + db.prepareDbUnit(getClass(), "select-with-no-available-report.xml"); + + AnalysisReportDto nextAvailableReport = dao.getNextAvailableReport(session); + + assertThat(nextAvailableReport).isNull(); + } + + @Test(expected = UnsupportedOperationException.class) + public void doGetNullableByKey_is_not_implemented_yet() { + dao.doGetNullableByKey(session, "ANY_STRING"); + } + + @Test(expected = UnsupportedOperationException.class) + public void getSynchronizationParams_is_not_implemented_yet() { + dao.getSynchronizationParams(new Date(), new HashMap()); + } + + @Test(expected = UnsupportedOperationException.class) + public void doUpdate_is_not_implemented_yet() { + dao.doUpdate(session, new AnalysisReportDto()); + } + + @Test(expected = UnsupportedOperationException.class) + public void tryToBookReport_is_not_implemented_yet() { + dao.tryToBookReport(session, new AnalysisReportDto()); + } + } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select-with-no-available-report.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select-with-no-available-report.xml new file mode 100644 index 00000000000..8cb1fa05454 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select-with-no-available-report.xml @@ -0,0 +1,27 @@ + + + + + + \ No newline at end of file diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report.xml new file mode 100644 index 00000000000..64e74fcde20 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report_with_working_reports_older.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report_with_working_reports_older.xml new file mode 100644 index 00000000000..d0c7f426029 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report_with_working_reports_older.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file 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 82ed36befae..f54ff8e63a8 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 @@ -23,9 +23,6 @@ import org.sonar.core.persistence.Dto; import javax.annotation.Nullable; -/** - * since 5.0 - */ public class AnalysisReportDto extends Dto { private Long id; @@ -33,10 +30,6 @@ public class AnalysisReportDto extends Dto { private Status status; private String data; - public enum Status { - PENDING, WORKING - } - public String getProjectKey() { return projectKey; } @@ -73,8 +66,7 @@ public class AnalysisReportDto extends Dto { return id; } - public AnalysisReportDto setId(Long id) { - this.id = id; - return this; + public enum Status { + PENDING, WORKING } } 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 c32f0610070..e777a3ba5f7 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 @@ -22,14 +22,14 @@ package org.sonar.core.computation.db; import org.apache.ibatis.annotations.Param; import java.util.Date; +import java.util.List; -/** - * since 5.0 - */ public interface AnalysisReportMapper { void insert(AnalysisReportDto report); - java.util.List selectByProjectKey(String projectKey); + List selectByProjectKey(String projectKey); + + List selectNextAvailableReport(@Param("availableStatus") AnalysisReportDto.Status availableStatus, @Param("busyStatus") AnalysisReportDto.Status busyStatus); /** * startup task use only @@ -40,4 +40,6 @@ public interface AnalysisReportMapper { * startup task use only */ void cleanWithTruncate(); + + int update(AnalysisReportDto report); } 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 785e71a775e..b0b437b8ff6 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 @@ -3,12 +3,12 @@ - id, - project_key as projectKey, - report_status as status, - report_data as data, - created_at as createdAt, - updated_at as updatedAt + ar.id, + ar.project_key as projectKey, + ar.report_status as status, + ar.report_data as data, + ar.created_at as createdAt, + ar.updated_at as updatedAt @@ -29,7 +29,21 @@ + + \ No newline at end of file