import org.sonar.core.permission.GlobalPermissions;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.MyBatis;
+import org.sonar.server.computation.ComputationService;
import org.sonar.server.db.DbClient;
import org.sonar.server.issue.index.IssueAuthorizationIndex;
import org.sonar.server.issue.index.IssueIndex;
private final IndexClient index;
private final InternalPermissionService permissionService;
private final Settings settings;
+ private final ComputationService computationService;
- public UploadReportAction(DbClient dbClient, IndexClient index, InternalPermissionService permissionService, Settings settings) {
+ public UploadReportAction(DbClient dbClient, IndexClient index, InternalPermissionService permissionService, Settings settings, ComputationService computationService) {
this.dbClient = dbClient;
this.index = index;
this.permissionService = permissionService;
this.settings = settings;
+ this.computationService = computationService;
}
void define(WebService.NewController controller) {
String projectKey = request.mandatoryParam(PARAM_PROJECT);
AuthorizedComponentDto project = dbClient.componentDao().getAuthorizedComponentByKey(projectKey, session);
+ computationService.create(projectKey);
+
// Synchronize project permission indexes if no permission found on it
if (index.get(IssueAuthorizationIndex.class).getNullableByKey(project.key()) == null) {
permissionService.synchronizePermissions(session, project.key());
--- /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.api.ServerComponent;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.computation.db.AnalysisReportDao;
+import org.sonar.server.db.DbClient;
+
+import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING;
+
+/**
+ * since 5.0
+ */
+public class ComputationService implements ServerComponent {
+ private DbClient dbClient;
+
+ public ComputationService(DbClient dbClient) {
+ this.dbClient = dbClient;
+ }
+
+ public void create(String projectKey) {
+ AnalysisReportDto report = new AnalysisReportDto()
+ .setProjectKey(projectKey)
+ .setStatus(PENDING);
+
+ AnalysisReportDao dao = dbClient.analysisReportDao();
+
+ DbSession session = dbClient.openSession(false);
+ try {
+ dao.insert(session, report);
+ session.commit();
+ } finally {
+ session.close();
+ }
+ }
+}
--- /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.
+ */
+
+@ParametersAreNonnullByDefault
+package org.sonar.server.computation;
+
+import javax.annotation.ParametersAreNonnullByDefault;
import org.sonar.server.activity.db.ActivityDao;
import org.sonar.server.component.db.ComponentDao;
import org.sonar.server.component.db.SnapshotDao;
+import org.sonar.server.computation.db.AnalysisReportDao;
import org.sonar.server.issue.db.IssueAuthorizationDao;
import org.sonar.server.issue.db.IssueDao;
import org.sonar.server.measure.persistence.MeasureDao;
private final IssueDao issueDao;
private final IssueAuthorizationDao issueAuthorizationDao;
private final ActionPlanDao actionPlanDao;
+ private final AnalysisReportDao analysisReportDao;
public DbClient(Database db, MyBatis myBatis, DaoComponent... daoComponents) {
this.db = db;
issueDao = getDao(map, IssueDao.class);
issueAuthorizationDao = getDao(map, IssueAuthorizationDao.class);
actionPlanDao = getDao(map, ActionPlanDao.class);
+ analysisReportDao = getDao(map, AnalysisReportDao.class);
}
public Database database() {
return actionPlanDao;
}
+ public AnalysisReportDao analysisReportDao() {
+ return analysisReportDao;
+ }
+
private <K> K getDao(Map<Class, DaoComponent> map, Class<K> clazz) {
return (K) map.get(clazz);
}
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.ComputationService;
+import org.sonar.server.computation.db.AnalysisReportDao;
import org.sonar.server.config.ws.PropertiesWs;
import org.sonar.server.db.DatabaseChecker;
import org.sonar.server.db.DbClient;
MeasureFilterDao.class,
ActivityDao.class,
GroupDao.class,
+ AnalysisReportDao.class,
// Elasticsearch
SearchClient.class,
pico.addSingleton(FileDesignWidget.class);
pico.addSingleton(PackageDesignWidget.class);
+ // Compute engine
+ pico.addSingleton(ComputationService.class);
+
for (Object components : level4AddedComponents) {
pico.addSingleton(components);
}
import org.sonar.api.config.Settings;
import org.sonar.api.resources.Languages;
import org.sonar.core.properties.PropertiesDao;
+import org.sonar.server.computation.ComputationService;
import org.sonar.server.db.DbClient;
import org.sonar.server.permission.InternalPermissionService;
import org.sonar.server.qualityprofile.QProfileFactory;
new GlobalReferentialsAction(mock(DbClient.class), mock(PropertiesDao.class)),
new ProjectReferentialsAction(mock(DbClient.class), mock(PropertiesDao.class), mock(QProfileFactory.class), mock(QProfileLoader.class), mock(RuleService.class),
mock(Languages.class)),
- new UploadReportAction(mock(DbClient.class), mock(IndexClient.class), mock(InternalPermissionService.class), new Settings())));
+ new UploadReportAction(mock(DbClient.class), mock(IndexClient.class), mock(InternalPermissionService.class), new Settings(), mock(ComputationService.class))));
}
@Test
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING;
public class AnalysisReportDaoTest {
private AnalysisReportDao dao;
AnalysisReportDto report = new AnalysisReportDto()
.setProjectKey("123456789-987654321")
.setData("data-project")
- .setStatus("pending");
+ .setStatus(PENDING);
report.setCreatedAt(DateUtils.parseDate("2014-09-24"))
.setUpdatedAt(DateUtils.parseDate("2014-09-25"));
id="1"
project_key="123456789-987654321"
report_data="data-project"
- report_status="pending"
+ report_status="PENDING"
created_at="2014-09-24"
updated_at="2014-09-26"
/>
private Long id;
private String projectKey;
- private String status;
+ private Status status;
private String data;
+ public enum Status {
+ PENDING
+ }
+
public String getProjectKey() {
return projectKey;
}
return this;
}
- public String getStatus() {
+ public Status getStatus() {
return status;
}
- public AnalysisReportDto setStatus(String status) {
+ public AnalysisReportDto setStatus(Status status) {
this.status = status;
return this;
}