*/
public abstract class Request {
+ public abstract WebService.Action action();
+
/**
* Returns the name of the HTTP method with which this request was made. Possible
* values are GET and POST. Others are not supported.
*/
public interface RequestHandler extends ServerExtension {
- void handle(Request request, Response response) throws Exception;
+ void handle(Request request, Response response);
}
import static org.fest.assertions.Assertions.assertThat;
import static org.fest.assertions.Fail.fail;
+import static org.mockito.Mockito.mock;
public class RequestTest {
static class SimpleRequest extends Request {
private final Map<String, String> params = new HashMap<String, String>();
+ private final WebService.Action action;
+
+ private SimpleRequest(WebService.Action action) {
+ this.action = action;
+ }
+
+ @Override
+ public WebService.Action action() {
+ return action;
+ }
@Override
public String method() {
}
- SimpleRequest request = new SimpleRequest();
+ SimpleRequest request = new SimpleRequest(mock(WebService.Action.class));
@Test
public void required_param_is_missing() throws Exception {
.setPrivate(true)
.setHandler(new RequestHandler() {
@Override
- public void handle(Request request, Response response) throws Exception {
+ public void handle(Request request, Response response) {
page(request, response);
}
});
.setSince("4.2")
.setHandler(new RequestHandler() {
@Override
- public void handle(Request request, Response response) throws Exception {
+ public void handle(Request request, Response response) {
list(request, response);
}
});
.setSince("4.2")
.setHandler(new RequestHandler() {
@Override
- public void handle(Request request, Response response) throws Exception {
+ public void handle(Request request, Response response) {
create(request, response);
}
})
NewController controller = context.newController("api/rules")
.setDescription("Coding rules");
- controller.newAction("search")
- .setDescription("Search for coding rules")
+ controller.newAction("list")
+ .setDescription("List coding rules")
.setSince("4.2")
.setHandler(new RequestHandler() {
@Override
- public void handle(Request request, Response response) throws Exception {
- search(request, response);
+ public void handle(Request request, Response response) {
+ list(request, response);
}
});
controller.done();
}
- void search(Request request, Response response) {
+ void list(Request request, Response response) {
response.newJsonWriter().beginObject()
- // TODO
.prop("TODO", true)
.endObject()
.close();
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 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.
+ */
+@ParametersAreNonnullByDefault
+package org.sonar.server.rule.ws;
+
+import javax.annotation.ParametersAreNonnullByDefault;
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 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.ws;
+
+import org.sonar.api.server.ws.Request;
+import org.sonar.api.server.ws.WebService;
+
+public abstract class InternalRequest extends Request {
+ private WebService.Action action;
+
+ @Override
+ public WebService.Action action() {
+ return action;
+ }
+
+ void setAction(WebService.Action action) {
+ this.action = action;
+ }
+}
NewController controller = context.newController("api/webservices")
.setDescription("List web services")
.setSince("4.2");
- controller.newAction("index")
+ controller.newAction("list")
.setHandler(new RequestHandler() {
@Override
public void handle(Request request, Response response) {
*/
package org.sonar.server.ws;
-import org.sonar.api.server.ws.Request;
-
import javax.servlet.http.HttpServletRequest;
-public class ServletRequest extends Request {
+public class ServletRequest extends InternalRequest {
private final HttpServletRequest source;
return context.controllers();
}
- public void execute(Request request, Response response,
+ public void execute(InternalRequest request, Response response,
String controllerPath, String actionKey) {
try {
WebService.Action action = getAction(controllerPath, actionKey);
+ request.setAction(action);
verifyRequest(action, request);
action.handler().handle(request, response);
assertThat(controller).isNotNull();
assertThat(controller.path()).isEqualTo("api/rules");
assertThat(controller.description()).isNotEmpty();
+ assertThat(controller.actions()).hasSize(1);
- WebService.Action search = controller.action("search");
+ WebService.Action search = controller.action("list");
assertThat(search).isNotNull();
- assertThat(search.key()).isEqualTo("search");
assertThat(search.handler()).isNotNull();
assertThat(search.since()).isEqualTo("4.2");
assertThat(search.isPost()).isFalse();
+ assertThat(search.isPrivate()).isFalse();
}
@Test
public void search_for_rules() throws Exception {
- tester.newRequest("search").execute().assertJson(getClass(), "search.json");
+ tester.newRequest("list").execute().assertJson(getClass(), "list.json");
}
}
assertThat(controller.since()).isEqualTo("4.2");
assertThat(controller.actions()).hasSize(1);
- WebService.Action index = controller.action("index");
+ WebService.Action index = controller.action("list");
assertThat(index).isNotNull();
- assertThat(index.key()).isEqualTo("index");
+ assertThat(index.key()).isEqualTo("list");
assertThat(index.handler()).isNotNull();
assertThat(index.since()).isEqualTo("4.2");
assertThat(index.isPost()).isFalse();
@Test
public void index() throws Exception {
WsTester tester = new WsTester(ws, new MetricWebService());
- tester.newRequest("api/webservices", "index").execute().assertJson(getClass(), "index.json");
+ tester.newRequest("api/webservices", "list").execute().assertJson(getClass(), "list.json");
}
static class MetricWebService implements WebService {
import javax.annotation.CheckForNull;
import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import static org.fest.assertions.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
public class WebServiceEngineTest {
- private static class SimpleRequest extends Request {
+ private static class SimpleRequest extends InternalRequest {
private String method = "GET";
private Map<String, String> params = new HashMap<String, String>();
@Test
public void execute_request() throws Exception {
- Request request = new SimpleRequest();
+ InternalRequest request = new SimpleRequest();
SimpleResponse response = new SimpleResponse();
engine.execute(request, response, "api/system", "health");
@Test
public void bad_controller() throws Exception {
- Request request = new SimpleRequest();
+ InternalRequest request = new SimpleRequest();
SimpleResponse response = new SimpleResponse();
engine.execute(request, response, "api/xxx", "health");
@Test
public void bad_action() throws Exception {
- Request request = new SimpleRequest();
+ InternalRequest request = new SimpleRequest();
SimpleResponse response = new SimpleResponse();
engine.execute(request, response, "api/system", "xxx");
@Test
public void method_get_not_allowed() throws Exception {
- Request request = new SimpleRequest();
+ InternalRequest request = new SimpleRequest();
SimpleResponse response = new SimpleResponse();
engine.execute(request, response, "api/system", "ping");
@Test
public void method_post_required() throws Exception {
- Request request = new SimpleRequest().setMethod("POST");
+ InternalRequest request = new SimpleRequest().setMethod("POST");
SimpleResponse response = new SimpleResponse();
engine.execute(request, response, "api/system", "ping");
@Test
public void required_parameter_is_not_set() throws Exception {
- Request request = new SimpleRequest();
+ InternalRequest request = new SimpleRequest();
SimpleResponse response = new SimpleResponse();
engine.execute(request, response, "api/system", "print");
@Test
public void optional_parameter_is_not_set() throws Exception {
- Request request = new SimpleRequest().setParam("message", "Hello World");
+ InternalRequest request = new SimpleRequest().setParam("message", "Hello World");
SimpleResponse response = new SimpleResponse();
engine.execute(request, response, "api/system", "print");
@Test
public void optional_parameter_is_set() throws Exception {
- Request request = new SimpleRequest()
+ InternalRequest request = new SimpleRequest()
.setParam("message", "Hello World")
.setParam("author", "Marcel");
SimpleResponse response = new SimpleResponse();
@Test
public void internal_error() throws Exception {
- Request request = new SimpleRequest();
+ InternalRequest request = new SimpleRequest();
SimpleResponse response = new SimpleResponse();
engine.execute(request, response, "api/system", "fail");
newController.newAction("health")
.setHandler(new RequestHandler() {
@Override
- public void handle(Request request, Response response) throws Exception {
- response.stream().output().write("good".getBytes());
+ public void handle(Request request, Response response) {
+ try {
+ response.stream().output().write("good".getBytes());
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
}
});
newController.newAction("ping")
.setPost(true)
.setHandler(new RequestHandler() {
@Override
- public void handle(Request request, Response response) throws Exception {
- response.stream().output().write("pong".getBytes());
+ public void handle(Request request, Response response) {
+ try {
+ response.stream().output().write("pong".getBytes());
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
}
});
newController.newAction("fail")
.setHandler(new RequestHandler() {
@Override
- public void handle(Request request, Response response) throws Exception {
+ public void handle(Request request, Response response) {
throw new IllegalStateException("Unexpected");
}
});
.newParam("author", "optional author")
.setHandler(new RequestHandler() {
@Override
- public void handle(Request request, Response response) throws Exception {
- IOUtils.write(
+ public void handle(Request request, Response response) {
+ try {
+ IOUtils.write(
request.requiredParam("message") + " by " + request.param("author", "-"), response.stream().output());
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
}
});
newController.done();
--- /dev/null
+{
+ "TODO": true
+}
+++ /dev/null
-{
- "TODO": true
-}
+++ /dev/null
-{
- "webServices": [
- {
- "path": "api/metric",
- "since": "3.2",
- "description": "Metrics",
- "actions": [
- {
- "key": "create",
- "description": "Create metric",
- "since": "4.1",
- "post": true,
- "params": [
- {
- "key": "key",
- "description": "Key of new metric"
- },
- {
- "key": "name"
- }
- ]
- },
- {
- "key": "show",
- "since": "3.2",
- "post": false
- }
- ]
- },
- {
- "path": "api/webservices",
- "since": "4.2",
- "description": "List web services",
- "actions": [
- {
- "key": "index",
- "since": "4.2",
- "post": false
- }
- ]
- }
- ]}
--- /dev/null
+{
+ "webServices": [
+ {
+ "path": "api/metric",
+ "since": "3.2",
+ "description": "Metrics",
+ "actions": [
+ {
+ "key": "create",
+ "description": "Create metric",
+ "since": "4.1",
+ "post": true,
+ "params": [
+ {
+ "key": "key",
+ "description": "Key of new metric"
+ },
+ {
+ "key": "name"
+ }
+ ]
+ },
+ {
+ "key": "show",
+ "since": "3.2",
+ "post": false
+ }
+ ]
+ },
+ {
+ "path": "api/webservices",
+ "since": "4.2",
+ "description": "List web services",
+ "actions": [
+ {
+ "key": "list",
+ "since": "4.2",
+ "post": false
+ }
+ ]
+ }
+ ]}
public static class TestRequest extends Request {
private final WebService.Controller controller;
- private final String actionKey;
+ private final WebService.Action action;
private String method = "GET";
private Map<String, String> params = new HashMap<String, String>();
- private TestRequest(WebService.Controller controller, String actionKey) {
+ private TestRequest(WebService.Controller controller, WebService.Action action) {
this.controller = controller;
- this.actionKey = actionKey;
+ this.action = action;
+ }
+
+ @Override
+ public WebService.Action action() {
+ return action;
}
@Override
}
public Result execute() throws Exception {
- WebService.Action action = controller.action(actionKey);
- if (action == null) {
- throw new IllegalArgumentException("Action not found: " + actionKey);
- }
TestResponse response = new TestResponse();
action.handler().handle(this, response);
return new Result(response);
if (context.controllers().size() != 1) {
throw new IllegalStateException("The method newRequest(String) requires to define one, and only one, controller");
}
- return new TestRequest(context.controllers().get(0), actionKey);
+ WebService.Controller controller = context.controllers().get(0);
+ WebService.Action action = controller.action(actionKey);
+ if (action == null) {
+ throw new IllegalArgumentException("Action not found: " + actionKey);
+ }
+ return new TestRequest(controller, action);
}
public TestRequest newRequest(String controllerPath, String actionKey) {
- return new TestRequest(context.controller(controllerPath), actionKey);
+ WebService.Controller controller = context.controller(controllerPath);
+ WebService.Action action = controller.action(actionKey);
+ return new TestRequest(controller, action);
}
}