public static final String UPLOAD_REPORT_ACTION = "upload_report";
static final String PARAM_PROJECT = "project";
- static final String PARAM_FIRST_ANALYSIS = "firstAnalysis";
private final DbClient dbClient;
private final IndexClient index;
.setRequired(true)
.setDescription("Project key")
.setExampleValue("org.codehaus.sonar:sonar");
-
- action
- .createParam(PARAM_FIRST_ANALYSIS)
- .setDescription("Is it the first analysis of this project ?")
- .setDefaultValue(false)
- .setBooleanPossibleValues();
}
@Override
AuthorizedComponentDto project = dbClient.componentDao().getAuthorizedComponentByKey(projectKey, session);
// Synchronize project permission indexes
- boolean isFirstAnalysis = request.mandatoryParamAsBoolean(PARAM_FIRST_ANALYSIS);
- if (isFirstAnalysis) {
- permissionService.synchronizePermissions(session, project.key());
- session.commit();
- }
+ // TODO only update permission if no permission for a project
+ permissionService.synchronizePermissions(session, project.key());
+ session.commit();
// Index project's issues
dbClient.issueDao().synchronizeAfter(session,
import org.sonar.server.search.IndexUtils;
import javax.annotation.CheckForNull;
+
import java.util.Collections;
import java.util.Date;
import java.util.List;
@Override
public RuleKey ruleKey() {
- return RuleKey.of(
- (String) getField(IssueNormalizer.IssueField.REPOSITORY.field()),
- (String) getField(IssueNormalizer.IssueField.RULE.field()));
+ return RuleKey.parse((String) getField(IssueNormalizer.IssueField.RULE_KEY.field()));
+ }
+
+ @Override
+ public String language() {
+ return getField(IssueNormalizer.IssueField.LANGUAGE.field());
}
@Override
import org.sonar.core.issue.db.IssueDto;
import org.sonar.server.search.*;
+import javax.annotation.Nullable;
+
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
}
// Field Filters
+ matchFilter(esFilter, IssueNormalizer.IssueField.KEY, query.issueKeys());
matchFilter(esFilter, IssueNormalizer.IssueField.ACTION_PLAN, query.actionPlans());
matchFilter(esFilter, IssueNormalizer.IssueField.ASSIGNEE, query.assignees());
matchFilter(esFilter, IssueNormalizer.IssueField.PROJECT, query.componentRoots());
matchFilter(esFilter, IssueNormalizer.IssueField.COMPONENT, query.components());
- matchFilter(esFilter, IssueNormalizer.IssueField.KEY, query.issueKeys());
- // TODO need to either materialize the language or join with rule
- // query.languages(esFilter, IssueNormalizer.IssueField.L, query.issueKeys());
+ matchFilter(esFilter, IssueNormalizer.IssueField.LANGUAGE, query.languages());
matchFilter(esFilter, IssueNormalizer.IssueField.RESOLUTION, query.resolutions());
matchFilter(esFilter, IssueNormalizer.IssueField.REPORTER, query.reporters());
- matchFilter(esFilter, IssueNormalizer.IssueField.RULE, query.rules());
+ matchFilter(esFilter, IssueNormalizer.IssueField.RULE_KEY, query.rules());
matchFilter(esFilter, IssueNormalizer.IssueField.SEVERITY, query.severities());
matchFilter(esFilter, IssueNormalizer.IssueField.STATUS, query.statuses());
return new Result<Issue>(this, response);
}
- private void matchFilter(BoolFilterBuilder filter, IndexField field, Collection<?> values) {
+ private void matchFilter(BoolFilterBuilder filter, IndexField field, @Nullable Collection<?> values) {
if (values != null && !values.isEmpty()) {
filter.must(FilterBuilders.termsFilter(field.field(), values));
}
public static final IndexField REPORTER = add(IndexField.Type.STRING, "reporter");
public static final IndexField STATUS = add(IndexField.Type.STRING, "status");
public static final IndexField SEVERITY = add(IndexField.Type.STRING, "severity");
-
- public static final IndexField RULE = addSearchable(IndexField.Type.STRING, "rule");
- public static final IndexField REPOSITORY = addSearchable(IndexField.Type.STRING, "repository");
+ public static final IndexField LANGUAGE = add(IndexField.Type.STRING, "language");
+ public static final IndexField RULE_KEY = addSearchable(IndexField.Type.STRING, "ruleKey");
public static final Set<IndexField> ALL_FIELDS = getAllFields();
update.put(IssueField.STATUS.field(), dto.getStatus());
update.put(IssueField.SEVERITY.field(), dto.getSeverity());
update.put(IssueField.DEBT.field(), dto.getDebt());
-
- // issueDoc.ruleKey();
- update.put(IssueField.RULE.field(), dto.getRule());
- update.put(IssueField.REPOSITORY.field(), dto.getRuleRepo());
+ update.put(IssueField.LANGUAGE.field(), dto.getLanguage());
+ update.put(IssueField.RULE_KEY.field(), dto.getRuleKey().toString());
// TODO Not yet normalized
// IssueDoc issueDoc = new IssueDoc(null);
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)
+ action.createParam(SearchRequestHandler.PARAM_SORT)
.setDescription("Sort field")
+ .setDeprecatedKey(IssueFilterParameters.SORT)
.setPossibleValues(IssueQuery.SORTS);
- action.createParam(IssueFilterParameters.ASC)
+ action.createParam(SearchRequestHandler.PARAM_ASCENDING)
+ .setDeprecatedKey(IssueFilterParameters.ASC)
.setDescription("Ascending sort")
.setBooleanPossibleValues();
action.createParam("format")
.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);
+ .createdBefore(request.paramAsDateTime(IssueFilterParameters.CREATED_BEFORE));
+ String sort = request.param(SearchRequestHandler.PARAM_SORT);
if (!Strings.isNullOrEmpty(sort)) {
builder.sort(sort);
- builder.asc(request.paramAsBoolean(IssueFilterParameters.ASC));
+ builder.asc(request.paramAsBoolean(SearchRequestHandler.PARAM_ASCENDING));
}
return builder.build();
}
@Override
protected Result<Issue> doSearch(IssueQuery query, QueryContext context) {
+ // Set limit to context ?
return ((DefaultIssueService)service).search(query, context);
}
import org.sonar.server.search.Result;
import javax.annotation.CheckForNull;
+
import java.util.Collection;
import java.util.List;
import java.util.Map;
public static final String PARAM_FACETS = "facets";
- private int pageSize;
- private int page;
private List<String> fields;
private final String actionName;
action
.createParam(PARAM_PAGE)
+ .setDeprecatedKey("pageIndex")
.setDescription("1-based page number")
.setExampleValue("42")
.setDefaultValue("1");
action
.createParam(PARAM_PAGE_SIZE)
+ .setDeprecatedKey("pageSize")
.setDescription("Page size. Must be greater than 0.")
.setExampleValue("20")
- .setDefaultValue(String.valueOf(QueryContext.DEFAULT_LIMIT));
+ .setDefaultValue("100");
action.createParam(PARAM_FACETS)
.setDescription("Compute predefined facets")
Result<DOMAIN> result = doSearch(query, context);
JsonWriter json = response.newJsonWriter().beginObject();
- this.writeStatistics(json, result);
+ this.writeStatistics(json, result, context);
doResultResponse(request, context, result, json);
doContextResponse(request, context, result, json);
if (context.isFacet()) {
request.mandatoryParamAsInt(PARAM_PAGE_SIZE));
}
- protected void writeStatistics(JsonWriter json, Result searchResult) {
+ protected void writeStatistics(JsonWriter json, Result searchResult, QueryContext context) {
json.prop("total", searchResult.getTotal());
- json.prop(PARAM_PAGE, page);
- json.prop(PARAM_PAGE_SIZE, pageSize);
+ json.prop(PARAM_PAGE, context.getPage());
+ json.prop(PARAM_PAGE_SIZE, context.getLimit());
}
protected void writeFacets(Result<?> results, JsonWriter json) {
public void define() throws Exception {
WebService.Action restoreProfiles = controller.action(UploadReportAction.UPLOAD_REPORT_ACTION);
assertThat(restoreProfiles).isNotNull();
- assertThat(restoreProfiles.params()).hasSize(2);
+ assertThat(restoreProfiles.params()).hasSize(1);
}
@Test
- public void add_project_issue_permission_index_on_first_analysis() throws Exception {
+ public void add_project_issue_permission_index() throws Exception {
ComponentDto project = new ComponentDto()
.setId(1L)
.setKey("MyProject")
MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
WsTester.TestRequest request = wsTester.newGetRequest(BatchWs.API_ENDPOINT, UploadReportAction.UPLOAD_REPORT_ACTION);
request.setParam(UploadReportAction.PARAM_PROJECT, project.key());
- request.setParam(UploadReportAction.PARAM_FIRST_ANALYSIS, "true");
request.execute();
// Check that issue authorization index has been created
assertThat(issue.getComponentId()).isEqualTo(401);
assertThat(issue.getRootComponentId()).isEqualTo(399);
assertThat(issue.getRuleId()).isEqualTo(500);
+ assertThat(issue.getLanguage()).isEqualTo("java");
assertThat(issue.getSeverity()).isEqualTo("BLOCKER");
assertThat(issue.isManualSeverity()).isFalse();
assertThat(issue.getMessage()).isNull();
package org.sonar.server.issue.index;
import com.google.common.collect.ImmutableList;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.*;
import org.sonar.api.issue.Issue;
import org.sonar.api.issue.IssueQuery;
+import org.sonar.api.rule.RuleKey;
import org.sonar.api.security.DefaultGroups;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.web.UserRole;
assertThat(result.getHits()).hasSize(2);
}
+ @Test
+ public void filter_by_rule() throws Exception {
+ db.issueDao().insert(session, createIssue().setRule(rule));
+
+ tester.get(RuleDao.class).insert(session, RuleTesting.newDto(RuleKey.of("rule", "without issue")));
+ session.commit();
+
+ assertThat(index.search(IssueQuery.builder().rules(newArrayList(rule.getKey())).build(), new QueryContext()).getHits()).hasSize(1);
+ assertThat(index.search(IssueQuery.builder().rules(newArrayList(RuleKey.of("rule", "without issue"))).build(), new QueryContext()).getHits()).isEmpty();
+ }
+
+ @Test
+ public void filter_by_language() throws Exception {
+ db.issueDao().insert(session, createIssue().setRule(rule));
+ session.commit();
+
+ assertThat(index.search(IssueQuery.builder().languages(newArrayList(rule.getLanguage())).build(), new QueryContext()).getHits()).hasSize(1);
+ assertThat(index.search(IssueQuery.builder().languages(newArrayList("unknown")).build(), new QueryContext()).getHits()).isEmpty();
+ }
+
@Test
public void is_assigned_filter() throws Exception {
String assignee = "steph";
assertThat(result.getHits()).hasSize(500);
}
+ @Test
+ @Ignore("TODO")
+ public void sort_by_assignee() throws Exception {
+ IssueDto issue1 = createIssue().setAssignee("steph");
+ IssueDto issue2 = createIssue().setAssignee("simon");
+ db.issueDao().insert(session, issue1, issue2);
+ session.commit();
+
+ IssueQuery.Builder query = IssueQuery.builder().sort(IssueQuery.SORT_BY_ASSIGNEE).asc(true);
+ Result<Issue> result = index.search(query.build(), new QueryContext());
+ assertThat(result.getHits()).hasSize(2);
+ assertThat(result.getHits().get(0).assignee()).isEqualTo("simon");
+ assertThat(result.getHits().get(1).assignee()).isEqualTo("steph");
+
+ query = IssueQuery.builder().sort(IssueQuery.SORT_BY_ASSIGNEE).asc(false);
+ result = index.search(query.build(), new QueryContext());
+ assertThat(result.getHits()).hasSize(2);
+ assertThat(result.getHits().get(0).assignee()).isEqualTo("steph");
+ assertThat(result.getHits().get(1).assignee()).isEqualTo("simon");
+ }
+
@Test
public void authorized_issues_on_groups() throws Exception {
ComponentDto project1 = new ComponentDto()
+++ /dev/null
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.issue.ws;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.sonar.api.security.DefaultGroups;
-import org.sonar.api.server.ws.WebService;
-import org.sonar.api.utils.DateUtils;
-import org.sonar.api.web.UserRole;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.issue.db.IssueDto;
-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.server.component.SnapshotTesting;
-import org.sonar.server.db.DbClient;
-import org.sonar.server.rule.RuleTesting;
-import org.sonar.server.rule.db.RuleDao;
-import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.MockUserSession;
-import org.sonar.server.ws.WsTester;
-
-import java.util.Date;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-public class IssuesWsMediumTest {
-
- @ClassRule
- public static ServerTester tester = new ServerTester()
- .setProperty("sonar.issues.use_es_backend", "true");
-
- IssuesWs ws;
- DbClient db;
- DbSession session;
- WsTester wsTester;
-
- @Before
- public void setUp() throws Exception {
- tester.clearDbAndIndexes();
- db = tester.get(DbClient.class);
- ws = tester.get(IssuesWs.class);
- wsTester = tester.get(WsTester.class);
- session = db.openSession(false);
- MockUserSession.set().setLogin("gandalf").setGlobalPermissions(GlobalPermissions.QUALITY_PROFILE_ADMIN);
- }
-
- @After
- public void after() {
- session.close();
- }
-
- @Test
- public void define() throws Exception {
- WebService.Controller controller = wsTester.controller(IssuesWs.API_ENDPOINT);
-
- assertThat(controller).isNotNull();
- assertThat(controller.actions()).hasSize(14);
- assertThat(controller.action(IssuesWs.ADD_COMMENT_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.ASSIGN_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.BULK_CHANGE_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.CHANGELOG_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.CREATE_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.DELETE_COMMENT_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.DO_ACTION_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.DO_TRANSITION_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.EDIT_COMMENT_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.PLAN_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.SET_SEVERITY_ACTION)).isNotNull();
- assertThat(controller.action(IssuesWs.TRANSITIONS_ACTION)).isNotNull();
-
- assertThat(controller.action(SearchAction.SEARCH_ACTION)).isNotNull();
- }
-
- @Test
- public void empty_search() throws Exception {
-
- WsTester.TestRequest request = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION);
- WsTester.Result result = request.execute();
-
- assertThat(result).isNotNull();
- result.assertJson(this.getClass(), "empty_result.json", false);
- }
-
- @Test
- public void find_single_result() throws Exception {
-
- RuleDto rule = RuleTesting.newXooX1();
- tester.get(RuleDao.class).insert(session, rule);
-
- ComponentDto project = new ComponentDto()
- .setId(1L)
- .setKey("MyProject")
- .setProjectId(1L);
- db.componentDao().insert(session, project);
- db.snapshotDao().insert(session, SnapshotTesting.createForComponent(project));
-
- // 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));
-
- ComponentDto resource = new ComponentDto()
- .setProjectId(1L)
- .setKey("MyComponent")
- .setId(2L);
- db.componentDao().insert(session, resource);
- db.snapshotDao().insert(session, SnapshotTesting.createForComponent(resource));
-
- IssueDto issue = new IssueDto()
- .setIssueCreationDate(DateUtils.parseDate("2014-09-04"))
- .setIssueUpdateDate(DateUtils.parseDate("2014-12-04"))
- .setRule(rule)
- .setDebt(10L)
- .setRootComponent(project)
- .setComponent(resource)
- .setStatus("OPEN").setResolution("OPEN")
- .setKee("82fd47d4-b650-4037-80bc-7b112bd4eac2")
- .setSeverity("MAJOR");
- db.issueDao().insert(session, issue);
-
- session.commit();
-
- WsTester.TestRequest request = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION);
- request.setParam(SearchAction.PARAM_FACETS, "true");
- WsTester.Result result = request.execute();
- assertThat(result).isNotNull();
-
- // TODO Date assertion is complex du to System2
- result.assertJson(this.getClass(), "single_result.json", false);
- }
-}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package org.sonar.server.issue.ws;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+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.IssueDto;
+import org.sonar.core.permission.PermissionFacade;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.rule.RuleDto;
+import org.sonar.server.component.SnapshotTesting;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.issue.IssueTesting;
+import org.sonar.server.issue.db.IssueDao;
+import org.sonar.server.issue.filter.IssueFilterParameters;
+import org.sonar.server.rule.RuleTesting;
+import org.sonar.server.rule.db.RuleDao;
+import org.sonar.server.tester.ServerTester;
+import org.sonar.server.user.MockUserSession;
+import org.sonar.server.ws.WsTester;
+
+import java.util.Date;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+public class SearchActionMediumTest {
+
+ @ClassRule
+ public static ServerTester tester = new ServerTester()
+ .setProperty("sonar.issues.use_es_backend", "true");
+
+ IssuesWs ws;
+ DbClient db;
+ DbSession session;
+ WsTester wsTester;
+
+ RuleDto rule;
+ ComponentDto project;
+ ComponentDto file;
+
+ @Before
+ public void setUp() throws Exception {
+ tester.clearDbAndIndexes();
+ db = tester.get(DbClient.class);
+ ws = tester.get(IssuesWs.class);
+ wsTester = tester.get(WsTester.class);
+ session = db.openSession(false);
+
+ rule = RuleTesting.newXooX1();
+ tester.get(RuleDao.class).insert(session, rule);
+
+ project = new ComponentDto()
+ .setId(1L)
+ .setKey("MyProject")
+ .setProjectId(1L);
+ db.componentDao().insert(session, project);
+ db.snapshotDao().insert(session, SnapshotTesting.createForComponent(project));
+
+ // 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));
+
+ file = new ComponentDto()
+ .setProjectId(1L)
+ .setKey("MyComponent")
+ .setId(2L);
+ db.componentDao().insert(session, file);
+ db.snapshotDao().insert(session, SnapshotTesting.createForComponent(file));
+
+ session.commit();
+
+ MockUserSession.set().setLogin("gandalf");
+ }
+
+ @After
+ public void after() {
+ session.close();
+ }
+
+ @Test
+ public void empty_search() throws Exception {
+ WsTester.TestRequest request = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION);
+ WsTester.Result result = request.execute();
+
+ assertThat(result).isNotNull();
+ result.assertJson(this.getClass(), "empty_result.json", false);
+ }
+
+ @Test
+ public void find_single_result() throws Exception {
+ IssueDto issue = IssueTesting.newDto(rule, file, project)
+ .setIssueCreationDate(DateUtils.parseDate("2014-09-04"))
+ .setIssueUpdateDate(DateUtils.parseDate("2014-12-04"))
+ .setRule(rule)
+ .setDebt(10L)
+ .setRootComponent(project)
+ .setComponent(file)
+ .setStatus("OPEN").setResolution("OPEN")
+ .setKee("82fd47d4-b650-4037-80bc-7b112bd4eac2")
+ .setSeverity("MAJOR");
+ db.issueDao().insert(session, issue);
+ session.commit();
+
+ WsTester.TestRequest request = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION);
+ request.setParam(SearchAction.PARAM_FACETS, "true");
+
+ WsTester.Result result = request.execute();
+ // TODO Date assertion is complex du to System2
+ result.assertJson(this.getClass(), "single_result.json", false);
+ }
+
+ @Test
+ public void paging() throws Exception {
+ for (int i=0; i<12; i++) {
+ IssueDto issue = IssueTesting.newDto(rule, file, project);
+ tester.get(IssueDao.class).insert(session, issue);
+ }
+ session.commit();
+
+ WsTester.TestRequest request = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION);
+ request.setParam(SearchAction.PARAM_PAGE, "2");
+ request.setParam(SearchAction.PARAM_PAGE_SIZE, "9");
+
+ WsTester.Result result = request.execute();
+ result.assertJson(this.getClass(), "paging.json", false);
+ }
+
+ @Test
+ public void paging_with_deprecated_params() throws Exception {
+ for (int i=0; i<12; i++) {
+ IssueDto issue = IssueTesting.newDto(rule, file, project);
+ tester.get(IssueDao.class).insert(session, issue);
+ }
+ session.commit();
+
+ WsTester.TestRequest request = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION);
+ request.setParam(IssueFilterParameters.PAGE_INDEX, "2");
+ request.setParam(IssueFilterParameters.PAGE_SIZE, "9");
+
+ WsTester.Result result = request.execute();
+ result.assertJson(this.getClass(), "paging.json", false);
+ }
+
+ @Test
+ public void default_page_size_is_100() throws Exception {
+ WsTester.TestRequest request = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION);
+
+ WsTester.Result result = request.execute();
+ result.assertJson(this.getClass(), "default_page_size_is_100.json", false);
+ }
+
+}
+++ /dev/null
-{"maxResultsReached": false, "paging": {
- "pageIndex": 1,
- "pageSize": 10,
- "total": 0,
- "fTotal": "0",
- "pages": 0
-}, "issues": [], "components": [], "projects": []}
+++ /dev/null
-{"maxResultsReached": false, "paging": {
- "pageIndex": 1,
- "pageSize": 10,
- "total": 1,
- "fTotal": "1",
- "pages": 1
-}, "issues": [
- {
- "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
- "component": "MyComponent",
- "project": "MyProject",
- "rule": "xoo:x1",
- "status": "OPEN",
- "resolution": "OPEN",
- "severity": "MAJOR",
- "debt": "10min",
- "fUpdateAge": "less than a minute"
- }
-], "components": [
- {
- "key": "MyComponent",
- "id": 2
- }
-], "projects": [
- {
- "key": "MyProject",
- "id": 1
- }
-], "facets": [
- {
- "property": "status",
- "values": [
- {
- "val": "OPEN",
- "count": 1
- }
- ]
- },
- {
- "property": "severity",
- "values": [
- {
- "val": "MAJOR",
- "count": 1
- }
- ]
- },
- {
- "property": "resolution",
- "values": [
- {
- "val": "OPEN",
- "count": 1
- }
- ]
- }
-]}
--- /dev/null
+{
+ "total": 0,
+ "p": 1,
+ "ps": 100,
+ "maxResultsReached": false,
+ "paging": {
+ "pageIndex": 1,
+ "pageSize": 100,
+ "total": 0,
+ "fTotal": "0",
+ "pages": 0
+ }
+}
--- /dev/null
+{
+ "total": 0,
+ "p": 1,
+ "ps": 100,
+ "maxResultsReached": false,
+ "paging": {
+ "pageIndex": 1,
+ "pageSize": 100,
+ "total": 0,
+ "fTotal": "0",
+ "pages": 0
+ },
+ "issues": [],
+ "components": [],
+ "projects": []
+}
--- /dev/null
+{
+ "total": 12,
+ "p": 2,
+ "ps": 9,
+ "maxResultsReached": false,
+ "paging": {
+ "pageIndex": 2,
+ "pageSize": 9,
+ "total": 12,
+ "fTotal": "12",
+ "pages": 2
+ }
+}
--- /dev/null
+{
+ "maxResultsReached": false,
+ "paging": {
+ "pageIndex": 1,
+ "pageSize": 100,
+ "total": 1,
+ "fTotal": "1",
+ "pages": 1
+ },
+ "issues": [
+ {
+ "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2",
+ "component": "MyComponent",
+ "project": "MyProject",
+ "rule": "xoo:x1",
+ "status": "OPEN",
+ "resolution": "OPEN",
+ "severity": "MAJOR",
+ "debt": "10min",
+ "fUpdateAge": "less than a minute"
+ }
+ ],
+ "components": [
+ {
+ "key": "MyComponent",
+ "id": 2
+ }
+ ],
+ "projects": [
+ {
+ "key": "MyProject",
+ "id": 1
+ }
+ ],
+ "facets": [
+ {
+ "property": "status",
+ "values": [
+ {
+ "val": "OPEN",
+ "count": 1
+ }
+ ]
+ },
+ {
+ "property": "severity",
+ "values": [
+ {
+ "val": "MAJOR",
+ "count": 1
+ }
+ ]
+ },
+ {
+ "property": "resolution",
+ "values": [
+ {
+ "val": "OPEN",
+ "count": 1
+ }
+ ]
+ }
+ ]}
// joins
private String ruleKey;
private String ruleRepo;
+ private String language;
private String componentKey;
private String rootComponentKey;
this.ruleId = rule.getId();
this.ruleKey = rule.getRuleKey();
this.ruleRepo = rule.getRepositoryKey();
+ this.language = rule.getLanguage();
return this;
}
return RuleKey.of(ruleRepo, ruleKey);
}
+ public String getLanguage(){
+ return language;
+ }
+
public String getComponentKey() {
return componentKey;
}
return this;
}
+ /**
+ * Should only be used to persist in E/S
+ *
+ * Please use {@link #setRule(org.sonar.core.rule.RuleDto)} instead
+ */
+ public IssueDto setLanguage(String language) {
+ this.language = language;
+ return this;
+ }
+
/**
* Should only be used to persist in E/S
*
issue.setProjectKey(rootComponentKey);
issue.setManualSeverity(manualSeverity);
issue.setRuleKey(getRuleKey());
+ issue.setLanguage(language);
issue.setActionPlanKey(actionPlanKey);
issue.setAuthorLogin(authorLogin);
issue.setNew(false);
i.updated_at as updatedAt,
r.plugin_rule_key as ruleKey,
r.plugin_name as ruleRepo,
+ r.language as language,
p.kee as componentKey,
root.kee as rootComponentKey
</sql>
.setKee("100")
.setRuleId(1)
.setRuleKey("squid", "AvoidCycle")
+ .setLanguage("xoo")
.setComponentKey("org.sonar.sample:Sample")
.setRootComponentKey("org.sonar.sample")
.setComponentId(1l)
DefaultIssue issue = dto.toDefaultIssue();
assertThat(issue.key()).isEqualTo("100");
assertThat(issue.ruleKey().toString()).isEqualTo("squid:AvoidCycle");
+ assertThat(issue.language()).isEqualTo("xoo");
assertThat(issue.componentKey()).isEqualTo("org.sonar.sample:Sample");
assertThat(issue.componentId()).isEqualTo(1L);
assertThat(issue.projectKey()).isEqualTo("org.sonar.sample");
RuleKey ruleKey();
+ String language();
+
/**
* See constants in {@link org.sonar.api.rule.Severity}.
*/
import javax.annotation.Nullable;
import java.io.Serializable;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import static com.google.common.collect.Lists.newArrayList;
private Long componentId;
private String projectKey;
private RuleKey ruleKey;
+ private String language;
private String severity;
private boolean manualSeverity = false;
private String message;
return this;
}
+ public String language() {
+ return language;
+ }
+
+ public DefaultIssue setLanguage(String l) {
+ this.language = l;
+ return this;
+ }
+
public String severity() {
return severity;
}