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')) | |||||
} |
/* | |||||
* 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 | |||||
} |
/* | |||||
* 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(); | |||||
} | |||||
} |
/* | |||||
* 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); | |||||
} | |||||
} |
/* | |||||
* 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(); | |||||
} | |||||
} |
/* | |||||
* 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(); | |||||
} | |||||
} | |||||
/* | |||||
* 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) { | |||||
} | |||||
} | |||||
} |
/* | |||||
* 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-process') | ||||
compile project(':server:sonar-webserver-core') | compile project(':server:sonar-webserver-core') | ||||
compile project(':server:sonar-webserver-webapi') | compile project(':server:sonar-webserver-webapi') | ||||
compile project(':server:sonar-webserver-pushapi') | |||||
compile project(':server:sonar-webserver-monitoring') | compile project(':server:sonar-webserver-monitoring') | ||||
compileOnly 'com.google.code.findbugs:jsr305' | compileOnly 'com.google.code.findbugs:jsr305' |
import org.sonar.server.projectlink.ws.ProjectLinksModule; | import org.sonar.server.projectlink.ws.ProjectLinksModule; | ||||
import org.sonar.server.projecttag.ws.ProjectTagsWsModule; | import org.sonar.server.projecttag.ws.ProjectTagsWsModule; | ||||
import org.sonar.server.property.InternalPropertiesImpl; | import org.sonar.server.property.InternalPropertiesImpl; | ||||
import org.sonar.server.pushapi.ServerPushWsModule; | |||||
import org.sonar.server.qualitygate.ProjectsInWarningModule; | import org.sonar.server.qualitygate.ProjectsInWarningModule; | ||||
import org.sonar.server.qualitygate.QualityGateModule; | import org.sonar.server.qualitygate.QualityGateModule; | ||||
import org.sonar.server.qualitygate.notification.QGChangeNotificationHandler; | import org.sonar.server.qualitygate.notification.QGChangeNotificationHandler; | ||||
MultipleAlmFeatureProvider.class, | MultipleAlmFeatureProvider.class, | ||||
// ServerPush endpoints | |||||
ServerPushWsModule.class, | |||||
// Compute engine (must be after Views and Developer Cockpit) | // Compute engine (must be after Views and Developer Cockpit) | ||||
ReportAnalysisFailureNotificationModule.class, | ReportAnalysisFailureNotificationModule.class, | ||||
CeModule.class, | CeModule.class, |
include 'server:sonar-webserver-core' | include 'server:sonar-webserver-core' | ||||
include 'server:sonar-webserver-es' | include 'server:sonar-webserver-es' | ||||
include 'server:sonar-webserver-webapi' | include 'server:sonar-webserver-webapi' | ||||
include 'server:sonar-webserver-pushapi' | |||||
include 'server:sonar-webserver-ws' | include 'server:sonar-webserver-ws' | ||||
include 'server:sonar-alm-client' | include 'server:sonar-alm-client' | ||||
include 'server:sonar-webserver-monitoring' | include 'server:sonar-webserver-monitoring' | ||||
enabled = !isCiServer | enabled = !isCiServer | ||||
} | } | ||||
} | } | ||||