use of com.twinsoft.convertigo.beans.core.IMappingRefModel in project convertigo by convertigo.
the class SwaggerUtils method parse.
public static Swagger parse(String requestUrl, UrlMapper urlMapper) {
Project project = urlMapper.getProject();
String projectName = project.getName();
String oasDirUrl = requestUrl.substring(0, requestUrl.indexOf("/" + servletMappingPath)) + "/projects/" + projectName + "/" + jsonSchemaDirectory + "/";
Swagger swagger = parseCommon(requestUrl, project);
List<Tag> tags = new ArrayList<Tag>();
Tag tag = new Tag();
tag.setName(urlMapper.getProject().getName());
tag.setDescription(urlMapper.getProject().getComment());
tags.add(tag);
swagger.setTags(tags);
// Security
Map<String, SecuritySchemeDefinition> securityDefinitions = swagger.getSecurityDefinitions();
for (UrlAuthentication authentication : urlMapper.getAuthenticationList()) {
if (AuthenticationType.Basic.equals(authentication.getType())) {
if (securityDefinitions == null || !securityDefinitions.containsKey("basicAuth")) {
BasicAuthDefinition basicAuthDefinition = new BasicAuthDefinition();
swagger.addSecurityDefinition("basicAuth", basicAuthDefinition);
SecurityRequirement securityRequirement = new SecurityRequirement();
securityRequirement.requirement("basicAuth", new ArrayList<String>());
swagger.addSecurity(securityRequirement);
}
}
}
// Models and Schemas
Map<String, Model> swagger_models = new HashMap<String, Model>();
try {
String models = getModels(oasDirUrl, urlMapper);
if (!models.isEmpty()) {
ObjectMapper mapper = Json.mapper();
JsonNode definitionNode = mapper.readTree(models);
for (Iterator<Entry<String, JsonNode>> it = GenericUtils.cast(definitionNode.fields()); it.hasNext(); ) {
Entry<String, JsonNode> entry = it.next();
swagger_models.put(entry.getKey().toString(), mapper.convertValue(entry.getValue(), Model.class));
}
}
} catch (Exception e) {
e.printStackTrace();
Engine.logEngine.warn("Unexpected exception while reading UrlMapper defined models", e);
}
swagger.setDefinitions(swagger_models);
// Mappings
Map<String, Path> swagger_paths = new HashMap<String, Path>();
try {
for (UrlMapping urlMapping : urlMapper.getMappingList()) {
Path swagger_path = new Path();
for (UrlMappingOperation umo : urlMapping.getOperationList()) {
Operation s_operation = new Operation();
s_operation.setOperationId(umo.getQName());
s_operation.setDescription(umo.getComment());
s_operation.setSummary(umo.getComment());
// Operation produces
if (umo instanceof AbstractRestOperation) {
DataContent dataOutput = ((AbstractRestOperation) umo).getOutputContent();
if (dataOutput.equals(DataContent.toJson)) {
s_operation.setProduces(Arrays.asList(MimeType.Json.value()));
} else if (dataOutput.equals(DataContent.toXml)) {
s_operation.setProduces(Arrays.asList(MimeType.Xml.value()));
} else {
s_operation.setProduces(Arrays.asList(MimeType.Json.value(), MimeType.Xml.value()));
}
}
// Operation tags
List<String> list = Arrays.asList("" + project.getName());
s_operation.setTags(list);
// Operation consumes
List<String> consumes = new ArrayList<String>();
// Operation parameters
List<Parameter> s_parameters = new ArrayList<Parameter>();
// 1 - add path parameters
for (String pathVarName : urlMapping.getPathVariableNames()) {
PathParameter s_parameter = new PathParameter();
s_parameter.setName(pathVarName);
s_parameter.setRequired(true);
s_parameter.setType("string");
// retrieve parameter description from bean
UrlMappingParameter ump = null;
try {
ump = umo.getParameterByName(pathVarName);
} catch (Exception e) {
}
if (ump != null && ump.getType() == Type.Path) {
s_parameter.setDescription(ump.getComment());
s_parameter.setType(ump.getInputType().toLowerCase());
Object value = ump.getValueOrNull();
if (value != null) {
s_parameter.setDefaultValue(String.valueOf(value));
}
}
s_parameters.add(s_parameter);
}
// 2 - add other parameters
for (UrlMappingParameter ump : umo.getParameterList()) {
Parameter s_parameter = null;
if (ump.getType() == Type.Query) {
s_parameter = new QueryParameter();
} else if (ump.getType() == Type.Form) {
s_parameter = new FormParameter();
} else if (ump.getType() == Type.Body) {
s_parameter = new BodyParameter();
if (ump instanceof IMappingRefModel) {
String modelReference = ((IMappingRefModel) ump).getModelReference();
if (!modelReference.isEmpty()) {
if (modelReference.indexOf(".jsonschema") != -1) {
modelReference = oasDirUrl + modelReference;
}
RefModel refModel = new RefModel(modelReference);
((BodyParameter) s_parameter).setSchema(refModel);
}
}
} else if (ump.getType() == Type.Header) {
s_parameter = new HeaderParameter();
} else if (ump.getType() == Type.Path) {
// ignore : should have been treated before
}
if (s_parameter != null) {
s_parameter.setName(ump.getName());
s_parameter.setDescription(ump.getComment());
s_parameter.setRequired(ump.isRequired());
if (s_parameter instanceof SerializableParameter) {
boolean isArray = ump.isMultiValued() || ump.isArray();
String _type = isArray ? "array" : ump.getDataType().name().toLowerCase();
String _collectionFormat = ump.isMultiValued() ? "multi" : (isArray ? "csv" : null);
Property _items = isArray ? getItems(ump.getDataType()) : null;
((SerializableParameter) s_parameter).setType(_type);
((SerializableParameter) s_parameter).setCollectionFormat(_collectionFormat);
((SerializableParameter) s_parameter).setItems(_items);
Object value = ump.getValueOrNull();
if (value != null) {
String collection = ((SerializableParameter) s_parameter).getCollectionFormat();
if (collection != null && collection.equals("multi")) {
Property items = new StringProperty();
// items.setDefault(String.valueOf(value));
((SerializableParameter) s_parameter).setItems(items);
// ((SerializableParameter) s_parameter).setEnumValue(Arrays.asList("val1","val2","val3"));
} else {
((AbstractSerializableParameter<?>) s_parameter).setDefaultValue(String.valueOf(value));
}
}
}
DataContent dataInput = ump.getInputContent();
if (dataInput.equals(DataContent.toJson)) {
if (!consumes.contains(MimeType.Json.value())) {
consumes.add(MimeType.Json.value());
}
} else if (dataInput.equals(DataContent.toXml)) {
if (!consumes.contains(MimeType.Xml.value())) {
consumes.add(MimeType.Xml.value());
}
}
// swagger-ui workaround for invalid request content-type for POST
if (ump.getType() == Type.Form) {
if (!DataType.File.equals(ump.getDataType())) {
if (!consumes.contains(MimeType.WwwForm.value())) {
consumes.add(MimeType.WwwForm.value());
}
} else {
if (!consumes.contains("multipart/form-data")) {
consumes.add("multipart/form-data");
}
}
}
// add parameter
if (ump.isExposed()) {
s_parameters.add(s_parameter);
}
}
}
s_operation.setParameters(s_parameters);
if (!consumes.isEmpty()) {
s_operation.setConsumes(consumes);
}
// Set operation responses
Map<String, Response> responses = new HashMap<String, Response>();
for (UrlMappingResponse umr : umo.getResponseList()) {
String statusCode = umr.getStatusCode();
if (!statusCode.isEmpty()) {
if (!responses.containsKey(statusCode)) {
Response response = new Response();
// response.setDescription(umr.getComment());
response.setDescription(umr.getStatusText());
if (umr instanceof IMappingRefModel) {
String modelReference = ((IMappingRefModel) umr).getModelReference();
if (!modelReference.isEmpty()) {
if (modelReference.indexOf(".jsonschema") != -1) {
modelReference = oasDirUrl + modelReference;
}
RefProperty refProperty = new RefProperty(modelReference);
response.setResponseSchema(new PropertyModelConverter().propertyToModel(refProperty));
}
}
responses.put(statusCode, response);
}
}
}
if (responses.isEmpty()) {
Response resp200 = new Response();
resp200.description("successful operation");
responses.put("200", resp200);
}
s_operation.setResponses(responses);
// Add operation to path
String s_method = umo.getMethod().toLowerCase();
swagger_path.set(s_method, s_operation);
}
swagger_paths.put(urlMapping.getPathWithPrefix(), swagger_path);
}
} catch (Exception e) {
e.printStackTrace();
Engine.logEngine.error("Unexpected exception while parsing UrlMapper to generate definition", e);
}
swagger.setPaths(swagger_paths);
return swagger;
}
use of com.twinsoft.convertigo.beans.core.IMappingRefModel in project convertigo by convertigo.
the class OpenApiUtils method writeOpenApiToFile.
private static void writeOpenApiToFile(final String requestUrl, final UrlMapper urlMapper, final File yamlFile, boolean useExternalRef) throws Exception {
synchronized (lockObject) {
if (yamlFile.exists() && Engine.isEngineMode())
return;
Long t0 = System.currentTimeMillis();
Project project = urlMapper.getProject();
String projectName = project.getName();
String oasDirUrl = requestUrl.substring(0, requestUrl.indexOf("/" + servletMappingPath)) + "/projects/" + projectName + "/" + jsonSchemaDirectory + "/";
OpenAPI openAPI = parseCommon(requestUrl, project);
List<Tag> tags = new ArrayList<>();
Tag tag = new Tag();
tag.setName(project.getName());
tag.setDescription(project.getComment());
tags.add(tag);
openAPI.setTags(tags);
if (openAPI.getComponents() == null) {
openAPI.components(new Components());
}
// Security
Map<String, SecurityScheme> securitySchemes = openAPI.getComponents().getSecuritySchemes();
for (UrlAuthentication authentication : urlMapper.getAuthenticationList()) {
if (AuthenticationType.Basic.equals(authentication.getType())) {
if (securitySchemes == null || !securitySchemes.containsKey("basicAuth")) {
SecurityScheme securitySchemesItem = new SecurityScheme();
securitySchemesItem.setType(SecurityScheme.Type.HTTP);
securitySchemesItem.setScheme("basic");
openAPI.getComponents().addSecuritySchemes("basicAuth", securitySchemesItem);
SecurityRequirement securityRequirement = new SecurityRequirement();
securityRequirement.addList("basicAuth", new ArrayList<String>());
openAPI.addSecurityItem(securityRequirement);
}
}
}
List<String> refList = new ArrayList<String>();
List<String> opIdList = new ArrayList<String>();
// Paths
Paths paths = new Paths();
try {
for (UrlMapping urlMapping : urlMapper.getMappingList()) {
PathItem item = new PathItem();
for (UrlMappingOperation umo : urlMapping.getOperationList()) {
Operation operation = new Operation();
operation.setOperationId(getOperationId(opIdList, umo, false));
operation.setDescription(umo.getComment());
operation.setSummary(umo.getComment());
// Tags
List<String> list = Arrays.asList("" + project.getName());
operation.setTags(list);
// 1 - add path parameters
for (String pathVarName : urlMapping.getPathVariableNames()) {
PathParameter parameter = new PathParameter();
parameter.setName(pathVarName);
// retrieve parameter description from bean
UrlMappingParameter ump = null;
try {
ump = umo.getParameterByName(pathVarName);
} catch (Exception e) {
}
if (ump != null && ump.getType() == Type.Path) {
parameter.setDescription(ump.getComment());
Schema<?> schema = getSchema(ump);
if (schema != null) {
parameter.setSchema(schema);
}
}
operation.addParametersItem(parameter);
}
// 2 - add other parameters
for (UrlMappingParameter ump : umo.getParameterList()) {
Parameter parameter = null;
if (ump.getType() == Type.Query) {
parameter = new QueryParameter();
} else if (ump.getType() == Type.Form) {
addFormParameter(operation, ump);
} else if (ump.getType() == Type.Body) {
addBodyParameter(operation, ump, oasDirUrl, refList, useExternalRef);
} else if (ump.getType() == Type.Header) {
parameter = new HeaderParameter();
} else if (ump.getType() == Type.Path) {
// ignore : should have been treated before
}
if (parameter != null) {
// Query | Header
parameter.setName(ump.getName());
parameter.setDescription(ump.getComment());
parameter.setRequired(ump.isRequired());
// parameter.setAllowEmptyValue(allowEmptyValue);
Schema<?> schema = getSchema(ump);
if (schema != null) {
parameter.setSchema(schema);
}
// add parameter
if (ump.isExposed()) {
operation.addParametersItem(parameter);
}
}
}
// Responses
List<String> produces = new ArrayList<String>();
if (umo instanceof AbstractRestOperation) {
DataContent dataOutput = ((AbstractRestOperation) umo).getOutputContent();
if (dataOutput.equals(DataContent.toJson)) {
produces = Arrays.asList(MimeType.Json.value());
} else if (dataOutput.equals(DataContent.toXml)) {
produces = Arrays.asList(MimeType.Xml.value());
} else {
produces = Arrays.asList(MimeType.Json.value(), MimeType.Xml.value());
}
}
ApiResponses responses = new ApiResponses();
operation.setResponses(responses);
for (UrlMappingResponse umr : umo.getResponseList()) {
String statusCode = umr.getStatusCode();
if (!statusCode.isEmpty()) {
if (!responses.containsKey(statusCode)) {
ApiResponse response = new ApiResponse();
response.setDescription(umr.getStatusText());
responses.addApiResponse(statusCode, response);
String modelReference = ((IMappingRefModel) umr).getModelReference();
if (!modelReference.isEmpty() && !produces.isEmpty()) {
if (modelReference.indexOf(".jsonschema") != -1) {
modelReference = modelReference.replace(".jsonschema#/definitions/", ".json#/components/schemas/");
modelReference = oasDirUrl + modelReference;
}
Content content = new Content();
response.setContent(content);
for (String mt : produces) {
MediaType mediaType = new MediaType();
content.addMediaType(mt, mediaType);
ObjectSchema schema = new ObjectSchema();
if (!refList.contains(modelReference)) {
refList.add(modelReference);
}
if (!useExternalRef && modelReference.indexOf('#') != -1) {
modelReference = modelReference.substring(modelReference.indexOf('#'));
}
schema.set$ref(modelReference);
mediaType.setSchema(schema);
}
}
}
}
}
if (umo.getMethod().equals(HttpMethodType.DELETE.name())) {
item.setDelete(operation);
} else if (umo.getMethod().equals(HttpMethodType.GET.name())) {
item.setGet(operation);
} else if (umo.getMethod().equals(HttpMethodType.HEAD.name())) {
item.setHead(operation);
} else if (umo.getMethod().equals(HttpMethodType.OPTIONS.name())) {
item.setOptions(operation);
} else if (umo.getMethod().equals(HttpMethodType.POST.name())) {
item.setPost(operation);
} else if (umo.getMethod().equals(HttpMethodType.PUT.name())) {
item.setPut(operation);
} else if (umo.getMethod().equals(HttpMethodType.TRACE.name())) {
item.setTrace(operation);
}
}
paths.addPathItem(urlMapping.getPathWithPrefix(), item);
}
} catch (Exception e) {
e.printStackTrace();
Engine.logEngine.error("Unexpected exception while parsing UrlMapper to generate definition", e);
}
openAPI.setPaths(paths);
// Models and Schemas
try {
Map<String, JSONObject> modelMap = new HashMap<String, JSONObject>(1000);
String models = getModels(oasDirUrl, urlMapper, modelMap);
/*System.out.println("refList");
for (String keyRef: refList) {
System.out.println(keyRef);
}
System.out.println("modelMap");
for (String keyRef: modelMap.keySet()) {
System.out.println(keyRef);
}*/
Set<String> done = new HashSet<String>();
JSONObject jsonModels = new JSONObject(models);
for (String keyRef : refList) {
addModelsFromMap(done, modelMap, keyRef, jsonModels);
}
OpenAPI oa = new OpenAPI();
String s = Json.pretty(oa.info(new Info()));
JSONObject json = new JSONObject(s);
json.put("components", new JSONObject());
json.getJSONObject("components").put("schemas", jsonModels);
JsonNode rootNode = Json.mapper().readTree(json.toString());
OpenAPIDeserializer ds = new OpenAPIDeserializer();
SwaggerParseResult result = ds.deserialize(rootNode);
@SuppressWarnings("rawtypes") Map<String, Schema> map = result.getOpenAPI().getComponents().getSchemas();
openAPI.getComponents().schemas(map);
modelMap.clear();
} catch (Throwable t) {
t.printStackTrace();
Engine.logEngine.error("Unexpected exception while parsing UrlMapper to generate models", t);
}
// write yaml
try {
FileUtils.write(yamlFile, prettyPrintYaml(openAPI), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
Engine.logEngine.error("Unexpected exception while writing project YAML file", e);
} finally {
Long t1 = System.currentTimeMillis();
Engine.logEngine.info("YAML file for " + projectName + " project written in " + (t1 - t0) + " ms");
}
}
}
use of com.twinsoft.convertigo.beans.core.IMappingRefModel in project convertigo by convertigo.
the class OpenApiUtils method addBodyParameter.
private static void addBodyParameter(Operation operation, UrlMappingParameter ump, String oasDirUrl, List<String> refList, boolean useExternalRef) {
RequestBody requestBody = operation.getRequestBody();
if (requestBody == null) {
operation.setRequestBody(new RequestBody());
requestBody = operation.getRequestBody();
requestBody.content(new Content());
MediaType mediaType = new MediaType();
String modelReference = ((IMappingRefModel) ump).getModelReference();
if (!modelReference.isEmpty()) {
if (modelReference.indexOf(".jsonschema") != -1) {
modelReference = modelReference.replace(".jsonschema#/definitions/", ".json#/components/schemas/");
modelReference = oasDirUrl + modelReference;
}
if (!refList.contains(modelReference)) {
refList.add(modelReference);
}
if (!useExternalRef && modelReference.indexOf('#') != -1) {
modelReference = modelReference.substring(modelReference.indexOf('#'));
}
ObjectSchema oschema = new ObjectSchema();
oschema.set$ref(modelReference);
mediaType.setSchema(oschema);
}
DataContent dataInput = ump.getInputContent();
if (dataInput.equals(DataContent.toJson)) {
requestBody.getContent().addMediaType(MimeType.Json.value(), mediaType);
} else if (dataInput.equals(DataContent.toXml)) {
requestBody.getContent().addMediaType(MimeType.Xml.value(), mediaType);
}
}
}
Aggregations