Skip to content

Commit

Permalink
Merge branch 'master' into fix-enum-type-generator
Browse files Browse the repository at this point in the history
  • Loading branch information
sbilello authored Sep 17, 2021
2 parents e3a7817 + 8d616c0 commit 897d9b3
Show file tree
Hide file tree
Showing 4 changed files with 240 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2117,17 +2117,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
}

List<Parameter> parameters = operation.getParameters();
CodegenParameter bodyParam = null;
List<CodegenParameter> allParams = new ArrayList<>();
List<CodegenParameter> bodyParams = new ArrayList<>();
List<CodegenParameter> pathParams = new ArrayList<>();
List<CodegenParameter> queryParams = new ArrayList<>();
List<CodegenParameter> headerParams = new ArrayList<>();
List<CodegenParameter> cookieParams = new ArrayList<>();
List<CodegenParameter> formParams = new ArrayList<>();
List<CodegenParameter> requiredParams = new ArrayList<>();

List<CodegenContent> codegenContents = new ArrayList<>();
final OperationParameters operationParameters = new OperationParameters();

RequestBody body = operation.getRequestBody();
if (body != null) {
Expand Down Expand Up @@ -2188,20 +2178,20 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
}
// todo: this segment is only to support the "older" template design. it should be removed once all templates are updated with the new {{#contents}} tag.
formParameter.getVendorExtensions().put(CodegenConstants.IS_FORM_PARAM_EXT_NAME, Boolean.TRUE);
formParams.add(formParameter.copy());
operationParameters.addFormParam(formParameter.copy());
if (body.getRequired() != null && body.getRequired()) {
requiredParams.add(formParameter.copy());
operationParameters.addRequiredParam(formParameter.copy());
}
allParams.add(formParameter);
operationParameters.addAllParams(formParameter);
}
codegenContents.add(codegenContent);
operationParameters.addCodegenContents(codegenContent);
}
} else {
bodyParam = fromRequestBody(body, schemaName, schema, schemas, imports);
CodegenParameter bodyParam = fromRequestBody(body, schemaName, schema, schemas, imports);
operationParameters.setBodyParam(bodyParam);
if (foundSchemas.isEmpty()) {
// todo: this segment is only to support the "older" template design. it should be removed once all templates are updated with the new {{#contents}} tag.
bodyParams.add(bodyParam.copy());
allParams.add(bodyParam);
operationParameters.addBodyParams(bodyParam.copy());
operationParameters.addAllParams(bodyParam);
} else {
boolean alreadyAdded = false;
for (Schema usedSchema : foundSchemas) {
Expand All @@ -2214,7 +2204,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
}
}
foundSchemas.add(schema);
codegenContents.add(codegenContent);
operationParameters.addCodegenContents(codegenContent);
}
}
}
Expand All @@ -2224,53 +2214,30 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
if (StringUtils.isNotBlank(param.get$ref())) {
param = getParameterFromRef(param.get$ref(), openAPI);
}
CodegenParameter codegenParameter = fromParameter(param, imports);
allParams.add(codegenParameter);
// Issue #2561 (neilotoole) : Moved setting of is<Type>Param flags
// from here to fromParameter().
if (param instanceof QueryParameter || "query".equalsIgnoreCase(param.getIn())) {
queryParams.add(codegenParameter.copy());
} else if (param instanceof PathParameter || "path".equalsIgnoreCase(param.getIn())) {
pathParams.add(codegenParameter.copy());
} else if (param instanceof HeaderParameter || "header".equalsIgnoreCase(param.getIn())) {
headerParams.add(codegenParameter.copy());
} else if (param instanceof CookieParameter || "cookie".equalsIgnoreCase(param.getIn())) {
cookieParams.add(codegenParameter.copy());
}
if (codegenParameter.required) {
requiredParams.add(codegenParameter.copy());
if ((param instanceof QueryParameter || "query".equalsIgnoreCase(param.getIn()))
&& param.getStyle() != null && param.getStyle().equals(Parameter.StyleEnum.DEEPOBJECT)) {
operationParameters.parseNestedObjects(param.getName(), param.getSchema(), imports, this, openAPI);
continue;
}
CodegenParameter codegenParameter = fromParameter(param, imports);
operationParameters.addParameters(param, codegenParameter);
}
}

addOperationImports(codegenOperation, imports);

codegenOperation.bodyParam = bodyParam;
codegenOperation.bodyParam = operationParameters.getBodyParam();
codegenOperation.httpMethod = httpMethod.toUpperCase();

// move "required" parameters in front of "optional" parameters
if (sortParamsByRequiredFlag) {
Collections.sort(allParams, new Comparator<CodegenParameter>() {
@Override
public int compare(CodegenParameter one, CodegenParameter another) {
if (one.required == another.required) return 0;
else if (one.required) return -1;
else return 1;
}
});
operationParameters.sortRequiredAllParams();
}

