aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2014-09-29 17:55:11 +0200
committerJulien Lancelot <julien.lancelot@sonarsource.com>2014-10-02 15:27:03 +0200
commitd39f45c813ca96615ce4a0a858477fc7124b664d (patch)
tree02faedf691c70486b4e7ca6aa670697a2af81f61 /server
parentdf96c3460f794d418918b441b5ad0435ce24f520 (diff)
downloadsonarqube-d39f45c813ca96615ce4a0a858477fc7124b664d.tar.gz
sonarqube-d39f45c813ca96615ce4a0a858477fc7124b664d.zip
SONAR-5529 Remove usage of sonar.issues.use_es_backend property
Conflicts: server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java36
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueService.java388
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java343
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/OldIssueService.java317
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java469
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java20
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java3
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java174
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java14
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/batch/BatchWsTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceMediumTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java (renamed from server/sonar-server/src/test/java/org/sonar/server/issue/DefaultIssueServiceMediumTest.java)9
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/OldIssueServiceTest.java550
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueAuthorizationIndexMediumTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexMediumTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java439
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java4
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java26
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java18
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupMediumTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/search/IndexSynchronizerMediumTest.java6
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues.json33
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_action_plans.json39
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_attributes.json26
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_comments.json54
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_components.json49
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_dates.json26
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_debt.json24
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_extra_fields.json52
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_rules.json30
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_sub_project.json58
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_users.json33
34 files changed, 405 insertions, 2856 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 15290fb9cfb..7ab0dbf7724 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
@@ -21,7 +21,6 @@
package org.sonar.server.batch;
import com.google.common.collect.ImmutableMap;
-import org.sonar.api.config.Settings;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.RequestHandler;
import org.sonar.api.server.ws.Response;
@@ -46,14 +45,12 @@ public class UploadReportAction implements RequestHandler {
private final DbClient dbClient;
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, ComputationService computationService) {
+ public UploadReportAction(DbClient dbClient, IndexClient index, InternalPermissionService permissionService, ComputationService computationService) {
this.dbClient = dbClient;
this.index = index;
this.permissionService = permissionService;
- this.settings = settings;
this.computationService = computationService;
}
@@ -87,25 +84,22 @@ public class UploadReportAction implements RequestHandler {
MyBatis.closeQuietly(session);
}
- // Switch Issue search
- if (settings.getString("sonar.issues.use_es_backend") != null) {
- // Synchronization of lot of data can only be done with a batch session for the moment
- session = dbClient.openSession(true);
- try {
- // Synchronize project permission indexes if no permission found on it
- if (index.get(IssueAuthorizationIndex.class).getNullableByKey(projectKey) == null) {
- permissionService.synchronizePermissions(session, projectKey);
- session.commit();
- }
-
- // Index project's issues
- dbClient.issueDao().synchronizeAfter(session,
- index.get(IssueIndex.class).getLastSynchronization(),
- ImmutableMap.of("project", projectKey));
+ // Synchronization of lot of data can only be done with a batch session for the moment
+ session = dbClient.openSession(true);
+ try {
+ // Synchronize project permission indexes if no permission found on it
+ if (index.get(IssueAuthorizationIndex.class).getNullableByKey(projectKey) == null) {
+ permissionService.synchronizePermissions(session, projectKey);
session.commit();
- } finally {
- MyBatis.closeQuietly(session);
}
+
+ // Index project's issues
+ dbClient.issueDao().synchronizeAfter(session,
+ index.get(IssueIndex.class).getLastSynchronization(),
+ ImmutableMap.of("project", projectKey));
+ session.commit();
+ } finally {
+ MyBatis.closeQuietly(session);
}
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueService.java b/server/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueService.java
deleted file mode 100644
index 9eb6f17acb3..00000000000
--- a/server/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueService.java
+++ /dev/null
@@ -1,388 +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.issue;
-
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
-import com.google.common.base.Strings;
-import com.google.common.collect.HashMultiset;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Multiset;
-import org.apache.commons.lang.StringUtils;
-import org.sonar.api.issue.ActionPlan;
-import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.IssueQuery;
-import org.sonar.api.issue.internal.DefaultIssue;
-import org.sonar.api.issue.internal.IssueChangeContext;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.user.User;
-import org.sonar.api.user.UserFinder;
-import org.sonar.api.web.UserRole;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.issue.DefaultIssueBuilder;
-import org.sonar.core.issue.IssueNotifications;
-import org.sonar.core.issue.IssueUpdater;
-import org.sonar.core.issue.db.IssueDao;
-import org.sonar.core.issue.db.IssueDto;
-import org.sonar.core.issue.db.IssueStorage;
-import org.sonar.core.issue.workflow.IssueWorkflow;
-import org.sonar.core.issue.workflow.Transition;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.core.preview.PreviewCache;
-import org.sonar.core.rule.RuleDto;
-import org.sonar.server.db.DbClient;
-import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.issue.actionplan.ActionPlanService;
-import org.sonar.server.issue.index.IssueIndex;
-import org.sonar.server.search.IndexClient;
-import org.sonar.server.search.QueryContext;
-import org.sonar.server.user.UserSession;
-
-import javax.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-
-import static com.google.common.collect.Lists.newArrayList;
-
-public class DefaultIssueService implements IssueService {
-
- private final DbClient dbClient;
- private final IndexClient indexClient;
-
- private final IssueWorkflow workflow;
- private final IssueUpdater issueUpdater;
- private final IssueStorage issueStorage;
- private final IssueNotifications issueNotifications;
- private final ActionPlanService actionPlanService;
- private final RuleFinder ruleFinder;
- private final IssueDao issueDao;
- private final UserFinder userFinder;
- private final PreviewCache dryRunCache;
-
- public DefaultIssueService(DbClient dbClient, IndexClient indexClient,
- IssueWorkflow workflow,
- IssueStorage issueStorage,
- IssueUpdater issueUpdater,
- IssueNotifications issueNotifications,
- ActionPlanService actionPlanService,
- RuleFinder ruleFinder,
- IssueDao issueDao,
- UserFinder userFinder,
- PreviewCache dryRunCache) {
- this.dbClient = dbClient;
- this.indexClient = indexClient;
- this.workflow = workflow;
- this.issueStorage = issueStorage;
- this.issueUpdater = issueUpdater;
- this.actionPlanService = actionPlanService;
- this.ruleFinder = ruleFinder;
- this.issueNotifications = issueNotifications;
- this.issueDao = issueDao;
- this.userFinder = userFinder;
- this.dryRunCache = dryRunCache;
- }
-
- @Override
- public List<String> listStatus() {
- return workflow.statusKeys();
- }
-
- /**
- * List of available transitions.
- * <p/>
- * Never return null, but return an empty list if the issue does not exist.
- */
- @Override
- public List<Transition> listTransitions(String issueKey) {
- DbSession session = dbClient.openSession(false);
- try {
- return listTransitions(getIssueByKey(session, issueKey));
- } finally {
- session.close();
- }
- }
-
- /**
- * Never return null, but an empty list if the issue does not exist.
- * No security check is done since it should already have been done to get the issue
- */
- @Override
- public List<Transition> listTransitions(@Nullable Issue issue) {
- if (issue == null) {
- return Collections.emptyList();
- }
- List<Transition> outTransitions = workflow.outTransitions(issue);
- List<Transition> allowedTransitions = new ArrayList<Transition>();
- for (Transition transition : outTransitions) {
- String projectKey = issue.projectKey();
- if (StringUtils.isBlank(transition.requiredProjectPermission()) ||
- (projectKey != null && UserSession.get().hasProjectPermission(transition.requiredProjectPermission(), projectKey))) {
- allowedTransitions.add(transition);
- }
- }
- return allowedTransitions;
- }
-
- @Override
- public Issue doTransition(String issueKey, String transitionKey) {
- verifyLoggedIn();
-
- DbSession session = dbClient.openSession(false);
- try {
- DefaultIssue defaultIssue = getIssueByKey(session, issueKey);
- IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
- checkTransitionPermission(transitionKey, UserSession.get(), defaultIssue);
- if (workflow.doTransition(defaultIssue, transitionKey, context)) {
- saveIssue(session, defaultIssue, context);
- }
- return defaultIssue;
-
- } finally {
- session.close();
- }
- }
-
- private void checkTransitionPermission(String transitionKey, UserSession userSession, DefaultIssue defaultIssue) {
- List<Transition> outTransitions = workflow.outTransitions(defaultIssue);
- for (Transition transition : outTransitions) {
- String projectKey = defaultIssue.projectKey();
- if (transition.key().equals(transitionKey) && StringUtils.isNotBlank(transition.requiredProjectPermission()) && projectKey != null) {
- userSession.checkProjectPermission(transition.requiredProjectPermission(), projectKey);
- }
- }
- }
-
- @Override
- public Issue assign(String issueKey, @Nullable String assignee) {
- verifyLoggedIn();
-
- DbSession session = dbClient.openSession(false);
- try {
- DefaultIssue issue = getIssueByKey(session, issueKey);
- User user = null;
- if (!Strings.isNullOrEmpty(assignee)) {
- user = userFinder.findByLogin(assignee);
- if (user == null) {
- throw new NotFoundException("Unknown user: " + assignee);
- }
- }
- IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
- if (issueUpdater.assign(issue, user, context)) {
- saveIssue(session, issue, context);
- }
- return issue;
-
- } finally {
- session.close();
- }
- }
-
- @Override
- public Issue plan(String issueKey, @Nullable String actionPlanKey) {
- verifyLoggedIn();
-
- DbSession session = dbClient.openSession(false);
- try {
- ActionPlan actionPlan = null;
- if (!Strings.isNullOrEmpty(actionPlanKey)) {
- actionPlan = actionPlanService.findByKey(actionPlanKey, UserSession.get());
- if (actionPlan == null) {
- throw new NotFoundException("Unknown action plan: " + actionPlanKey);
- }
- }
- DefaultIssue issue = getIssueByKey(session, issueKey);
-
- IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
- if (issueUpdater.plan(issue, actionPlan, context)) {
- saveIssue(session, issue, context);
- }
- return issue;
-
- } finally {
- session.close();
- }
- }
-
- @Override
- public Issue setSeverity(String issueKey, String severity) {
- verifyLoggedIn();
-
- DbSession session = dbClient.openSession(false);
- try {
- DefaultIssue issue = getIssueByKey(session, issueKey);
- UserSession.get().checkProjectPermission(UserRole.ISSUE_ADMIN, issue.projectKey());
-
- IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
- if (issueUpdater.setManualSeverity(issue, severity, context)) {
- saveIssue(session, issue, context);
- }
- return issue;
- } finally {
- session.close();
- }
- }
-
- @Override
- public DefaultIssue createManualIssue(String componentKey, RuleKey ruleKey, @Nullable Integer line, @Nullable String message, @Nullable String severity,
- @Nullable Double effortToFix) {
- verifyLoggedIn();
-
- DbSession session = dbClient.openSession(false);
- try {
- ComponentDto component = dbClient.componentDao().getByKey(session, componentKey);
- ComponentDto project = dbClient.componentDao().getRootProjectByKey(componentKey, session);
-
- UserSession.get().checkProjectPermission(UserRole.USER, project.getKey());
- if (!ruleKey.isManual()) {
- throw new IllegalArgumentException("Issues can be created only on rules marked as 'manual': " + ruleKey);
- }
- Rule rule = getRuleByKey(ruleKey);
-
- DefaultIssue issue = new DefaultIssueBuilder()
- .componentKey(component.getKey())
- .projectKey(project.getKey())
- .line(line)
- .message(!Strings.isNullOrEmpty(message) ? message : rule.getName())
- .severity(Objects.firstNonNull(severity, Severity.MAJOR))
- .effortToFix(effortToFix)
- .ruleKey(ruleKey)
- .reporter(UserSession.get().login())
- .build();
-
- Date now = new Date();
- issue.setCreationDate(now);
- issue.setUpdateDate(now);
- issueStorage.save(issue);
- dryRunCache.reportResourceModification(component.getKey());
- return issue;
- } finally {
- session.close();
- }
- }
-
- // TODO result should be replaced by an aggregation object in IssueIndex
- @Override
- public RulesAggregation findRulesByComponent(String componentKey, @Nullable Date periodDate, DbSession session) {
- RulesAggregation rulesAggregation = new RulesAggregation();
- for (RuleDto ruleDto : issueDao.findRulesByComponent(componentKey, periodDate, session)) {
- rulesAggregation.add(ruleDto);
- }
- return rulesAggregation;
- }
-
- // TODO result should be replaced by an aggregation object in IssueIndex
- @Override
- public Multiset<String> findSeveritiesByComponent(String componentKey, @Nullable Date periodDate, DbSession session) {
- Multiset<String> aggregation = HashMultiset.create();
- for (String severity : issueDao.findSeveritiesByComponent(componentKey, periodDate, session)) {
- aggregation.add(severity);
- }
- return aggregation;
- }
-
- public DefaultIssue getIssueByKey(DbSession session, String key) {
- // Load from index to check permission
- Issue authorizedIssueIndex = indexClient.get(IssueIndex.class).getByKey(key);
- return dbClient.issueDao().getByKey(session, authorizedIssueIndex.key()).toDefaultIssue();
- }
-
- public DefaultIssue getIssueByKey(String key) {
- DbSession session = dbClient.openSession(false);
- try {
- // Load from index to check permission
- indexClient.get(IssueIndex.class).getByKey(key);
- return dbClient.issueDao().getByKey(session, key).toDefaultIssue();
- } finally {
- session.close();
- }
- }
-
- private void saveIssue(DbSession session, DefaultIssue issue, IssueChangeContext context) {
- String projectKey = issue.projectKey();
- if (projectKey == null) {
- throw new IllegalStateException(String.format("Issue '%s' has no project key", issue.key()));
- }
- issueStorage.save(issue);
- issueNotifications.sendChanges(issue, context,
- getRuleByKey(issue.ruleKey()),
- dbClient.componentDao().getByKey(session, projectKey),
- dbClient.componentDao().getNullableByKey(session, issue.componentKey()));
- dryRunCache.reportResourceModification(issue.componentKey());
- }
-
- private Rule getRuleByKey(RuleKey ruleKey) {
- Rule rule = ruleFinder.findByKey(ruleKey);
- if (rule == null) {
- throw new IllegalArgumentException("Unknown rule: " + ruleKey);
- }
- return rule;
- }
-
- public org.sonar.server.search.Result<Issue> search(IssueQuery query, QueryContext options) {
- return indexClient.get(IssueIndex.class).search(query, options);
- }
-
- /**
- * Warning, paging is not taken into account when using this method, max limit is set. (Only used to execute query for bulk change)
- * TODO move it to the IssueFilterService when OldIssueService will be removed
- */
- public List<Issue> searchFromQuery(IssueQuery query) {
- return indexClient.get(IssueIndex.class).search(query, new QueryContext().setMaxLimit()).getHits();
- }
-
- /**
- * Used by the bulk change : first load issues from E/S to load only authorized issues then load issues from DB in order to update them.
- * TODO move it to the IssueBulkChangeService when OldIssueService will be removed
- */
- @Override
- public List<Issue> search(List<String> issueKeys) {
- // Load from index to check permission
- List<Issue> authorizedIndexIssues = search(IssueQuery.builder().issueKeys(issueKeys).build(), new QueryContext().setMaxLimit()).getHits();
- List<String> authorizedIssueKeys = newArrayList(Iterables.transform(authorizedIndexIssues, new Function<Issue, String>() {
- @Override
- public String apply(@Nullable Issue input) {
- return input != null ? input.key() : null;
- }
- }));
-
- DbSession session = dbClient.openSession(false);
- try {
- List<IssueDto> issueDtos = dbClient.issueDao().getByKeys(session, authorizedIssueKeys);
- return newArrayList(Iterables.transform(issueDtos, new Function<IssueDto, Issue>() {
- @Override
- public Issue apply(@Nullable IssueDto input) {
- return input != null ? input.toDefaultIssue() : null;
- }
- }));
- } finally {
- session.close();
- }
- }
-
- private void verifyLoggedIn() {
- UserSession.get().checkLoggedIn();
- }
-}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java
index 0d6a6fc10eb..22a4bf71760 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java
@@ -17,53 +17,362 @@
* 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.issue;
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
+import com.google.common.collect.HashMultiset;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Multiset;
+import org.apache.commons.lang.StringUtils;
import org.sonar.api.ServerComponent;
+import org.sonar.api.issue.ActionPlan;
import org.sonar.api.issue.Issue;
import org.sonar.api.issue.IssueQuery;
import org.sonar.api.issue.internal.DefaultIssue;
+import org.sonar.api.issue.internal.IssueChangeContext;
import org.sonar.api.rule.RuleKey;
+import org.sonar.api.rule.Severity;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.user.User;
+import org.sonar.api.user.UserFinder;
+import org.sonar.api.web.UserRole;
+import org.sonar.core.component.ComponentDto;
+import org.sonar.core.issue.DefaultIssueBuilder;
+import org.sonar.core.issue.IssueNotifications;
+import org.sonar.core.issue.IssueUpdater;
+import org.sonar.core.issue.db.IssueDao;
+import org.sonar.core.issue.db.IssueDto;
+import org.sonar.core.issue.db.IssueStorage;
+import org.sonar.core.issue.workflow.IssueWorkflow;
import org.sonar.core.issue.workflow.Transition;
import org.sonar.core.persistence.DbSession;
+import org.sonar.core.preview.PreviewCache;
+import org.sonar.core.rule.RuleDto;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.server.issue.actionplan.ActionPlanService;
+import org.sonar.server.issue.index.IssueIndex;
+import org.sonar.server.search.IndexClient;
+import org.sonar.server.search.QueryContext;
+import org.sonar.server.user.UserSession;
import javax.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
import java.util.List;
-public interface IssueService extends ServerComponent {
- List<String> listStatus();
+import static com.google.common.collect.Lists.newArrayList;
+
+public class IssueService implements ServerComponent {
+
+ private final DbClient dbClient;
+ private final IndexClient indexClient;
+
+ private final IssueWorkflow workflow;
+ private final IssueUpdater issueUpdater;
+ private final IssueStorage issueStorage;
+ private final IssueNotifications issueNotifications;
+ private final ActionPlanService actionPlanService;
+ private final RuleFinder ruleFinder;
+ private final IssueDao issueDao;
+ private final UserFinder userFinder;
+ private final PreviewCache dryRunCache;
+
+ public IssueService(DbClient dbClient, IndexClient indexClient,
+ IssueWorkflow workflow,
+ IssueStorage issueStorage,
+ IssueUpdater issueUpdater,
+ IssueNotifications issueNotifications,
+ ActionPlanService actionPlanService,
+ RuleFinder ruleFinder,
+ IssueDao issueDao,
+ UserFinder userFinder,
+ PreviewCache dryRunCache) {
+ this.dbClient = dbClient;
+ this.indexClient = indexClient;
+ this.workflow = workflow;
+ this.issueStorage = issueStorage;
+ this.issueUpdater = issueUpdater;
+ this.actionPlanService = actionPlanService;
+ this.ruleFinder = ruleFinder;
+ this.issueNotifications = issueNotifications;
+ this.issueDao = issueDao;
+ this.userFinder = userFinder;
+ this.dryRunCache = dryRunCache;
+ }
+
+ public List<String> listStatus() {
+ return workflow.statusKeys();
+ }
+
+ /**
+ * List of available transitions.
+ * <p/>
+ * Never return null, but return an empty list if the issue does not exist.
+ */
+ public List<Transition> listTransitions(String issueKey) {
+ DbSession session = dbClient.openSession(false);
+ try {
+ return listTransitions(getIssueByKey(session, issueKey));
+ } finally {
+ session.close();
+ }
+ }
+
+ /**
+ * Never return null, but an empty list if the issue does not exist.
+ * No security check is done since it should already have been done to get the issue
+ */
+ public List<Transition> listTransitions(@Nullable Issue issue) {
+ if (issue == null) {
+ return Collections.emptyList();
+ }
+ List<Transition> outTransitions = workflow.outTransitions(issue);
+ List<Transition> allowedTransitions = new ArrayList<Transition>();
+ for (Transition transition : outTransitions) {
+ String projectKey = issue.projectKey();
+ if (StringUtils.isBlank(transition.requiredProjectPermission()) ||
+ (projectKey != null && UserSession.get().hasProjectPermission(transition.requiredProjectPermission(), projectKey))) {
+ allowedTransitions.add(transition);
+ }
+ }
+ return allowedTransitions;
+ }
+
+ public Issue doTransition(String issueKey, String transitionKey) {
+ verifyLoggedIn();
+
+ DbSession session = dbClient.openSession(false);
+ try {
+ DefaultIssue defaultIssue = getIssueByKey(session, issueKey);
+ IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
+ checkTransitionPermission(transitionKey, UserSession.get(), defaultIssue);
+ if (workflow.doTransition(defaultIssue, transitionKey, context)) {
+ saveIssue(session, defaultIssue, context);
+ }
+ return defaultIssue;
+
+ } finally {
+ session.close();
+ }
+ }
+
+ private void checkTransitionPermission(String transitionKey, UserSession userSession, DefaultIssue defaultIssue) {
+ List<Transition> outTransitions = workflow.outTransitions(defaultIssue);
+ for (Transition transition : outTransitions) {
+ String projectKey = defaultIssue.projectKey();
+ if (transition.key().equals(transitionKey) && StringUtils.isNotBlank(transition.requiredProjectPermission()) && projectKey != null) {
+ userSession.checkProjectPermission(transition.requiredProjectPermission(), projectKey);
+ }
+ }
+ }
- List<Transition> listTransitions(String issueKey);
+ public Issue assign(String issueKey, @Nullable String assignee) {
+ verifyLoggedIn();
- List<Transition> listTransitions(@Nullable Issue issue);
+ DbSession session = dbClient.openSession(false);
+ try {
+ DefaultIssue issue = getIssueByKey(session, issueKey);
+ User user = null;
+ if (!Strings.isNullOrEmpty(assignee)) {
+ user = userFinder.findByLogin(assignee);
+ if (user == null) {
+ throw new NotFoundException("Unknown user: " + assignee);
+ }
+ }
+ IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
+ if (issueUpdater.assign(issue, user, context)) {
+ saveIssue(session, issue, context);
+ }
+ return issue;
- Issue doTransition(String issueKey, String transitionKey);
+ } finally {
+ session.close();
+ }
+ }
- Issue assign(String issueKey, @Nullable String assignee);
+ public Issue plan(String issueKey, @Nullable String actionPlanKey) {
+ verifyLoggedIn();
- Issue plan(String issueKey, @Nullable String actionPlanKey);
+ DbSession session = dbClient.openSession(false);
+ try {
+ ActionPlan actionPlan = null;
+ if (!Strings.isNullOrEmpty(actionPlanKey)) {
+ actionPlan = actionPlanService.findByKey(actionPlanKey, UserSession.get());
+ if (actionPlan == null) {
+ throw new NotFoundException("Unknown action plan: " + actionPlanKey);
+ }
+ }
+ DefaultIssue issue = getIssueByKey(session, issueKey);
- Issue setSeverity(String issueKey, String severity);
+ IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
+ if (issueUpdater.plan(issue, actionPlan, context)) {
+ saveIssue(session, issue, context);
+ }
+ return issue;
- DefaultIssue createManualIssue(String componentKey, RuleKey ruleKey, @Nullable Integer line, @Nullable String message, @Nullable String severity,
- @Nullable Double effortToFix);
+ } finally {
+ session.close();
+ }
+ }
+
+ public Issue setSeverity(String issueKey, String severity) {
+ verifyLoggedIn();
+
+ DbSession session = dbClient.openSession(false);
+ try {
+ DefaultIssue issue = getIssueByKey(session, issueKey);
+ UserSession.get().checkProjectPermission(UserRole.ISSUE_ADMIN, issue.projectKey());
+
+ IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
+ if (issueUpdater.setManualSeverity(issue, severity, context)) {
+ saveIssue(session, issue, context);
+ }
+ return issue;
+ } finally {
+ session.close();
+ }
+ }
+
+ public DefaultIssue createManualIssue(String componentKey, RuleKey ruleKey, @Nullable Integer line, @Nullable String message, @Nullable String severity,
+ @Nullable Double effortToFix) {
+ verifyLoggedIn();
+
+ DbSession session = dbClient.openSession(false);
+ try {
+ ComponentDto component = dbClient.componentDao().getByKey(session, componentKey);
+ ComponentDto project = dbClient.componentDao().getRootProjectByKey(componentKey, session);
+
+ UserSession.get().checkProjectPermission(UserRole.USER, project.getKey());
+ if (!ruleKey.isManual()) {
+ throw new IllegalArgumentException("Issues can be created only on rules marked as 'manual': " + ruleKey);
+ }
+ Rule rule = getRuleByKey(ruleKey);
+
+ DefaultIssue issue = new DefaultIssueBuilder()
+ .componentKey(component.getKey())
+ .projectKey(project.getKey())
+ .line(line)
+ .message(!Strings.isNullOrEmpty(message) ? message : rule.getName())
+ .severity(Objects.firstNonNull(severity, Severity.MAJOR))
+ .effortToFix(effortToFix)
+ .ruleKey(ruleKey)
+ .reporter(UserSession.get().login())
+ .build();
+
+ Date now = new Date();
+ issue.setCreationDate(now);
+ issue.setUpdateDate(now);
+ issueStorage.save(issue);
+ dryRunCache.reportResourceModification(component.getKey());
+ return issue;
+ } finally {
+ session.close();
+ }
+ }
// TODO result should be replaced by an aggregation object in IssueIndex
- RulesAggregation findRulesByComponent(String componentKey, @Nullable Date periodDate, DbSession session);
+ public RulesAggregation findRulesByComponent(String componentKey, @Nullable Date periodDate, DbSession session) {
+ RulesAggregation rulesAggregation = new RulesAggregation();
+ for (RuleDto ruleDto : issueDao.findRulesByComponent(componentKey, periodDate, session)) {
+ rulesAggregation.add(ruleDto);
+ }
+ return rulesAggregation;
+ }
// TODO result should be replaced by an aggregation object in IssueIndex
- Multiset<String> findSeveritiesByComponent(String componentKey, @Nullable Date periodDate, DbSession session);
+ public Multiset<String> findSeveritiesByComponent(String componentKey, @Nullable Date periodDate, DbSession session) {
+ Multiset<String> aggregation = HashMultiset.create();
+ for (String severity : issueDao.findSeveritiesByComponent(componentKey, periodDate, session)) {
+ aggregation.add(severity);
+ }
+ return aggregation;
+ }
+
+ public DefaultIssue getIssueByKey(DbSession session, String key) {
+ // Load from index to check permission
+ Issue authorizedIssueIndex = indexClient.get(IssueIndex.class).getByKey(key);
+ return dbClient.issueDao().getByKey(session, authorizedIssueIndex.key()).toDefaultIssue();
+ }
+
+ public DefaultIssue getIssueByKey(String key) {
+ DbSession session = dbClient.openSession(false);
+ try {
+ // Load from index to check permission
+ indexClient.get(IssueIndex.class).getByKey(key);
+ return dbClient.issueDao().getByKey(session, key).toDefaultIssue();
+ } finally {
+ session.close();
+ }
+ }
+
+ private void saveIssue(DbSession session, DefaultIssue issue, IssueChangeContext context) {
+ String projectKey = issue.projectKey();
+ if (projectKey == null) {
+ throw new IllegalStateException(String.format("Issue '%s' has no project key", issue.key()));
+ }
+ issueStorage.save(issue);
+ issueNotifications.sendChanges(issue, context,
+ getRuleByKey(issue.ruleKey()),
+ dbClient.componentDao().getByKey(session, projectKey),
+ dbClient.componentDao().getNullableByKey(session, issue.componentKey()));
+ dryRunCache.reportResourceModification(issue.componentKey());
+ }
+
+ private Rule getRuleByKey(RuleKey ruleKey) {
+ Rule rule = ruleFinder.findByKey(ruleKey);
+ if (rule == null) {
+ throw new IllegalArgumentException("Unknown rule: " + ruleKey);
+ }
+ return rule;
+ }
- DefaultIssue getIssueByKey(DbSession session, String key);
+ public org.sonar.server.search.Result<Issue> search(IssueQuery query, QueryContext options) {
+ return indexClient.get(IssueIndex.class).search(query, options);
+ }
- DefaultIssue getIssueByKey(String key);
+ /**
+ * Warning, paging is not taken into account when using this method, max limit is set. (Only used to execute query for bulk change)
+ * TODO move it to the IssueFilterService when OldIssueService will be removed
+ */
+ public List<Issue> searchFromQuery(IssueQuery query) {
+ return indexClient.get(IssueIndex.class).search(query, new QueryContext().setMaxLimit()).getHits();
+ }
- List<Issue> searchFromQuery(IssueQuery query);
+ /**
+ * Used by the bulk change : first load issues from E/S to load only authorized issues then load issues from DB in order to update them.
+ * TODO move it to the IssueBulkChangeService when OldIssueService will be removed
+ */
+ public List<Issue> search(List<String> issueKeys) {
+ // Load from index to check permission
+ List<Issue> authorizedIndexIssues = search(IssueQuery.builder().issueKeys(issueKeys).build(), new QueryContext().setMaxLimit()).getHits();
+ List<String> authorizedIssueKeys = newArrayList(Iterables.transform(authorizedIndexIssues, new Function<Issue, String>() {
+ @Override
+ public String apply(@Nullable Issue input) {
+ return input != null ? input.key() : null;
+ }
+ }));
- List<Issue> search(List<String> issues);
+ DbSession session = dbClient.openSession(false);
+ try {
+ List<IssueDto> issueDtos = dbClient.issueDao().getByKeys(session, authorizedIssueKeys);
+ return newArrayList(Iterables.transform(issueDtos, new Function<IssueDto, Issue>() {
+ @Override
+ public Issue apply(@Nullable IssueDto input) {
+ return input != null ? input.toDefaultIssue() : null;
+ }
+ }));
+ } finally {
+ session.close();
+ }
+ }
+ private void verifyLoggedIn() {
+ UserSession.get().checkLoggedIn();
+ }
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/OldIssueService.java b/server/sonar-server/src/main/java/org/sonar/server/issue/OldIssueService.java
deleted file mode 100644
index 665572b5208..00000000000
--- a/server/sonar-server/src/main/java/org/sonar/server/issue/OldIssueService.java
+++ /dev/null
@@ -1,317 +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.issue;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Strings;
-import com.google.common.collect.HashMultiset;
-import com.google.common.collect.Multiset;
-import org.apache.commons.lang.StringUtils;
-import org.sonar.api.issue.ActionPlan;
-import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.IssueQuery;
-import org.sonar.api.issue.IssueQueryResult;
-import org.sonar.api.issue.internal.DefaultIssue;
-import org.sonar.api.issue.internal.IssueChangeContext;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.user.User;
-import org.sonar.api.user.UserFinder;
-import org.sonar.api.web.UserRole;
-import org.sonar.core.issue.DefaultIssueBuilder;
-import org.sonar.core.issue.IssueNotifications;
-import org.sonar.core.issue.IssueUpdater;
-import org.sonar.core.issue.db.IssueDao;
-import org.sonar.core.issue.db.IssueStorage;
-import org.sonar.core.issue.workflow.IssueWorkflow;
-import org.sonar.core.issue.workflow.Transition;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.core.preview.PreviewCache;
-import org.sonar.core.resource.ResourceDao;
-import org.sonar.core.resource.ResourceDto;
-import org.sonar.core.resource.ResourceQuery;
-import org.sonar.core.rule.RuleDto;
-import org.sonar.core.user.AuthorizationDao;
-import org.sonar.server.issue.actionplan.ActionPlanService;
-import org.sonar.server.user.UserSession;
-
-import javax.annotation.Nullable;
-
-import java.util.*;
-
-/**
- * @since 3.6
- */
-public class OldIssueService implements IssueService {
-
- private final DefaultIssueFinder finder;
- private final IssueWorkflow workflow;
- private final IssueUpdater issueUpdater;
- private final IssueStorage issueStorage;
- private final IssueNotifications issueNotifications;
- private final ActionPlanService actionPlanService;
- private final RuleFinder ruleFinder;
- private final ResourceDao resourceDao;
- private final IssueDao issueDao;
- private final AuthorizationDao authorizationDao;
- private final UserFinder userFinder;
- private final PreviewCache dryRunCache;
-
- public OldIssueService(
- DefaultIssueFinder finder,
- IssueWorkflow workflow,
- IssueStorage issueStorage,
- IssueUpdater issueUpdater,
- IssueNotifications issueNotifications,
- ActionPlanService actionPlanService,
- RuleFinder ruleFinder,
- ResourceDao resourceDao,
- IssueDao issueDao,
- AuthorizationDao authorizationDao,
- UserFinder userFinder,
- PreviewCache dryRunCache) {
- this.finder = finder;
- this.workflow = workflow;
- this.issueStorage = issueStorage;
- this.issueUpdater = issueUpdater;
- this.actionPlanService = actionPlanService;
- this.ruleFinder = ruleFinder;
- this.issueNotifications = issueNotifications;
- this.resourceDao = resourceDao;
- this.issueDao = issueDao;
- this.authorizationDao = authorizationDao;
- this.userFinder = userFinder;
- this.dryRunCache = dryRunCache;
- }
-
- /**
- * List of available transitions.
- * <p/>
- * Never return null, but return an empty list if the issue does not exist.
- */
- public List<Transition> listTransitions(String issueKey) {
- Issue issue = getIssueByKey(issueKey);
- return listTransitions(issue);
- }
-
- /**
- * Never return null, but an empty list if the issue does not exist.
- * No security check is done since it should already have been done to get the issue
- */
- public List<Transition> listTransitions(@Nullable Issue issue) {
- if (issue == null) {
- return Collections.emptyList();
- }
- List<Transition> outTransitions = workflow.outTransitions(issue);
- List<Transition> allowedTransitions = new ArrayList<Transition>();
- for (Transition transition : outTransitions) {
- DefaultIssue defaultIssue = (DefaultIssue) issue;
- String projectKey = defaultIssue.projectKey();
- if (StringUtils.isBlank(transition.requiredProjectPermission()) ||
- (projectKey != null && UserSession.get().hasProjectPermission(transition.requiredProjectPermission(), projectKey))) {
- allowedTransitions.add(transition);
- }
- }
- return allowedTransitions;
- }
-
- public Issue doTransition(String issueKey, String transitionKey) {
- verifyLoggedIn();
- IssueQueryResult queryResult = loadIssue(issueKey);
- DefaultIssue defaultIssue = (DefaultIssue) queryResult.first();
- IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
- checkTransitionPermission(transitionKey, UserSession.get(), defaultIssue);
- if (workflow.doTransition(defaultIssue, transitionKey, context)) {
- issueStorage.save(defaultIssue);
- issueNotifications.sendChanges(defaultIssue, context, queryResult);
- dryRunCache.reportResourceModification(defaultIssue.componentKey());
- }
- return defaultIssue;
- }
-
- private void checkTransitionPermission(String transitionKey, UserSession userSession, DefaultIssue defaultIssue) {
- List<Transition> outTransitions = workflow.outTransitions(defaultIssue);
- for (Transition transition : outTransitions) {
- String projectKey = defaultIssue.projectKey();
- if (transition.key().equals(transitionKey) && StringUtils.isNotBlank(transition.requiredProjectPermission()) && projectKey != null) {
- userSession.checkProjectPermission(transition.requiredProjectPermission(), projectKey);
- }
- }
- }
-
- public Issue assign(String issueKey, @Nullable String assignee) {
- verifyLoggedIn();
- IssueQueryResult queryResult = loadIssue(issueKey);
- DefaultIssue issue = (DefaultIssue) queryResult.first();
- User user = null;
- if (!Strings.isNullOrEmpty(assignee)) {
- user = userFinder.findByLogin(assignee);
- if (user == null) {
- throw new IllegalArgumentException("Unknown user: " + assignee);
- }
- }
- IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
- if (issueUpdater.assign(issue, user, context)) {
- issueStorage.save(issue);
- issueNotifications.sendChanges(issue, context, queryResult);
- dryRunCache.reportResourceModification(issue.componentKey());
- }
- return issue;
- }
-
- public Issue plan(String issueKey, @Nullable String actionPlanKey) {
- verifyLoggedIn();
- ActionPlan actionPlan = null;
- if (!Strings.isNullOrEmpty(actionPlanKey)) {
- actionPlan = actionPlanService.findByKey(actionPlanKey, UserSession.get());
- if (actionPlan == null) {
- throw new IllegalArgumentException("Unknown action plan: " + actionPlanKey);
- }
- }
- IssueQueryResult queryResult = loadIssue(issueKey);
- DefaultIssue issue = (DefaultIssue) queryResult.first();
-
- IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
- if (issueUpdater.plan(issue, actionPlan, context)) {
- issueStorage.save(issue);
- issueNotifications.sendChanges(issue, context, queryResult);
- dryRunCache.reportResourceModification(issue.componentKey());
- }
- return issue;
- }
-
- public Issue setSeverity(String issueKey, String severity) {
- verifyLoggedIn();
- IssueQueryResult queryResult = loadIssue(issueKey);
- DefaultIssue issue = (DefaultIssue) queryResult.first();
- UserSession.get().checkProjectPermission(UserRole.ISSUE_ADMIN, issue.projectKey());
-
- IssueChangeContext context = IssueChangeContext.createUser(new Date(), UserSession.get().login());
- if (issueUpdater.setManualSeverity(issue, severity, context)) {
- issueStorage.save(issue);
- issueNotifications.sendChanges(issue, context, queryResult);
- dryRunCache.reportResourceModification(issue.componentKey());
- }
- return issue;
- }
-
- public DefaultIssue createManualIssue(String componentKey, RuleKey ruleKey, @Nullable Integer line, @Nullable String message, @Nullable String severity,
- @Nullable Double effortToFix) {
- verifyLoggedIn();
- ResourceDto component = resourceDao.getResource(ResourceQuery.create().setKey(componentKey));
- ResourceDto project = resourceDao.getRootProjectByComponentKey(componentKey);
- if (component == null || project == null) {
- throw new IllegalArgumentException("Unknown component: " + componentKey);
- }
- if (!authorizationDao.isAuthorizedComponentKey(component.getKey(), UserSession.get().userId(), UserRole.USER)) {
- // TODO throw unauthorized
- throw new IllegalStateException("User does not have the required role");
- }
- if (!ruleKey.isManual()) {
- throw new IllegalArgumentException("Issues can be created only on rules marked as 'manual': " + ruleKey);
- }
- Rule rule = findRule(ruleKey);
-
- DefaultIssue issue = new DefaultIssueBuilder()
- .componentKey(component.getKey())
- .projectKey(project.getKey())
- .line(line)
- .message(!Strings.isNullOrEmpty(message) ? message : rule.getName())
- .severity(Objects.firstNonNull(severity, Severity.MAJOR))
- .effortToFix(effortToFix)
- .ruleKey(ruleKey)
- .reporter(UserSession.get().login())
- .build();
-
- Date now = new Date();
- issue.setCreationDate(now);
- issue.setUpdateDate(now);
- issueStorage.save(issue);
- dryRunCache.reportResourceModification(component.getKey());
- return issue;
- }
-
- private Rule findRule(RuleKey ruleKey) {
- Rule rule = ruleFinder.findByKey(ruleKey);
- if (rule == null) {
- throw new IllegalArgumentException("Unknown rule: " + ruleKey);
- }
- return rule;
- }
-
- public List<String> listStatus() {
- return workflow.statusKeys();
- }
-
- private void verifyLoggedIn() {
- if (!UserSession.get().isLoggedIn()) {
- // must be logged
- throw new IllegalStateException("User is not logged in");
- }
- }
-
- // TODO result should be replaced by an aggregation object in IssueIndex
- public RulesAggregation findRulesByComponent(String componentKey, @Nullable Date periodDate, DbSession session) {
- RulesAggregation rulesAggregation = new RulesAggregation();
- for (RuleDto ruleDto : issueDao.findRulesByComponent(componentKey, periodDate, session)) {
- rulesAggregation.add(ruleDto);
- }
- return rulesAggregation;
- }
-
- // TODO result should be replaced by an aggregation object in IssueIndex
- public Multiset<String> findSeveritiesByComponent(String componentKey, @Nullable Date periodDate, DbSession session) {
- Multiset<String> aggregation = HashMultiset.create();
- for (String severity : issueDao.findSeveritiesByComponent(componentKey, periodDate, session)) {
- aggregation.add(severity);
- }
- return aggregation;
- }
-
- public IssueQueryResult loadIssue(String issueKey) {
- IssueQueryResult result = finder.find(IssueQuery.builder().issueKeys(Arrays.asList(issueKey)).requiredRole(UserRole.USER).build());
- if (result.issues().size() != 1) {
- // TODO throw 404
- throw new IllegalArgumentException("Issue not found: " + issueKey);
- }
- return result;
- }
-
- @Override
- public DefaultIssue getIssueByKey(DbSession session, String key) {
- return (DefaultIssue) loadIssue(key).first();
- }
-
- @Override
- public DefaultIssue getIssueByKey(String key) {
- return (DefaultIssue) loadIssue(key).first();
- }
-
- public List<Issue> searchFromQuery(IssueQuery issueQuery) {
- return finder.find(issueQuery).issues();
- }
-
- @Override
- public List<Issue> search(List<String> issues) {
- return finder.find(IssueQuery.builder().issueKeys(issues).pageSize(-1).requiredRole(UserRole.USER).build()).issues();
- }
-}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java
deleted file mode 100644
index 5eafcc2d137..00000000000
--- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java
+++ /dev/null
@@ -1,469 +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.issue.ws;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import com.google.common.io.Resources;
-import org.sonar.api.component.Component;
-import org.sonar.api.i18n.I18n;
-import org.sonar.api.issue.*;
-import org.sonar.api.issue.internal.DefaultIssue;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.server.ws.Request;
-import org.sonar.api.server.ws.RequestHandler;
-import org.sonar.api.server.ws.Response;
-import org.sonar.api.server.ws.WebService;
-import org.sonar.api.user.User;
-import org.sonar.api.utils.DateUtils;
-import org.sonar.api.utils.Duration;
-import org.sonar.api.utils.Durations;
-import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.markdown.Markdown;
-import org.sonar.server.exceptions.BadRequestException;
-import org.sonar.server.issue.filter.IssueFilterParameters;
-import org.sonar.server.user.UserSession;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import static com.google.common.collect.Lists.newArrayList;
-
-@Deprecated
-public class IssueSearchAction implements RequestHandler {
-
- public static final String SEARCH_ACTION = "search";
-
- private static final String ACTIONS_EXTRA_FIELD = "actions";
- private static final String TRANSITIONS_EXTRA_FIELD = "transitions";
- private static final String ASSIGNEE_NAME_EXTRA_FIELD = "assigneeName";
- private static final String REPORTER_NAME_EXTRA_FIELD = "reporterName";
- private static final String ACTION_PLAN_NAME_EXTRA_FIELD = "actionPlanName";
-
- private static final String EXTRA_FIELDS_PARAM = "extra_fields";
-
- private final IssueFinder issueFinder;
- private final IssueActionsWriter actionsWriter;
- private final I18n i18n;
- private final Durations durations;
-
- public IssueSearchAction(IssueFinder issueFinder, IssueActionsWriter actionsWriter, I18n i18n, Durations durations) {
- this.issueFinder = issueFinder;
- this.actionsWriter = actionsWriter;
- this.i18n = i18n;
- this.durations = durations;
- }
-
- void define(WebService.NewController controller) {
- WebService.NewAction action = controller.createAction(SEARCH_ACTION)
- .setDescription("Get a list of issues. If the number of issues is greater than 10,000, only the first 10,000 ones are returned by the web service. " +
- "Requires Browse permission on project(s)")
- .setSince("3.6")
- .setHandler(this)
- .setResponseExample(Resources.getResource(this.getClass(), "example-search.json"));
-
- action.createParam(IssueFilterParameters.ISSUES)
- .setDescription("Comma-separated list of issue keys")
- .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef");
- action.createParam(IssueFilterParameters.SEVERITIES)
- .setDescription("Comma-separated list of severities")
- .setExampleValue(Severity.BLOCKER + "," + Severity.CRITICAL)
- .setPossibleValues(Severity.ALL);
- action.createParam(IssueFilterParameters.STATUSES)
- .setDescription("Comma-separated list of statuses")
- .setExampleValue(Issue.STATUS_OPEN + "," + Issue.STATUS_REOPENED)
- .setPossibleValues(Issue.STATUSES);
- action.createParam(IssueFilterParameters.RESOLUTIONS)
- .setDescription("Comma-separated list of resolutions")
- .setExampleValue(Issue.RESOLUTION_FIXED + "," + Issue.RESOLUTION_REMOVED)
- .setPossibleValues(Issue.RESOLUTIONS);
- action.createParam(IssueFilterParameters.RESOLVED)
- .setDescription("To match resolved or unresolved issues")
- .setBooleanPossibleValues();
- action.createParam(IssueFilterParameters.COMPONENTS)
- .setDescription("To retrieve issues associated to a specific list of components (comma-separated list of component keys). " +
- "Note that if you set the value to a project key, only issues associated to this project are retrieved. " +
- "Issues associated to its sub-components (such as files, packages, etc.) are not retrieved. See also componentRoots")
- .setExampleValue("org.apache.struts:struts:org.apache.struts.Action");
- action.createParam(IssueFilterParameters.COMPONENT_ROOTS)
- .setDescription("To retrieve issues associated to a specific list of components and their sub-components (comma-separated list of component keys). " +
- "Views are not supported")
- .setExampleValue("org.apache.struts:struts");
- action.createParam(IssueFilterParameters.RULES)
- .setDescription("Comma-separated list of coding rule keys. Format is <repository>:<rule>")
- .setExampleValue("squid:AvoidCycles");
- action.createParam(IssueFilterParameters.HIDE_RULES)
- .setDescription("To not return rules")
- .setBooleanPossibleValues();
- action.createParam(IssueFilterParameters.ACTION_PLANS)
- .setDescription("Comma-separated list of action plan keys (not names)")
- .setExampleValue("3f19de90-1521-4482-a737-a311758ff513");
- action.createParam(IssueFilterParameters.PLANNED)
- .setDescription("To retrieve issues associated to an action plan or not")
- .setBooleanPossibleValues();
- action.createParam(IssueFilterParameters.REPORTERS)
- .setDescription("Comma-separated list of reporter logins")
- .setExampleValue("admin");
- action.createParam(IssueFilterParameters.ASSIGNEES)
- .setDescription("Comma-separated list of assignee logins")
- .setExampleValue("admin,usera");
- action.createParam(IssueFilterParameters.ASSIGNED)
- .setDescription("To retrieve assigned or unassigned issues")
- .setBooleanPossibleValues();
- action.createParam(IssueFilterParameters.LANGUAGES)
- .setDescription("Comma-separated list of languages. Available since 4.4")
- .setExampleValue("java,js");
- action.createParam(EXTRA_FIELDS_PARAM)
- .setDescription("Add some extra fields on each issue. Available since 4.4")
- .setPossibleValues(ACTIONS_EXTRA_FIELD, TRANSITIONS_EXTRA_FIELD, ASSIGNEE_NAME_EXTRA_FIELD, REPORTER_NAME_EXTRA_FIELD, ACTION_PLAN_NAME_EXTRA_FIELD);
- action.createParam(IssueFilterParameters.CREATED_AT)
- .setDescription("To retrieve issues created at a given date. Format: date or datetime ISO formats")
- .setExampleValue("2013-05-01 (or 2013-05-01T13:00:00+0100)");
- action.createParam(IssueFilterParameters.CREATED_AFTER)
- .setDescription("To retrieve issues created after the given date (inclusive). Format: date or datetime ISO formats")
- .setExampleValue("2013-05-01 (or 2013-05-01T13:00:00+0100)");
- action.createParam(IssueFilterParameters.CREATED_BEFORE)
- .setDescription("To retrieve issues created before the given date (exclusive). Format: date or datetime ISO formats")
- .setExampleValue("2013-05-01 (or 2013-05-01T13:00:00+0100)");
- action.createParam(IssueFilterParameters.PAGE_SIZE)
- .setDescription("Maximum number of results per page. " +
- "Default value: 100 (except when the 'components' parameter is set, value is set to \"-1\" in this case). " +
- "If set to \"-1\", the max possible value is used")
- .setExampleValue("50");
- action.createParam(IssueFilterParameters.PAGE_INDEX)
- .setDescription("Index of the selected page")
- .setDefaultValue("1")
- .setExampleValue("2");
- action.createParam(IssueFilterParameters.SORT)
- .setDescription("Sort field")
- .setPossibleValues(IssueQuery.SORTS);
- action.createParam(IssueFilterParameters.ASC)
- .setDescription("Ascending sort")
- .setBooleanPossibleValues();
- action.createParam("format")
- .setDescription("Only json format is available. This parameter is kept only for backward compatibility and shouldn't be used anymore");
- }
-
- @Override
- public void handle(Request request, Response response) {
- checkFormatParameter(request);
- IssueQueryResult queryResult = issueFinder.find(createQuery(request));
-
- JsonWriter json = response.newJsonWriter();
- json.beginObject();
-
- writePaging(queryResult, json);
- writeIssues(queryResult, request.paramAsStrings(EXTRA_FIELDS_PARAM), json);
- writeComponents(queryResult, json);
- writeProjects(queryResult, json);
- writeRules(queryResult, json);
- writeUsers(queryResult, json);
- writeActionPlans(queryResult, json);
-
- json.endObject().close();
- }
-
- private void checkFormatParameter(Request request) {
- String format = request.param("format");
- if (!Strings.isNullOrEmpty(format) && !"json".equals(format)) {
- throw new BadRequestException("Only json format is supported.");
- }
- }
-
- private void writePaging(IssueQueryResult result, JsonWriter json) {
- json.prop("maxResultsReached", result.maxResultsReached());
- json.name("paging").beginObject()
- .prop("pageIndex", result.paging().pageIndex())
- .prop("pageSize", result.paging().pageSize())
- .prop("total", result.paging().total())
- .prop("fTotal", i18n.formatInteger(UserSession.get().locale(), result.paging().total()))
- .prop("pages", result.paging().pages())
- .endObject();
- }
-
- private void writeIssues(IssueQueryResult result, @Nullable List<String> extraFields, JsonWriter json) {
- json.name("issues").beginArray();
-
- for (Issue i : result.issues()) {
- json.beginObject();
-
- DefaultIssue issue = (DefaultIssue) i;
- String actionPlanKey = issue.actionPlanKey();
- Duration debt = issue.debt();
- Date updateDate = issue.updateDate();
-
- json
- .prop("key", issue.key())
- .prop("component", issue.componentKey())
- .prop("componentId", issue.componentId())
- .prop("project", issue.projectKey())
- .prop("rule", issue.ruleKey().toString())
- .prop("status", issue.status())
- .prop("resolution", issue.resolution())
- .prop("severity", issue.severity())
- .prop("message", issue.message())
- .prop("line", issue.line())
- .prop("debt", debt != null ? durations.encode(debt) : null)
- .prop("reporter", issue.reporter())
- .prop("assignee", issue.assignee())
- .prop("author", issue.authorLogin())
- .prop("actionPlan", actionPlanKey)
- .prop("creationDate", isoDate(issue.creationDate()))
- .prop("updateDate", isoDate(updateDate))
- .prop("fUpdateAge", formatAgeDate(updateDate))
- .prop("closeDate", isoDate(issue.closeDate()));
-
- writeIssueComments(result, issue, json);
- writeIssueAttributes(issue, json);
- writeIssueExtraFields(result, issue, extraFields, json);
- json.endObject();
- }
-
- json.endArray();
- }
-
- private void writeIssueComments(IssueQueryResult queryResult, Issue issue, JsonWriter json) {
- if (!issue.comments().isEmpty()) {
- json.name("comments").beginArray();
- String login = UserSession.get().login();
- for (IssueComment comment : issue.comments()) {
- String userLogin = comment.userLogin();
- User user = userLogin != null ? queryResult.user(userLogin) : null;
- json.beginObject()
- .prop("key", comment.key())
- .prop("login", comment.userLogin())
- .prop("userName", user != null ? user.name() : null)
- .prop("htmlText", Markdown.convertToHtml(comment.markdownText()))
- .prop("markdown", comment.markdownText())
- .prop("updatable", login != null && login.equals(userLogin))
- .prop("createdAt", DateUtils.formatDateTime(comment.createdAt()))
- .endObject();
- }
- json.endArray();
- }
- }
-
- private void writeIssueAttributes(Issue issue, JsonWriter json) {
- if (!issue.attributes().isEmpty()) {
- json.name("attr").beginObject();
- for (Map.Entry<String, String> entry : issue.attributes().entrySet()) {
- json.prop(entry.getKey(), entry.getValue());
- }
- json.endObject();
- }
- }
-
- private void writeIssueExtraFields(IssueQueryResult result, Issue issue, @Nullable List<String> extraFields, JsonWriter json) {
- if (extraFields != null && UserSession.get().isLoggedIn()) {
- if (extraFields.contains(ACTIONS_EXTRA_FIELD)) {
- actionsWriter.writeActions(issue, json);
- }
-
- if (extraFields.contains(TRANSITIONS_EXTRA_FIELD)) {
- actionsWriter.writeTransitions(issue, json);
- }
-
- String assignee = issue.assignee();
- if (extraFields.contains(ASSIGNEE_NAME_EXTRA_FIELD) && assignee != null) {
- User user = result.user(assignee);
- json.prop(ASSIGNEE_NAME_EXTRA_FIELD, user != null ? user.name() : null);
- }
-
- String reporter = issue.reporter();
- if (extraFields.contains(REPORTER_NAME_EXTRA_FIELD) && reporter != null) {
- User user = result.user(reporter);
- json.prop(REPORTER_NAME_EXTRA_FIELD, user != null ? user.name() : null);
- }
-
- String actionPlanKey = issue.actionPlanKey();
- if (extraFields.contains(ACTION_PLAN_NAME_EXTRA_FIELD) && actionPlanKey != null) {
- ActionPlan actionPlan = result.actionPlan(issue);
- json.prop(ACTION_PLAN_NAME_EXTRA_FIELD, actionPlan != null ? actionPlan.name() : null);
- }
- }
- }
-
- private void writeComponents(IssueQueryResult result, JsonWriter json) {
- json.name("components").beginArray();
- for (Component component : result.components()) {
- ComponentDto componentDto = (ComponentDto) component;
- json.beginObject()
- .prop("key", component.key())
- .prop("id", componentDto.getId())
- .prop("qualifier", component.qualifier())
- .prop("name", component.name())
- .prop("longName", component.longName())
- .prop("path", component.path())
- // On a root project, subProjectId is null but projectId is equal to itself, which make no sense.
- .prop("projectId", (componentDto.projectId() != null && componentDto.subProjectId() != null) ? componentDto.projectId() : null)
- .prop("subProjectId", componentDto.subProjectId())
- .endObject();
- }
- json.endArray();
- }
-
- private void writeProjects(IssueQueryResult result, JsonWriter json) {
- json.name("projects").beginArray();
- for (Component project : result.projects()) {
- ComponentDto componentDto = (ComponentDto) project;
- json.beginObject()
- .prop("key", project.key())
- .prop("id", componentDto.getId())
- .prop("qualifier", project.qualifier())
- .prop("name", project.name())
- .prop("longName", project.longName())
- .endObject();
- }
- json.endArray();
- }
-
- private void writeRules(IssueQueryResult result, JsonWriter json) {
- json.name("rules").beginArray();
- for (Rule rule : result.rules()) {
- json.beginObject()
- .prop("key", rule.ruleKey().toString())
- .prop("name", rule.getName())
- .prop("desc", rule.getDescription())
- .prop("status", rule.getStatus())
- .endObject();
- }
- json.endArray();
- }
-
- private void writeUsers(IssueQueryResult result, JsonWriter json) {
- json.name("users").beginArray();
- for (User user : result.users()) {
- json.beginObject()
- .prop("login", user.login())
- .prop("name", user.name())
- .prop("active", user.active())
- .prop("email", user.email())
- .endObject();
- }
- json.endArray();
- }
-
- private void writeActionPlans(IssueQueryResult result, JsonWriter json) {
- if (!result.actionPlans().isEmpty()) {
- json.name("actionPlans").beginArray();
- for (ActionPlan actionPlan : result.actionPlans()) {
- Date deadLine = actionPlan.deadLine();
- Date updatedAt = actionPlan.updatedAt();
-
- json.beginObject()
- .prop("key", actionPlan.key())
- .prop("name", actionPlan.name())
- .prop("status", actionPlan.status())
- .prop("project", actionPlan.projectKey())
- .prop("userLogin", actionPlan.userLogin())
- .prop("deadLine", isoDate(deadLine))
- .prop("fDeadLine", formatDate(deadLine))
- .prop("createdAt", isoDate(actionPlan.createdAt()))
- .prop("fCreatedAt", formatDate(actionPlan.createdAt()))
- .prop("updatedAt", isoDate(actionPlan.updatedAt()))
- .prop("fUpdatedAt", formatDate(updatedAt))
- .endObject();
- }
- json.endArray();
- }
- }
-
- @CheckForNull
- private String isoDate(@Nullable Date date) {
- if (date != null) {
- return DateUtils.formatDateTime(date);
- }
- return null;
- }
-
- @CheckForNull
- private String formatDate(@Nullable Date date) {
- if (date != null) {
- return i18n.formatDateTime(UserSession.get().locale(), date);
- }
- return null;
- }
-
- @CheckForNull
- private String formatAgeDate(@Nullable Date date) {
- if (date != null) {
- return i18n.ageFromNow(UserSession.get().locale(), date);
- }
- return null;
- }
-
- @CheckForNull
- private static Collection<RuleKey> stringsToRules(@Nullable Collection<String> rules) {
- if (rules != null) {
- return newArrayList(Iterables.transform(rules, new Function<String, RuleKey>() {
- @Override
- public RuleKey apply(@Nullable String s) {
- return s != null ? RuleKey.parse(s) : null;
- }
- }));
- }
- return null;
- }
-
- @VisibleForTesting
- static IssueQuery createQuery(Request request) {
- IssueQuery.Builder builder = IssueQuery.builder()
- .requiredRole(UserRole.USER)
- .issueKeys(request.paramAsStrings(IssueFilterParameters.ISSUES))
- .severities(request.paramAsStrings(IssueFilterParameters.SEVERITIES))
- .statuses(request.paramAsStrings(IssueFilterParameters.STATUSES))
- .resolutions(request.paramAsStrings(IssueFilterParameters.RESOLUTIONS))
- .resolved(request.paramAsBoolean(IssueFilterParameters.RESOLVED))
- .components(request.paramAsStrings(IssueFilterParameters.COMPONENTS))
- .componentRoots(request.paramAsStrings(IssueFilterParameters.COMPONENT_ROOTS))
- .rules(stringsToRules(request.paramAsStrings(IssueFilterParameters.RULES)))
- .actionPlans(request.paramAsStrings(IssueFilterParameters.ACTION_PLANS))
- .reporters(request.paramAsStrings(IssueFilterParameters.REPORTERS))
- .assignees(request.paramAsStrings(IssueFilterParameters.ASSIGNEES))
- .languages(request.paramAsStrings(IssueFilterParameters.LANGUAGES))
- .assigned(request.paramAsBoolean(IssueFilterParameters.ASSIGNED))
- .planned(request.paramAsBoolean(IssueFilterParameters.PLANNED))
- .hideRules(request.paramAsBoolean(IssueFilterParameters.HIDE_RULES))
- .createdAt(request.paramAsDateTime(IssueFilterParameters.CREATED_AT))
- .createdAfter(request.paramAsDateTime(IssueFilterParameters.CREATED_AFTER))
- .createdBefore(request.paramAsDateTime(IssueFilterParameters.CREATED_BEFORE))
- .pageSize(request.paramAsInt(IssueFilterParameters.PAGE_SIZE))
- .pageIndex(request.paramAsInt(IssueFilterParameters.PAGE_INDEX));
- String sort = request.param(IssueFilterParameters.SORT);
- if (!Strings.isNullOrEmpty(sort)) {
- builder.sort(sort);
- builder.asc(request.paramAsBoolean(IssueFilterParameters.ASC));
- }
- return builder.build();
- }
-
-}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java
index 13e4aa4e4db..090340e35cb 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java
@@ -43,21 +43,11 @@ public class IssuesWs implements WebService {
public static final String BULK_CHANGE_ACTION = "bulk_change";
private final IssueShowAction showAction;
- private final IssueSearchAction searchAction;
private final SearchAction esSearchAction;
- public IssuesWs(IssueShowAction showAction, IssueSearchAction searchAction) {
- this(showAction, null, searchAction);
- }
-
public IssuesWs(IssueShowAction showAction, SearchAction searchAction) {
- this(showAction, searchAction, null);
- }
-
- private IssuesWs(IssueShowAction showAction, SearchAction esSearchAction, IssueSearchAction searchAction) {
this.showAction = showAction;
- this.esSearchAction = esSearchAction;
- this.searchAction = searchAction;
+ this.esSearchAction = searchAction;
}
@Override
@@ -67,13 +57,7 @@ public class IssuesWs implements WebService {
controller.setSince("3.6");
showAction.define(controller);
-
- // TODO remove after transition
- if (esSearchAction != null) {
- esSearchAction.define(controller);
- } else if (searchAction != null) {
- searchAction.define(controller);
- }
+ esSearchAction.define(controller);
defineChangelogAction(controller);
defineAssignAction(controller);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java
index c5f39b98ae5..c400e991d62 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java
@@ -47,7 +47,6 @@ import org.sonar.core.issue.db.IssueChangeDao;
import org.sonar.core.persistence.DbSession;
import org.sonar.markdown.Markdown;
import org.sonar.server.db.DbClient;
-import org.sonar.server.issue.DefaultIssueService;
import org.sonar.server.issue.IssueService;
import org.sonar.server.issue.actionplan.ActionPlanService;
import org.sonar.server.issue.filter.IssueFilterParameters;
@@ -223,7 +222,7 @@ public class SearchAction extends SearchRequestHandler<IssueQuery, Issue> {
if (components != null && components.size() == 1) {
context.setShowFullResult(true);
}
- return ((DefaultIssueService) service).search(query, context);
+ return ((IssueService) service).search(query, context);
}
@Override
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 8192bf32e6b..73a9492f21e 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
@@ -40,6 +40,7 @@ import org.sonar.core.component.SnapshotPerspectives;
import org.sonar.core.config.CorePropertyDefinitions;
import org.sonar.core.config.Logback;
import org.sonar.core.i18n.DefaultI18n;
+import org.sonar.core.i18n.GwtI18n;
import org.sonar.core.i18n.RuleI18nManager;
import org.sonar.core.issue.IssueFilterSerializer;
import org.sonar.core.issue.IssueNotifications;
@@ -50,13 +51,7 @@ import org.sonar.core.measure.db.MeasureFilterDao;
import org.sonar.core.metric.DefaultMetricFinder;
import org.sonar.core.notification.DefaultNotificationManager;
import org.sonar.core.permission.PermissionFacade;
-import org.sonar.core.persistence.DaoUtils;
-import org.sonar.core.persistence.DatabaseVersion;
-import org.sonar.core.persistence.DefaultDatabase;
-import org.sonar.core.persistence.MyBatis;
-import org.sonar.core.persistence.PreviewDatabaseFactory;
-import org.sonar.core.persistence.SemaphoreUpdater;
-import org.sonar.core.persistence.SemaphoresImpl;
+import org.sonar.core.persistence.*;
import org.sonar.core.preview.PreviewCache;
import org.sonar.core.profiling.Profiling;
import org.sonar.core.purge.PurgeProfiler;
@@ -82,22 +77,14 @@ import org.sonar.server.activity.index.ActivityNormalizer;
import org.sonar.server.activity.ws.ActivitiesWebService;
import org.sonar.server.activity.ws.ActivityMapping;
import org.sonar.server.authentication.ws.AuthenticationWs;
-import org.sonar.server.batch.BatchIndex;
-import org.sonar.server.batch.BatchWs;
-import org.sonar.server.batch.GlobalReferentialsAction;
-import org.sonar.server.batch.ProjectReferentialsAction;
-import org.sonar.server.batch.UploadReportAction;
+import org.sonar.server.batch.*;
import org.sonar.server.charts.ChartFactory;
import org.sonar.server.component.ComponentCleanerService;
import org.sonar.server.component.DefaultComponentFinder;
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.ComponentAppAction;
-import org.sonar.server.component.ws.ComponentsWs;
-import org.sonar.server.component.ws.EventsWs;
-import org.sonar.server.component.ws.ProjectsWs;
-import org.sonar.server.component.ws.ResourcesWs;
+import org.sonar.server.component.ws.*;
import org.sonar.server.computation.AnalysisReportTasksCleaner;
import org.sonar.server.computation.ComputationService;
import org.sonar.server.computation.db.AnalysisReportDao;
@@ -112,36 +99,13 @@ import org.sonar.server.db.DbClient;
import org.sonar.server.db.EmbeddedDatabaseFactory;
import org.sonar.server.db.migrations.DatabaseMigrations;
import org.sonar.server.db.migrations.DatabaseMigrator;
-import org.sonar.server.debt.DebtCharacteristicsXMLImporter;
-import org.sonar.server.debt.DebtModelBackup;
-import org.sonar.server.debt.DebtModelLookup;
-import org.sonar.server.debt.DebtModelOperations;
-import org.sonar.server.debt.DebtModelPluginRepository;
-import org.sonar.server.debt.DebtModelService;
-import org.sonar.server.debt.DebtModelXMLExporter;
-import org.sonar.server.debt.DebtRulesXMLImporter;
+import org.sonar.server.debt.*;
import org.sonar.server.design.FileDesignWidget;
import org.sonar.server.design.PackageDesignWidget;
import org.sonar.server.duplication.ws.DuplicationsJsonWriter;
import org.sonar.server.duplication.ws.DuplicationsParser;
import org.sonar.server.duplication.ws.DuplicationsWs;
-import org.sonar.server.issue.ActionService;
-import org.sonar.server.issue.AssignAction;
-import org.sonar.server.issue.CommentAction;
-import org.sonar.server.issue.DefaultIssueFinder;
-import org.sonar.server.issue.DefaultIssueService;
-import org.sonar.server.issue.InternalRubyIssueService;
-import org.sonar.server.issue.IssueBulkChangeService;
-import org.sonar.server.issue.IssueChangelogFormatter;
-import org.sonar.server.issue.IssueChangelogService;
-import org.sonar.server.issue.IssueCommentService;
-import org.sonar.server.issue.IssueStatsFinder;
-import org.sonar.server.issue.OldIssueService;
-import org.sonar.server.issue.PlanAction;
-import org.sonar.server.issue.PublicRubyIssueService;
-import org.sonar.server.issue.ServerIssueStorage;
-import org.sonar.server.issue.SetSeverityAction;
-import org.sonar.server.issue.TransitionAction;
+import org.sonar.server.issue.*;
import org.sonar.server.issue.actionplan.ActionPlanService;
import org.sonar.server.issue.actionplan.ActionPlanWs;
import org.sonar.server.issue.db.IssueAuthorizationDao;
@@ -154,7 +118,6 @@ import org.sonar.server.issue.index.IssueAuthorizationNormalizer;
import org.sonar.server.issue.index.IssueIndex;
import org.sonar.server.issue.index.IssueNormalizer;
import org.sonar.server.issue.ws.IssueActionsWriter;
-import org.sonar.server.issue.ws.IssueSearchAction;
import org.sonar.server.issue.ws.IssueShowAction;
import org.sonar.server.issue.ws.IssuesWs;
import org.sonar.server.measure.MeasureFilterEngine;
@@ -175,84 +138,22 @@ import org.sonar.server.platform.ws.L10nWs;
import org.sonar.server.platform.ws.RestartHandler;
import org.sonar.server.platform.ws.ServerWs;
import org.sonar.server.platform.ws.SystemWs;
-import org.sonar.server.plugins.InstalledPluginReferentialFactory;
-import org.sonar.server.plugins.PluginDownloader;
-import org.sonar.server.plugins.ServerExtensionInstaller;
-import org.sonar.server.plugins.ServerPluginJarInstaller;
-import org.sonar.server.plugins.ServerPluginJarsInstaller;
-import org.sonar.server.plugins.ServerPluginRepository;
-import org.sonar.server.plugins.UpdateCenterClient;
-import org.sonar.server.plugins.UpdateCenterMatrixFactory;
+import org.sonar.server.plugins.*;
import org.sonar.server.qualitygate.QgateProjectFinder;
import org.sonar.server.qualitygate.QualityGates;
import org.sonar.server.qualitygate.RegisterQualityGates;
-import org.sonar.server.qualitygate.ws.QGatesAppAction;
-import org.sonar.server.qualitygate.ws.QGatesCopyAction;
-import org.sonar.server.qualitygate.ws.QGatesCreateAction;
-import org.sonar.server.qualitygate.ws.QGatesCreateConditionAction;
-import org.sonar.server.qualitygate.ws.QGatesDeleteConditionAction;
-import org.sonar.server.qualitygate.ws.QGatesDeselectAction;
-import org.sonar.server.qualitygate.ws.QGatesDestroyAction;
-import org.sonar.server.qualitygate.ws.QGatesListAction;
-import org.sonar.server.qualitygate.ws.QGatesRenameAction;
-import org.sonar.server.qualitygate.ws.QGatesSearchAction;
-import org.sonar.server.qualitygate.ws.QGatesSelectAction;
-import org.sonar.server.qualitygate.ws.QGatesSetAsDefaultAction;
-import org.sonar.server.qualitygate.ws.QGatesShowAction;
-import org.sonar.server.qualitygate.ws.QGatesUnsetDefaultAction;
-import org.sonar.server.qualitygate.ws.QGatesUpdateConditionAction;
-import org.sonar.server.qualitygate.ws.QGatesWs;
-import org.sonar.server.qualityprofile.BuiltInProfiles;
-import org.sonar.server.qualityprofile.QProfileBackuper;
-import org.sonar.server.qualityprofile.QProfileCopier;
-import org.sonar.server.qualityprofile.QProfileExporters;
-import org.sonar.server.qualityprofile.QProfileFactory;
-import org.sonar.server.qualityprofile.QProfileLoader;
-import org.sonar.server.qualityprofile.QProfileLookup;
-import org.sonar.server.qualityprofile.QProfileProjectLookup;
-import org.sonar.server.qualityprofile.QProfileProjectOperations;
-import org.sonar.server.qualityprofile.QProfileRepositoryExporter;
-import org.sonar.server.qualityprofile.QProfileReset;
-import org.sonar.server.qualityprofile.QProfileService;
-import org.sonar.server.qualityprofile.QProfiles;
-import org.sonar.server.qualityprofile.RegisterQualityProfiles;
-import org.sonar.server.qualityprofile.RuleActivator;
-import org.sonar.server.qualityprofile.RuleActivatorContextFactory;
+import org.sonar.server.qualitygate.ws.*;
+import org.sonar.server.qualityprofile.*;
import org.sonar.server.qualityprofile.db.ActiveRuleDao;
import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer;
-import org.sonar.server.qualityprofile.ws.BulkRuleActivationActions;
-import org.sonar.server.qualityprofile.ws.ProfilesWs;
-import org.sonar.server.qualityprofile.ws.QProfileRestoreBuiltInAction;
-import org.sonar.server.qualityprofile.ws.QProfilesWs;
-import org.sonar.server.qualityprofile.ws.RuleActivationActions;
-import org.sonar.server.rule.DefaultRuleFinder;
-import org.sonar.server.rule.DeprecatedRulesDefinition;
-import org.sonar.server.rule.RegisterRules;
-import org.sonar.server.rule.RubyRuleService;
-import org.sonar.server.rule.RuleCreator;
-import org.sonar.server.rule.RuleDefinitionsLoader;
-import org.sonar.server.rule.RuleDeleter;
-import org.sonar.server.rule.RuleOperations;
-import org.sonar.server.rule.RuleRepositories;
-import org.sonar.server.rule.RuleService;
-import org.sonar.server.rule.RuleUpdater;
+import org.sonar.server.qualityprofile.ws.*;
+import org.sonar.server.rule.*;
import org.sonar.server.rule.db.RuleDao;
import org.sonar.server.rule.index.RuleIndex;
import org.sonar.server.rule.index.RuleNormalizer;
-import org.sonar.server.rule.ws.ActiveRuleCompleter;
-import org.sonar.server.rule.ws.AppAction;
-import org.sonar.server.rule.ws.DeleteAction;
-import org.sonar.server.rule.ws.RuleMapping;
-import org.sonar.server.rule.ws.RulesWebService;
-import org.sonar.server.rule.ws.SearchAction;
-import org.sonar.server.rule.ws.TagsAction;
-import org.sonar.server.rule.ws.UpdateAction;
-import org.sonar.server.search.IndexClient;
-import org.sonar.server.search.IndexQueue;
-import org.sonar.server.search.IndexSynchronizer;
-import org.sonar.server.search.SearchClient;
-import org.sonar.server.search.SearchHealth;
+import org.sonar.server.rule.ws.*;
+import org.sonar.server.search.*;
import org.sonar.server.source.CodeColorizers;
import org.sonar.server.source.DeprecatedSourceDecorator;
import org.sonar.server.source.HtmlSourceDecorator;
@@ -261,26 +162,9 @@ import org.sonar.server.source.ws.ScmAction;
import org.sonar.server.source.ws.ScmWriter;
import org.sonar.server.source.ws.ShowAction;
import org.sonar.server.source.ws.SourcesWs;
-import org.sonar.server.startup.CleanPreviewAnalysisCache;
-import org.sonar.server.startup.CopyRequirementsFromCharacteristicsToRules;
-import org.sonar.server.startup.GeneratePluginIndex;
-import org.sonar.server.startup.JdbcDriverDeployer;
-import org.sonar.server.startup.LogServerId;
-import org.sonar.server.startup.RegisterDashboards;
-import org.sonar.server.startup.RegisterDebtModel;
-import org.sonar.server.startup.RegisterMetrics;
-import org.sonar.server.startup.RegisterNewMeasureFilters;
-import org.sonar.server.startup.RegisterPermissionTemplates;
-import org.sonar.server.startup.RegisterServletFilters;
-import org.sonar.server.startup.RenameDeprecatedPropertyKeys;
-import org.sonar.server.startup.ServerMetadataPersister;
+import org.sonar.server.startup.*;
import org.sonar.server.test.CoverageService;
-import org.sonar.server.test.ws.CoverageShowAction;
-import org.sonar.server.test.ws.CoverageWs;
-import org.sonar.server.test.ws.TestsCoveredFilesAction;
-import org.sonar.server.test.ws.TestsShowAction;
-import org.sonar.server.test.ws.TestsTestCasesAction;
-import org.sonar.server.test.ws.TestsWs;
+import org.sonar.server.test.ws.*;
import org.sonar.server.text.MacroInterpreter;
import org.sonar.server.text.RubyTextService;
import org.sonar.server.ui.JRubyI18n;
@@ -288,23 +172,12 @@ import org.sonar.server.ui.JRubyProfiling;
import org.sonar.server.ui.PageDecorations;
import org.sonar.server.ui.Views;
import org.sonar.server.updatecenter.ws.UpdateCenterWs;
-import org.sonar.server.user.DefaultUserService;
-import org.sonar.server.user.DoPrivileged;
-import org.sonar.server.user.GroupMembershipFinder;
-import org.sonar.server.user.GroupMembershipService;
-import org.sonar.server.user.NewUserNotifier;
-import org.sonar.server.user.SecurityRealmFactory;
+import org.sonar.server.user.*;
import org.sonar.server.user.db.GroupDao;
import org.sonar.server.user.ws.FavoritesWs;
import org.sonar.server.user.ws.UserPropertiesWs;
import org.sonar.server.user.ws.UsersWs;
-import org.sonar.server.util.BooleanTypeValidation;
-import org.sonar.server.util.FloatTypeValidation;
-import org.sonar.server.util.IntegerTypeValidation;
-import org.sonar.server.util.StringListTypeValidation;
-import org.sonar.server.util.StringTypeValidation;
-import org.sonar.server.util.TextTypeValidation;
-import org.sonar.server.util.TypeValidations;
+import org.sonar.server.util.*;
import org.sonar.server.ws.ListingWs;
import org.sonar.server.ws.WebServiceEngine;
@@ -425,6 +298,7 @@ class ServerComponents {
JRubyI18n.class,
DefaultI18n.class,
RuleI18nManager.class,
+ GwtI18n.class,
Durations.class,
// ws
@@ -628,15 +502,8 @@ class ServerComponents {
pico.addSingleton(IssueChangelogFormatter.class);
pico.addSingleton(IssuesWs.class);
pico.addSingleton(IssueShowAction.class);
-
- // Switch Issue search
- if (properties.getProperty("sonar.issues.use_es_backend", null) != null) {
- pico.addSingleton(org.sonar.server.issue.ws.SearchAction.class);
- pico.addSingleton(DefaultIssueService.class);
- } else {
- pico.addSingleton(IssueSearchAction.class);
- pico.addSingleton(OldIssueService.class);
- }
+ pico.addSingleton(org.sonar.server.issue.ws.SearchAction.class);
+ pico.addSingleton(IssueService.class);
pico.addSingleton(IssueActionsWriter.class);
// issue filters
@@ -748,6 +615,7 @@ class ServerComponents {
/** Index startup Synchronization */
startupContainer.addSingleton(IndexSynchronizer.class);
+ startupContainer.addSingleton(GwtPublisher.class);
startupContainer.addSingleton(RegisterMetrics.class);
startupContainer.addSingleton(RegisterQualityGates.class);
startupContainer.addSingleton(RegisterRules.class);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java b/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java
index c881df181f9..082c029a8ce 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java
@@ -21,7 +21,6 @@ package org.sonar.server.search;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.sonar.api.config.Settings;
import org.sonar.core.persistence.DbSession;
import org.sonar.server.activity.index.ActivityIndex;
import org.sonar.server.db.Dao;
@@ -42,12 +41,10 @@ public class IndexSynchronizer {
private final DbClient db;
private final IndexClient index;
- private final Settings settings;
- public IndexSynchronizer(DbClient db, IndexClient index, Settings settings) {
+ public IndexSynchronizer(DbClient db, IndexClient index) {
this.db = db;
this.index = index;
- this.settings = settings;
}
public void execute() {
@@ -56,13 +53,8 @@ public class IndexSynchronizer {
LOG.info("Starting DB to Index synchronization");
long start = System.currentTimeMillis();
synchronize(session, db.ruleDao(), index.get(RuleIndex.class));
-
- // Switch Issue search
- if (settings.getString("sonar.issues.use_es_backend") != null) {
- synchronize(session, db.issueDao(), index.get(IssueIndex.class));
- synchronize(session, db.issueAuthorizationDao(), index.get(IssueAuthorizationIndex.class));
- }
-
+ synchronize(session, db.issueDao(), index.get(IssueIndex.class));
+ synchronize(session, db.issueAuthorizationDao(), index.get(IssueAuthorizationIndex.class));
synchronize(session, db.activeRuleDao(), index.get(ActiveRuleIndex.class));
synchronize(session, db.activityDao(), index.get(ActivityIndex.class));
session.commit();
diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/BatchWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/BatchWsTest.java
index a3bd0361be4..ea8a89811ee 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/batch/BatchWsTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/batch/BatchWsTest.java
@@ -28,7 +28,6 @@ import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.config.Settings;
import org.sonar.api.resources.Languages;
import org.sonar.core.properties.PropertiesDao;
import org.sonar.server.computation.ComputationService;
@@ -67,7 +66,7 @@ public class BatchWsTest {
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(), mock(ComputationService.class))));
+ new UploadReportAction(mock(DbClient.class), mock(IndexClient.class), mock(InternalPermissionService.class), mock(ComputationService.class))));
}
@Test
diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
index dcae8594b9a..d7d2eadc6ba 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
@@ -59,8 +59,7 @@ import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING;
public class UploadReportActionMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
+ public static ServerTester tester = new ServerTester();
DbClient db;
DbSession session;
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceMediumTest.java
index a20de2e44eb..dc59a5187a4 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceMediumTest.java
@@ -61,8 +61,7 @@ import static org.fest.assertions.Fail.fail;
public class IssueBulkChangeServiceMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
+ public static ServerTester tester = new ServerTester();
DbClient db;
IndexClient indexClient;
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/DefaultIssueServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java
index 9e0320fbdf5..d0737fdeb66 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/DefaultIssueServiceMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java
@@ -65,11 +65,10 @@ import static com.google.common.collect.Lists.newArrayList;
import static org.fest.assertions.Assertions.assertThat;
import static org.fest.assertions.Fail.fail;
-public class DefaultIssueServiceMediumTest {
+public class IssueServiceMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
+ public static ServerTester tester = new ServerTester();
DbClient db;
IndexClient indexClient;
@@ -137,11 +136,11 @@ public class DefaultIssueServiceMediumTest {
tester.get(IssueDao.class).insert(session, issue1, issue2);
session.commit();
- org.sonar.server.search.Result<Issue> result = ((DefaultIssueService) service).search(IssueQuery.builder().build(), new QueryContext());
+ org.sonar.server.search.Result<Issue> result = ((IssueService) service).search(IssueQuery.builder().build(), new QueryContext());
assertThat(result.getHits()).hasSize(2);
assertThat(result.getFacets()).isEmpty();
- result = ((DefaultIssueService) service).search(IssueQuery.builder().build(), new QueryContext().setFacet(true));
+ result = ((IssueService) service).search(IssueQuery.builder().build(), new QueryContext().setFacet(true));
assertThat(result.getFacets().keySet()).hasSize(4);
assertThat(result.getFacetKeys("actionPlan")).hasSize(2);
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/OldIssueServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/OldIssueServiceTest.java
deleted file mode 100644
index c594ffb8af2..00000000000
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/OldIssueServiceTest.java
+++ /dev/null
@@ -1,550 +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.issue;
-
-import com.google.common.collect.Multiset;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.issue.ActionPlan;
-import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.IssueQuery;
-import org.sonar.api.issue.IssueQueryResult;
-import org.sonar.api.issue.internal.DefaultIssue;
-import org.sonar.api.issue.internal.IssueChangeContext;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.user.User;
-import org.sonar.api.user.UserFinder;
-import org.sonar.api.web.UserRole;
-import org.sonar.core.issue.DefaultActionPlan;
-import org.sonar.core.issue.IssueNotifications;
-import org.sonar.core.issue.IssueUpdater;
-import org.sonar.core.issue.db.IssueDao;
-import org.sonar.core.issue.db.IssueStorage;
-import org.sonar.core.issue.workflow.IssueWorkflow;
-import org.sonar.core.issue.workflow.Transition;
-import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.core.preview.PreviewCache;
-import org.sonar.core.resource.ResourceDao;
-import org.sonar.core.resource.ResourceDto;
-import org.sonar.core.resource.ResourceQuery;
-import org.sonar.core.rule.RuleDto;
-import org.sonar.core.user.AuthorizationDao;
-import org.sonar.core.user.DefaultUser;
-import org.sonar.server.issue.actionplan.ActionPlanService;
-import org.sonar.server.user.MockUserSession;
-import org.sonar.server.user.UserSession;
-
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static org.fest.assertions.Assertions.assertThat;
-import static org.fest.assertions.Fail.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class OldIssueServiceTest {
-
- @Mock
- DefaultIssueFinder finder;
-
- @Mock
- IssueWorkflow workflow;
-
- @Mock
- IssueUpdater issueUpdater;
-
- @Mock
- IssueStorage issueStorage;
-
- @Mock
- IssueNotifications issueNotifications;
-
- @Mock
- ActionPlanService actionPlanService;
-
- @Mock
- RuleFinder ruleFinder;
-
- @Mock
- ResourceDao resourceDao;
-
- @Mock
- IssueDao issueDao;
-
- @Mock
- AuthorizationDao authorizationDao;
-
- @Mock
- UserFinder userFinder;
-
- UserSession userSession;
-
- @Mock
- IssueQueryResult issueQueryResult;
-
- @Mock
- ResourceDto resource;
-
- @Mock
- ResourceDto project;
-
- Transition transition = Transition.create("reopen", Issue.STATUS_RESOLVED, Issue.STATUS_REOPENED);
-
- DefaultIssue issue = new DefaultIssue().setKey("ABCD");
-
- OldIssueService issueService;
-
- @Before
- public void before() {
- userSession = MockUserSession.set()
- .setLogin("arthur")
- .setUserId(10)
- .setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN)
- .addProjectPermissions(UserRole.USER, project.getKey())
- .addProjectPermissions(UserRole.ISSUE_ADMIN, project.getKey());
-
- when(authorizationDao.isAuthorizedComponentKey(anyString(), eq(10), anyString())).thenReturn(true);
- when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
- when(issueQueryResult.issues()).thenReturn(newArrayList((Issue) issue));
- when(issueQueryResult.first()).thenReturn(issue);
-
- when(resource.getKey()).thenReturn("org.sonar.Sample");
- when(project.getKey()).thenReturn("Sample");
-
- issueService = new OldIssueService(finder, workflow, issueStorage, issueUpdater, issueNotifications, actionPlanService, ruleFinder, resourceDao, issueDao,
- authorizationDao, userFinder, mock(PreviewCache.class));
- }
-
- @Test
- public void load_issue() {
- IssueQueryResult result = issueService.loadIssue("ABCD");
- assertThat(result).isEqualTo(issueQueryResult);
- }
-
- @Test
- public void fail_to_load_issue() {
- when(issueQueryResult.issues()).thenReturn(Collections.<Issue>emptyList());
- when(finder.find(any(IssueQuery.class))).thenReturn(issueQueryResult);
-
- try {
- issueService.loadIssue("ABCD");
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Issue not found: ABCD");
- }
- }
-
- @Test
- public void list_status() {
- issueService.listStatus();
- verify(workflow).statusKeys();
- }
-
- @Test
- public void list_transitions() {
- List<Transition> transitions = newArrayList(transition);
- when(workflow.outTransitions(issue)).thenReturn(transitions);
-
- List<Transition> result = issueService.listTransitions("ABCD");
- assertThat(result).hasSize(1);
- assertThat(result.get(0)).isEqualTo(transition);
- }
-
- @Test
- public void return_no_transition() {
- when(issueQueryResult.first()).thenReturn(null);
- when(issueQueryResult.issues()).thenReturn(newArrayList((Issue) new DefaultIssue()));
-
- assertThat(issueService.listTransitions("ABCD")).isEmpty();
- verifyZeroInteractions(workflow);
- }
-
- @Test
- public void do_transition() {
- when(workflow.doTransition(eq(issue), eq(transition.key()), any(IssueChangeContext.class))).thenReturn(true);
-
- Issue result = issueService.doTransition("ABCD", transition.key());
- assertThat(result).isNotNull();
-
- ArgumentCaptor<IssueChangeContext> measureCaptor = ArgumentCaptor.forClass(IssueChangeContext.class);
- verify(workflow).doTransition(eq(issue), eq(transition.key()), measureCaptor.capture());
- verify(issueStorage).save(issue);
-
- IssueChangeContext issueChangeContext = measureCaptor.getValue();
- assertThat(issueChangeContext.login()).isEqualTo("arthur");
- assertThat(issueChangeContext.date()).isNotNull();
-
- verify(issueNotifications).sendChanges(eq(issue), eq(issueChangeContext), eq(issueQueryResult));
- }
-
- @Test
- public void not_do_transition() {
- when(workflow.doTransition(eq(issue), eq(transition.key()), any(IssueChangeContext.class))).thenReturn(false);
-
- Issue result = issueService.doTransition("ABCD", transition.key());
- assertThat(result).isNotNull();
- verify(workflow).doTransition(eq(issue), eq(transition.key()), any(IssueChangeContext.class));
- verifyZeroInteractions(issueStorage);
- verifyZeroInteractions(issueNotifications);
- }
-
- @Test
- public void fail_do_transition_if_not_logged() {
- MockUserSession.set();
- try {
- issueService.doTransition("ABCD", transition.key());
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("User is not logged in");
- }
- verifyZeroInteractions(authorizationDao);
- }
-
- @Test
- public void assign() {
- String assignee = "perceval";
- User user = new DefaultUser();
-
- when(userFinder.findByLogin(assignee)).thenReturn(user);
- when(issueUpdater.assign(eq(issue), eq(user), any(IssueChangeContext.class))).thenReturn(true);
-
- Issue result = issueService.assign("ABCD", assignee);
- assertThat(result).isNotNull();
-
- ArgumentCaptor<IssueChangeContext> measureCaptor = ArgumentCaptor.forClass(IssueChangeContext.class);
- verify(issueUpdater).assign(eq(issue), eq(user), measureCaptor.capture());
- verify(issueStorage).save(issue);
-
- IssueChangeContext issueChangeContext = measureCaptor.getValue();
- assertThat(issueChangeContext.login()).isEqualTo("arthur");
- assertThat(issueChangeContext.date()).isNotNull();
-
- verify(issueNotifications).sendChanges(eq(issue), eq(issueChangeContext), eq(issueQueryResult));
- }
-
- @Test
- public void unassign() {
- when(issueUpdater.assign(eq(issue), eq((User) null), any(IssueChangeContext.class))).thenReturn(true);
-
- Issue result = issueService.assign("ABCD", null);
- assertThat(result).isNotNull();
-
- ArgumentCaptor<IssueChangeContext> measureCaptor = ArgumentCaptor.forClass(IssueChangeContext.class);
- verify(issueUpdater).assign(eq(issue), eq((User) null), measureCaptor.capture());
- verify(issueStorage).save(issue);
-
- IssueChangeContext issueChangeContext = measureCaptor.getValue();
- assertThat(issueChangeContext.login()).isEqualTo("arthur");
- assertThat(issueChangeContext.date()).isNotNull();
-
- verify(issueNotifications).sendChanges(eq(issue), eq(issueChangeContext), eq(issueQueryResult));
- verify(userFinder, never()).findByLogin(anyString());
- }
-
- @Test
- public void not_assign() {
- String assignee = "perceval";
- User user = new DefaultUser();
-
- when(userFinder.findByLogin(assignee)).thenReturn(user);
- when(issueUpdater.assign(eq(issue), eq(user), any(IssueChangeContext.class))).thenReturn(false);
-
- Issue result = issueService.assign("ABCD", assignee);
- assertThat(result).isNotNull();
-
- verify(issueUpdater).assign(eq(issue), eq(user), any(IssueChangeContext.class));
- verifyZeroInteractions(issueStorage);
- verifyZeroInteractions(issueNotifications);
- }
-
- @Test
- public void fail_assign_if_assignee_not_found() {
- String assignee = "perceval";
-
- when(userFinder.findByLogin(assignee)).thenReturn(null);
-
- try {
- issueService.assign("ABCD", assignee);
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Unknown user: perceval");
- }
-
- verifyZeroInteractions(issueUpdater);
- verifyZeroInteractions(issueStorage);
- verifyZeroInteractions(issueNotifications);
- }
-
- @Test
- public void plan() {
- String actionPlanKey = "EFGH";
-
- ActionPlan actionPlan = new DefaultActionPlan();
-
- when(actionPlanService.findByKey(actionPlanKey, userSession)).thenReturn(actionPlan);
- when(issueUpdater.plan(eq(issue), eq(actionPlan), any(IssueChangeContext.class))).thenReturn(true);
-
- Issue result = issueService.plan("ABCD", actionPlanKey);
- assertThat(result).isNotNull();
-
- ArgumentCaptor<IssueChangeContext> measureCaptor = ArgumentCaptor.forClass(IssueChangeContext.class);
- verify(issueUpdater).plan(eq(issue), eq(actionPlan), measureCaptor.capture());
- verify(issueStorage).save(issue);
-
- IssueChangeContext issueChangeContext = measureCaptor.getValue();
- assertThat(issueChangeContext.login()).isEqualTo("arthur");
- assertThat(issueChangeContext.date()).isNotNull();
-
- verify(issueNotifications).sendChanges(eq(issue), eq(issueChangeContext), eq(issueQueryResult));
- }
-
- @Test
- public void unplan() {
- when(issueUpdater.plan(eq(issue), eq((ActionPlan) null), any(IssueChangeContext.class))).thenReturn(true);
-
- Issue result = issueService.plan("ABCD", null);
- assertThat(result).isNotNull();
-
- ArgumentCaptor<IssueChangeContext> measureCaptor = ArgumentCaptor.forClass(IssueChangeContext.class);
- verify(issueUpdater).plan(eq(issue), eq((ActionPlan) null), measureCaptor.capture());
- verify(issueStorage).save(issue);
-
- IssueChangeContext issueChangeContext = measureCaptor.getValue();
- assertThat(issueChangeContext.login()).isEqualTo("arthur");
- assertThat(issueChangeContext.date()).isNotNull();
-
- verify(issueNotifications).sendChanges(eq(issue), eq(issueChangeContext), eq(issueQueryResult));
- verify(actionPlanService, never()).findByKey(anyString(), any(UserSession.class));
- }
-
- @Test
- public void not_plan() {
- String actionPlanKey = "EFGH";
-
- ActionPlan actionPlan = new DefaultActionPlan();
-
- when(actionPlanService.findByKey(actionPlanKey, userSession)).thenReturn(actionPlan);
- when(issueUpdater.plan(eq(issue), eq(actionPlan), any(IssueChangeContext.class))).thenReturn(false);
-
- Issue result = issueService.plan("ABCD", actionPlanKey);
- assertThat(result).isNotNull();
- verify(issueUpdater).plan(eq(issue), eq(actionPlan), any(IssueChangeContext.class));
- verifyZeroInteractions(issueStorage);
- verifyZeroInteractions(issueNotifications);
- }
-
- @Test
- public void fail_plan_if_action_plan_not_found() {
- String actionPlanKey = "EFGH";
-
- when(actionPlanService.findByKey(actionPlanKey, userSession)).thenReturn(null);
- try {
- issueService.plan("ABCD", actionPlanKey);
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Unknown action plan: EFGH");
- }
-
- verifyZeroInteractions(issueUpdater);
- verifyZeroInteractions(issueStorage);
- verifyZeroInteractions(issueNotifications);
- }
-
- @Test
- public void set_severity() {
- String severity = "MINOR";
- when(issueUpdater.setManualSeverity(eq(issue), eq(severity), any(IssueChangeContext.class))).thenReturn(true);
-
- Issue result = issueService.setSeverity("ABCD", severity);
- assertThat(result).isNotNull();
-
- ArgumentCaptor<IssueChangeContext> measureCaptor = ArgumentCaptor.forClass(IssueChangeContext.class);
- verify(issueUpdater).setManualSeverity(eq(issue), eq(severity), measureCaptor.capture());
- verify(issueStorage).save(issue);
-
- IssueChangeContext issueChangeContext = measureCaptor.getValue();
- assertThat(issueChangeContext.login()).isEqualTo("arthur");
- assertThat(issueChangeContext.date()).isNotNull();
-
- verify(issueNotifications).sendChanges(eq(issue), eq(issueChangeContext), eq(issueQueryResult));
- }
-
- @Test
- public void not_set_severity() {
- String severity = "MINOR";
- when(issueUpdater.setManualSeverity(eq(issue), eq(severity), any(IssueChangeContext.class))).thenReturn(false);
-
- Issue result = issueService.setSeverity("ABCD", severity);
- assertThat(result).isNotNull();
- verify(issueUpdater).setManualSeverity(eq(issue), eq(severity), any(IssueChangeContext.class));
- verifyZeroInteractions(issueStorage);
- verifyZeroInteractions(issueNotifications);
- }
-
- @Test
- public void create_manual_issue() {
- RuleKey ruleKey = RuleKey.of("manual", "manualRuleKey");
- when(ruleFinder.findByKey(ruleKey)).thenReturn(Rule.create("manual", "manualRuleKey"));
- when(resourceDao.getResource(any(ResourceQuery.class))).thenReturn(resource);
- when(resourceDao.getRootProjectByComponentKey(anyString())).thenReturn(project);
-
- Issue result = issueService.createManualIssue("org.sonar.Sample", RuleKey.of("manual", "manualRuleKey"), null, "Fix it", null, null);
- assertThat(result).isNotNull();
- assertThat(result.message()).isEqualTo("Fix it");
- assertThat(result.creationDate()).isNotNull();
- assertThat(result.updateDate()).isNotNull();
-
- verify(issueStorage).save(any(DefaultIssue.class));
- verify(authorizationDao).isAuthorizedComponentKey(anyString(), anyInt(), eq(UserRole.USER));
- }
-
- @Test
- public void create_manual_issue_use_rule_name_if_no_message() {
- RuleKey ruleKey = RuleKey.of("manual", "manualRuleKey");
- when(ruleFinder.findByKey(ruleKey)).thenReturn(Rule.create("manual", "manualRuleKey").setName("Manual Rule"));
- when(resourceDao.getResource(any(ResourceQuery.class))).thenReturn(resource);
- when(resourceDao.getRootProjectByComponentKey(anyString())).thenReturn(project);
-
- Issue result = issueService.createManualIssue("org.sonar.Sample", RuleKey.of("manual", "manualRuleKey"), null, "", null, null);
- assertThat(result).isNotNull();
- assertThat(result.message()).isEqualTo("Manual Rule");
- assertThat(result.creationDate()).isNotNull();
- assertThat(result.updateDate()).isNotNull();
-
- verify(issueStorage).save(any(DefaultIssue.class));
- verify(authorizationDao).isAuthorizedComponentKey(anyString(), anyInt(), eq(UserRole.USER));
- }
-
- @Test
- public void fail_create_manual_issue_if_not_having_required_role() {
- RuleKey ruleKey = RuleKey.of("manual", "manualRuleKey");
- when(resourceDao.getResource(any(ResourceQuery.class))).thenReturn(resource);
- when(resourceDao.getRootProjectByComponentKey(anyString())).thenReturn(project);
- when(ruleFinder.findByKey(ruleKey)).thenReturn(Rule.create("manual", "manualRuleKey"));
- when(authorizationDao.isAuthorizedComponentKey(anyString(), eq(10), anyString())).thenReturn(false);
-
- try {
- issueService.createManualIssue("org.sonar.Sample", ruleKey, null, null, null, null);
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalStateException.class).hasMessage("User does not have the required role");
- }
- }
-
- @Test
- public void fail_create_manual_issue_if_not_manual_rule() {
- when(resourceDao.getResource(any(ResourceQuery.class))).thenReturn(resource);
- when(resourceDao.getRootProjectByComponentKey(anyString())).thenReturn(project);
-
- RuleKey ruleKey = RuleKey.of("squid", "s100");
- try {
- issueService.createManualIssue("org.sonar.Sample", ruleKey, null, null, null, null);
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Issues can be created only on rules marked as 'manual': squid:s100");
- }
- verifyZeroInteractions(issueStorage);
- }
-
- @Test
- public void fail_create_manual_issue_if_rule_not_found() {
- when(resourceDao.getResource(any(ResourceQuery.class))).thenReturn(resource);
- when(resourceDao.getRootProjectByComponentKey(anyString())).thenReturn(project);
-
- RuleKey ruleKey = RuleKey.of("manual", "manualRuleKey");
- when(ruleFinder.findByKey(ruleKey)).thenReturn(null);
- try {
- issueService.createManualIssue("org.sonar.Sample", RuleKey.of("manual", "manualRuleKey"), null, null, null, null);
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Unknown rule: manual:manualRuleKey");
- }
- verifyZeroInteractions(issueStorage);
- }
-
- @Test
- public void fail_create_manual_issue_if_component_not_found() {
- RuleKey ruleKey = RuleKey.of("manual", "manualRuleKey");
- when(ruleFinder.findByKey(ruleKey)).thenReturn(Rule.create("manual", "manualRuleKey"));
- when(resourceDao.getResource(any(ResourceQuery.class))).thenReturn(null);
- try {
- issueService.createManualIssue("org.sonar.Sample", RuleKey.of("manual", "manualRuleKey"), null, null, null, null);
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Unknown component: org.sonar.Sample");
- }
- verifyZeroInteractions(issueStorage);
- }
-
- @Test
- public void find_rules_by_component() throws Exception {
- DbSession session = mock(DbSession.class);
- String componentKey = "org.sonar.Sample";
-
- Date date = new Date();
- when(issueDao.findRulesByComponent(componentKey, date, session)).thenReturn(newArrayList(
- RuleDto.createFor(RuleKey.of("repo", "rule")).setName("Rule name"),
- RuleDto.createFor(RuleKey.of("repo", "rule")).setName("Rule name")
- ));
-
- RulesAggregation result = issueService.findRulesByComponent(componentKey, date, session);
- assertThat(result.rules()).hasSize(1);
- }
-
- @Test
- public void find_rules_by_severity() throws Exception {
- DbSession session = mock(DbSession.class);
- String componentKey = "org.sonar.Sample";
-
- Date date = new Date();
- when(issueDao.findSeveritiesByComponent(componentKey, date, session)).thenReturn(newArrayList("MAJOR", "MAJOR", "INFO"));
-
- Multiset<String> result = issueService.findSeveritiesByComponent(componentKey, date, session);
- assertThat(result.count("MAJOR")).isEqualTo(2);
- assertThat(result.count("INFO")).isEqualTo(1);
- assertThat(result.count("UNKNOWN")).isEqualTo(0);
- }
-
- @Test
- public void search_issues() {
- assertThat(issueService.search(newArrayList("ABCD"))).hasSize(1);
- }
-
- @Test
- public void search_from_query() {
- IssueQuery query = mock(IssueQuery.class);
- issueService.searchFromQuery(query);
- verify(finder).find(query);
- }
-}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java
index 92a7517ca5b..c1de0e4a257 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java
@@ -52,8 +52,7 @@ import static org.fest.assertions.Assertions.assertThat;
public class IssueBackendMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
+ public static ServerTester tester = new ServerTester();
DbClient dbClient;
IndexClient indexClient;
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueAuthorizationIndexMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueAuthorizationIndexMediumTest.java
index 94c0f933513..ad849b152e8 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueAuthorizationIndexMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueAuthorizationIndexMediumTest.java
@@ -44,8 +44,7 @@ import static org.fest.assertions.Assertions.assertThat;
public class IssueAuthorizationIndexMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
+ public static ServerTester tester = new ServerTester();
DbClient db;
DbSession session;
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexMediumTest.java
index ca4617a17bb..1b36f864d71 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexMediumTest.java
@@ -66,8 +66,7 @@ import static org.fest.assertions.Assertions.assertThat;
public class IssueIndexMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
+ public static ServerTester tester = new ServerTester();
DbClient db;
DbSession session;
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java
deleted file mode 100644
index 31903c546da..00000000000
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java
+++ /dev/null
@@ -1,439 +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.issue.ws;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.sonar.api.component.Component;
-import org.sonar.api.i18n.I18n;
-import org.sonar.api.issue.ActionPlan;
-import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.IssueFinder;
-import org.sonar.api.issue.IssueQuery;
-import org.sonar.api.issue.internal.DefaultIssue;
-import org.sonar.api.issue.internal.DefaultIssueComment;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.user.User;
-import org.sonar.api.utils.DateUtils;
-import org.sonar.api.utils.Duration;
-import org.sonar.api.utils.Durations;
-import org.sonar.api.utils.Paging;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.issue.DefaultActionPlan;
-import org.sonar.core.issue.DefaultIssueQueryResult;
-import org.sonar.core.issue.workflow.Transition;
-import org.sonar.core.user.DefaultUser;
-import org.sonar.server.exceptions.BadRequestException;
-import org.sonar.server.issue.ActionService;
-import org.sonar.server.issue.IssueService;
-import org.sonar.server.user.MockUserSession;
-import org.sonar.server.ws.WsTester;
-
-import java.util.*;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static com.google.common.collect.Maps.newHashMap;
-import static org.fest.assertions.Assertions.assertThat;
-import static org.fest.assertions.Fail.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.*;
-
-@RunWith(MockitoJUnitRunner.class)
-public class IssueSearchActionTest {
-
- @Mock
- IssueFinder issueFinder;
-
- @Mock
- IssueService issueService;
-
- @Mock
- ActionService actionService;
-
- @Mock
- I18n i18n;
-
- @Mock
- Durations durations;
-
- List<Issue> issues;
- DefaultIssueQueryResult result;
-
- Date issueCreationDate;
-
- WsTester tester;
-
- @Before
- public void setUp() throws Exception {
- issues = new ArrayList<Issue>();
- result = new DefaultIssueQueryResult(issues);
- when(issueFinder.find(any(IssueQuery.class))).thenReturn(result);
-
- issueCreationDate = DateUtils.parseDateTime("2014-01-22T19:10:03+0100");
- when(i18n.formatDateTime(any(Locale.class), eq(issueCreationDate))).thenReturn("Jan 22, 2014 10:03 AM");
-
- result.setMaxResultsReached(true);
- result.setPaging(Paging.create(100, 1, 2));
- when(i18n.formatInteger(any(Locale.class), eq(2))).thenReturn("2");
-
- tester = new WsTester(new IssuesWs(mock(IssueShowAction.class),
- new IssueSearchAction(issueFinder, new IssueActionsWriter(issueService, actionService), i18n, durations)));
- }
-
- @Test
- public void issues() throws Exception {
- String issueKey = "ABCD";
- Issue issue = new DefaultIssue()
- .setKey(issueKey)
- .setComponentKey("sample:src/main/xoo/sample/Sample.xoo")
- .setComponentId(5L)
- .setProjectKey("sample")
- .setRuleKey(RuleKey.of("squid", "AvoidCycle"))
- .setActionPlanKey("AP-ABCD")
- .setLine(12)
- .setMessage("Fix it")
- .setResolution("FIXED")
- .setStatus("CLOSED")
- .setSeverity("MAJOR")
- .setAssignee("john")
- .setReporter("steven")
- .setAuthorLogin("Henry")
- .setCreationDate(issueCreationDate);
- issues.add(issue);
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues.json");
- }
-
- @Test
- public void issues_with_dates() throws Exception {
- Date creationDate = DateUtils.parseDateTime("2014-01-22T19:10:03+0100");
- Date updateDate = DateUtils.parseDateTime("2014-01-23T19:10:03+0100");
- Date closedDate = DateUtils.parseDateTime("2014-01-24T19:10:03+0100");
-
- Issue issue = createIssue()
- .setCreationDate(creationDate)
- .setUpdateDate(updateDate)
- .setCloseDate(closedDate);
- issues.add(issue);
-
- when(i18n.formatDateTime(any(Locale.class), eq(creationDate))).thenReturn("Jan 22, 2014 10:03 AM");
- when(i18n.formatDateTime(any(Locale.class), eq(updateDate))).thenReturn("Jan 23, 2014 10:03 AM");
- when(i18n.ageFromNow(any(Locale.class), eq(updateDate))).thenReturn("9 days");
- when(i18n.formatDateTime(any(Locale.class), eq(closedDate))).thenReturn("Jan 24, 2014 10:03 AM");
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues_with_dates.json");
- }
-
- @Test
- public void issues_with_debt() throws Exception {
- Duration debt = (Duration.create(7260L));
- Issue issue = createIssue().setDebt(debt);
- issues.add(issue);
-
- when(durations.encode(debt)).thenReturn("2h1min");
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues_with_debt.json");
- }
-
- @Test
- public void issues_with_action_plan() throws Exception {
- Issue issue = createIssue()
- .setActionPlanKey("AP-ABCD");
- issues.add(issue);
-
- Date createdAt = DateUtils.parseDateTime("2014-01-22T19:10:03+0100");
- Date updatedAt = DateUtils.parseDateTime("2014-01-23T19:10:03+0100");
- Date deadLine = DateUtils.parseDateTime("2014-01-24T19:10:03+0100");
-
- when(i18n.formatDateTime(any(Locale.class), eq(createdAt))).thenReturn("Jan 22, 2014 10:03 AM");
- when(i18n.formatDateTime(any(Locale.class), eq(updatedAt))).thenReturn("Jan 23, 2014 10:03 AM");
- when(i18n.formatDateTime(any(Locale.class), eq(deadLine))).thenReturn("Jan 24, 2014 10:03 AM");
-
- result.addActionPlans(Lists.<ActionPlan>newArrayList(
- new DefaultActionPlan()
- .setKey("AP-ABCD")
- .setName("1.0")
- .setStatus("OPEN")
- .setProjectKey("sample")
- .setUserLogin("arthur")
- .setDeadLine(deadLine)
- .setCreatedAt(createdAt)
- .setUpdatedAt(updatedAt)
- ));
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues_with_action_plans.json");
- }
-
- @Test
- public void issues_with_comments() throws Exception {
- Issue issue = createIssue()
- .addComment(
- new DefaultIssueComment()
- .setKey("COMMENT-ABCD")
- .setMarkdownText("*My comment*")
- .setUserLogin("john")
- .setCreatedAt(DateUtils.parseDateTime("2014-02-23T19:10:03+0100"))
- )
- .addComment(
- new DefaultIssueComment()
- .setKey("COMMENT-ABCE")
- .setMarkdownText("Another comment")
- .setUserLogin("arthur")
- .setCreatedAt(DateUtils.parseDateTime("2014-02-23T19:10:03+0100"))
- );
- issues.add(issue);
-
- MockUserSession.set().setLogin("john");
- result.addUsers(Lists.<User>newArrayList(
- new DefaultUser().setName("John Smith").setLogin("john"),
- new DefaultUser().setName("Arthur McEnroy").setLogin("arthur")
- ));
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues_with_comments.json");
- }
-
- @Test
- public void issues_with_attributes() throws Exception {
- Issue issue = createIssue()
- .setAttribute("jira-issue-key", "SONAR-1234");
- issues.add(issue);
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues_with_attributes.json");
- }
-
- @Test
- public void issues_with_extra_fields() throws Exception {
- Issue issue = createIssue()
- .setActionPlanKey("AP-ABCD")
- .setAssignee("john")
- .setReporter("henry");
- issues.add(issue);
-
- MockUserSession.set().setLogin("john");
- when(issueService.listTransitions(eq(issue))).thenReturn(newArrayList(Transition.create("reopen", "RESOLVED", "REOPEN")));
-
- result.addActionPlans(newArrayList((ActionPlan) new DefaultActionPlan().setKey("AP-ABCD").setName("1.0")));
-
- result.addUsers(Lists.<User>newArrayList(
- new DefaultUser().setName("John").setLogin("john"),
- new DefaultUser().setName("Henry").setLogin("henry")
- ));
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search").setParam("extra_fields", "actions,transitions,assigneeName,reporterName,actionPlanName");
- request.execute().assertJson(getClass(), "issues_with_extra_fields.json");
- }
-
- @Test
- public void issues_with_components() throws Exception {
- issues.add(createIssue());
-
- ComponentDto component = new ComponentDto()
- .setId(10L)
- .setKey("sample:src/main/xoo/sample/Sample.xoo")
- .setLongName("src/main/xoo/sample/Sample.xoo")
- .setName("Sample.xoo")
- .setQualifier("FIL")
- .setPath("src/main/xoo/sample/Sample.xoo")
- .setSubProjectId(7L)
- .setProjectId_unit_test_only(7L);
-
- ComponentDto project = new ComponentDto()
- .setId(7L)
- .setKey("sample")
- .setLongName("Sample")
- .setName("Sample")
- .setQualifier("TRK")
- .setProjectId_unit_test_only(7L);
-
- result.addComponents(Lists.<Component>newArrayList(component, project));
- result.addProjects(Lists.<Component>newArrayList(project));
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues_with_components.json");
- }
-
- @Test
- public void issues_with_sub_project() throws Exception {
- Issue issue = createIssue().setComponentKey("sample:sample-module:src/main/xoo/sample/Sample.xoo");
- issues.add(issue);
-
- // File
- ComponentDto component = new ComponentDto()
- .setId(10L)
- .setKey("sample:sample-module:src/main/xoo/sample/Sample.xoo")
- .setLongName("src/main/xoo/sample/Sample.xoo")
- .setName("Sample.xoo")
- .setQualifier("FIL")
- .setPath("src/main/xoo/sample/Sample.xoo")
- .setSubProjectId(8L)
- .setProjectId_unit_test_only(7L);
-
- // Sub project
- ComponentDto subProject = new ComponentDto()
- .setId(8L)
- .setKey("sample-module")
- .setLongName("Sample Project :: Sample Module")
- .setName("Sample Project :: Sample Module")
- .setQualifier("BRC")
- .setSubProjectId(7L)
- .setProjectId_unit_test_only(7L);
-
- // Project
- ComponentDto project = new ComponentDto()
- .setId(7L)
- .setKey("sample")
- .setLongName("Sample Project")
- .setName("Sample Project")
- .setQualifier("TRK")
- .setProjectId_unit_test_only(7L);
-
- result.addComponents(Lists.<Component>newArrayList(component, subProject, project));
- result.addProjects(Lists.<Component>newArrayList(project));
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues_with_sub_project.json");
- }
-
- @Test
- public void issues_with_rules() throws Exception {
- issues.add(createIssue());
-
- result.addRules(newArrayList(
- Rule.create("squid", "AvoidCycle").setName("Avoid cycle").setDescription("Avoid cycle description")
- ));
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues_with_rules.json");
- }
-
- @Test
- public void issues_with_users() throws Exception {
- Issue issue = createIssue()
- .setAssignee("john")
- .setReporter("steven")
- .setAuthorLogin("Henry");
- issues.add(issue);
-
- result.addUsers(Lists.<User>newArrayList(
- new DefaultUser().setName("John").setLogin("john").setActive(true).setEmail("john@email.com")
- ));
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search");
- request.execute().assertJson(getClass(), "issues_with_users.json");
- }
-
- @Test
- public void verify_issue_query_parameters() throws Exception {
- Map<String, String> map = newHashMap();
- map.put("issues", "ABCDE1234");
- map.put("severities", "MAJOR,MINOR");
- map.put("statuses", "CLOSED");
- map.put("resolutions", "FALSE-POSITIVE");
- map.put("resolved", "true");
- map.put("components", "org.apache");
- map.put("componentRoots", "org.sonar");
- map.put("reporters", "marilyn");
- map.put("assignees", "joanna");
- map.put("languages", "xoo");
- map.put("assigned", "true");
- map.put("planned", "true");
- map.put("hideRules", "true");
- map.put("createdAt", "2013-04-15T09:08:24+0200");
- map.put("createdAfter", "2013-04-16T09:08:24+0200");
- map.put("createdBefore", "2013-04-17T09:08:24+0200");
- map.put("rules", "squid:AvoidCycle,findbugs:NullReference");
- map.put("pageSize", "10");
- map.put("pageIndex", "50");
- map.put("sort", "CREATION_DATE");
- map.put("asc", "true");
-
- WsTester.TestRequest request = tester.newGetRequest("api/issues", "search").setParams(map);
- request.execute();
-
- ArgumentCaptor<IssueQuery> captor = ArgumentCaptor.forClass(IssueQuery.class);
- verify(issueFinder).find(captor.capture());
-
- IssueQuery query = captor.getValue();
- assertThat(query.requiredRole()).isEqualTo("user");
- assertThat(query.issueKeys()).containsOnly("ABCDE1234");
- assertThat(query.severities()).containsOnly("MAJOR", "MINOR");
- assertThat(query.statuses()).containsOnly("CLOSED");
- assertThat(query.resolutions()).containsOnly("FALSE-POSITIVE");
- assertThat(query.resolved()).isTrue();
- assertThat(query.components()).containsOnly("org.apache");
- assertThat(query.componentRoots()).containsOnly("org.sonar");
- assertThat(query.reporters()).containsOnly("marilyn");
- assertThat(query.assignees()).containsOnly("joanna");
- assertThat(query.languages()).containsOnly("xoo");
- assertThat(query.assigned()).isTrue();
- assertThat(query.planned()).isTrue();
- assertThat(query.hideRules()).isTrue();
- assertThat(query.createdAt()).isEqualTo(DateUtils.parseDateTime("2013-04-15T09:08:24+0200"));
- assertThat(query.createdAfter()).isEqualTo(DateUtils.parseDateTime("2013-04-16T09:08:24+0200"));
- assertThat(query.createdBefore()).isEqualTo(DateUtils.parseDateTime("2013-04-17T09:08:24+0200"));
- assertThat(query.rules()).containsOnly(RuleKey.of("squid", "AvoidCycle"), RuleKey.of("findbugs", "NullReference"));
- assertThat(query.pageSize()).isEqualTo(10);
- assertThat(query.pageIndex()).isEqualTo(50);
- assertThat(query.sort()).isEqualTo("CREATION_DATE");
- assertThat(query.asc()).isTrue();
- }
-
- @Test
- public void verify_format_parameter() throws Exception {
- // No error if json
- tester.newGetRequest("api/issues", "search").setParams(ImmutableMap.of("format", "json")).execute();
-
- // No error if empty
- tester.newGetRequest("api/issues", "search").setParams(ImmutableMap.of("format", "")).execute();
-
- // Error if not empty and not json
- try {
- tester.newGetRequest("api/issues", "search").setParams(ImmutableMap.of("format", "xml")).execute();
- fail();
- } catch (Exception e) {
- assertThat(e).isInstanceOf(BadRequestException.class);
- }
- }
-
- private DefaultIssue createIssue() {
- return new DefaultIssue()
- .setKey("ABCD")
- .setComponentKey("sample:src/main/xoo/sample/Sample.xoo")
- .setProjectKey("sample")
- .setRuleKey(RuleKey.of("squid", "AvoidCycle"))
- .setCreationDate(issueCreationDate);
- }
-
-}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java
index f28328410ee..7688c48155f 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java
@@ -40,6 +40,7 @@ import org.sonar.api.utils.Duration;
import org.sonar.api.utils.Durations;
import org.sonar.core.component.ComponentDto;
import org.sonar.core.issue.DefaultActionPlan;
+import org.sonar.core.issue.db.IssueChangeDao;
import org.sonar.core.issue.workflow.Transition;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.user.DefaultUser;
@@ -135,7 +136,8 @@ public class IssueShowActionTest {
tester = new WsTester(new IssuesWs(
new IssueShowAction(dbClient, issueService, issueChangelogService,
new IssueActionsWriter(issueService, actionService), actionPlanService, userFinder, debtModel, ruleService, i18n, durations),
- mock(IssueSearchAction.class)));
+ new SearchAction(mock(DbClient.class), mock(IssueChangeDao.class), mock(IssueService.class), mock(IssueActionsWriter.class), mock(RuleService.class),
+ mock(ActionPlanService.class), mock(UserFinder.class), mock(I18n.class), mock(Durations.class))));
}
@Test
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java
index 7f57e4b2d46..6da00cf3175 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java
@@ -22,11 +22,11 @@ package org.sonar.server.issue.ws;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.i18n.I18n;
-import org.sonar.api.issue.IssueFinder;
import org.sonar.api.server.ws.RailsHandler;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.user.UserFinder;
import org.sonar.api.utils.Durations;
+import org.sonar.core.issue.db.IssueChangeDao;
import org.sonar.server.db.DbClient;
import org.sonar.server.debt.DebtModelService;
import org.sonar.server.issue.IssueChangelogService;
@@ -42,21 +42,20 @@ public class IssuesWsTest {
IssueShowAction showAction;
- IssueSearchAction searchAction;
-
WsTester tester;
@Before
public void setUp() throws Exception {
- IssueFinder issueFinder = mock(IssueFinder.class);
IssueChangelogService issueChangelogService = mock(IssueChangelogService.class);
IssueActionsWriter actionsWriter = mock(IssueActionsWriter.class);
DebtModelService debtModelService = mock(DebtModelService.class);
I18n i18n = mock(I18n.class);
Durations durations = mock(Durations.class);
- showAction = new IssueShowAction(mock(DbClient.class), mock(IssueService.class), issueChangelogService, actionsWriter, mock(ActionPlanService.class), mock(UserFinder.class), debtModelService, mock(RuleService.class), i18n, durations);
- searchAction = new IssueSearchAction(issueFinder, actionsWriter, i18n, durations);
+ showAction = new IssueShowAction(mock(DbClient.class), mock(IssueService.class), issueChangelogService, actionsWriter, mock(ActionPlanService.class), mock(UserFinder.class),
+ debtModelService, mock(RuleService.class), i18n, durations);
+ SearchAction searchAction = new SearchAction(mock(DbClient.class), mock(IssueChangeDao.class), mock(IssueService.class), mock(IssueActionsWriter.class), mock(RuleService.class),
+ mock(ActionPlanService.class), mock(UserFinder.class), mock(I18n.class), mock(Durations.class));
tester = new WsTester(new IssuesWs(showAction, searchAction));
}
@@ -90,21 +89,6 @@ public class IssuesWsTest {
}
@Test
- public void define_search_action() throws Exception {
- WebService.Controller controller = tester.controller("api/issues");
-
- WebService.Action show = controller.action("search");
- assertThat(show).isNotNull();
- assertThat(show.handler()).isNotNull();
- assertThat(show.since()).isEqualTo("3.6");
- assertThat(show.isPost()).isFalse();
- assertThat(show.isInternal()).isFalse();
- assertThat(show.handler()).isSameAs(searchAction);
- assertThat(show.responseExampleAsString()).isNotEmpty();
- assertThat(show.params()).hasSize(24);
- }
-
- @Test
public void define_changelog_action() throws Exception {
WebService.Controller controller = tester.controller("api/issues");
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java
index 71fc04829da..4ba6aef26d4 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java
@@ -27,6 +27,7 @@ import org.junit.ClassRule;
import org.junit.Test;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.security.DefaultGroups;
+import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.KeyValueFormat;
import org.sonar.api.web.UserRole;
@@ -55,8 +56,7 @@ import static org.fest.assertions.Assertions.assertThat;
public class SearchActionMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
+ public static ServerTester tester = new ServerTester();
IssuesWs ws;
DbClient db;
@@ -110,6 +110,20 @@ public class SearchActionMediumTest {
}
@Test
+ public void define_action() throws Exception {
+ WebService.Controller controller = wsTester.controller("api/issues");
+
+ WebService.Action show = controller.action("search");
+ assertThat(show).isNotNull();
+ assertThat(show.handler()).isNotNull();
+ assertThat(show.since()).isEqualTo("3.6");
+ assertThat(show.isPost()).isFalse();
+ assertThat(show.isInternal()).isFalse();
+ assertThat(show.responseExampleAsString()).isNotEmpty();
+ assertThat(show.params()).hasSize(26);
+ }
+
+ @Test
public void empty_search() throws Exception {
WsTester.TestRequest request = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION);
WsTester.Result result = request.execute();
diff --git a/server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupMediumTest.java
index f1324255837..4afc1f1c786 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupMediumTest.java
@@ -50,8 +50,7 @@ import static org.fest.assertions.Assertions.assertThat;
public class BackendCleanupMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
+ public static ServerTester tester = new ServerTester();
DbClient db;
DbSession session;
diff --git a/server/sonar-server/src/test/java/org/sonar/server/search/IndexSynchronizerMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/search/IndexSynchronizerMediumTest.java
index 9ca6b1ad461..9c554e6d2ec 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/search/IndexSynchronizerMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/search/IndexSynchronizerMediumTest.java
@@ -23,7 +23,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
-import org.sonar.api.config.Settings;
import org.sonar.api.rule.RuleKey;
import org.sonar.core.persistence.BatchSession;
import org.sonar.core.persistence.DbSession;
@@ -38,8 +37,7 @@ import static org.fest.assertions.Assertions.assertThat;
public class IndexSynchronizerMediumTest {
@ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
+ public static ServerTester tester = new ServerTester();
IndexSynchronizer synchronizer;
DbClient dbClient;
@@ -53,7 +51,7 @@ public class IndexSynchronizerMediumTest {
indexClient = tester.get(IndexClient.class);
platform = tester.get(Platform.class);
dbSession = dbClient.openSession(false);
- synchronizer = new IndexSynchronizer(dbClient, indexClient, tester.get(Settings.class));
+ synchronizer = new IndexSynchronizer(dbClient, indexClient);
tester.clearDbAndIndexes();
}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues.json
deleted file mode 100644
index b809ccb6100..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "componentId": 5,
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "resolution": "FIXED",
- "status": "CLOSED",
- "severity": "MAJOR",
- "message": "Fix it",
- "line": 12,
- "reporter": "steven",
- "assignee": "john",
- "author": "Henry",
- "actionPlan": "AP-ABCD",
- "creationDate": "2014-01-22T19:10:03+0100"
- }
- ],
- "components": [],
- "projects": [],
- "rules": [],
- "users": []
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_action_plans.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_action_plans.json
deleted file mode 100644
index b9d150aa066..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_action_plans.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "actionPlan": "AP-ABCD",
- "creationDate": "2014-01-22T19:10:03+0100"
- }
- ],
- "components": [],
- "projects": [],
- "rules": [],
- "users": [],
- "actionPlans": [
- {
- "key": "AP-ABCD",
- "name": "1.0",
- "status": "OPEN",
- "project": "sample",
- "userLogin": "arthur",
- "deadLine": "2014-01-24T19:10:03+0100",
- "fDeadLine": "Jan 24, 2014 10:03 AM",
- "createdAt": "2014-01-22T19:10:03+0100",
- "fCreatedAt": "Jan 22, 2014 10:03 AM",
- "updatedAt": "2014-01-23T19:10:03+0100",
- "fUpdatedAt": "Jan 23, 2014 10:03 AM"
- }
- ]
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_attributes.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_attributes.json
deleted file mode 100644
index 9d03dcd4389..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_attributes.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "creationDate": "2014-01-22T19:10:03+0100",
- "attr": {
- "jira-issue-key": "SONAR-1234"
- }
- }
- ],
- "components": [],
- "projects": [],
- "rules": [],
- "users": []
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_comments.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_comments.json
deleted file mode 100644
index 01705444815..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_comments.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "creationDate": "2014-01-22T19:10:03+0100",
- "comments": [
- {
- "key": "COMMENT-ABCD",
- "login": "john",
- "userName": "John Smith",
- "htmlText": "<em>My comment</em>",
- "markdown": "*My comment*",
- "updatable": true,
- "createdAt": "2014-02-23T19:10:03+0100"
- },
- {
- "key": "COMMENT-ABCE",
- "login": "arthur",
- "userName": "Arthur McEnroy",
- "htmlText": "Another comment",
- "markdown": "Another comment",
- "updatable": false,
- "createdAt": "2014-02-23T19:10:03+0100"
- }
- ]
- }
- ],
- "components": [],
- "projects": [],
- "rules": [],
- "users": [
- {
- "login": "john",
- "name": "John Smith",
- "active": false
- },
- {
- "login": "arthur",
- "name": "Arthur McEnroy",
- "active": false
- }
- ]
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_components.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_components.json
deleted file mode 100644
index 268b3f050ce..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_components.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "creationDate": "2014-01-22T19:10:03+0100"
- }
- ],
- "components": [
- {
- "key": "sample:src/main/xoo/sample/Sample.xoo",
- "id": 10,
- "qualifier": "FIL",
- "name": "Sample.xoo",
- "longName": "src/main/xoo/sample/Sample.xoo",
- "path": "src/main/xoo/sample/Sample.xoo",
- "projectId": 7,
- "subProjectId": 7
- },
- {
- "key": "sample",
- "id": 7,
- "qualifier": "TRK",
- "name": "Sample",
- "longName": "Sample"
- }
- ],
- "projects": [
- {
- "key": "sample",
- "id": 7,
- "qualifier": "TRK",
- "name": "Sample",
- "longName": "Sample"
- }
- ],
- "rules": [],
- "users": []
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_dates.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_dates.json
deleted file mode 100644
index 814789bc44c..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_dates.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "creationDate": "2014-01-22T19:10:03+0100",
- "updateDate": "2014-01-23T19:10:03+0100",
- "fUpdateAge": "9 days",
- "closeDate": "2014-01-24T19:10:03+0100"
- }
- ],
- "components": [],
- "projects": [],
- "rules": [],
- "users": []
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_debt.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_debt.json
deleted file mode 100644
index 967f0624cca..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_debt.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "debt": "2h1min",
- "creationDate": "2014-01-22T19:10:03+0100"
- }
- ],
- "components": [],
- "projects": [],
- "rules": [],
- "users": []
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_extra_fields.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_extra_fields.json
deleted file mode 100644
index 3d610a334bb..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_extra_fields.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "creationDate": "2014-01-22T19:10:03+0100",
- "assignee": "john",
- "assigneeName": "John",
- "reporter": "henry",
- "reporterName": "Henry",
- "actionPlan": "AP-ABCD",
- "actionPlanName": "1.0",
- "actions": [
- "comment", "assign", "plan"
- ],
- "transitions": [
- "reopen"
- ]
- }
- ],
- "components": [],
- "projects": [],
- "rules": [],
- "users": [
- {
- "login": "henry",
- "name": "Henry",
- "active": false
- },
- {
- "login": "john",
- "name": "John",
- "active": false
- }
- ],
- "actionPlans": [
- {
- "key": "AP-ABCD",
- "name": "1.0"
- }
- ]
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_rules.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_rules.json
deleted file mode 100644
index 4548f3df190..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_rules.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "creationDate": "2014-01-22T19:10:03+0100"
- }
- ],
- "components": [],
- "projects": [],
- "rules": [
- {
- "key": "squid:AvoidCycle",
- "name": "Avoid cycle",
- "desc": "Avoid cycle description",
- "status": "READY"
- }
- ],
- "users": []
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_sub_project.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_sub_project.json
deleted file mode 100644
index 0b6fca70de3..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_sub_project.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:sample-module:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "creationDate": "2014-01-22T19:10:03+0100"
- }
- ],
- "components": [
- {
- "key": "sample-module",
- "id": 8,
- "qualifier": "BRC",
- "name": "Sample Project :: Sample Module",
- "longName": "Sample Project :: Sample Module",
- "projectId": 7,
- "subProjectId": 7
- },
- {
- "key": "sample:sample-module:src/main/xoo/sample/Sample.xoo",
- "id": 10,
- "qualifier": "FIL",
- "name": "Sample.xoo",
- "longName": "src/main/xoo/sample/Sample.xoo",
- "path": "src/main/xoo/sample/Sample.xoo",
- "projectId": 7,
- "subProjectId": 8
- },
- {
- "key": "sample",
- "id": 7,
- "qualifier": "TRK",
- "name": "Sample Project",
- "longName": "Sample Project"
- }
- ],
- "projects": [
- {
- "key": "sample",
- "id": 7,
- "qualifier": "TRK",
- "name": "Sample Project",
- "longName": "Sample Project"
- }
- ],
- "rules": [],
- "users": []
-}
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_users.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_users.json
deleted file mode 100644
index 46c4968af7d..00000000000
--- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_users.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "maxResultsReached": true,
- "paging": {
- "pageIndex": 1,
- "pageSize": 100,
- "total": 2,
- "fTotal": "2",
- "pages": 1
- },
- "issues": [
- {
- "key": "ABCD",
- "component": "sample:src/main/xoo/sample/Sample.xoo",
- "project": "sample",
- "rule": "squid:AvoidCycle",
- "reporter": "steven",
- "assignee": "john",
- "author": "Henry",
- "creationDate": "2014-01-22T19:10:03+0100"
- }
- ],
- "components": [],
- "projects": [],
- "rules": [],
- "users": [
- {
- "login": "john",
- "name": "John",
- "active": true,
- "email": "john@email.com"
- }
- ]
-}