Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion multiapi-engine/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>com.sngular</groupId>
<artifactId>multiapi-engine</artifactId>
<version>6.1.0</version>
<version>6.2.0</version>
<packaging>jar</packaging>

<properties>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@

package com.sngular.api.generator.plugin.common.model;

import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Map;
import java.util.Objects;
import com.sngular.api.generator.plugin.openapi.exception.CodeGenerationException;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Map;
import java.util.Objects;

@Data
public class SchemaFieldObjectType {

Expand All @@ -38,6 +39,21 @@ public class SchemaFieldObjectType {
new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile")
);

private static final Map<String, String> IMPORT_TYPE_MAPPINGS = Map.ofEntries(
new SimpleImmutableEntry<>(TypeConstants.OBJECT, "java.util.Object"),
new SimpleImmutableEntry<>(TypeConstants.ARRAY, "java.util.List"),
new SimpleImmutableEntry<>(TypeConstants.MAP, "java.util.Map"),
new SimpleImmutableEntry<>(TypeConstants.BIG_DECIMAL, "java.math.BigDecimal"),
new SimpleImmutableEntry<>(TypeConstants.STRING, "java.util.String"),
new SimpleImmutableEntry<>(TypeConstants.LOCALDATE, "java.time.LocalDate"),
new SimpleImmutableEntry<>(TypeConstants.LOCALDATETIME, "java.time.LocalDateTime"),
new SimpleImmutableEntry<>(TypeConstants.ZONEDDATE, "java.time." + ZONED_DATE_TIME),
new SimpleImmutableEntry<>(TypeConstants.ZONEDDATETIME, "java.time." + ZONED_DATE_TIME),
new SimpleImmutableEntry<>(TypeConstants.OFFSETDATE, "java.time." + OFFSET_DATE_TIME),
new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, "java.time." + OFFSET_DATE_TIME),
new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile")
);

