]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5529 Remove usage of sonar.issues.use_es_backend property
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 29 Sep 2014 15:55:11 +0000 (17:55 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 2 Oct 2014 13:27:03 +0000 (15:27 +0200)
Conflicts:
server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java

35 files changed:
server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueService.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java
server/sonar-server/src/main/java/org/sonar/server/issue/OldIssueService.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueSearchAction.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java
server/sonar-server/src/test/java/org/sonar/server/batch/BatchWsTest.java
server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/DefaultIssueServiceMediumTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/issue/IssueBulkChangeServiceMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/issue/OldIssueServiceTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueAuthorizationIndexMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueSearchActionTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/platform/BackendCleanupMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/search/IndexSynchronizerMediumTest.java
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_action_plans.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_attributes.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_comments.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_components.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_dates.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_debt.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_extra_fields.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_rules.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_sub_project.json [deleted file]
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueSearchActionTest/issues_with_users.json [deleted file]

index 15290fb9cfbb4bc079773d5b0b7b502c2ed0fb9d..7ab0dbf77240fcfb08e35021fc51fe3b0fc71388 100644 (file)
@@ -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 (file)
index 9eb6f17..0000000
+++ /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();
-  }
-}
index 0d6a6fc10eb338347902ee875759fc0ca49bd97c..22a4bf717603fd1ad7eb65557c2d0cc014f2a649 100644 (file)
  * 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 (file)
