From 7804e38967853801e373c4b19063bc7669b21489 Mon Sep 17 00:00:00 2001 From: Duarte Meneses Date: Thu, 8 Oct 2020 11:43:02 -0500 Subject: [PATCH] SONAR-13941 move api/views/app endpoint to DE and rename to api/metrics/user_metrics --- .../server/metric/ws/MetricsWsModule.java | 1 + .../server/metric/ws/UserMetricsAction.java | 64 +++++++++++++++++ .../metric/ws/example-user-metrics.json | 6 ++ .../server/metric/ws/MetricsWsModuleTest.java | 2 +- .../metric/ws/UserMetricsActionTest.java | 71 +++++++++++++++++++ .../metric/ws/UserMetricsActionTest/app.json | 7 ++ 6 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 server/sonar-webserver-webapi/src/main/java/org/sonar/server/metric/ws/UserMetricsAction.java create mode 100644 server/sonar-webserver-webapi/src/main/resources/org/sonar/server/metric/ws/example-user-metrics.json create mode 100644 server/sonar-webserver-webapi/src/test/java/org/sonar/server/metric/ws/UserMetricsActionTest.java create mode 100644 server/sonar-webserver-webapi/src/test/resources/org/sonar/server/metric/ws/UserMetricsActionTest/app.json diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/metric/ws/MetricsWsModule.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/metric/ws/MetricsWsModule.java index 989a7ff3ce5..3177cca460f 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/metric/ws/MetricsWsModule.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/metric/ws/MetricsWsModule.java @@ -31,6 +31,7 @@ public class MetricsWsModule extends Module { DomainsAction.class, SearchAction.class, UpdateAction.class, + UserMetricsAction.class, TypesAction.class); } } diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/metric/ws/UserMetricsAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/metric/ws/UserMetricsAction.java new file mode 100644 index 00000000000..2fcbef782d2 --- /dev/null +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/metric/ws/UserMetricsAction.java @@ -0,0 +1,64 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program 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. + * + * This program 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.metric.ws; + +import java.util.Collection; +import org.sonar.api.measures.Metric; +import org.sonar.api.measures.Metric.ValueType; +import org.sonar.api.measures.MetricFinder; +import org.sonar.api.server.ws.Request; +import org.sonar.api.server.ws.Response; +import org.sonar.api.server.ws.WebService; +import org.sonar.api.utils.text.JsonWriter; + +public class UserMetricsAction implements MetricsWsAction { + + private final MetricFinder metricFinder; + + public UserMetricsAction(MetricFinder metricFinder) { + this.metricFinder = metricFinder; + } + + @Override + public void handle(Request request, Response response) { + Collection metrics = metricFinder.findAll(); + try (JsonWriter json = response.newJsonWriter()) { + json.beginObject() + .name("manual_metrics") + .beginObject(); + metrics.stream() + .filter(metric -> metric.getUserManaged() && ValueType.STRING == metric.getType()) + .forEach(metric -> json.prop(metric.getKey(), metric.getName())); + json.endObject(); + json.name("remote_servers").beginArray().endArray().endObject(); + } + } + + @Override + public void define(WebService.NewController controller) { + controller.createAction("user_metrics") + .setDescription("Metrics managed by users") + .setSince("1.0") + .setDeprecatedSince("7.4") + .setInternal(true) + .setResponseExample(getClass().getResource("example-user-metrics.json")) + .setHandler(this); + } +} diff --git a/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/metric/ws/example-user-metrics.json b/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/metric/ws/example-user-metrics.json new file mode 100644 index 00000000000..a6d65f6870a --- /dev/null +++ b/server/sonar-webserver-webapi/src/main/resources/org/sonar/server/metric/ws/example-user-metrics.json @@ -0,0 +1,6 @@ +{ + "manual_metrics": { + "entity_name": "Entity Name" + }, + "remote_servers": [] +} diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/metric/ws/MetricsWsModuleTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/metric/ws/MetricsWsModuleTest.java index 09254cae0c1..1ba8e0b6311 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/metric/ws/MetricsWsModuleTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/metric/ws/MetricsWsModuleTest.java @@ -29,6 +29,6 @@ public class MetricsWsModuleTest { public void verify_count_of_added_components() { ComponentContainer container = new ComponentContainer(); new MetricsWsModule().configure(container); - assertThat(container.size()).isEqualTo(9); + assertThat(container.size()).isEqualTo(10); } } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/metric/ws/UserMetricsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/metric/ws/UserMetricsActionTest.java new file mode 100644 index 00000000000..0c1915e46d9 --- /dev/null +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/metric/ws/UserMetricsActionTest.java @@ -0,0 +1,71 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program 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. + * + * This program 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.metric.ws; + +import com.google.common.collect.Lists; +import org.junit.Test; +import org.sonar.api.measures.Metric; +import org.sonar.api.measures.Metric.ValueType; +import org.sonar.api.measures.MetricFinder; +import org.sonar.server.ws.WsActionTester; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.sonar.test.JsonAssert.assertJson; + +public class UserMetricsActionTest { + + MetricFinder metrics = mock(MetricFinder.class); + + WsActionTester ws = new WsActionTester(new UserMetricsAction(metrics)); + + @Test + public void test_definition() { + assertThat(ws.getDef().key()).isEqualTo("user_metrics"); + assertThat(ws.getDef().isInternal()).isTrue(); + assertThat(ws.getDef().responseExampleAsString()).isNotEmpty(); + assertThat(ws.getDef().params()).isEmpty(); + } + + @Test + public void should_list_manual_metrics() { + Metric m1 = mock(Metric.class); + when(m1.getUserManaged()).thenReturn(true); + when(m1.getKey()).thenReturn("m1"); + when(m1.getName()).thenReturn("Metric 1"); + when(m1.getType()).thenReturn(ValueType.STRING); + Metric m2 = mock(Metric.class); + when(m2.getUserManaged()).thenReturn(false); + Metric m3 = mock(Metric.class); + when(m3.getUserManaged()).thenReturn(true); + when(m3.getKey()).thenReturn("m3"); + when(m3.getName()).thenReturn("Metric 3"); + when(m3.getType()).thenReturn(ValueType.STRING); + Metric m4 = mock(Metric.class); + when(m4.getUserManaged()).thenReturn(true); + when(m4.getKey()).thenReturn("m3"); + when(m4.getName()).thenReturn("Metric 4"); + when(m4.getType()).thenReturn(ValueType.INT); + when(metrics.findAll()).thenReturn(Lists.newArrayList(m1, m2, m3, m4)); + + assertJson(ws.newRequest().execute().getInput()).isSimilarTo(getClass().getResource("UserMetricsActionTest/app.json")); + } +} diff --git a/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/metric/ws/UserMetricsActionTest/app.json b/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/metric/ws/UserMetricsActionTest/app.json new file mode 100644 index 00000000000..d2900055324 --- /dev/null +++ b/server/sonar-webserver-webapi/src/test/resources/org/sonar/server/metric/ws/UserMetricsActionTest/app.json @@ -0,0 +1,7 @@ +{ + "manual_metrics": { + "m1": "Metric 1", + "m3": "Metric 3" + }, + "remote_servers": [] +} -- 2.39.5