/*
* Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sebastian_daschner.jaxrs_analyzer.backend.plaintext;
import com.sebastian_daschner.jaxrs_analyzer.backend.StringBackend;
import com.sebastian_daschner.jaxrs_analyzer.model.Types;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.*;
import com.sebastian_daschner.jaxrs_analyzer.utils.StringUtils;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import static com.sebastian_daschner.jaxrs_analyzer.backend.ComparatorUtils.mapKeyComparator;
import static com.sebastian_daschner.jaxrs_analyzer.backend.ComparatorUtils.parameterComparator;
import static com.sebastian_daschner.jaxrs_analyzer.model.JavaUtils.toReadableType;
/**
* A thread-safe backend which produces a plain text representation of the JAX-RS analysis.
*
* @author Sebastian Daschner
*/
public class PlainTextBackend extends StringBackend {
private static final String NAME = "PlainText";
private static final String REST_HEADER = "REST resources of ";
private static final String TYPE_WILDCARD = "*/*";
@Override
protected void appendMethod(final String baseUri, final String resource, final ResourceMethod resourceMethod) {
builder.append(resourceMethod.getMethod()).append(' ');
if (!StringUtils.isBlank(baseUri))
builder.append(baseUri).append('/');
builder.append(resource).append(":\n");
if (resourceMethod.isDeprecated())
builder.append(" Deprecated\n");
}
@Override
protected void appendRequest(final ResourceMethod resourceMethod) {
builder.append(" Request:\n");
if (resourceMethod.getRequestBody() != null) {
builder.append(" Content-Type: ");
builder.append(resourceMethod.getRequestMediaTypes().isEmpty() ? TYPE_WILDCARD : toString(resourceMethod.getRequestMediaTypes()));
builder.append('\n');
builder.append(" Request Body: ").append(toTypeOrCollection(resourceMethod.getRequestBody())).append('\n');
Optional.ofNullable(resources.getTypeRepresentations().get(resourceMethod.getRequestBody())).ifPresent(r -> {
builder.append(" ");
r.accept(visitor);
builder.append('\n');
});
} else {
builder.append(" No body\n");
}
final Set<MethodParameter> parameters = resourceMethod.getMethodParameters();
appendParams(" Path Param: ", parameters, ParameterType.PATH);
appendParams(" Query Param: ", parameters, ParameterType.QUERY);
appendParams(" Form Param: ", parameters, ParameterType.FORM);
appendParams(" Header Param: ", parameters, ParameterType.HEADER);
appendParams(" Cookie Param: ", parameters, ParameterType.COOKIE);
appendParams(" Matrix Param: ", parameters, ParameterType.MATRIX);
builder.append('\n');
}
private void appendParams(final String name, final Set<MethodParameter> parameters, final ParameterType parameterType) {
parameters.stream().filter(p -> p.getParameterType() == parameterType)
.sorted(parameterComparator()).forEach(p -> builder
.append(name)
.append(p.getName())
.append(", ")
.append(toReadableType(p.getType().getType()))
// TODO add default value
.append('\n'));
}
@Override
protected void appendResponse(final ResourceMethod resourceMethod) {
builder.append(" Response:\n");
builder.append(" Content-Type: ");
builder.append(resourceMethod.getResponseMediaTypes().isEmpty() ? TYPE_WILDCARD : toString(resourceMethod.getResponseMediaTypes()));
builder.append('\n');
resourceMethod.getResponses().entrySet().stream().sorted(mapKeyComparator()).forEach(e -> {
builder.append(" Status Codes: ").append(e.getKey()).append('\n');
final Response response = e.getValue();
if (!response.getHeaders().isEmpty()) {
builder.append(" Header: ").append(response.getHeaders().stream().sorted().collect(Collectors.joining(", ")));
builder.append('\n');
}
if (response.getResponseBody() != null) {
builder.append(" Response Body: ").append(toTypeOrCollection(response.getResponseBody())).append('\n');
Optional.ofNullable(resources.getTypeRepresentations().get(response.getResponseBody())).ifPresent(r -> {
builder.append(" ");
r.accept(visitor);
builder.append('\n');
});
}
builder.append('\n');
});
}
@Override
protected void appendResourceEnd() {
builder.append("\n");
}
private String toTypeOrCollection(final TypeIdentifier type) {
final TypeRepresentation representation = resources.getTypeRepresentations().get(type);
if (representation != null && !representation.getComponentType().equals(type) && !type.getType().equals(Types.JSON)) {
return "Collection of " + toReadableType(representation.getComponentType().getType());
}
return toReadableType(type.getType());
}
private static String toString(final Set<String> set) {
return set.stream().sorted().map(Object::toString).collect(Collectors.joining(", "));
}
@Override
public String getName() {
return NAME;
}
@Override
protected void appendFirstLine() {
builder.append(REST_HEADER).append(projectName).append(":\n");
}
}