package com.sebastian_daschner.jaxrs_analyzer.backend;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.Project;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.ResourceMethod;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.Resources;
import com.sebastian_daschner.jaxrs_analyzer.model.rest.TypeRepresentationVisitor;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.util.Comparator.comparing;
/**
* A backend that is backed by Strings (plain text).
*
* @author Sebastian Daschner
*/
public abstract class StringBackend implements Backend {
protected final Lock lock = new ReentrantLock();
protected StringBuilder builder;
protected Resources resources;
protected String projectName;
protected String projectVersion;
protected TypeRepresentationVisitor visitor;
private void initRender(final Project project) {
// initialize fields
builder = new StringBuilder();
resources = project.getResources();
projectName = project.getName();
projectVersion = project.getVersion();
visitor = new JsonRepresentationAppender(builder, resources.getTypeRepresentations());
}
@Override
public byte[] render(final Project project) {
lock.lock();
try {
initRender(project);
final String output = renderInternal();
return serialize(output);
} finally {
lock.unlock();
}
}
private String renderInternal() {
appendHeader();
resources.getResources().stream().sorted().forEach(this::appendResource);
return builder.toString();
}
private void appendHeader() {
appendFirstLine();
builder.append(projectVersion).append("\n\n");
}
private void appendResource(final String resource) {
resources.getMethods(resource).stream()
.sorted(comparing(ResourceMethod::getMethod))
.forEach(resourceMethod -> {
appendMethod(resources.getBasePath(), resource, resourceMethod);
appendRequest(resourceMethod);
appendResponse(resourceMethod);
appendResourceEnd();
});
}
protected abstract void appendFirstLine();
protected abstract void appendMethod(String baseUri, String resource, ResourceMethod resourceMethod);
protected abstract void appendRequest(ResourceMethod resourceMethod);
protected abstract void appendResponse(ResourceMethod resourceMethod);
protected void appendResourceEnd() {
}
private static byte[] serialize(final String output) {
return output.getBytes();
}
}