Skip to content

Commit 6d71d1c

Browse files
authored
Improving Imports on Open Api Templates (#362)
1 parent c646d0f commit 6d71d1c

File tree

20 files changed

+200
-114
lines changed

20 files changed

+200
-114
lines changed

multiapi-engine/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<groupId>com.sngular</groupId>
66
<artifactId>multiapi-engine</artifactId>
7-
<version>6.1.0</version>
7+
<version>6.2.0</version>
88
<packaging>jar</packaging>
99

1010
<properties>

multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/model/SchemaFieldObjectType.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66

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

9-
import java.util.AbstractMap.SimpleImmutableEntry;
10-
import java.util.Map;
11-
import java.util.Objects;
129
import com.sngular.api.generator.plugin.openapi.exception.CodeGenerationException;
1310
import lombok.Data;
1411
import org.apache.commons.lang3.StringUtils;
1512

13+
import java.util.AbstractMap.SimpleImmutableEntry;
14+
import java.util.Map;
15+
import java.util.Objects;
16+
1617
@Data
1718
public class SchemaFieldObjectType {
1819

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

42+
private static final Map<String, String> IMPORT_TYPE_MAPPINGS = Map.ofEntries(
43+
new SimpleImmutableEntry<>(TypeConstants.OBJECT, "java.util.Object"),
44+
new SimpleImmutableEntry<>(TypeConstants.ARRAY, "java.util.List"),
45+
new SimpleImmutableEntry<>(TypeConstants.MAP, "java.util.Map"),
46+
new SimpleImmutableEntry<>(TypeConstants.BIG_DECIMAL, "java.math.BigDecimal"),
47+
new SimpleImmutableEntry<>(TypeConstants.STRING, "java.util.String"),
48+
new SimpleImmutableEntry<>(TypeConstants.LOCALDATE, "java.time.LocalDate"),
49+
new SimpleImmutableEntry<>(TypeConstants.LOCALDATETIME, "java.time.LocalDateTime"),
50+
new SimpleImmutableEntry<>(TypeConstants.ZONEDDATE, "java.time." + ZONED_DATE_TIME),
51+
new SimpleImmutableEntry<>(TypeConstants.ZONEDDATETIME, "java.time." + ZONED_DATE_TIME),
52+
new SimpleImmutableEntry<>(TypeConstants.OFFSETDATE, "java.time." + OFFSET_DATE_TIME),
53+
new SimpleImmutableEntry<>(TypeConstants.OFFSETDATETIME, "java.time." + OFFSET_DATE_TIME),
54+
new SimpleImmutableEntry<>(TypeConstants.MULTIPART_FILE, "MultipartFile")
55+
);
56+
4157
private static final Map<String, String> IMPL_TYPE_MAPPINGS = Map.ofEntries(
4258
new SimpleImmutableEntry<>(TypeConstants.OBJECT, "Object"),
4359
new SimpleImmutableEntry<>(TypeConstants.ARRAY, "ArrayList<?>"),
@@ -141,8 +157,7 @@ public String toString() {
141157
@Override
142158
public boolean equals(final Object obj) {
143159
boolean result = false;
144-
if (obj instanceof SchemaFieldObjectType) {
145-
final SchemaFieldObjectType other = (SchemaFieldObjectType) obj;
160+
if (obj instanceof SchemaFieldObjectType other) {
146161
final boolean baseTypeIsEqual = baseType.equals(other.baseType);
147162
final boolean innerTypeIsEqual = Objects.isNull(innerType) ? Objects.isNull(other.innerType) : innerType.equals(other.innerType);
148163
result = baseTypeIsEqual && innerTypeIsEqual;
@@ -155,4 +170,8 @@ public boolean equals(final Object obj) {
155170
public int hashCode() {
156171
return Objects.hash(Objects.isNull(innerType) ? 0 : innerType.hashCode(), baseType);
157172
}
173+
174+
public String getImportName() {
175+
return IMPORT_TYPE_MAPPINGS.get(this.baseType);
176+
}
158177
}

multiapi-engine/src/main/java/com/sngular/api/generator/plugin/common/tools/MapperUtil.java

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class MapperUtil {
2222
private static final String SLASH = "/";
2323

2424
private static final String PACKAGE_SEPARATOR_STR = ".";
25+
public static final String JAVA_TIME = "java.time.";
2526

2627
private MapperUtil() {}
2728

@@ -154,37 +155,19 @@ public static String getPojoNameFromRef(final JsonNode schema, final CommonSpecF
154155
}
155156

156157
public static String getDateType(final JsonNode schema, final CommonSpecFile specFile) {
157-
final String dateType;
158-
switch (ApiTool.getFormat(schema)) {
159-
160-
case "date":
161-
switch (specFile.getUseTimeType()) {
162-
case ZONED:
163-
dateType = TypeConstants.ZONEDDATE;
164-
break;
165-
case OFFSET:
166-
dateType = TypeConstants.OFFSETDATE;
167-
break;
168-
default:
169-
dateType = TypeConstants.LOCALDATE;
170-
}
171-
break;
172-
case "date-time":
173-
switch (specFile.getUseTimeType()) {
174-
case ZONED:
175-
dateType = TypeConstants.ZONEDDATETIME;
176-
break;
177-
case OFFSET:
178-
dateType = TypeConstants.OFFSETDATETIME;
179-
break;
180-
default:
181-
dateType = TypeConstants.LOCALDATETIME;
182-
}
183-
break;
184-
default:
185-
dateType = TypeConstants.LOCALDATETIME;
186-
}
187-
return dateType;
158+
return switch (ApiTool.getFormat(schema)) {
159+
case "date" -> switch (specFile.getUseTimeType()) {
160+
case ZONED -> TypeConstants.ZONEDDATE;
161+
case OFFSET -> TypeConstants.OFFSETDATE;
162+
default -> TypeConstants.LOCALDATE;
163+
};
164+
case "date-time" -> switch (specFile.getUseTimeType()) {
165+
case ZONED -> TypeConstants.ZONEDDATETIME;
166+
case OFFSET -> TypeConstants.OFFSETDATETIME;
167+
default -> TypeConstants.LOCALDATETIME;
168+
};
169+
default -> TypeConstants.LOCALDATETIME;
170+
};
188171
}
189172

190173
public static String getRefClass(final JsonNode schema) {

multiapi-engine/src/main/java/com/sngular/api/generator/plugin/openapi/utils/MapperPathUtil.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,13 +238,15 @@ private static List<ParameterObject> mapParameterObjects(
238238

239239
private static ParameterObject buildParameterObject(
240240
final SpecFile specFile, final GlobalObject globalObject, final JsonNode refParameter, final Path baseDir) {
241+
final var dateType = getSchemaType(getContentOrSchema(refParameter), TypeConstants.OBJECT, specFile, globalObject, baseDir);
241242
return ParameterObject.builder()
242243
.name(ApiTool.getName(refParameter))
243244
.required(ApiTool.getNodeAsBoolean(refParameter, REQUIRED))
244245
.description(ApiTool.getNodeAsString(refParameter, DESCRIPTION))
245246
.in(ApiTool.getNodeAsString(refParameter, "in"))
246-
.dataType(getSchemaType(getContentOrSchema(refParameter), TypeConstants.OBJECT, specFile, globalObject, baseDir))
247+
.dataType(dateType)
247248
.isCollection(ApiTool.hasItems(getContentOrSchema(refParameter)))
249+
.importName(dateType.getImportName())
248250
.build();
249251
}
250252

multiapi-engine/src/main/resources/templates/openapi/template.ftlh

Lines changed: 47 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,52 @@
11
<#ftl output_format="plainText">
22
package <#if packageApi??>${packageApi}<#elseif package??> ${package}</#if>;
33

4+
<#assign imports=[]>
5+
<#assign model_imports=[]>
6+
<#list pathObjects as path>
7+
<#list path.operationObjects as operation>
8+
<#list operation.requestObjects as request>
9+
<#list request.contentObjects as content>
10+
<#if content.importName?? && (!imports?seq_contains(content.importName)) && (!model_imports?seq_contains(content.importName))>
11+
<#if (!checkBasicTypes?seq_contains(content.importName))>
12+
<#if (!content.importName?contains("java."))>
13+
<#assign model_imports = model_imports+[content.importName]>
14+
<#else>
15+
<#assign imports = imports+[content.importName]>
16+
</#if>
17+
</#if>
18+
</#if>
19+
</#list>
20+
</#list>
21+
<#list operation.responseObjects as response>
22+
<#list response.contentObjects as content>
23+
<#if content.importName?? && (!imports?seq_contains(content.importName)) && (!model_imports?seq_contains(content.importName))>
24+
<#if (!checkBasicTypes?seq_contains(content.importName))>
25+
<#if (!content.importName?contains("java."))>
26+
<#assign model_imports = model_imports+[content.importName]>
27+
<#else>
28+
<#assign imports = imports+[content.importName]>
29+
</#if>
30+
</#if>
31+
</#if>
32+
</#list>
33+
</#list>
34+
<#list operation.parameterObjects as parameter>
35+
<#if parameter.importName?? && (!imports?seq_contains(parameter.importName)) && (!model_imports?seq_contains(parameter.importName))>
36+
<#if (!checkBasicTypes?seq_contains(parameter.importName))>
37+
<#if (!parameter.importName?contains("java."))>
38+
<#assign model_imports = model_imports+[parameter.importName]>
39+
<#else>
40+
<#assign imports = imports+[parameter.importName]>
41+
</#if>
42+
</#if>
43+
</#if>
44+
</#list>
45+
</#list>
46+
</#list>
47+
<#list imports as import>
48+
import ${import};
49+
</#list>
450
import java.util.Optional;
551
import java.util.List;
652
import java.util.Map;
@@ -17,37 +63,7 @@ import org.springframework.http.ResponseEntity;
1763
import org.springframework.web.bind.annotation.*;
1864
import org.springframework.web.context.request.NativeWebRequest;
1965

20-
<#assign imports=[]>
21-
<#list pathObjects as path>
22-
<#list path.operationObjects as operation>
23-
<#list operation.requestObjects as request>
24-
<#list request.contentObjects as content>
25-
<#if content.importName?? && (!imports?seq_contains(content.importName))>
26-
<#if (!checkBasicTypes?seq_contains(content.importName))>
27-
<#assign imports = imports+[content.importName]>
28-
</#if>
29-
</#if>
30-
</#list>
31-
</#list>
32-
<#list operation.responseObjects as response>
33-
<#list response.contentObjects as content>
34-
<#if content.importName?? && (!imports?seq_contains(content.importName))>
35-
<#if (!checkBasicTypes?seq_contains(content.importName))>
36-
<#assign imports = imports+[content.importName]>
37-
</#if>
38-
</#if>
39-
</#list>
40-
</#list>
41-
<#list operation.parameterObjects as parameter>
42-
<#if parameter.importName?? && (!imports?seq_contains(parameter.importName))>
43-
<#if (!checkBasicTypes?seq_contains(parameter.importName))>
44-
<#assign imports = imports+[parameter.importName]>
45-
</#if>
46-
</#if>
47-
</#list>
48-
</#list>
49-
</#list>
50-
<#list imports as import>
66+
<#list model_imports as import>
5167
import <#if packageModel??>${packageModel}<#elseif package??>${package}</#if>.${import};
5268
</#list>
5369

multiapi-engine/src/main/resources/templates/openapi/templateCallRestClient.ftlh

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,59 @@
11
<#ftl output_format="plainText">
22
package <#if packageApi??>${packageApi}<#elseif package??> ${package}</#if>;
33

4-
import java.util.HashMap;
5-
import java.util.List;
6-
import java.util.Map;
7-
8-
import ${packageClient}.ApiRestClient;
9-
104
<#assign imports=[]>
5+
<#assign model_imports=[]>
116
<#list pathObjects as path>
127
<#list path.operationObjects as operation>
138
<#list operation.requestObjects as request>
149
<#list request.contentObjects as content>
15-
<#if content.importName?? && (!imports?seq_contains(content.importName))>
10+
<#if content.importName?? && (!imports?seq_contains(content.importName)) && (!model_imports?seq_contains(content.importName))>
1611
<#if (!checkBasicTypes?seq_contains(content.importName))>
17-
<#assign imports = imports+[content.importName]>
12+
<#if (!content.importName?contains("java."))>
13+
<#assign model_imports = model_imports+[content.importName]>
14+
<#else>
15+
<#assign imports = imports+[content.importName]>
16+
</#if>
1817
</#if>
1918
</#if>
2019
</#list>
2120
</#list>
2221
<#list operation.responseObjects as response>
2322
<#list response.contentObjects as content>
24-
<#if content.importName?? && (!imports?seq_contains(content.importName))>
23+
<#if content.importName?? && (!imports?seq_contains(content.importName)) && (!model_imports?seq_contains(content.importName))>
2524
<#if (!checkBasicTypes?seq_contains(content.importName))>
26-
<#assign imports = imports+[content.importName]>
25+
<#if (!content.importName?contains("java."))>
26+
<#assign model_imports = model_imports+[content.importName]>
27+
<#else>
28+
<#assign imports = imports+[content.importName]>
29+
</#if>
2730
</#if>
2831
</#if>
2932
</#list>
3033
</#list>
3134
<#list operation.parameterObjects as parameter>
32-
<#if parameter.importName?? && (!imports?seq_contains(parameter.importName))>
33-
<#if (!checkBasicTypes?seq_contains(parameter.importName))>
35+
<#if parameter.importName?? && (!imports?seq_contains(parameter.importName)) && (!model_imports?seq_contains(parameter.importName))>
36+
<#if (!checkBasicTypes?seq_contains(parameter.importName))>
37+
<#if (!parameter.importName?contains("java."))>
38+
<#assign model_imports = model_imports+[parameter.importName]>
39+
<#else>
3440
<#assign imports = imports+[parameter.importName]>
3541
</#if>
3642
</#if>
43+
</#if>
3744
</#list>
3845
</#list>
3946
</#list>
4047
<#list imports as import>
48+
import ${import};
49+
</#list>
50+
import java.util.HashMap;
51+
import java.util.List;
52+
import java.util.Map;
53+
54+
import ${packageClient}.ApiRestClient;
55+
56+
<#list model_imports as import>
4157
import <#if packageModel??>${packageModel}<#elseif package??>${package}</#if>.${import};
4258
</#list>
4359

@@ -93,15 +109,21 @@ public class ${className?cap_first}Api {
93109
* ${operation.operationType} ${path.pathName}<#if operation.summary?has_content>: ${operation.summary}</#if>
94110
<#if operation.responseObjects?has_content>
95111
<#if operation.parameterObjects?has_content>
96-
* <#list operation.parameterObjects as parameter>@param ${parameter.name} ${parameter.description} ${parameter.required?c}</#list>
112+
<#list operation.parameterObjects as parameter>
113+
* @param ${parameter.name} ${parameter.description!" "} <#if parameter.required == true>(required)</#if>
114+
</#list>
97115
</#if>
98116
<#if path.parameterObjects?has_content>
99-
* <#list path.parameterObjects as parameter>@param ${parameter.name} ${parameter.description} ${parameter.required?c}</#list>
117+
<#list path.parameterObjects as parameter>
118+
* @param ${parameter.name} ${parameter.description!" "} <#if parameter.required == true>(required)</#if>
119+
</#list>
100120
</#if>
101121
<#if operation.requestObjects?has_content>
102-
*<#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>
122+
<#list operation.requestObjects as request><#list request.contentObjects as content>
123+
* @param ${content.dataType?api.getVariableNameString()}<#if content?has_next>, </#if></#list> ${request.description! ""} <#if request.required == true>(required)</#if>
124+
</#list>
103125
</#if>
104-
* @return<#list operation.responseObjects as response><#if response.responseName != "default"> ${response.description}; (status code ${response.responseName})</#if></#list>
126+
* @return<#list operation.responseObjects as response><#if response.responseName != "default"> ${response.description!" "}; (status code ${response.responseName})</#if></#list>
105127
</#if>
106128
* @throws RestClientException if an error occurs while attempting to invoke the API
107129
*/
@@ -152,7 +174,6 @@ public class ${className?cap_first}Api {
152174
<#if operation.parameterObjects?has_content>
153175
<#list operation.parameterObjects as parameter>
154176
<#if parameter.in == "query">
155-
156177
queryParams.putAll(apiRestClient.parameterToMultiValueMap(<#if parameter.isCollection == true> ApiRestClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT))<#else> null</#if>, "${parameter.name}", ${parameter.name}));
157178
</#if>
158179
</#list>

0 commit comments

Comments
 (0)