package com.sebastian_daschner.jaxrs_analyzer.backend.swagger;
import com.sebastian_daschner.jaxrs_analyzer.LogProvider;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonPatch;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.EnumSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
/**
* The Swagger backend specific configuration properties.
*
* @author Sebastian Daschner
*/
public class SwaggerOptions {
public static final String DOMAIN = "domain";
public static final String SWAGGER_SCHEMES = "swaggerSchemes";
public static final String RENDER_SWAGGER_TAGS = "renderSwaggerTags";
public static final String SWAGGER_TAGS_PATH_OFFSET = "swaggerTagsPathOffset";
public static final String JSON_PATCH = "jsonPatch";
private static final String DEFAULT_DOMAIN = "";
private static final Set<SwaggerScheme> DEFAULT_SCHEMES = EnumSet.of(SwaggerScheme.HTTP);
private static final boolean DEFAULT_RENDER_TAGS = false;
private static final int DEFAULT_TAGS_PATH_OFFSET = 0;
/**
* The deployed domain of the project.
*/
private String domain = DEFAULT_DOMAIN;
/**
* The transfer protocol (https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#swaggerSchemes) of the project.
*/
private Set<SwaggerScheme> schemes = DEFAULT_SCHEMES;
/**
* Flag if Swagger tags (https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#tagObject)
* — generated from the paths — should be rendered.
*/
private boolean renderTags = DEFAULT_RENDER_TAGS;
/**
* The path offset of the Swagger tags.
*/
private int tagsPathOffset = DEFAULT_TAGS_PATH_OFFSET;
/**
* The optional JSON patch (RFC 6902) that can modify the Swagger JSON output.
*/
private JsonPatch jsonPatch;
String getDomain() {
return domain;
}
Set<SwaggerScheme> getSchemes() {
return schemes;
}
boolean isRenderTags() {
return renderTags;
}
int getTagsPathOffset() {
return tagsPathOffset;
}
JsonPatch getJsonPatch() {
return jsonPatch;
}
void configure(final Map<String, String> config) {
if (config.containsKey(SWAGGER_TAGS_PATH_OFFSET)) {
int swaggerTagsPathOffset = Integer.parseInt(config.get(SWAGGER_TAGS_PATH_OFFSET));
if (swaggerTagsPathOffset < 0) {
System.err.println("Please provide positive integer number for option --swaggerTagsPathOffset\n");
throw new IllegalArgumentException("Please provide positive integer number for option --swaggerTagsPathOffset");
}
tagsPathOffset = swaggerTagsPathOffset;
}
if (config.containsKey(DOMAIN)) {
domain = config.get(DOMAIN);
}
if (config.containsKey(SWAGGER_SCHEMES)) {
schemes = extractSwaggerSchemes(config.get(SWAGGER_SCHEMES));
}
if (config.containsKey(RENDER_SWAGGER_TAGS)) {
renderTags = Boolean.parseBoolean(config.get(RENDER_SWAGGER_TAGS));
}
if (config.containsKey(JSON_PATCH)) {
jsonPatch = readPatch(config.get(JSON_PATCH));
}
}
private Set<SwaggerScheme> extractSwaggerSchemes(final String schemes) {
return Stream.of(schemes.split(","))
.map(this::extractSwaggerScheme)
.collect(() -> EnumSet.noneOf(SwaggerScheme.class), Set::add, Set::addAll);
}
private SwaggerScheme extractSwaggerScheme(final String scheme) {
switch (scheme.toLowerCase()) {
case "http":
return SwaggerScheme.HTTP;
case "https":
return SwaggerScheme.HTTPS;
case "ws":
return SwaggerScheme.WS;
case "wss":
return SwaggerScheme.WSS;
default:
throw new IllegalArgumentException("Unknown swagger scheme " + scheme);
}
}
private static JsonPatch readPatch(final String patchFile) {
try {
final JsonArray patchArray = Json.createReader(Files.newBufferedReader(Paths.get(patchFile))).readArray();
return Json.createPatchBuilder(patchArray).build();
} catch (Exception e) {
LogProvider.error("Could not read JSON patch from the specified location, reason: " + e.getMessage());
LogProvider.error("Patch won't be applied");
LogProvider.debug(e);
return null;
}
}
}