package io.swagger.parser;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.models.Swagger;
import io.swagger.models.auth.AuthorizationValue;
import io.swagger.parser.util.DeserializationUtils;
import io.swagger.parser.util.SwaggerDeserializationResult;
import io.swagger.util.Json;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ServiceLoader;
public class SwaggerParser {
public SwaggerDeserializationResult readWithInfo(String location, List<AuthorizationValue> auths, boolean resolve) {
if (location == null) {
return null;
}
location = location.replaceAll("\\\\","/");
List<SwaggerParserExtension> parserExtensions = getExtensions();
SwaggerDeserializationResult output;
if(auths == null) {
auths = new ArrayList<AuthorizationValue>();
}
output = new Swagger20Parser().readWithInfo(location, auths);
if (output != null) {
if(output.getSwagger() != null && "2.0".equals(output.getSwagger().getSwagger())) {
if(resolve) {
output.setSwagger(new SwaggerResolver(output.getSwagger(), auths, location).resolve());
}
return output;
}
}
for (SwaggerParserExtension extension : parserExtensions) {
output = extension.readWithInfo(location, auths);
if (output != null && output.getSwagger() != null && "2.0".equals(output.getSwagger().getSwagger())) {
return output;
}
}
if(output == null) {
output = new SwaggerDeserializationResult()
.message("The swagger definition could not be read");
}
return output;
}
public Swagger read(String location) {
return read(location, null, true);
}
public Swagger read(String location, List<AuthorizationValue> auths, boolean resolve) {
if (location == null) {
return null;
}
location = location.replaceAll("\\\\","/");
Swagger output;
try {
output = new Swagger20Parser().read(location, auths);
if (output != null) {
return new SwaggerResolver(output, auths, location).resolve();
}
} catch (IOException e) {
}
List<SwaggerParserExtension> parserExtensions = getExtensions();
for (SwaggerParserExtension extension : parserExtensions) {
try {
output = extension.read(location, auths);
if (output != null) {
return output;
}
} catch (IOException e) {
if (System.getProperty("debugParser") != null) {
e.printStackTrace();
}
// continue to next parser
}
}
return null;
}
public SwaggerDeserializationResult readWithInfo(String swaggerAsString) {
if(swaggerAsString == null) {
return new SwaggerDeserializationResult().message("empty or null swagger supplied");
}
try {
JsonNode node;
if (swaggerAsString.trim().startsWith("{")) {
ObjectMapper mapper = Json.mapper();
node = mapper.readTree(swaggerAsString);
} else {
node = DeserializationUtils.readYamlTree(swaggerAsString);
}
SwaggerDeserializationResult result = new Swagger20Parser().readWithInfo(node);
if (result != null) {
result.setSwagger(new SwaggerResolver(result.getSwagger(), new ArrayList<AuthorizationValue>(), null).resolve());
}
else {
result = new SwaggerDeserializationResult().message("Definition does not appear to be a valid Swagger format");
}
return result;
}
catch (Exception e) {
return new SwaggerDeserializationResult().message("malformed or unreadable swagger supplied");
}
}
public Swagger parse(String swaggerAsString) {
return parse(swaggerAsString, null);
}
public Swagger parse(String swaggerAsString, List<AuthorizationValue> auths) {
Swagger output;
try {
output = new Swagger20Parser().parse(swaggerAsString);
if (output != null) {
return new SwaggerResolver(output, auths, null).resolve();
}
} catch (IOException e) {
}
return null;
}
public Swagger read(JsonNode node) {
return read(node, new ArrayList<AuthorizationValue>(), false);
}
public Swagger read(JsonNode node, boolean resolve) {
return read(node, new ArrayList<AuthorizationValue>(), resolve);
}
public Swagger read(JsonNode node, List<AuthorizationValue> authorizationValues, boolean resolve) {
if (node == null) {
return null;
}
List<SwaggerParserExtension> parserExtensions = getExtensions();
Swagger output = null;
try {
output = new Swagger20Parser().read(node);
if (output != null) {
if(resolve) {
return new SwaggerResolver(output, authorizationValues).resolve();
}
else {
return output;
}
}
} catch (IOException e) {
}
for (SwaggerParserExtension extension : parserExtensions) {
try {
output = extension.read(node);
if (output != null) {
return output;
}
} catch (IOException e) {
if (System.getProperty("debugParser") != null) {
e.printStackTrace();
}
// continue to next parser
}
}
return null;
}
public List<SwaggerParserExtension> getExtensions() {
ServiceLoader<SwaggerParserExtension> loader = ServiceLoader.load(SwaggerParserExtension.class);
List<SwaggerParserExtension> output = new ArrayList<SwaggerParserExtension>();
Iterator<SwaggerParserExtension> itr = loader.iterator();
while (itr.hasNext()) {
output.add(itr.next());
}
return output;
}
}