private static final Map<String, String> IMPL_TYPE_MAPPINGS = Map.ofEntries(
new SimpleImmutableEntry<>(TypeConstants.OBJECT, "Object"),
new SimpleImmutableEntry<>(TypeConstants.ARRAY, "ArrayList<?>"),
Expand Down Expand Up @@ -141,8 +157,7 @@ public String toString() {
@Override
public boolean equals(final Object obj) {
boolean result = false;
if (obj instanceof SchemaFieldObjectType) {
final SchemaFieldObjectType other = (SchemaFieldObjectType) obj;
if (obj instanceof SchemaFieldObjectType other) {
final boolean baseTypeIsEqual = baseType.equals(other.baseType);
final boolean innerTypeIsEqual = Objects.isNull(innerType) ? Objects.isNull(other.innerType) : innerType.equals(other.innerType);
result = baseTypeIsEqual && innerTypeIsEqual;
Expand All @@ -155,4 +170,8 @@ public boolean equals(final Object obj) {
public int hashCode() {
return Objects.hash(Objects.isNull(innerType) ? 0 : innerType.hashCode(), baseType);
}

public String getImportName() {
return IMPORT_TYPE_MAPPINGS.get(this.baseType);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class MapperUtil {
private static final String SLASH = "/";

private static final String PACKAGE_SEPARATOR_STR = ".";
public static final String JAVA_TIME = "java.time.";

private MapperUtil() {}

Expand Down Expand Up @@ -154,37 +155,19 @@ public static String getPojoNameFromRef(final JsonNode schema, final CommonSpecF
}

public static String getDateType(final JsonNode schema, final CommonSpecFile specFile) {
final String dateType;
switch (ApiTool.getFormat(schema)) {

case "date":
switch (specFile.getUseTimeType()) {
case ZONED:
dateType = TypeConstants.ZONEDDATE;
break;
case OFFSET:
dateType = TypeConstants.OFFSETDATE;
break;
default:
dateType = TypeConstants.LOCALDATE;
}
break;
case "date-time":
switch (specFile.getUseTimeType()) {
case ZONED:
dateType = TypeConstants.ZONEDDATETIME;
break;
case OFFSET:
dateType = TypeConstants.OFFSETDATETIME;
break;
default:
dateType = TypeConstants.LOCALDATETIME;
}
break;
default:
dateType = TypeConstants.LOCALDATETIME;
}
return dateType;
return switch (ApiTool.getFormat(schema)) {
case "date" -> switch (specFile.getUseTimeType()) {
case ZONED -> TypeConstants.ZONEDDATE;
case OFFSET -> TypeConstants.OFFSETDATE;
default -> TypeConstants.LOCALDATE;
};
case "date-time" -> switch (specFile.getUseTimeType()) {
case ZONED -> TypeConstants.ZONEDDATETIME;
case OFFSET -> TypeConstants.OFFSETDATETIME;
default -> TypeConstants.LOCALDATETIME;
};
default -> TypeConstants.LOCALDATETIME;
};
}

public static String getRefClass(final JsonNode schema) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,13 +238,15 @@ private static List<ParameterObject> mapParameterObjects(

private static ParameterObject buildParameterObject(
final SpecFile specFile, final GlobalObject globalObject, final JsonNode refParameter, final Path baseDir) {
final var dateType = getSchemaType(getContentOrSchema(refParameter), TypeConstants.OBJECT, specFile, globalObject, baseDir);
return ParameterObject.builder()
.name(ApiTool.getName(refParameter))
.required(ApiTool.getNodeAsBoolean(refParameter, REQUIRED))
.description(ApiTool.getNodeAsString(refParameter, DESCRIPTION))
.in(ApiTool.getNodeAsString(refParameter, "in"))
.dataType(getSchemaType(getContentOrSchema(refParameter), TypeConstants.OBJECT, specFile, globalObject, baseDir))
.dataType(dateType)
.isCollection(ApiTool.hasItems(getContentOrSchema(refParameter)))
.importName(dateType.getImportName())
.build();
}

Expand Down
78 changes: 47 additions & 31 deletions multiapi-engine/src/main/resources/templates/openapi/template.ftlh
Original file line number Diff line number Diff line change
@@ -1,6 +1,52 @@
<#ftl output_format="plainText">
package <#if packageApi??>${packageApi}<#elseif package??> ${package}</#if>;

<#assign imports=[]>
<#assign model_imports=[]>
<#list pathObjects as path>
<#list path.operationObjects as operation>
<#list operation.requestObjects as request>
<#list request.contentObjects as content>
<#if content.importName?? && (!imports?seq_contains(content.importName)) && (!model_imports?seq_contains(content.importName))>
<#if (!checkBasicTypes?seq_contains(content.importName))>
<#if (!content.importName?contains("java."))>
<#assign model_imports = model_imports+[content.importName]>
<#else>
<#assign imports = imports+[content.importName]>
</#if>
</#if>
</#if>
</#list>
</#list>
<#list operation.responseObjects as response>
<#list response.contentObjects as content>
<#if content.importName?? && (!imports?seq_contains(content.importName)) && (!model_imports?seq_contains(content.importName))>
<#if (!checkBasicTypes?seq_contains(content.importName))>
<#if (!content.importName?contains("java."))>
<#assign model_imports = model_imports+[content.importName]>
<#else>
<#assign imports = imports+[content.importName]>
</#if>
</#if>
</#if>
</#list>
</#list>
<#list operation.parameterObjects as parameter>
<#if parameter.importName?? && (!imports?seq_contains(parameter.importName)) && (!model_imports?seq_contains(parameter.importName))>
<#if (!checkBasicTypes?seq_contains(parameter.importName))>
<#if (!parameter.importName?contains("java."))>
<#assign model_imports = model_imports+[parameter.importName]>
<#else>
<#assign imports = imports+[parameter.importName]>
</#if>
</#if>
</#if>
</#list>
</#list>
</#list>
<#list imports as import>
import ${import};
</#list>
import java.util.Optional;
import java.util.List;
import java.util.Map;
Expand All @@ -17,37 +63,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.NativeWebRequest;

<#assign imports=[]>
<#list pathObjects as path>
<#list path.operationObjects as operation>
<#list operation.requestObjects as request>
<#list request.contentObjects as content>
<#if content.importName?? && (!imports?seq_contains(content.importName))>
<#if (!checkBasicTypes?seq_contains(content.importName))>
<#assign imports = imports+[content.importName]>
</#if>
</#if>
</#list>
</#list>
<#list operation.responseObjects as response>
<#list response.contentObjects as content>
<#if content.importName?? && (!imports?seq_contains(content.importName))>
<#if (!checkBasicTypes?seq_contains(content.importName))>
<#assign imports = imports+[content.importName]>
</#if>
</#if>
</#list>
</#list>
<#list operation.parameterObjects as parameter>
<#if parameter.importName?? && (!imports?seq_contains(parameter.importName))>
<#if (!checkBasicTypes?seq_contains(parameter.importName))>
<#assign imports = imports+[parameter.importName]>
</#if>
</#if>
</#list>
</#list>
</#list>
<#list imports as import>
<#list model_imports as import>
import <#if packageModel??>${packageModel}<#elseif package??>${package}</#if>.${import};
</#list>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,43 +1,59 @@
<#ftl output_format="plainText">
package <#if packageApi??>${packageApi}<#elseif package??> ${package}</#if>;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import ${packageClient}.ApiRestClient;

<#assign imports=[]>
<#assign model_imports=[]>
<#list pathObjects as path>
<#list path.operationObjects as operation>
<#list operation.requestObjects as request>
<#list request.contentObjects as content>
<#if content.importName?? && (!imports?seq_contains(content.importName))>
<#if content.importName?? && (!imports?seq_contains(content.importName)) && (!model_imports?seq_contains(content.importName))>
<#if (!checkBasicTypes?seq_contains(content.importName))>
<#assign imports = imports+[content.importName]>
<#if (!content.importName?contains("java."))>
<#assign model_imports = model_imports+[content.importName]>
<#else>
<#assign imports = imports+[content.importName]>
</#if>
</#if>
</#if>
</#list>
</#list>
<#list operation.responseObjects as response>
<#list response.contentObjects as content>
<#if content.importName?? && (!imports?seq_contains(content.importName))>
<#if content.importName?? && (!imports?seq_contains(content.importName)) && (!model_imports?seq_contains(content.importName))>
<#if (!checkBasicTypes?seq_contains(content.importName))>
<#assign imports = imports+[content.importName]>
<#if (!content.importName?contains("java."))>
<#assign model_imports = model_imports+[content.importName]>
<#else>
<#assign imports = imports+[content.importName]>
</#if>
</#if>
</#if>
</#list>
</#list>
<#list operation.parameterObjects as parameter>
<#if parameter.importName?? && (!imports?seq_contains(parameter.importName))>
<#if (!checkBasicTypes?seq_contains(parameter.importName))>
<#if parameter.importName?? && (!imports?seq_contains(parameter.importName)) && (!model_imports?seq_contains(parameter.importName))>
<#if (!checkBasicTypes?seq_contains(parameter.importName))>
<#if (!parameter.importName?contains("java."))>
<#assign model_imports = model_imports+[parameter.importName]>
<#else>
<#assign imports = imports+[parameter.importName]>
</#if>
</#if>
</#if>
</#list>
</#list>
</#list>
<#list imports as import>
import ${import};
</#list>
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import ${packageClient}.ApiRestClient;

<#list model_imports as import>
import <#if packageModel??>${packageModel}<#elseif package??>${package}</#if>.${import};
</#list>

Expand Down Expand Up @@ -93,15 +109,21 @@ public class ${className?cap_first}Api {
* ${operation.operationType} ${path.pathName}<#if operation.summary?has_content>: ${operation.summary}</#if>
<#if operation.responseObjects?has_content>
<#if operation.parameterObjects?has_content>
* <#list operation.parameterObjects as parameter>@param ${parameter.name} ${parameter.description} ${parameter.required?c}</#list>
<#list operation.parameterObjects as parameter>
* @param ${parameter.name} ${parameter.description!" "} <#if parameter.required == true>(required)</#if>
</#list>
</#if>
<#if path.parameterObjects?has_content>
* <#list path.parameterObjects as parameter>@param ${parameter.name} ${parameter.description} ${parameter.required?c}</#list>
<#list path.parameterObjects as parameter>
* @param ${parameter.name} ${parameter.description!" "} <#if parameter.required == true>(required)</#if>
</#list>
</#if>
<#if operation.requestObjects?has_content>
*<#list operation.requestObjects as request><#list request.contentObjects as content> @param ${content.dataType?api.getVariableNameString()}<#if content?has_next>, </#if></#list> ${request.description! ""} <#if request.required == true>(required)</#if></#list>
<#list operation.requestObjects as request><#list request.contentObjects as content>
* @param ${content.dataType?api.getVariableNameString()}<#if content?has_next>, </#if></#list> ${request.description! ""} <#if request.required == true>(required)</#if>
</#list>
</#if>
* @return<#list operation.responseObjects as response><#if response.responseName != "default"> ${response.description}; (status code ${response.responseName})</#if></#list>
* @return<#list operation.responseObjects as response><#if response.responseName != "default"> ${response.description!" "}; (status code ${response.responseName})</#if></#list>
</#if>
* @throws RestClientException if an error occurs while attempting to invoke the API
*/
Expand Down Expand Up @@ -152,7 +174,6 @@ public class ${className?cap_first}Api {
<#if operation.parameterObjects?has_content>
<#list operation.parameterObjects as parameter>
<#if parameter.in == "query">

queryParams.putAll(apiRestClient.parameterToMultiValueMap(<#if parameter.isCollection == true> ApiRestClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT))<#else> null</#if>, "${parameter.name}", ${parameter.name}));
</#if>
</#list>
Expand Down
Loading
Loading