org.sonar.server.ws.ws.ListAction.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.server.ws.ws.ListAction.java

Source

/*
 * SonarQube
 * Copyright (C) 2009-2017 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.ws.ws;

import com.google.common.collect.Ordering;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import org.sonar.api.server.ws.Change;
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;
import org.sonar.core.util.stream.MoreCollectors;

import static com.google.common.base.Preconditions.checkState;

public class ListAction implements WebServicesWsAction {
    private WebService.Context context;

    @Override
    public void define(WebService.NewController context) {
        WebService.NewAction action = context.createAction("list").setSince("4.2")
                .setDescription("List web services").setResponseExample(getClass().getResource("list-example.json"))
                .setHandler(this);

        action.createParam("include_internals").setDescription(
                "Include web services that are implemented for internal use only. Their forward-compatibility is not assured")
                .setBooleanPossibleValues().setDefaultValue("false");
    }

    @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 setContext(WebService.Context context) {
        this.context = context;
    }

    private static void writeController(JsonWriter writer, WebService.Controller controller,
            boolean includeInternals) {
        if (includeInternals || !controller.isInternal()) {
            writer.beginObject();
            writer.prop("path", controller.path());
            writer.prop("since", controller.since());
            writer.prop("description", controller.description());
            // sort actions by key
            Ordering<WebService.Action> ordering = Ordering.natural().onResultOf(WebService.Action::key);
            writer.name("actions").beginArray();
            for (WebService.Action action : ordering.sortedCopy(controller.actions())) {
                writeAction(writer, action, includeInternals);
            }
            writer.endArray();
            writer.endObject();
        }
    }

    private static void writeAction(JsonWriter writer, WebService.Action action, boolean includeInternals) {
        if (includeInternals || !action.isInternal()) {
            writer.beginObject();
            writer.prop("key", action.key());
            writer.prop("description", action.description());
            writer.prop("since", action.since());
            writer.prop("deprecatedSince", action.deprecatedSince());
            writer.prop("internal", action.isInternal());
            writer.prop("post", action.isPost());
            writer.prop("hasResponseExample", action.responseExample() != null);
            writeChangelog(writer, action);
            writeParameters(writer, action, includeInternals);
            writer.endObject();
        }
    }

    private static void writeParameters(JsonWriter writer, WebService.Action action, boolean includeInternals) {
        List<WebService.Param> params = action.params().stream().filter(p -> includeInternals || !p.isInternal())
                .collect(MoreCollectors.toList());
        if (!params.isEmpty()) {
            // sort parameters by key
            Ordering<WebService.Param> ordering = Ordering.natural().onResultOf(WebService.Param::key);
            writer.name("params").beginArray();
            for (WebService.Param param : ordering.sortedCopy(params)) {
                writeParam(writer, param);
            }
            writer.endArray();
        }
    }

    private static void writeParam(JsonWriter writer, WebService.Param param) {
        writer.beginObject();
        writer.prop("key", param.key());
        writer.prop("description", param.description());
        writer.prop("since", param.since());
        writer.prop("required", param.isRequired());
        writer.prop("internal", param.isInternal());
        writer.prop("defaultValue", param.defaultValue());
        writer.prop("exampleValue", param.exampleValue());
        writer.prop("deprecatedSince", param.deprecatedSince());
        writer.prop("deprecatedKey", param.deprecatedKey());
        writer.prop("deprecatedKeySince", param.deprecatedKeySince());
        writer.prop("maxValuesAllowed", param.maxValuesAllowed());
        Set<String> possibleValues = param.possibleValues();
        if (possibleValues != null) {
            writer.name("possibleValues").beginArray().values(possibleValues).endArray();
        }
        writer.endObject();
    }

    private static void writeChangelog(JsonWriter writer, WebService.Action action) {
        writer.name("changelog").beginArray();
        action.changelog().stream().sorted(Comparator.comparing(Change::getVersion).reversed())
                .forEach(changelog -> {
                    writer.beginObject();
                    writer.prop("description", changelog.getDescription());
                    writer.prop("version", changelog.getVersion());
                    writer.endObject();
                });
        writer.endArray();
    }

}