@Test public void action_parameters() { ((WebService) context -> { NewController newController = context.createController("api/rule"); NewAction newAction = newDefaultAction(newController, "create"); newAction }).define(context); WebService.Action action = context.controller("api/rule").action("create"); assertThat(action.params()).hasSize(8);
@Test public void define_ws() { PullRequestsWs underTest = new PullRequestsWs(new PullRequestWsAction() { @Override public void define(WebService.NewController context) { context.createAction("foo").setHandler(this); } @Override public void handle(Request request, Response response) { } }); WebService.Context context = new WebService.Context(); underTest.define(context); assertThat(context.controller("api/project_pull_requests").action("foo")).isNotNull(); }
@Override public void handle(Request request, Response response) throws Exception { checkState(context != null && !context.controllers().isEmpty(), "Web service controllers must be loaded before calling the action"); boolean includeInternals = request.mandatoryParamAsBoolean("include_internals"); JsonWriter writer = response.newJsonWriter(); writer.beginObject(); writer.name("webServices").beginArray(); // sort controllers by path Ordering<WebService.Controller> ordering = Ordering.natural().onResultOf(WebService.Controller::path); for (WebService.Controller controller : ordering.sortedCopy(context.controllers())) { writeController(writer, controller, includeInternals); } writer.endArray(); writer.endObject(); writer.close(); }
@Override public void handle(Request request, Response response) throws Exception { checkState(context != null, "Webservice global context must be loaded before calling the action"); String controllerKey = request.mandatoryParam("controller"); WebService.Controller controller = context.controller(controllerKey); checkArgument(controller != null, "Controller does not exist: %s", controllerKey); String actionKey = request.mandatoryParam("action"); WebService.Action action = controller.action(actionKey); checkArgument(action != null, "Action does not exist: %s", actionKey); if (action.responseExample() == null) { response.noContent(); return; } try (JsonWriter json = response.newJsonWriter()) { json.beginObject() .prop("format", action.responseExampleFormat()) .prop("example", action.responseExampleAsString()) .endObject(); } }
@Override public void handle(Request request, Response response) throws Exception { checkState(context != null && !context.controllers().isEmpty(), "Web service controllers must be loaded before calling the action"); boolean includeInternals = request.mandatoryParamAsBoolean("include_internals"); JsonWriter writer = response.newJsonWriter(); writer.beginObject(); writer.name("webServices").beginArray(); // sort controllers by path Ordering<WebService.Controller> ordering = Ordering.natural().onResultOf(WebService.Controller::path); for (WebService.Controller controller : ordering.sortedCopy(context.controllers())) { writeController(writer, controller, includeInternals); } writer.endArray(); writer.endObject(); writer.close(); }
List<WebService.Controller> controllers() { return getContext().controllers(); }
@Override public void start() { context = new WebService.Context(); for (WebService webService : webServices) { webService.define(context); } }
@CheckForNull private WebService.Action getAction(ActionExtractor actionExtractor) { String controllerPath = actionExtractor.getController(); String actionKey = actionExtractor.getAction(); WebService.Controller controller = getContext().controller(controllerPath); return controller == null ? null : controller.action(actionKey); }
WebService.Controller controller = context.controller("api/metric"); assertThat(controller).isNotNull(); assertThat(controller.path()).isEqualTo("api/metric");
@Test public void param_metadata_as_objects() { ((WebService) context -> { NewController newController = context.createController("api/rule"); NewAction create = newDefaultAction(newController, "create"); create.createParam("status") .setDefaultValue(RuleStatus.BETA) .setPossibleValues(RuleStatus.BETA, RuleStatus.READY) .setExampleValue(RuleStatus.BETA); create.createParam("max") .setDefaultValue(11) .setPossibleValues(11, 13, 17) .setExampleValue(17); newController.done(); }).define(context); WebService.Action action = context.controller("api/rule").action("create"); assertThat(action.param("status").defaultValue()).isEqualTo("BETA"); assertThat(action.param("status").possibleValues()).containsOnly("BETA", "READY"); assertThat(action.param("status").exampleValue()).isEqualTo("BETA"); assertThat(action.param("max").defaultValue()).isEqualTo("11"); assertThat(action.param("max").possibleValues()).containsOnly("11", "13", "17"); assertThat(action.param("max").exampleValue()).isEqualTo("17"); }
@Test public void fail_to_open_response_example() { WebService ws = context -> { try { NewController controller = context.createController("foo"); newDefaultAction(controller, "bar").setResponseExample(new URL("file:/does/not/exist")); controller.done(); } catch (MalformedURLException e) { e.printStackTrace(); } }; ws.define(context); WebService.Action action = context.controller("foo").action("bar"); try { action.responseExampleAsString(); fail(); } catch (IllegalStateException e) { assertThat(e).hasMessage("Fail to load file:/does/not/exist"); } }
@Override public void handle(Request request, Response response) throws Exception { checkState(context != null, "Webservice global context must be loaded before calling the action"); String controllerKey = request.mandatoryParam("controller"); WebService.Controller controller = context.controller(controllerKey); checkArgument(controller != null, "Controller does not exist: %s", controllerKey); String actionKey = request.mandatoryParam("action"); WebService.Action action = controller.action(actionKey); checkArgument(action != null, "Action does not exist: %s", actionKey); if (action.responseExample() == null) { response.noContent(); return; } try (JsonWriter json = response.newJsonWriter()) { json.beginObject() .prop("format", action.responseExampleFormat()) .prop("example", action.responseExampleAsString()) .endObject(); } }
@Test public void param_null_metadata() { ((WebService) context -> { NewController newController = context.createController("api/rule"); NewAction create = newDefaultAction(newController, "create"); create.createParam("status") .setDefaultValue(null) .setPossibleValues(Collections.emptyList()) .setExampleValue(null); create.createParam("max") .setPossibleValues((Object[]) null); newController.done(); }).define(context); WebService.Action action = context.controller("api/rule").action("create"); assertThat(action.param("status").defaultValue()).isNull(); assertThat(action.param("status").possibleValues()).isNull(); assertThat(action.param("status").exampleValue()).isNull(); assertThat(action.param("max").possibleValues()).isNull(); }
private TestRequest newRequest(String controllerKey, String actionKey, String method) { TestRequest request = new TestRequest(method); WebService.Controller controller = context.controller(controllerKey); if (controller == null) { throw new IllegalArgumentException( String.format("Controller '%s' is unknown, did you forget to call NewController.done()?", controllerKey)); } WebService.Action action = controller.action(actionKey); if (action == null) { throw new IllegalArgumentException( String.format("Action '%s' not found on controller '%s'.", actionKey, controllerKey)); } request.setAction(action); return request; } }
@Test public void define_ws() { BranchesWs underTest = new BranchesWs(new BranchWsAction() { @Override public void define(WebService.NewController context) { context.createAction("foo").setHandler(this); } @Override public void handle(Request request, Response response) { } }); WebService.Context context = new WebService.Context(); underTest.define(context); assertThat(context.controller("api/project_branches").action("foo")).isNotNull(); }
List<WebService.Controller> controllers() { return getContext().controllers(); }
@Override public void define(Context context) { NewController controller = context.createController("api/favourites") .setDescription("Removed since 6.3, please use api/favorites instead") .setSince("2.6"); controller.createAction("index") .setDescription("The web service is removed and you're invited to use api/favorites instead") .setSince("2.6") .setDeprecatedSince("6.3") .setHandler(RemovedWebServiceHandler.INSTANCE) .setResponseExample(RemovedWebServiceHandler.INSTANCE.getResponseExample()); controller.done(); }
@Override public void define(final Context context) { NewController controller = context .createController("api/webservices") .setSince("4.2") .setDescription("Get information on the web api supported on this instance."); actions.forEach(action -> { action.define(controller); action.setContext(context); }); controller.done(); } }
@Test public void action_updatable_is_defined() { logInAsSystemAdministrator(); WsTester wsTester = new WsTester(); WebService.NewController newController = wsTester.context().createController(DUMMY_CONTROLLER_KEY); underTest.define(newController); newController.done(); WebService.Controller controller = wsTester.controller(DUMMY_CONTROLLER_KEY); assertThat(controller.actions()).extracting("key").containsExactly("updates"); WebService.Action action = controller.actions().iterator().next(); assertThat(action.isPost()).isFalse(); assertThat(action.description()).isNotEmpty(); assertThat(action.responseExample()).isNotNull(); }
@CheckForNull public WebService.Controller controller(String key) { return context.controller(key); }