codegenOperation.allParams = addHasMore(allParams);
codegenOperation.bodyParams = addHasMore(bodyParams);
codegenOperation.pathParams = addHasMore(pathParams);
codegenOperation.queryParams = addHasMore(queryParams);
codegenOperation.headerParams = addHasMore(headerParams);
codegenOperation.cookieParams = addHasMore(cookieParams);
codegenOperation.formParams = addHasMore(formParams);
codegenOperation.requiredParams = addHasMore(requiredParams);
operationParameters.addHasMore(codegenOperation);
codegenOperation.externalDocs = operation.getExternalDocs();

configuresParameterForMediaType(codegenOperation, codegenContents);
configuresParameterForMediaType(codegenOperation, operationParameters.getCodegenContents());
// legacy support
codegenOperation.nickname = codegenOperation.operationId;

Expand Down Expand Up @@ -3002,16 +2969,6 @@ private void addHeaders(ApiResponse response, List<CodegenProperty> target, Map<
}
}

protected static List<CodegenParameter> addHasMore(List<CodegenParameter> objs) {
if (objs != null) {
for (int i = 0; i < objs.size(); i++) {
objs.get(i).secondaryParam = i > 0;
objs.get(i).getVendorExtensions().put(CodegenConstants.HAS_MORE_EXT_NAME, i < objs.size() - 1);
}
}
return objs;
}

private static Map<String, Object> addHasMore(Map<String, Object> objs) {
if (objs != null) {
for (int i = 0; i < objs.size() - 1; i++) {
Expand Down Expand Up @@ -4379,7 +4336,7 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation
}
}
);
addHasMore(content.getParameters());
OperationParameters.addHasMore(content.getParameters());
}
codegenOperation.getContents().addAll(codegenContents);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
package io.swagger.codegen.v3.generators;

