--- /dev/null
+sonarqube {
+ properties {
+ property 'sonar.projectName', "${projectTitle} :: WebServer :: PushAPI"
+ }
+}
+dependencies {
+
+ compile project(':server:sonar-webserver-auth')
+ compile project(':server:sonar-webserver-ws')
+
+ testCompile 'junit:junit'
+ testCompile 'org.assertj:assertj-core'
+ testCompile 'org.mockito:mockito-core'
+
+ testCompile testFixtures(project(':server:sonar-webserver-ws'))
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 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.pushapi;
+
+import org.sonar.server.ws.WsAction;
+
+public interface ServerPushAction extends WsAction {
+ //marker interface
+
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 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.pushapi;
+
+import java.util.List;
+import org.sonar.api.server.ws.WebService;
+
+public class ServerPushWs implements WebService {
+ private final List<ServerPushAction> actions;
+
+ public ServerPushWs(List<ServerPushAction> actions) {
+ this.actions = actions;
+ }
+
+ @Override
+ public void define(Context context) {
+ NewController controller = context
+ .createController("api/push")
+ .setSince("9.4")
+ .setDescription("Endpoints supporting server side events.");
+
+ actions.forEach(action -> action.define(controller));
+
+ controller.done();
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 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.pushapi;
+
+import org.sonar.core.platform.Module;
+import org.sonar.server.pushapi.sonarlint.SonarLintPushAction;
+
+public class ServerPushWsModule extends Module {
+
+ @Override
+ protected void configureModule() {
+ add(
+ ServerPushWs.class,
+
+ SonarLintPushAction.class);
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 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.pushapi.sonarlint;
+
+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.log.Logger;
+import org.sonar.api.utils.log.Loggers;
+import org.sonar.server.pushapi.ServerPushAction;
+
+public class SonarLintPushAction implements ServerPushAction {
+
+ private static final Logger LOGGER = Loggers.get(SonarLintPushAction.class);
+
+ private static final String PROJECT_PARAM_KEY = "projectKeys";
+ private static final String LANGUAGE_PARAM_KEY = "languages";
+
+ @Override
+ public void define(WebService.NewController controller) {
+ WebService.NewAction action = controller
+ .createAction("sonarlint_events")
+ .setInternal(true)
+ .setDescription("Endpoint for listening to server side events. Currently it notifies listener about change to activation of a rule")
+ .setSince("9.4")
+ .setHandler(this);
+
+ action
+ .createParam(PROJECT_PARAM_KEY)
+ .setDescription("Comma-separated list of projects keys for which events will be delivered")
+ .setRequired(true)
+ .setExampleValue("example-project-key,example-project-key2");
+
+ action
+ .createParam(LANGUAGE_PARAM_KEY)
+ .setDescription("Comma-separated list of languages for which events will be delivered")
+ .setRequired(true)
+ .setExampleValue("java,cobol");
+ }
+
+ @Override
+ public void handle(Request request, Response response) {
+ String projectKeys = request.getParam(PROJECT_PARAM_KEY).getValue();
+ String languages = request.getParam(LANGUAGE_PARAM_KEY).getValue();
+
+ //to remove later
+ LOGGER.debug(projectKeys != null ? projectKeys : "");
+ LOGGER.debug(languages != null ? languages : "");
+
+ response.noContent();
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 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.pushapi;
+
+import org.junit.Test;
+import org.sonar.core.platform.ComponentContainer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ServerPushWsModuleTest {
+
+
+ @Test
+ public void verify_count_of_added_components() {
+ ComponentContainer container = new ComponentContainer();
+
+ new ServerPushWsModule().configure(container);
+
+ assertThat(container.size()).isPositive();
+ }
+}
+
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 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.pushapi;
+
+import java.util.Arrays;
+import org.junit.Test;
+import org.sonar.api.server.ws.Request;
+import org.sonar.api.server.ws.Response;
+import org.sonar.api.server.ws.WebService;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ServerPushWsTest {
+
+ private DummyServerPushAction dummyServerPushAction = new DummyServerPushAction();
+ private ServerPushWs underTest = new ServerPushWs(Arrays.asList(dummyServerPushAction));
+
+ @Test
+ public void define_ws() {
+ WebService.Context context = new WebService.Context();
+
+ underTest.define(context);
+
+ WebService.Controller controller = context.controller("api/push");
+ assertThat(controller).isNotNull();
+ assertThat(controller.path()).isEqualTo("api/push");
+ assertThat(controller.since()).isEqualTo("9.4");
+ assertThat(controller.description()).isNotEmpty();
+ assertThat(controller.actions()).isNotEmpty();
+ }
+
+ private static class DummyServerPushAction implements ServerPushAction {
+
+ @Override
+ public void define(WebService.NewController context) {
+ context.createAction("foo").setHandler(this);
+ }
+
+ @Override
+ public void handle(Request request, Response response) {
+
+ }
+ }
+}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2021 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.pushapi.sonarlint;
+
+import org.junit.Test;
+import org.sonar.api.server.ws.WebService;
+import org.sonar.server.ws.TestRequest;
+import org.sonar.server.ws.TestResponse;
+import org.sonar.server.ws.WsActionTester;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.assertj.core.api.Assertions.tuple;
+
+public class SonarLintPushActionTest {
+
+ private final WsActionTester ws = new WsActionTester(new SonarLintPushAction());
+
+ @Test
+ public void defineTest() {
+ WebService.Action def = ws.getDef();
+
+ assertThat(def.since()).isEqualTo("9.4");
+ assertThat(def.isInternal()).isTrue();
+ assertThat(def.params())
+ .extracting(WebService.Param::key, WebService.Param::isRequired)
+ .containsExactlyInAnyOrder(tuple("languages", true), tuple("projectKeys", true));
+ }
+
+ @Test
+ public void handle_returnsNoResponseWhenParamsProvided() {
+ TestResponse response = ws.newRequest()
+ .setParam("projectKeys", "project1,project2")
+ .setParam("languages", "java")
+ .execute();
+
+ assertThat(response.getStatus()).isEqualTo(204);
+ }
+
+ @Test
+ public void handle_whenParamsNotProvided_throwException() {
+ TestRequest testRequest = ws.newRequest();
+ assertThatThrownBy(testRequest::execute)
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("The 'projectKeys' parameter is missing");
+ }
+}
compile project(':server:sonar-process')
compile project(':server:sonar-webserver-core')
compile project(':server:sonar-webserver-webapi')
+ compile project(':server:sonar-webserver-pushapi')
compile project(':server:sonar-webserver-monitoring')
compileOnly 'com.google.code.findbugs:jsr305'
import org.sonar.server.projectlink.ws.ProjectLinksModule;
import org.sonar.server.projecttag.ws.ProjectTagsWsModule;
import org.sonar.server.property.InternalPropertiesImpl;
+import org.sonar.server.pushapi.ServerPushWsModule;
import org.sonar.server.qualitygate.ProjectsInWarningModule;
import org.sonar.server.qualitygate.QualityGateModule;
import org.sonar.server.qualitygate.notification.QGChangeNotificationHandler;
MultipleAlmFeatureProvider.class,
+ // ServerPush endpoints
+ ServerPushWsModule.class,
+
// Compute engine (must be after Views and Developer Cockpit)
ReportAnalysisFailureNotificationModule.class,
CeModule.class,
include 'server:sonar-webserver-core'
include 'server:sonar-webserver-es'
include 'server:sonar-webserver-webapi'
+include 'server:sonar-webserver-pushapi'
include 'server:sonar-webserver-ws'
include 'server:sonar-alm-client'
include 'server:sonar-webserver-monitoring'
enabled = !isCiServer
}
}
+