Skip to content

Commit

Permalink
Merge pull request #2555 from opencb/TASK-7429
Browse files Browse the repository at this point in the history
TASK-7429 - Swagger WS body empty and can't be edited
  • Loading branch information
juanfeSanahuja authored Feb 27, 2025
2 parents bccaf41 + 7bbf7c6 commit bb2cd6e
Show file tree
Hide file tree
Showing 12 changed files with 417 additions and 150 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import org.opencb.opencga.core.common.GitRepositoryState;
import org.opencb.opencga.core.tools.annotations.*;
import org.opencb.opencga.server.generator.commons.ApiCommons;
import org.opencb.opencga.server.generator.models.RestParameter;
import org.opencb.opencga.server.generator.openapi.models.*;
import org.opencb.opencga.server.generator.openapi.common.SwaggerDefinitionGenerator;

Expand All @@ -13,9 +12,10 @@

public class JsonOpenApiGenerator {

private final List<Class<?>> beansDefinitions= new ArrayList<>();

public Swagger generateJsonOpenApi(ApiCommons apiCommons, String token, String environment) {
List<Class<?>> classes = apiCommons.getApiClasses();
List<Class<?>> beansDefinitions= new ArrayList<>();
Swagger swagger = new Swagger();
Info info = new Info();
info.setTitle("OpenCGA RESTful Web Services");
Expand Down Expand Up @@ -55,19 +55,23 @@ public Swagger generateJsonOpenApi(ApiCommons apiCommons, String token, String e

// Procesar métodos
for (java.lang.reflect.Method wsmethod : clazz.getDeclaredMethods()) {

ApiOperation apiOperation = wsmethod.getAnnotation(ApiOperation.class);
if (apiOperation != null) {

if (apiOperation != null && !apiOperation.hidden()) {
// Crear operación Swagger
Method method = new Method();
method.setSummary(apiOperation.value());
method.setDescription(apiOperation.notes());
method.setTags(Collections.singletonList(api.value()));
Map<String,Object> responses=new HashMap<>();
responses.put("type", String.valueOf(apiOperation.response()));
if(apiOperation.response() instanceof Class){
beansDefinitions.add((Class) apiOperation.response());
Map<String,Response> responses=new HashMap<>();
responses.put("200",new Response().setDescription("Successful operation").setSchema(new Schema("#/definitions/"+apiOperation.response().getSimpleName())));
if(!SwaggerDefinitionGenerator.isPrimitive(apiOperation.response())){
if(!beansDefinitions.contains((Class) apiOperation.response()) && SwaggerDefinitionGenerator.isOpencbBean((Class) apiOperation.response())){
beansDefinitions.add((Class) apiOperation.response());
}
}
method.getResponses().put("200", responses);
method.setResponses(responses);

// Obtener el método HTTP
String httpMethod = extractHttpMethod(wsmethod);
Expand Down Expand Up @@ -146,42 +150,63 @@ private List<Parameter> extractParameters(java.lang.reflect.Method method, Strin
if (apiParam == null || apiParam.hidden()) {
continue;
}

// Procesar PathParam
PathParam pathParam = methodParam.getAnnotation(PathParam.class);
if (pathParam != null) {
parameter.setName(pathParam.value());
parameter.setDescription(pathParam.value());
parameter.setRequired(true);
parameter.setType(methodParam.getType().getSimpleName().toLowerCase(Locale.ROOT));
}

// Procesar QueryParam
QueryParam queryParam = methodParam.getAnnotation(QueryParam.class);
if (queryParam != null) {
parameter.setName(queryParam.value());
parameter.setDescription(queryParam.value());
if(apiParam.value().equals("body") || apiParam.name().equals("body") || isBody(methodParam)){
parameter.setName("body");
parameter.setIn("body");
parameter.setDescription(StringUtils.isNotEmpty(apiParam.value()) ? apiParam.value() : "body");
parameter.setRequired(apiParam.required());
parameter.setType(methodParam.getType().getSimpleName().toLowerCase(Locale.ROOT));
}
parameter.setType(methodParam.getType().getTypeName());
parameter.setSchema(new Schema("#/definitions/"+methodParam.getType().getSimpleName()));
if(!beansDefinitions.contains((Class) methodParam.getType())){
beansDefinitions.add(methodParam.getType());
}
}else {
// Procesar PathParam
PathParam pathParam = methodParam.getAnnotation(PathParam.class);
if (pathParam != null) {
parameter.setName(pathParam.value());
parameter.setDescription(pathParam.value());
parameter.setRequired(true);
}

FormDataParam formDataParam = methodParam.getAnnotation(FormDataParam.class);
if (formDataParam != null) {
parameter.setName(formDataParam.value());
parameter.setDescription(formDataParam.value());
parameter.setRequired(apiParam.required());
parameter.setType(methodParam.getType().getSimpleName().toLowerCase(Locale.ROOT));
// Procesar QueryParam
QueryParam queryParam = methodParam.getAnnotation(QueryParam.class);
if (queryParam != null) {
parameter.setName(queryParam.value());
parameter.setDescription(queryParam.value());
parameter.setRequired(apiParam.required());
}

FormDataParam formDataParam = methodParam.getAnnotation(FormDataParam.class);
if (formDataParam != null) {
parameter.setName(formDataParam.value());
parameter.setDescription(formDataParam.value());
parameter.setRequired(apiParam.required());
}
if(SwaggerDefinitionGenerator.isPrimitive(methodParam.getType())){
parameter.setType(SwaggerDefinitionGenerator.mapJavaTypeToSwaggerType(methodParam.getType()));
}else {
parameter.setType(methodParam.getType().getTypeName());
}
parameter.setIn(getIn(methodParam));
parameter.setDefaultValue(apiParam.defaultValue());
parameter.setDescription(StringUtils.isEmpty(parameter.getDescription()) ? apiParam.value() : parameter.getDescription());
}
if(parameter.getName()!=null){
parameters.add(parameter);
}
parameter.setIn(getIn(methodParam));
parameter.setDefaultValue(apiParam.defaultValue());
parameter.setDescription(StringUtils.isEmpty(parameter.getDescription())?apiParam.value():parameter.getDescription());
parameters.add(parameter);
}

return parameters;
}

private boolean isBody(java.lang.reflect.Parameter methodParameter) {
return methodParameter.getAnnotation(PathParam.class) == null &&
methodParameter.getAnnotation(QueryParam.class) == null &&
methodParameter.getAnnotation(FormDataParam.class) == null;
}


private String getIn(java.lang.reflect.Parameter methodParameter) {
if (methodParameter.getAnnotation(PathParam.class) != null) {
return "path";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.opencb.opencga.server.generator.openapi;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.opencb.opencga.server.generator.commons.ApiCommonsImpl;
import org.opencb.opencga.server.generator.openapi.models.Swagger;
Expand All @@ -10,6 +11,7 @@ public static void main(String[] args) throws Exception {
Swagger swagger = generator.generateJsonOpenApi(new ApiCommonsImpl(), "El token va aquí", "task-xxxx");

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String swaggerJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(swagger);

System.out.println(swaggerJson);
Expand Down
Loading

0 comments on commit bb2cd6e

Please sign in to comment.