import io.swagger.codegen.v3.CodegenConstants;
import io.swagger.codegen.v3.CodegenContent;
import io.swagger.codegen.v3.CodegenOperation;
import io.swagger.codegen.v3.CodegenParameter;
import io.swagger.codegen.v3.generators.util.OpenAPIUtil;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.ArraySchema;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.CookieParameter;
import io.swagger.v3.oas.models.parameters.HeaderParameter;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.parameters.PathParameter;
import io.swagger.v3.oas.models.parameters.QueryParameter;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class OperationParameters {

private CodegenParameter bodyParam = null;
private List<CodegenParameter> allParams = new ArrayList<>();
private List<CodegenParameter> bodyParams = new ArrayList<>();
private List<CodegenParameter> pathParams = new ArrayList<>();
private List<CodegenParameter> queryParams = new ArrayList<>();
private List<CodegenParameter> headerParams = new ArrayList<>();
private List<CodegenParameter> cookieParams = new ArrayList<>();
private List<CodegenParameter> formParams = new ArrayList<>();
private List<CodegenParameter> requiredParams = new ArrayList<>();
private List<CodegenContent> codegenContents = new ArrayList<>();

public void setBodyParam(CodegenParameter bodyParam) {
this.bodyParam = bodyParam;
}

public CodegenParameter getBodyParam() {
return bodyParam;
}

public List<CodegenParameter> getAllParams() {
return allParams;
}

public List<CodegenParameter> getBodyParams() {
return bodyParams;
}

public List<CodegenParameter> getPathParams() {
return pathParams;
}

public List<CodegenParameter> getQueryParams() {
return queryParams;
}

public List<CodegenParameter> getHeaderParams() {
return headerParams;
}

public List<CodegenParameter> getCookieParams() {
return cookieParams;
}

public List<CodegenParameter> getFormParams() {
return formParams;
}

public List<CodegenParameter> getRequiredParams() {
return requiredParams;
}

public List<CodegenContent> getCodegenContents() {
return codegenContents;
}

public void addAllParams(CodegenParameter codegenParameter) {
allParams.add(codegenParameter);
}

public void addBodyParams(CodegenParameter codegenParameter) {
bodyParams.add(codegenParameter);
}

public void addPathParams(CodegenParameter codegenParameter) {
pathParams.add(codegenParameter);
}

public void addQueryParams(CodegenParameter codegenParameter) {
queryParams.add(codegenParameter);
}

public void addHeaderParams(CodegenParameter codegenParameter) {
headerParams.add(codegenParameter);
}

public void addCookieParams(CodegenParameter codegenParameter) {
cookieParams.add(codegenParameter);
}

public void addFormParam(CodegenParameter codegenParameter) {
formParams.add(codegenParameter);
}

public void addRequiredParam(CodegenParameter codegenParameter) {
requiredParams.add(codegenParameter);
}

public void addCodegenContents(CodegenContent codegenContent) {
codegenContents.add(codegenContent);
}

public void addParameters(Parameter parameter, CodegenParameter codegenParameter) {
allParams.add(codegenParameter);

if (parameter instanceof QueryParameter || "query".equalsIgnoreCase(parameter.getIn())) {
queryParams.add(codegenParameter.copy());
} else if (parameter instanceof PathParameter || "path".equalsIgnoreCase(parameter.getIn())) {
pathParams.add(codegenParameter.copy());
} else if (parameter instanceof HeaderParameter || "header".equalsIgnoreCase(parameter.getIn())) {
headerParams.add(codegenParameter.copy());
} else if (parameter instanceof CookieParameter || "cookie".equalsIgnoreCase(parameter.getIn())) {
cookieParams.add(codegenParameter.copy());
}
if (codegenParameter.required) {
requiredParams.add(codegenParameter.copy());
}
}

public void addHasMore(CodegenOperation codegenOperation) {
codegenOperation.allParams = addHasMore(allParams);
codegenOperation.bodyParams = addHasMore(bodyParams);
codegenOperation.pathParams = addHasMore(pathParams);
codegenOperation.queryParams = addHasMore(queryParams);
codegenOperation.headerParams = addHasMore(headerParams);
codegenOperation.cookieParams = addHasMore(cookieParams);
codegenOperation.formParams = addHasMore(formParams);
codegenOperation.requiredParams = addHasMore(requiredParams);
}

public void sortRequiredAllParams() {
Collections.sort(allParams, (one, another) -> {
if (one.required == another.required) {
return 0;
} else if (one.required) {
return -1;
} else {
return 1;
}
});
}

public void parseNestedObjects(String name, Schema schema, Set<String> imports, DefaultCodegenConfig codegenConfig, OpenAPI openAPI) {
schema = OpenAPIUtil.getRefSchemaIfExists(schema, openAPI);
if (schema == null || !isObjectWithProperties(schema)) {
return;
}
final Map<String, Schema> properties = schema.getProperties();
for (String key : properties.keySet()) {
Schema property = properties.get(key);
property = OpenAPIUtil.getRefSchemaIfExists(property, openAPI);
boolean required;
if (schema.getRequired() == null || schema.getRequired().isEmpty()) {
required = false;
} else {
required = schema.getRequired().stream().anyMatch(propertyName -> key.equalsIgnoreCase(propertyName.toString()));
}
final String parameterName;
if (property instanceof ArraySchema) {
parameterName = String.format("%s[%s][]", name, key);
} else {
parameterName = String.format("%s[%s]", name, key);
}
if (isObjectWithProperties(property)) {
parseNestedObjects(parameterName, property, imports, codegenConfig, openAPI);
continue;
}
final Parameter queryParameter = new QueryParameter()
.name(parameterName)
.required(required)
.schema(property);
final CodegenParameter codegenParameter = codegenConfig.fromParameter(queryParameter, imports);
addParameters(queryParameter, codegenParameter);
}
}

public static List<CodegenParameter> addHasMore(List<CodegenParameter> codegenParameters) {
if (codegenParameters == null || codegenParameters.isEmpty()) {
return codegenParameters;
}
for (int i = 0; i < codegenParameters.size(); i++) {
codegenParameters.get(i).secondaryParam = i > 0;
codegenParameters.get(i).getVendorExtensions().put(CodegenConstants.HAS_MORE_EXT_NAME, i < codegenParameters.size() - 1);
}
return codegenParameters;
}

private boolean isObjectWithProperties(Schema schema) {
return ("object".equalsIgnoreCase(schema.getType()) || schema.getType() == null)
&& schema.getProperties() != null
&& !schema.getProperties().isEmpty();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import io.swagger.codegen.v3.generators.OperationParameters;
import io.swagger.codegen.v3.utils.URLPathUtil;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation;
Expand Down Expand Up @@ -452,7 +453,7 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation
addParameters(content, codegenOperation.cookieParams);
}
for (CodegenContent content : codegenContents) {
addHasMore(content.getParameters());
OperationParameters.addHasMore(content.getParameters());
}
codegenOperation.getContents().addAll(codegenContents);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,17 @@ public static Schema getSchemaFromName(String name, OpenAPI openAPI) {
return mapSchema.get(name);
}

public static Schema getRefSchemaIfExists(Schema schema, OpenAPI openAPI) {
if (schema == null) {
return null;
}
if (StringUtils.isBlank(schema.get$ref()) || openAPI == null || openAPI.getComponents() == null) {
return schema;
}
final String name = getSimpleRef(schema.get$ref());
return getSchemaFromName(name, openAPI);
}

public static Schema getSchemaFromRefSchema(Schema refSchema, OpenAPI openAPI) {
if (StringUtils.isBlank(refSchema.get$ref())) {
return null;
Expand Down

0 comments on commit 897d9b3

Please sign in to comment.