From ebc7ebb5c530d1de13a79cb3f2d873af89f37efb Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Wed, 29 May 2013 10:24:04 +0200 Subject: [PATCH] SONAR-3755 replace the enum IssueQuery.Sort by String constants --- .../java/org/sonar/batch/index/Cache.java | 6 +-- .../org/sonar/core/issue/db/IssueMapper.xml | 12 +++--- .../org/sonar/core/issue/db/IssueDaoTest.java | 12 +++--- .../java/org/sonar/api/issue/IssueQuery.java | 28 +++++++++----- .../org/sonar/api/issue/RubyIssueService.java | 5 ++- .../org/sonar/api/issue/IssueQueryTest.java | 4 +- .../sonar/server/issue/IssuesFinderSort.java | 37 ++++++++++--------- .../server/issue/PublicRubyIssueService.java | 2 +- .../server/issue/IssuesFinderSortTest.java | 12 +++--- .../issue/PublicRubyIssueServiceTest.java | 4 +- 10 files changed, 66 insertions(+), 56 deletions(-) diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/Cache.java b/sonar-batch/src/main/java/org/sonar/batch/index/Cache.java index fc2c80acefd..399dafb665f 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/Cache.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/Cache.java @@ -27,7 +27,6 @@ import com.persistit.exception.PersistitException; import org.apache.commons.lang.builder.ToStringBuilder; import javax.annotation.CheckForNull; - import java.io.Serializable; import java.util.Collection; import java.util.Iterator; @@ -35,7 +34,6 @@ import java.util.List; import java.util.Set; /** - * *

* This cache is not thread-safe, due to direct usage of {@link com.persistit.Exchange} *

@@ -192,7 +190,7 @@ public class Cache { // TODO implement a lazy-loading equivalent with Iterator/Iterable public Collection values(String group) { try { - List values = Lists.newLinkedList(); + List values = Lists.newArrayList(); exchange.clear(); Exchange iteratorExchange = new Exchange(exchange); iteratorExchange.append(group).append(Key.BEFORE); @@ -213,7 +211,7 @@ public class Cache { public Collection allValues() { try { - List values = Lists.newLinkedList(); + List values = Lists.newArrayList(); exchange.clear(); Exchange iteratorExchange = new Exchange(exchange); iteratorExchange.append(Key.BEFORE); diff --git a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml index a87e101942b..3ebf476c91e 100644 --- a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml @@ -37,22 +37,22 @@ , - + i.severity as severity - + i.status as status - + i.assignee as assignee - + i.issue_creation_date as issueCreationDate - + i.issue_update_date as issueUpdateDate - + i.issue_close_date as issueCloseDate diff --git a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java index f66eb89b3ea..41089436f81 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java @@ -251,27 +251,27 @@ public class IssueDaoTest extends AbstractDaoTestCase { public void should_select_issues_with_sort_column() { setupData("shared", "should_select_issues_with_sort_column"); - IssueQuery query = IssueQuery.builder().sort(IssueQuery.Sort.ASSIGNEE).requiredRole("user").build(); + IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_ASSIGNEE).requiredRole("user").build(); List results = dao.selectIssues(query); assertThat(results.get(0).getAssignee()).isNotNull(); - query = IssueQuery.builder().sort(IssueQuery.Sort.SEVERITY).requiredRole("user").build(); + query = IssueQuery.builder().sort(IssueQuery.SORT_BY_SEVERITY).requiredRole("user").build(); results = dao.selectIssues(query); assertThat(results.get(0).getSeverity()).isNotNull(); - query = IssueQuery.builder().sort(IssueQuery.Sort.STATUS).requiredRole("user").build(); + query = IssueQuery.builder().sort(IssueQuery.SORT_BY_STATUS).requiredRole("user").build(); results = dao.selectIssues(query); assertThat(results.get(0).getStatus()).isNotNull(); - query = IssueQuery.builder().sort(IssueQuery.Sort.CREATION_DATE).requiredRole("user").build(); + query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CREATION_DATE).requiredRole("user").build(); results = dao.selectIssues(query); assertThat(results.get(0).getIssueCreationDate()).isNotNull(); - query = IssueQuery.builder().sort(IssueQuery.Sort.UPDATE_DATE).requiredRole("user").build(); + query = IssueQuery.builder().sort(IssueQuery.SORT_BY_UPDATE_DATE).requiredRole("user").build(); results = dao.selectIssues(query); assertThat(results.get(0).getIssueUpdateDate()).isNotNull(); - query = IssueQuery.builder().sort(IssueQuery.Sort.CLOSE_DATE).requiredRole("user").build(); + query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CLOSE_DATE).requiredRole("user").build(); results = dao.selectIssues(query); assertThat(results.get(0).getIssueCloseDate()).isNotNull(); } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQuery.java b/sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQuery.java index 26a2cbd7123..761c2b8294f 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQuery.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueQuery.java @@ -20,15 +20,16 @@ package org.sonar.api.issue; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.sonar.api.rule.RuleKey; import org.sonar.api.web.UserRole; import javax.annotation.CheckForNull; import javax.annotation.Nullable; - import java.util.Collection; import java.util.Date; +import java.util.Set; /** * @since 3.6 @@ -41,9 +42,13 @@ public class IssueQuery { public static final int MAX_PAGE_SIZE = 500; public static final int MAX_ISSUE_KEYS = 500; - public static enum Sort { - CREATION_DATE, UPDATE_DATE, CLOSE_DATE, ASSIGNEE, SEVERITY, STATUS - } + public static final String SORT_BY_CREATION_DATE = "CREATION_DATE"; + public static final String SORT_BY_UPDATE_DATE = "UPDATE_DATE"; + public static final String SORT_BY_CLOSE_DATE = "CLOSE_DATE"; + public static final String SORT_BY_ASSIGNEE = "ASSIGNEE"; + public static final String SORT_BY_SEVERITY = "SEVERITY"; + public static final String SORT_BY_STATUS = "STATUS"; + public static final Set SORTS = ImmutableSet.of(SORT_BY_CREATION_DATE, SORT_BY_UPDATE_DATE, SORT_BY_CLOSE_DATE, SORT_BY_ASSIGNEE, SORT_BY_SEVERITY, SORT_BY_STATUS); private final Collection issueKeys; private final Collection severities; @@ -60,7 +65,7 @@ public class IssueQuery { private final Boolean resolved; private final Date createdAfter; private final Date createdBefore; - private final Sort sort; + private final String sort; private final Boolean asc; private final String requiredRole; @@ -159,7 +164,7 @@ public class IssueQuery { } @CheckForNull - public Sort sort() { + public String sort() { return sort; } @@ -209,7 +214,7 @@ public class IssueQuery { private Boolean resolved = null; private Date createdAfter; private Date createdBefore; - private Sort sort; + private String sort; private Boolean asc = false; private Integer pageSize; private Integer pageIndex; @@ -305,8 +310,11 @@ public class IssueQuery { return this; } - public Builder sort(@Nullable Sort sort) { - this.sort = sort; + public Builder sort(@Nullable String s) { + if (s != null && !SORTS.contains(s)) { + throw new IllegalArgumentException("Bad sort field: " + s); + } + this.sort = s; return this; } @@ -345,7 +353,7 @@ public class IssueQuery { } else { if (pageSize == null) { pageSize = DEFAULT_PAGE_SIZE; - } else if (pageSize<=0 || pageSize > MAX_PAGE_SIZE) { + } else if (pageSize <= 0 || pageSize > MAX_PAGE_SIZE) { pageSize = MAX_PAGE_SIZE; } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/issue/RubyIssueService.java b/sonar-plugin-api/src/main/java/org/sonar/api/issue/RubyIssueService.java index dd716651c38..458f123541f 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/issue/RubyIssueService.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/issue/RubyIssueService.java @@ -56,8 +56,9 @@ public interface RubyIssueService extends ServerComponent { *
  • 'assigned': true to get only assigned issues, false to get only unassigned issues. By default no filtering is done.
  • *
  • 'createdAfter': match all the issues created after the given date (inclusive). Both date and datetime ISO formats are supported: 2013-05-18 or 2010-05-18T15:50:45+0100
  • *
  • 'createdBefore': match all the issues created before the given date (exclusive). Both date and datetime ISO formats are supported: 2013-05-18 or 2010-05-18T15:50:45+0100
  • - *
  • 'pageSize': TODO
  • - *
  • 'pageIndex': TODO
  • + *
  • 'pageSize': maximum number of results per page. Default is {@link org.sonar.api.issue.IssueQuery#DEFAULT_PAGE_SIZE}, + * except when the parameter 'components' is set. In this case there's no limit by default (all results in the same page).
  • + *
  • 'pageIndex': index of the selected page. Default is 1.
  • *
  • 'sort': TODO
  • *
  • 'asc': TODO
  • * diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/issue/IssueQueryTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/issue/IssueQueryTest.java index fb972c40cee..5792dc0f63a 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/issue/IssueQueryTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/issue/IssueQueryTest.java @@ -49,7 +49,7 @@ public class IssueQueryTest { .assigned(true) .createdAfter(new Date()) .createdBefore(new Date()) - .sort(IssueQuery.Sort.ASSIGNEE) + .sort(IssueQuery.SORT_BY_ASSIGNEE) .pageSize(10) .pageIndex(2) .requiredRole(UserRole.CODEVIEWER) @@ -67,7 +67,7 @@ public class IssueQueryTest { assertThat(query.actionPlans()).containsOnly("AP1", "AP2"); assertThat(query.createdAfter()).isNotNull(); assertThat(query.createdBefore()).isNotNull(); - assertThat(query.sort()).isEqualTo(IssueQuery.Sort.ASSIGNEE); + assertThat(query.sort()).isEqualTo(IssueQuery.SORT_BY_ASSIGNEE); assertThat(query.pageSize()).isEqualTo(10); assertThat(query.pageIndex()).isEqualTo(2); assertThat(query.requiredRole()).isEqualTo(UserRole.CODEVIEWER); diff --git a/sonar-server/src/main/java/org/sonar/server/issue/IssuesFinderSort.java b/sonar-server/src/main/java/org/sonar/server/issue/IssuesFinderSort.java index fb6cca91922..64e394bb731 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/IssuesFinderSort.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/IssuesFinderSort.java @@ -40,30 +40,33 @@ class IssuesFinderSort { } public List sort() { - IssueQuery.Sort sort = query.sort(); + String sort = query.sort(); if (sort != null) { return getIssueProcessor(sort).sort(issues, query.asc()); } return issues; } - private IssueProcessor getIssueProcessor(IssueQuery.Sort sort){ - switch (sort) { - case ASSIGNEE: - return new AssigneeSortIssueProcessor(); - case SEVERITY: - return new SeveritySortIssueProcessor(); - case STATUS: - return new StatusSortIssueProcessor(); - case CREATION_DATE: - return new CreationDateSortIssueProcessor(); - case UPDATE_DATE: - return new UpdateDateSortIssueProcessor(); - case CLOSE_DATE: - return new CloseDateSortIssueProcessor(); - default: - throw new IllegalArgumentException("Cannot sort issues on field : " + sort.name()); + private IssueProcessor getIssueProcessor(String sort) { + if (IssueQuery.SORT_BY_ASSIGNEE.equals(sort)) { + return new AssigneeSortIssueProcessor(); } + if (IssueQuery.SORT_BY_SEVERITY.equals(sort)) { + return new SeveritySortIssueProcessor(); + } + if (IssueQuery.SORT_BY_STATUS.equals(sort)) { + return new StatusSortIssueProcessor(); + } + if (IssueQuery.SORT_BY_CREATION_DATE.equals(sort)) { + return new CreationDateSortIssueProcessor(); + } + if (IssueQuery.SORT_BY_UPDATE_DATE.equals(sort)) { + return new UpdateDateSortIssueProcessor(); + } + if (IssueQuery.SORT_BY_CLOSE_DATE.equals(sort)) { + return new CloseDateSortIssueProcessor(); + } + throw new IllegalArgumentException("Cannot sort issues on field : " + sort); } abstract static class IssueProcessor { diff --git a/sonar-server/src/main/java/org/sonar/server/issue/PublicRubyIssueService.java b/sonar-server/src/main/java/org/sonar/server/issue/PublicRubyIssueService.java index 1832775006f..2f12f8ce1f9 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/PublicRubyIssueService.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/PublicRubyIssueService.java @@ -85,7 +85,7 @@ public class PublicRubyIssueService implements RubyIssueService { builder.pageIndex(RubyUtils.toInteger(props.get("pageIndex"))); String sort = (String) props.get("sort"); if (sort != null) { - builder.sort(IssueQuery.Sort.valueOf(sort.toUpperCase())); + builder.sort(sort); builder.asc(RubyUtils.toBoolean(props.get("asc"))); } return builder.build(); diff --git a/sonar-server/src/test/java/org/sonar/server/issue/IssuesFinderSortTest.java b/sonar-server/src/test/java/org/sonar/server/issue/IssuesFinderSortTest.java index 0b7a1869042..23601d03ed7 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/IssuesFinderSortTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/IssuesFinderSortTest.java @@ -42,7 +42,7 @@ public class IssuesFinderSortTest { IssueDto issue4 = new IssueDto().setId(4L).setAssignee(null); List dtoList = newArrayList(issue1, issue2, issue3, issue4); - IssueQuery query = IssueQuery.builder().sort(IssueQuery.Sort.ASSIGNEE).asc(true).build(); + IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_ASSIGNEE).asc(true).build(); IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query); List result = newArrayList(issuesFinderSort.sort()); @@ -61,7 +61,7 @@ public class IssuesFinderSortTest { IssueDto issue3 = new IssueDto().setId(3L).setStatus("OPEN"); List dtoList = newArrayList(issue1, issue2, issue3); - IssueQuery query = IssueQuery.builder().sort(IssueQuery.Sort.STATUS).asc(false).build(); + IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_STATUS).asc(false).build(); IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query); List result = newArrayList(issuesFinderSort.sort()); @@ -79,7 +79,7 @@ public class IssuesFinderSortTest { IssueDto issue3 = new IssueDto().setId(3L).setSeverity("MAJOR"); List dtoList = newArrayList(issue1, issue2, issue3); - IssueQuery query = IssueQuery.builder().sort(IssueQuery.Sort.SEVERITY).asc(true).build(); + IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_SEVERITY).asc(true).build(); IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query); List result = newArrayList(issuesFinderSort.sort()); @@ -101,7 +101,7 @@ public class IssuesFinderSortTest { IssueDto issue3 = new IssueDto().setId(3L).setIssueCreationDate(date2); List dtoList = newArrayList(issue1, issue2, issue3); - IssueQuery query = IssueQuery.builder().sort(IssueQuery.Sort.CREATION_DATE).asc(false).build(); + IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CREATION_DATE).asc(false).build(); IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query); List result = newArrayList(issuesFinderSort.sort()); @@ -123,7 +123,7 @@ public class IssuesFinderSortTest { IssueDto issue3 = new IssueDto().setId(3L).setIssueUpdateDate(date2); List dtoList = newArrayList(issue1, issue2, issue3); - IssueQuery query = IssueQuery.builder().sort(IssueQuery.Sort.UPDATE_DATE).asc(false).build(); + IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_UPDATE_DATE).asc(false).build(); IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query); List result = newArrayList(issuesFinderSort.sort()); @@ -145,7 +145,7 @@ public class IssuesFinderSortTest { IssueDto issue3 = new IssueDto().setId(3L).setIssueCloseDate(date2); List dtoList = newArrayList(issue1, issue2, issue3); - IssueQuery query = IssueQuery.builder().sort(IssueQuery.Sort.CLOSE_DATE).asc(false).build(); + IssueQuery query = IssueQuery.builder().sort(IssueQuery.SORT_BY_CLOSE_DATE).asc(false).build(); IssuesFinderSort issuesFinderSort = new IssuesFinderSort(dtoList, query); List result = newArrayList(issuesFinderSort.sort()); diff --git a/sonar-server/src/test/java/org/sonar/server/issue/PublicRubyIssueServiceTest.java b/sonar-server/src/test/java/org/sonar/server/issue/PublicRubyIssueServiceTest.java index d85d8102b15..8552facf9bb 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/PublicRubyIssueServiceTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/PublicRubyIssueServiceTest.java @@ -74,7 +74,7 @@ public class PublicRubyIssueServiceTest { map.put("rules", "squid:AvoidCycle,findbugs:NullReference"); map.put("pageSize", 10l); map.put("pageIndex", 50); - map.put("sort", "creation_date"); + map.put("sort", "CREATION_DATE"); map.put("asc", true); IssueQuery query = new PublicRubyIssueService(finder).toQuery(map); @@ -94,7 +94,7 @@ public class PublicRubyIssueServiceTest { assertThat(query.createdBefore()).isEqualTo(DateUtils.parseDateTime("2013-04-17T09:08:24+0200")); assertThat(query.pageSize()).isEqualTo(10); assertThat(query.pageIndex()).isEqualTo(50); - assertThat(query.sort()).isEqualTo(IssueQuery.Sort.CREATION_DATE); + assertThat(query.sort()).isEqualTo(IssueQuery.SORT_BY_CREATION_DATE); assertThat(query.asc()).isTrue(); } -- 2.39.5