index 665572b..0000000
+++ /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 (file)
index 5eafcc2..0000000
+++ /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();
-  }
-
-}
index 13e4aa4e4dbf12c3c4a2c3c6fd8025833e12cb7e..090340e35cb62067b845e35dec9f70a489b2b0cc 100644 (file)
@@ -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);
index c5f39b98ae58db5f46732ba89f7056ab22fb987d..c400e991d62aa05fc3a541c25adc67b251c37169 100644 (file)
@@ -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
index 8192bf32e6b9d3cf55fb0c558998b11947437d7d..73a9492f21ea21b86a3e4220decbdc2ae24f1583 100644 (file)
@@ -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);
index c881df181f93e9d155fadef09878e5f170a3ce1e..082c029a8ceef49012868703bdce630e3823285b 100644 (file)
@@ -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();
index a3bd0361be4fb89da09ab516414d29fdd70c73f2..ea8a89811ee8f58c78dc411df027afa8dccfbf48 100644 (file)
@@ -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
index dcae8594b9a49fb1c76b29e08dabbd633ea6649c..d7d2eadc6ba9c6022a83a9b55d129ce6a3af8614 100644 (file)
@@ -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/DefaultIssueServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/DefaultIssueServiceMediumTest.java
deleted file mode 100644 (file)
index 9e0320f..0000000
+++ /dev/null
@@ -1,411 +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.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.sonar.api.issue.DefaultTransitions;
-import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.IssueQuery;
-import org.sonar.api.resources.Qualifiers;
-import org.sonar.api.resources.Scopes;
-import org.sonar.api.rule.Severity;
-import org.sonar.api.security.DefaultGroups;
-import org.sonar.api.utils.DateUtils;
-import org.sonar.api.web.UserRole;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.issue.db.ActionPlanDto;
-import org.sonar.core.issue.db.IssueDto;
-import org.sonar.core.issue.workflow.Transition;
-import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.core.permission.PermissionFacade;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.core.rule.RuleDto;
-import org.sonar.core.user.UserDto;
-import org.sonar.server.component.SnapshotTesting;
-import org.sonar.server.component.db.ComponentDao;
-import org.sonar.server.component.db.SnapshotDao;
-import org.sonar.server.db.DbClient;
-import org.sonar.server.exceptions.ForbiddenException;
-import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.issue.db.IssueDao;
-import org.sonar.server.issue.index.IssueIndex;
-import org.sonar.server.rule.RuleTesting;
-import org.sonar.server.rule.db.RuleDao;
-import org.sonar.server.search.IndexClient;
-import org.sonar.server.search.QueryContext;
-import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-
-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 {
-
-  @ClassRule
-  public static ServerTester tester = new ServerTester()
-    .setProperty("sonar.issues.use_es_backend", "true");
-
-  DbClient db;
-  IndexClient indexClient;
-  DbSession session;
-  IssueService service;
-
-  RuleDto rule;
-  ComponentDto project;
-  ComponentDto file;
-  UserDto connectedUser;
-
-  @Before
-  public void setUp() throws Exception {
-    tester.clearDbAndIndexes();
-    db = tester.get(DbClient.class);
-    indexClient = tester.get(IndexClient.class);
-    session = db.openSession(false);
-    service = tester.get(IssueService.class);
-
-    rule = RuleTesting.newXooX1();
-    tester.get(RuleDao.class).insert(session, rule);
-
-    project = new ComponentDto()
-      .setKey("MyProject")
-      .setLongName("My Project")
-      .setQualifier(Qualifiers.PROJECT)
-      .setScope(Scopes.PROJECT);
-    tester.get(ComponentDao.class).insert(session, project);
-    tester.get(SnapshotDao.class).insert(session, SnapshotTesting.createForComponent(project));
-
-    file = new ComponentDto()
-      .setSubProjectId(project.getId())
-      .setKey("MyComponent")
-      .setLongName("My Component");
-    tester.get(ComponentDao.class).insert(session, file);
-    tester.get(SnapshotDao.class).insert(session, SnapshotTesting.createForComponent(file));
-
-    // project can be seen by anyone
-    tester.get(PermissionFacade.class).insertGroupPermission(project.getId(), DefaultGroups.ANYONE, UserRole.USER, session);
-    db.issueAuthorizationDao().synchronizeAfter(session, new Date(0));
-
-    connectedUser = new UserDto().setLogin("gandalf").setName("Gandalf");
-    db.userDao().insert(session, connectedUser);
-    tester.get(PermissionFacade.class).insertUserPermission(project.getId(), connectedUser.getId(), UserRole.USER, session);
-
-    MockUserSession.set()
-      .setLogin(connectedUser.getLogin())
-      .setUserId(connectedUser.getId().intValue())
-      .setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN)
-      .addProjectPermissions(UserRole.USER, project.key())
-      .addProjectPermissions(UserRole.ISSUE_ADMIN, project.key());
-
-    session.commit();
-  }
-
-  @After
-  public void after() {
-    session.close();
-  }
-
-  @Test
-  public void can_facet() throws Exception {
-    IssueDto issue1 = newIssue().setActionPlanKey("P1");
-    IssueDto issue2 = newIssue().setActionPlanKey("P2").setResolution("NONE");
-    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());
-    assertThat(result.getHits()).hasSize(2);
-    assertThat(result.getFacets()).isEmpty();
-
-    result = ((DefaultIssueService) service).search(IssueQuery.builder().build(), new QueryContext().setFacet(true));
-    assertThat(result.getFacets().keySet()).hasSize(4);
-    assertThat(result.getFacetKeys("actionPlan")).hasSize(2);
-  }
-
-  @Test
-  public void list_status() {
-    assertThat(service.listStatus()).containsExactly("OPEN", "CONFIRMED", "REOPENED", "RESOLVED", "CLOSED");
-  }
-
-  @Test
-  public void list_transitions() {
-    IssueDto issue = newIssue().setStatus(Issue.STATUS_RESOLVED).setResolution(Issue.RESOLUTION_FALSE_POSITIVE);
-    tester.get(IssueDao.class).insert(session, issue);
-    session.commit();
-
-    List<Transition> result = service.listTransitions(issue.getKey());
-    assertThat(result).hasSize(1);
-    assertThat(result.get(0).key()).isEqualTo("reopen");
-  }
-
-  @Test
-  public void do_transition() {
-    IssueDto issue = newIssue().setStatus(Issue.STATUS_OPEN);
-    tester.get(IssueDao.class).insert(session, issue);
-    session.commit();
-
-    assertThat(db.issueDao().getByKey(session, issue.getKey())).isNotNull();
-    IssueTesting.assertIsEquivalent(issue, indexClient.get(IssueIndex.class).getByKey(issue.getKey()));
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).status()).isEqualTo(Issue.STATUS_OPEN);
-
-    service.doTransition(issue.getKey(), DefaultTransitions.CONFIRM);
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).status()).isEqualTo(Issue.STATUS_CONFIRMED);
-  }
-
-  @Test
-  public void assign() {
-    IssueDto issue = newIssue();
-    tester.get(IssueDao.class).insert(session, issue);
-
-    UserDto user = new UserDto().setLogin("perceval").setName("Perceval");
-    db.userDao().insert(session, user);
-    session.commit();
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).assignee()).isNull();
-
-    service.assign(issue.getKey(), user.getLogin());
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).assignee()).isEqualTo("perceval");
-  }
-
-  @Test
-  public void un_assign() {
-    IssueDto issue = newIssue().setAssignee("perceval");
-    tester.get(IssueDao.class).insert(session, issue);
-
-    UserDto user = new UserDto().setLogin("perceval").setName("Perceval");
-    db.userDao().insert(session, user);
-    session.commit();
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).assignee()).isEqualTo("perceval");
-
-    service.assign(issue.getKey(), "");
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).assignee()).isNull();
-  }
-
-  @Test
-  public void fail_to_assign_on_unknown_user() {
-    IssueDto issue = newIssue();
-    tester.get(IssueDao.class).insert(session, issue);
-    session.commit();
-
-    try {
-      service.assign(issue.getKey(), "unknown");
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("Unknown user: unknown");
-    }
-  }
-
-  @Test
-  public void plan() {
-    IssueDto issue = newIssue();
-    tester.get(IssueDao.class).insert(session, issue);
-
-    String actionPlanKey = "EFGH";
-    db.actionPlanDao().save(new ActionPlanDto().setKey(actionPlanKey).setProjectId(project.getId()));
-    session.commit();
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).actionPlanKey()).isNull();
-
-    service.plan(issue.getKey(), actionPlanKey);
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).actionPlanKey()).isEqualTo(actionPlanKey);
-  }
-
-  @Test
-  public void un_plan() {
-    String actionPlanKey = "EFGH";
-    db.actionPlanDao().save(new ActionPlanDto().setKey(actionPlanKey).setProjectId(project.getId()));
-
-    IssueDto issue = newIssue().setActionPlanKey(actionPlanKey);
-    tester.get(IssueDao.class).insert(session, issue);
-    session.commit();
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).actionPlanKey()).isEqualTo(actionPlanKey);
-
-    service.plan(issue.getKey(), null);
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).actionPlanKey()).isNull();
-  }
-
-  @Test
-  public void fail_plan_if_action_plan_not_found() {
-    tester.get(IssueDao.class).insert(session, newIssue());
-    session.commit();
-
-    try {
-      service.plan("ABCD", "unknown");
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("Unknown action plan: unknown");
-    }
-  }
-
-  @Test
-  public void set_severity() {
-    IssueDto issue = newIssue().setSeverity(Severity.BLOCKER);
-    tester.get(IssueDao.class).insert(session, issue);
-    session.commit();
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).severity()).isEqualTo(Severity.BLOCKER);
-
-    service.setSeverity(issue.getKey(), Severity.MINOR);
-
-    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).severity()).isEqualTo(Severity.MINOR);
-  }
-
-  @Test
-  public void create_manual_issue() {
-    RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
-    tester.get(RuleDao.class).insert(session, manualRule);
-    session.commit();
-
-    Issue result = service.createManualIssue(file.key(), manualRule.getKey(), 10, "Fix it", Severity.MINOR, 2d);
-
-    Issue manualIssue = indexClient.get(IssueIndex.class).getByKey(result.key());
-    assertThat(manualIssue.componentKey()).isEqualTo(file.key());
-    assertThat(manualIssue.projectKey()).isEqualTo(project.key());
-    assertThat(manualIssue.ruleKey()).isEqualTo(manualRule.getKey());
-    assertThat(manualIssue.message()).isEqualTo("Fix it");
-    assertThat(manualIssue.line()).isEqualTo(10);
-    assertThat(manualIssue.severity()).isEqualTo(Severity.MINOR);
-    assertThat(manualIssue.effortToFix()).isEqualTo(2d);
-    assertThat(manualIssue.reporter()).isEqualTo(connectedUser.getLogin());
-  }
-
-  @Test
-  public void create_manual_issue_with_major_severity_when_no_severity() {
-    RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
-    tester.get(RuleDao.class).insert(session, manualRule);
-    session.commit();
-
-    Issue result = service.createManualIssue(file.key(), manualRule.getKey(), 10, "Fix it", null, 2d);
-
-    Issue manualIssue = indexClient.get(IssueIndex.class).getByKey(result.key());
-    assertThat(manualIssue.severity()).isEqualTo(Severity.MAJOR);
-  }
-
-  @Test
-  public void create_manual_issue_with_rule_name_when_no_message() {
-    RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey").setName("Manual rule name");
-    tester.get(RuleDao.class).insert(session, manualRule);
-    session.commit();
-
-    Issue result = service.createManualIssue(file.key(), manualRule.getKey(), 10, null, null, 2d);
-
-    Issue manualIssue = indexClient.get(IssueIndex.class).getByKey(result.key());
-    assertThat(manualIssue.message()).isEqualTo("Manual rule name");
-  }
-
-  @Test
-  public void fail_create_manual_issue_on_not_manual_rule() {
-    try {
-      service.createManualIssue(file.key(), rule.getKey(), 10, "Fix it", null, 2d);
-      fail();
-    } catch (Exception e) {
-      assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Issues can be created only on rules marked as 'manual': xoo:x1");
-    }
-  }
-
-  @Test(expected = ForbiddenException.class)
-  public void fail_create_manual_issue_if_not_having_required_role() {
-    // User has not the 'user' role on the project
-    MockUserSession.set()
-      .setLogin(connectedUser.getLogin())
-      .setUserId(connectedUser.getId().intValue())
-      .setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN)
-      .addProjectPermissions(UserRole.CODEVIEWER, project.key());
-
-    RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
-    tester.get(RuleDao.class).insert(session, manualRule);
-    session.commit();
-
-    service.createManualIssue(file.key(), rule.getKey(), 10, "Fix it", null, 2d);
-  }
-
-  @Test
-  public void find_rules_by_component() throws Exception {
-    // 2 issues on the same rule
-    tester.get(IssueDao.class).insert(session, newIssue().setRule(rule));
-    tester.get(IssueDao.class).insert(session, newIssue().setRule(rule));
-    session.commit();
-
-    RulesAggregation result = service.findRulesByComponent(file.key(), null, session);
-    assertThat(result.rules()).hasSize(1);
-  }
-
-  @Test
-  public void find_rules_by_severity() throws Exception {
-    tester.get(IssueDao.class).insert(session, newIssue().setSeverity(Severity.MAJOR));
-    tester.get(IssueDao.class).insert(session, newIssue().setSeverity(Severity.MAJOR));
-    tester.get(IssueDao.class).insert(session, newIssue().setSeverity(Severity.INFO));
-    session.commit();
-
-    Multiset<String> result = service.findSeveritiesByComponent(file.key(), null, session);
-    assertThat(result.count("MAJOR")).isEqualTo(2);
-    assertThat(result.count("INFO")).isEqualTo(1);
-    assertThat(result.count("UNKNOWN")).isEqualTo(0);
-  }
-
-  @Test
-  public void search_issues() {
-    IssueDto issue = newIssue();
-    tester.get(IssueDao.class).insert(session, issue);
-    session.commit();
-
-    List<Issue> result = service.search(newArrayList(issue.getKey()));
-    assertThat(result).hasSize(1);
-  }
-
-  @Test
-  public void search_from_query() {
-    IssueDto issue = newIssue();
-    tester.get(IssueDao.class).insert(session, issue);
-    session.commit();
-
-    List<Issue> result = service.searchFromQuery(IssueQuery.builder().build());
-    assertThat(result).hasSize(1);
-  }
-
-  private IssueDto newIssue() {
-    return new IssueDto()
-      .setIssueCreationDate(DateUtils.parseDate("2014-09-04"))
-      .setIssueUpdateDate(DateUtils.parseDate("2014-12-04"))
-      .setRule(rule)
-      .setDebt(10L)
-      .setRootComponent(project)
-      .setComponent(file)
-      .setStatus(Issue.STATUS_OPEN)
-      .setResolution(null)
-      .setSeverity(Severity.MAJOR)
-      .setKee(UUID.randomUUID().toString());
-  }
-}
index a20de2e44eb6f39470bb34bfadd9fd40dc5b3214..dc59a5187a4268f91b343aed602f85eeef50baf8 100644 (file)
@@ -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/IssueServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java
new file mode 100644 (file)
index 0000000..d0737fd
--- /dev/null
@@ -0,0 +1,410 @@
+/*
+ * 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.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.sonar.api.issue.DefaultTransitions;
+import org.sonar.api.issue.Issue;
+import org.sonar.api.issue.IssueQuery;
+import org.sonar.api.resources.Qualifiers;
+import org.sonar.api.resources.Scopes;
+import org.sonar.api.rule.Severity;
+import org.sonar.api.security.DefaultGroups;
+import org.sonar.api.utils.DateUtils;
+import org.sonar.api.web.UserRole;
+import org.sonar.core.component.ComponentDto;
+import org.sonar.core.issue.db.ActionPlanDto;
+import org.sonar.core.issue.db.IssueDto;
+import org.sonar.core.issue.workflow.Transition;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.permission.PermissionFacade;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.rule.RuleDto;
+import org.sonar.core.user.UserDto;
+import org.sonar.server.component.SnapshotTesting;
+import org.sonar.server.component.db.ComponentDao;
+import org.sonar.server.component.db.SnapshotDao;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.exceptions.ForbiddenException;
+import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.server.issue.db.IssueDao;
+import org.sonar.server.issue.index.IssueIndex;
+import org.sonar.server.rule.RuleTesting;
+import org.sonar.server.rule.db.RuleDao;
+import org.sonar.server.search.IndexClient;
+import org.sonar.server.search.QueryContext;
+import org.sonar.server.tester.ServerTester;
+import org.sonar.server.user.MockUserSession;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static org.fest.assertions.Assertions.assertThat;
+import static org.fest.assertions.Fail.fail;
+
+public class IssueServiceMediumTest {
+
+  @ClassRule
+  public static ServerTester tester = new ServerTester();
+
+  DbClient db;
+  IndexClient indexClient;
+  DbSession session;
+  IssueService service;
+
+  RuleDto rule;
+  ComponentDto project;
+  ComponentDto file;
+  UserDto connectedUser;
+
+  @Before
+  public void setUp() throws Exception {
+    tester.clearDbAndIndexes();
+    db = tester.get(DbClient.class);
+    indexClient = tester.get(IndexClient.class);
+    session = db.openSession(false);
+    service = tester.get(IssueService.class);
+
+    rule = RuleTesting.newXooX1();
+    tester.get(RuleDao.class).insert(session, rule);
+
+    project = new ComponentDto()
+      .setKey("MyProject")
+      .setLongName("My Project")
+      .setQualifier(Qualifiers.PROJECT)
+      .setScope(Scopes.PROJECT);
+    tester.get(ComponentDao.class).insert(session, project);
+    tester.get(SnapshotDao.class).insert(session, SnapshotTesting.createForComponent(project));
+
+    file = new ComponentDto()
+      .setSubProjectId(project.getId())
+      .setKey("MyComponent")
+      .setLongName("My Component");
+    tester.get(ComponentDao.class).insert(session, file);
+    tester.get(SnapshotDao.class).insert(session, SnapshotTesting.createForComponent(file));
+
+    // project can be seen by anyone
+    tester.get(PermissionFacade.class).insertGroupPermission(project.getId(), DefaultGroups.ANYONE, UserRole.USER, session);
+    db.issueAuthorizationDao().synchronizeAfter(session, new Date(0));
+
+    connectedUser = new UserDto().setLogin("gandalf").setName("Gandalf");
+    db.userDao().insert(session, connectedUser);
+    tester.get(PermissionFacade.class).insertUserPermission(project.getId(), connectedUser.getId(), UserRole.USER, session);
+
+    MockUserSession.set()
+      .setLogin(connectedUser.getLogin())
+      .setUserId(connectedUser.getId().intValue())
+      .setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN)
+      .addProjectPermissions(UserRole.USER, project.key())
+      .addProjectPermissions(UserRole.ISSUE_ADMIN, project.key());
+
+    session.commit();
+  }
+
+  @After
+  public void after() {
+    session.close();
+  }
+
+  @Test
+  public void can_facet() throws Exception {
+    IssueDto issue1 = newIssue().setActionPlanKey("P1");
+    IssueDto issue2 = newIssue().setActionPlanKey("P2").setResolution("NONE");
+    tester.get(IssueDao.class).insert(session, issue1, issue2);
+    session.commit();
+
+    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 = ((IssueService) service).search(IssueQuery.builder().build(), new QueryContext().setFacet(true));
+    assertThat(result.getFacets().keySet()).hasSize(4);
+    assertThat(result.getFacetKeys("actionPlan")).hasSize(2);
+  }
+
+  @Test
+  public void list_status() {
+    assertThat(service.listStatus()).containsExactly("OPEN", "CONFIRMED", "REOPENED", "RESOLVED", "CLOSED");
+  }
+
+  @Test
+  public void list_transitions() {
+    IssueDto issue = newIssue().setStatus(Issue.STATUS_RESOLVED).setResolution(Issue.RESOLUTION_FALSE_POSITIVE);
+    tester.get(IssueDao.class).insert(session, issue);
+    session.commit();
+
+    List<Transition> result = service.listTransitions(issue.getKey());
+    assertThat(result).hasSize(1);
+    assertThat(result.get(0).key()).isEqualTo("reopen");
+  }
+
+  @Test
+  public void do_transition() {
+    IssueDto issue = newIssue().setStatus(Issue.STATUS_OPEN);
+    tester.get(IssueDao.class).insert(session, issue);
+    session.commit();
+
+    assertThat(db.issueDao().getByKey(session, issue.getKey())).isNotNull();
+    IssueTesting.assertIsEquivalent(issue, indexClient.get(IssueIndex.class).getByKey(issue.getKey()));
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).status()).isEqualTo(Issue.STATUS_OPEN);
+
+    service.doTransition(issue.getKey(), DefaultTransitions.CONFIRM);
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).status()).isEqualTo(Issue.STATUS_CONFIRMED);
+  }
+
+  @Test
+  public void assign() {
+    IssueDto issue = newIssue();
+    tester.get(IssueDao.class).insert(session, issue);
+
+    UserDto user = new UserDto().setLogin("perceval").setName("Perceval");
+    db.userDao().insert(session, user);
+    session.commit();
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).assignee()).isNull();
+
+    service.assign(issue.getKey(), user.getLogin());
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).assignee()).isEqualTo("perceval");
+  }
+
+  @Test
+  public void un_assign() {
+    IssueDto issue = newIssue().setAssignee("perceval");
+    tester.get(IssueDao.class).insert(session, issue);
+
+    UserDto user = new UserDto().setLogin("perceval").setName("Perceval");
+    db.userDao().insert(session, user);
+    session.commit();
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).assignee()).isEqualTo("perceval");
+
+    service.assign(issue.getKey(), "");
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).assignee()).isNull();
+  }
+
+  @Test
+  public void fail_to_assign_on_unknown_user() {
+    IssueDto issue = newIssue();
+    tester.get(IssueDao.class).insert(session, issue);
+    session.commit();
+
+    try {
+      service.assign(issue.getKey(), "unknown");
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("Unknown user: unknown");
+    }
+  }
+
+  @Test
+  public void plan() {
+    IssueDto issue = newIssue();
+    tester.get(IssueDao.class).insert(session, issue);
+
+    String actionPlanKey = "EFGH";
+    db.actionPlanDao().save(new ActionPlanDto().setKey(actionPlanKey).setProjectId(project.getId()));
+    session.commit();
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).actionPlanKey()).isNull();
+
+    service.plan(issue.getKey(), actionPlanKey);
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).actionPlanKey()).isEqualTo(actionPlanKey);
+  }
+
+  @Test
+  public void un_plan() {
+    String actionPlanKey = "EFGH";
+    db.actionPlanDao().save(new ActionPlanDto().setKey(actionPlanKey).setProjectId(project.getId()));
+
+    IssueDto issue = newIssue().setActionPlanKey(actionPlanKey);
+    tester.get(IssueDao.class).insert(session, issue);
+    session.commit();
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).actionPlanKey()).isEqualTo(actionPlanKey);
+
+    service.plan(issue.getKey(), null);
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).actionPlanKey()).isNull();
+  }
+
+  @Test
+  public void fail_plan_if_action_plan_not_found() {
+    tester.get(IssueDao.class).insert(session, newIssue());
+    session.commit();
+
+    try {
+      service.plan("ABCD", "unknown");
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("Unknown action plan: unknown");
+    }
+  }
+
+  @Test
+  public void set_severity() {
+    IssueDto issue = newIssue().setSeverity(Severity.BLOCKER);
+    tester.get(IssueDao.class).insert(session, issue);
+    session.commit();
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).severity()).isEqualTo(Severity.BLOCKER);
+
+    service.setSeverity(issue.getKey(), Severity.MINOR);
+
+    assertThat(indexClient.get(IssueIndex.class).getByKey(issue.getKey()).severity()).isEqualTo(Severity.MINOR);
+  }
+
+  @Test
+  public void create_manual_issue() {
+    RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
+    tester.get(RuleDao.class).insert(session, manualRule);
+    session.commit();
+
+    Issue result = service.createManualIssue(file.key(), manualRule.getKey(), 10, "Fix it", Severity.MINOR, 2d);
+
+    Issue manualIssue = indexClient.get(IssueIndex.class).getByKey(result.key());
+    assertThat(manualIssue.componentKey()).isEqualTo(file.key());
+    assertThat(manualIssue.projectKey()).isEqualTo(project.key());
+    assertThat(manualIssue.ruleKey()).isEqualTo(manualRule.getKey());
+    assertThat(manualIssue.message()).isEqualTo("Fix it");
+    assertThat(manualIssue.line()).isEqualTo(10);
+    assertThat(manualIssue.severity()).isEqualTo(Severity.MINOR);
+    assertThat(manualIssue.effortToFix()).isEqualTo(2d);
+    assertThat(manualIssue.reporter()).isEqualTo(connectedUser.getLogin());
+  }
+
+  @Test
+  public void create_manual_issue_with_major_severity_when_no_severity() {
+    RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
+    tester.get(RuleDao.class).insert(session, manualRule);
+    session.commit();
+
+    Issue result = service.createManualIssue(file.key(), manualRule.getKey(), 10, "Fix it", null, 2d);
+
+    Issue manualIssue = indexClient.get(IssueIndex.class).getByKey(result.key());
+    assertThat(manualIssue.severity()).isEqualTo(Severity.MAJOR);
+  }
+
+  @Test
+  public void create_manual_issue_with_rule_name_when_no_message() {
+    RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey").setName("Manual rule name");
+    tester.get(RuleDao.class).insert(session, manualRule);
+    session.commit();
+
+    Issue result = service.createManualIssue(file.key(), manualRule.getKey(), 10, null, null, 2d);
+
+    Issue manualIssue = indexClient.get(IssueIndex.class).getByKey(result.key());
+    assertThat(manualIssue.message()).isEqualTo("Manual rule name");
+  }
+
+  @Test
+  public void fail_create_manual_issue_on_not_manual_rule() {
+    try {
+      service.createManualIssue(file.key(), rule.getKey(), 10, "Fix it", null, 2d);
+      fail();
+    } catch (Exception e) {
+      assertThat(e).isInstanceOf(IllegalArgumentException.class).hasMessage("Issues can be created only on rules marked as 'manual': xoo:x1");
+    }
+  }
+
+  @Test(expected = ForbiddenException.class)
+  public void fail_create_manual_issue_if_not_having_required_role() {
+    // User has not the 'user' role on the project
+    MockUserSession.set()
+      .setLogin(connectedUser.getLogin())
+      .setUserId(connectedUser.getId().intValue())
+      .setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN)
+      .addProjectPermissions(UserRole.CODEVIEWER, project.key());
+
+    RuleDto manualRule = RuleTesting.newManualRule("manualRuleKey");
+    tester.get(RuleDao.class).insert(session, manualRule);
+    session.commit();
+
+    service.createManualIssue(file.key(), rule.getKey(), 10, "Fix it", null, 2d);
+  }
+
+  @Test
+  public void find_rules_by_component() throws Exception {
+    // 2 issues on the same rule
+    tester.get(IssueDao.class).insert(session, newIssue().setRule(rule));
+    tester.get(IssueDao.class).insert(session, newIssue().setRule(rule));
+    session.commit();
+
+    RulesAggregation result = service.findRulesByComponent(file.key(), null, session);
+    assertThat(result.rules()).hasSize(1);
+  }
+
+  @Test
+  public void find_rules_by_severity() throws Exception {
+    tester.get(IssueDao.class).insert(session, newIssue().setSeverity(Severity.MAJOR));
+    tester.get(IssueDao.class).insert(session, newIssue().setSeverity(Severity.MAJOR));
+    tester.get(IssueDao.class).insert(session, newIssue().setSeverity(Severity.INFO));
+    session.commit();
+
+    Multiset<String> result = service.findSeveritiesByComponent(file.key(), null, session);
+    assertThat(result.count("MAJOR")).isEqualTo(2);
+    assertThat(result.count("INFO")).isEqualTo(1);
+    assertThat(result.count("UNKNOWN")).isEqualTo(0);
+  }
+
+  @Test
+  public void search_issues() {
+    IssueDto issue = newIssue();
+    tester.get(IssueDao.class).insert(session, issue);
+    session.commit();
+
+    List<Issue> result = service.search(newArrayList(issue.getKey()));
+    assertThat(result).hasSize(1);
+  }
+
+  @Test
+  public void search_from_query() {
+    IssueDto issue = newIssue();
+    tester.get(IssueDao.class).insert(session, issue);
+    session.commit();
+
+    List<Issue> result = service.searchFromQuery(IssueQuery.builder().build());
+    assertThat(result).hasSize(1);
+  }
+
+  private IssueDto newIssue() {
+    return new IssueDto()
+      .setIssueCreationDate(DateUtils.parseDate("2014-09-04"))
+      .setIssueUpdateDate(DateUtils.parseDate("2014-12-04"))
+      .setRule(rule)
+      .setDebt(10L)
+      .setRootComponent(project)
+      .setComponent(file)
+      .setStatus(Issue.STATUS_OPEN)
+      .setResolution(null)
+      .setSeverity(Severity.MAJOR)
+      .setKee(UUID.randomUUID().toString());
+  }
+}
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 (file)
index c594ffb..0000000
+++ /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);
-  }
-}
index 92a7517ca5b0ce55152792dc534991b69170eb2f..c1de0e4a25753fd957c673ce018e967aa2455c74 100644 (file)
@@ -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;
index 94c0f933513ffdf69d82071cad14f240d14c8eb0..ad849b152e861c479c9fcadee2575fd78ad953ed 100644 (file)
@@ -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;
index ca4617a17bbd5466f34427d8deefb51fa7dfc0bb..1b36f864d713043319e13777390807cb07ff16d3 100644 (file)
@@ -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 (file)
index 31903c5..0000000
+++ /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);
-  }
-
-}
index f28328410ee3e5f859ac6b13ac4acecae377b089..7688c48155f2fb2e33866cbb5a6815e0afcc3497 100644 (file)
@@ -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
index 7f57e4b2d46ece19aadc399d355f68405cc20f28..6da00cf317572b7d8464500669dcf913edc5b29f 100644 (file)
@@ -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));
   }
 
@@ -89,21 +88,6 @@ public class IssuesWsTest {
     assertThat(key.isRequired()).isFalse();
   }
 
-  @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");
index 71fc04829daa4b8c4bd6e1528afe6490b56eceb9..4ba6aef26d4b56480459962d7f49ecb63f549f9b 100644 (file)
@@ -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;
@@ -109,6 +109,20 @@ public class SearchActionMediumTest {
     session.close();
   }
 
+  @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);
index f13242558376874ba885e9335e7b19fac8c7c916..4afc1f1c78698231de051bf3c5b5b7996f90e302 100644 (file)
@@ -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;
index 9ca6b1ad461bd108d4bbafeda7623e6b7fbd7e5a..9c554e6d2eca73b20c09d2031665ad3b3a6887dd 100644 (file)
@@ -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 (file)
index b809ccb..0000000
+++ /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 (file)
index b9d150a..0000000
+++ /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 (file)
index 9d03dcd..0000000
+++ /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 (file)
index 0170544..0000000
+++ /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 (file)
index 268b3f0..0000000
+++ /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 (file)
index 814789b..0000000
+++ /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 (file)
index 967f062..0000000
+++ /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 (file)
index 3d610a3..0000000
+++ /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 (file)
index 4548f3d..0000000
+++ /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 (file)
index 0b6fca7..0000000
+++ /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 (file)
index 46c4968..0000000
+++ /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"
-    }
-  ]
-}