From b99b802f6857f6384653e84988b77fb88e58f2ef Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Mon, 1 Jun 2015 12:26:34 +0200 Subject: [PATCH] SONAR-6570 ws api/metrics/search change endpoint to search - change endpoint from 'list' to 'search' - add pagination in response - display only optional fields in WS description --- .../server/metric/persistence/MetricDao.java | 4 +++ .../ws/{ListAction.java => SearchAction.java} | 28 +++++++++++-------- .../platformlevel/PlatformLevel4.java | 3 +- ...tActionTest.java => SearchActionTest.java} | 16 +++++------ .../search_metrics.json} | 5 +++- .../sonar/core/metric/db/MetricMapper.java | 2 ++ .../org/sonar/core/metric/db/MetricMapper.xml | 8 ++++++ 7 files changed, 45 insertions(+), 21 deletions(-) rename server/sonar-server/src/main/java/org/sonar/server/metric/ws/{ListAction.java => SearchAction.java} (86%) rename server/sonar-server/src/test/java/org/sonar/server/metric/ws/{ListActionTest.java => SearchActionTest.java} (91%) rename server/sonar-server/src/test/resources/org/sonar/server/metric/ws/{ListActionTest/list_metrics.json => SearchActionTest/search_metrics.json} (93%) diff --git a/server/sonar-server/src/main/java/org/sonar/server/metric/persistence/MetricDao.java b/server/sonar-server/src/main/java/org/sonar/server/metric/persistence/MetricDao.java index 8b8a01d3bec..175592fbff2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/metric/persistence/MetricDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/metric/persistence/MetricDao.java @@ -96,4 +96,8 @@ public class MetricDao implements DaoComponent { } }); } + + public int countCustom(DbSession session) { + return mapper(session).countCustom(); + } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/metric/ws/ListAction.java b/server/sonar-server/src/main/java/org/sonar/server/metric/ws/SearchAction.java similarity index 86% rename from server/sonar-server/src/main/java/org/sonar/server/metric/ws/ListAction.java rename to server/sonar-server/src/main/java/org/sonar/server/metric/ws/SearchAction.java index d77523a52be..a56f1838e8d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/metric/ws/ListAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/metric/ws/SearchAction.java @@ -20,6 +20,9 @@ package org.sonar.server.metric.ws; +import java.util.List; +import java.util.Set; +import javax.annotation.Nullable; import org.sonar.api.measures.Metric; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; @@ -32,14 +35,11 @@ import org.sonar.core.persistence.MyBatis; import org.sonar.server.db.DbClient; import org.sonar.server.es.SearchOptions; -import javax.annotation.Nullable; - -import java.util.List; -import java.util.Set; - import static com.google.common.collect.Sets.newHashSet; -public class ListAction implements MetricsWsAction { +public class SearchAction implements MetricsWsAction { + + private static final String ACTION = "search"; public static final String PARAM_IS_CUSTOM = "is_custom"; @@ -49,21 +49,25 @@ public class ListAction implements MetricsWsAction { public static final String FIELD_DESCRIPTION = "description"; public static final String FIELD_DOMAIN = "domain"; public static final String FIELD_TYPE = "type"; - private static final Set POSSIBLE_FIELDS = newHashSet(FIELD_ID, FIELD_KEY, FIELD_NAME, FIELD_DESCRIPTION, FIELD_DOMAIN, FIELD_TYPE); + private static final Set OPTIONAL_FIELDS = newHashSet(FIELD_NAME, FIELD_DESCRIPTION, FIELD_DOMAIN, FIELD_TYPE); + private final Set ALL_POSSIBLE_FIELDS; private final DbClient dbClient; - public ListAction(DbClient dbClient) { + public SearchAction(DbClient dbClient) { this.dbClient = dbClient; + Set possibleFields = newHashSet(FIELD_ID, FIELD_KEY); + possibleFields.addAll(OPTIONAL_FIELDS); + ALL_POSSIBLE_FIELDS = possibleFields; } @Override public void define(WebService.NewController context) { - WebService.NewAction action = context.createAction("list") + WebService.NewAction action = context.createAction(ACTION) .setSince("5.2") .setResponseExample(getClass().getResource("example-list.json")) .addPagingParams(100) - .addFieldsParam(POSSIBLE_FIELDS) + .addFieldsParam(OPTIONAL_FIELDS) .setHandler(this); action.createParam(PARAM_IS_CUSTOM) @@ -85,10 +89,12 @@ public class ListAction implements MetricsWsAction { DbSession dbSession = dbClient.openSession(false); try { List metrics = dbClient.metricDao().selectEnabled(dbSession, isCustom, searchOptions); + int nbMetrics = dbClient.metricDao().countCustom(dbSession); JsonWriter json = response.newJsonWriter(); json.beginObject(); Set desiredFields = desiredFields(request.paramAsStrings(Param.FIELDS)); writeMetrics(json, metrics, desiredFields); + searchOptions.writeJson(json, nbMetrics); json.endObject(); json.close(); } finally { @@ -98,7 +104,7 @@ public class ListAction implements MetricsWsAction { private Set desiredFields(@Nullable List fields) { if (fields == null || fields.isEmpty()) { - return POSSIBLE_FIELDS; + return ALL_POSSIBLE_FIELDS; } return newHashSet(fields); diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java index f05626b68c4..d374fe6102f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java @@ -170,6 +170,7 @@ import org.sonar.server.measure.ws.ManualMeasuresWs; import org.sonar.server.measure.ws.TimeMachineWs; import org.sonar.server.metric.CoreCustomMetrics; import org.sonar.server.metric.ws.MetricsWs; +import org.sonar.server.metric.ws.SearchAction; import org.sonar.server.notifications.NotificationCenter; import org.sonar.server.notifications.NotificationService; import org.sonar.server.permission.InternalPermissionService; @@ -496,7 +497,7 @@ public class PlatformLevel4 extends PlatformLevel { TimeMachineWs.class, ManualMeasuresWs.class, MetricsWs.class, - org.sonar.server.metric.ws.ListAction.class, + SearchAction.class, org.sonar.server.metric.ws.TypesAction.class, org.sonar.server.metric.ws.DomainsAction.class, org.sonar.server.metric.ws.DeleteAction.class, diff --git a/server/sonar-server/src/test/java/org/sonar/server/metric/ws/ListActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/metric/ws/SearchActionTest.java similarity index 91% rename from server/sonar-server/src/test/java/org/sonar/server/metric/ws/ListActionTest.java rename to server/sonar-server/src/test/java/org/sonar/server/metric/ws/SearchActionTest.java index ec30e61e418..9a7038705ef 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/metric/ws/ListActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/metric/ws/SearchActionTest.java @@ -34,10 +34,10 @@ import org.sonar.server.metric.persistence.MetricDao; import org.sonar.server.ws.WsTester; import static org.assertj.core.api.Assertions.assertThat; -import static org.sonar.server.metric.ws.ListAction.PARAM_IS_CUSTOM; +import static org.sonar.server.metric.ws.SearchAction.PARAM_IS_CUSTOM; import static org.sonar.server.metric.ws.MetricTesting.newMetricDto; -public class ListActionTest { +public class SearchActionTest { @ClassRule public static DbTester db = new DbTester(); @@ -49,7 +49,7 @@ public class ListActionTest { public void setUp() { dbClient = new DbClient(db.database(), db.myBatis(), new MetricDao()); dbSession = dbClient.openSession(false); - ws = new WsTester(new MetricsWs(new ListAction(dbClient))); + ws = new WsTester(new MetricsWs(new SearchAction(dbClient))); db.truncateTables(); } @@ -59,16 +59,16 @@ public class ListActionTest { } @Test - public void list_metrics_in_database() throws Exception { + public void search_metrics_in_database() throws Exception { insertNewCustomMetric("1", "2", "3"); WsTester.Result result = newRequest().execute(); - result.assertJson(getClass(), "list_metrics.json"); + result.assertJson(getClass(), "search_metrics.json"); } @Test - public void list_metrics_ordered_by_name_case_insensitive() throws Exception { + public void search_metrics_ordered_by_name_case_insensitive() throws Exception { insertNewCustomMetric("3", "1", "2"); String firstResult = newRequest().setParam(Param.PAGE, "1").setParam(Param.PAGE_SIZE, "1").execute().outputAsString(); @@ -81,7 +81,7 @@ public class ListActionTest { } @Test - public void list_metrics_with_pagination() throws Exception { + public void search_metrics_with_pagination() throws Exception { insertNewCustomMetric("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); WsTester.Result result = newRequest() @@ -158,6 +158,6 @@ public class ListActionTest { } private WsTester.TestRequest newRequest() { - return ws.newGetRequest("api/metrics", "list"); + return ws.newGetRequest("api/metrics", "search"); } } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/metric/ws/ListActionTest/list_metrics.json b/server/sonar-server/src/test/resources/org/sonar/server/metric/ws/SearchActionTest/search_metrics.json similarity index 93% rename from server/sonar-server/src/test/resources/org/sonar/server/metric/ws/ListActionTest/list_metrics.json rename to server/sonar-server/src/test/resources/org/sonar/server/metric/ws/SearchActionTest/search_metrics.json index 4f5049c8aeb..0bae892fc3d 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/metric/ws/ListActionTest/list_metrics.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/metric/ws/SearchActionTest/search_metrics.json @@ -21,5 +21,8 @@ "domain":"custom-domain-3", "description":"custom-description-3" } - ] + ], + "total":3, + "ps":100, + "p":1 } diff --git a/sonar-core/src/main/java/org/sonar/core/metric/db/MetricMapper.java b/sonar-core/src/main/java/org/sonar/core/metric/db/MetricMapper.java index 46eaf787e21..dc85301383a 100644 --- a/sonar-core/src/main/java/org/sonar/core/metric/db/MetricMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/metric/db/MetricMapper.java @@ -40,4 +40,6 @@ public interface MetricMapper { List selectByKeys(@Param("keys") List keys); void disable(@Param("ids") List ids); + + int countCustom(); } diff --git a/sonar-core/src/main/resources/org/sonar/core/metric/db/MetricMapper.xml b/sonar-core/src/main/resources/org/sonar/core/metric/db/MetricMapper.xml index 2e638309850..6b427f585ba 100644 --- a/sonar-core/src/main/resources/org/sonar/core/metric/db/MetricMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/metric/db/MetricMapper.xml @@ -48,6 +48,14 @@ ORDER BY UPPER(m.short_name) + -- 2.39.5