diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-09-29 17:55:11 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2014-10-02 15:27:03 +0200 |
commit | d39f45c813ca96615ce4a0a858477fc7124b664d (patch) | |
tree | 02faedf691c70486b4e7ca6aa670697a2af81f61 /server | |
parent | df96c3460f794d418918b441b5ad0435ce24f520 (diff) | |
download | sonarqube-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')
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" - } - ] -} |