Skip to content

Commit 860b551

Browse files
committed
Merge pull request #1376 from xhh/java-util-model-package
[Java] Add a config option to use fully qualified name for java.util classes
2 parents 22218cb + a94384c commit 860b551

File tree

22 files changed

+212
-229
lines changed

22 files changed

+212
-229
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
10441044
}
10451045
}
10461046
for (String i : imports) {
1047-
if (!defaultIncludes.contains(i) && !languageSpecificPrimitives.contains(i)) {
1047+
if (needToImport(i)) {
10481048
op.imports.add(i);
10491049
}
10501050
}
@@ -1317,6 +1317,12 @@ public List<CodegenSecurity> fromSecurity(Map<String, SecuritySchemeDefinition>
13171317
return secs;
13181318
}
13191319

1320+
protected boolean needToImport(String type) {
1321+
return !defaultIncludes.contains(type)
1322+
&& !languageSpecificPrimitives.contains(type)
1323+
&& type.indexOf(".") < 0;
1324+
}
1325+
13201326
protected List<Map<String, Object>> toExamples(Map<String, Object> examples) {
13211327
if (examples == null) {
13221328
return null;
@@ -1420,7 +1426,7 @@ public static String underscore(String word) {
14201426
}
14211427

14221428
private void addImport(CodegenModel m, String type) {
1423-
if (type != null && !languageSpecificPrimitives.contains(type) && !defaultIncludes.contains(type)) {
1429+
if (type != null && needToImport(type)) {
14241430
m.imports.add(type);
14251431
}
14261432
}
@@ -1599,8 +1605,8 @@ protected CliOption buildLibraryCliOption(Map<String, String> supportedLibraries
15991605
* @return sanitized string
16001606
*/
16011607
public String sanitizeName(String name) {
1602-
// NOTE: performance wise, we should have written with 2 replaceAll to replace desired
1603-
// character with _ or empty character. Below aims to spell out different cases we've
1608+
// NOTE: performance wise, we should have written with 2 replaceAll to replace desired
1609+
// character with _ or empty character. Below aims to spell out different cases we've
16041610
// encountered so far and hopefully make it easier for others to add more special
16051611
// cases in the future.
16061612

@@ -1623,7 +1629,7 @@ public String sanitizeName(String name) {
16231629

16241630
// input name and age => input_name_and_age
16251631
name = name.replaceAll(" ", "_");
1626-
1632+
16271633
// remove everything else other than word, number and _
16281634
// $php_variable => php_variable
16291635
return name.replaceAll("[^a-zA-Z0-9_]", "");

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig {
3737
protected String artifactVersion = "1.0.0";
3838
protected String sourceFolder = "src/main/java";
3939
protected String localVariablePrefix = "";
40+
protected boolean fullJavaUtil = false;
41+
protected String javaUtilPrefix = "";
4042
protected Boolean serializableModel = false;
4143

4244
public JavaClientCodegen() {
@@ -81,6 +83,7 @@ public JavaClientCodegen() {
8183
cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC));
8284
cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC));
8385
cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC));
86+
cliOptions.add(new CliOption("fullJavaUtil", "whether to use fully qualified name for classes under java.util (default to false)"));
8487

8588
supportedLibraries.put("<default>", "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2");
8689
supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.6");
@@ -107,7 +110,7 @@ public String getHelp() {
107110
@Override
108111
public void processOpts() {
109112
super.processOpts();
110-
113+
111114
if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) {
112115
this.setInvokerPackage((String) additionalProperties.get(CodegenConstants.INVOKER_PACKAGE));
113116
} else {
@@ -152,6 +155,32 @@ public void processOpts() {
152155
// need to put back serializableModel (boolean) into additionalProperties as value in additionalProperties is string
153156
additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, serializableModel);
154157

158+
if (additionalProperties.containsKey("fullJavaUtil")) {
159+
fullJavaUtil = Boolean.valueOf(additionalProperties.get("fullJavaUtil").toString());
160+
}
161+
if (fullJavaUtil) {
162+
javaUtilPrefix = "java.util.";
163+
}
164+
additionalProperties.put("fullJavaUtil", fullJavaUtil);
165+
additionalProperties.put("javaUtilPrefix", javaUtilPrefix);
166+
167+
if (fullJavaUtil) {
168+
typeMapping.put("array", "java.util.List");
169+
typeMapping.put("map", "java.util.Map");
170+
typeMapping.put("DateTime", "java.util.Date");
171+
typeMapping.remove("List");
172+
importMapping.remove("Date");
173+
importMapping.remove("Map");
174+
importMapping.remove("HashMap");
175+
importMapping.remove("Array");
176+
importMapping.remove("ArrayList");
177+
importMapping.remove("List");
178+
importMapping.remove("Set");
179+
importMapping.remove("DateTime");
180+
instantiationTypes.put("array", "java.util.ArrayList");
181+
instantiationTypes.put("map", "java.util.HashMap");
182+
}
183+
155184
this.sanitizeConfig();
156185

157186
final String invokerFolder = (sourceFolder + File.separator + invokerPackage).replace(".", File.separator);
@@ -161,7 +190,7 @@ public void processOpts() {
161190
supportingFiles.add(new SupportingFile("gradle.properties.mustache", "", "gradle.properties"));
162191
supportingFiles.add(new SupportingFile("ApiClient.mustache", invokerFolder, "ApiClient.java"));
163192
supportingFiles.add(new SupportingFile("StringUtil.mustache", invokerFolder, "StringUtil.java"));
164-
193+
165194
final String authFolder = (sourceFolder + File.separator + invokerPackage + ".auth").replace(".", File.separator);
166195
supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.mustache", authFolder, "HttpBasicAuth.java"));
167196
supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.mustache", authFolder, "ApiKeyAuth.java"));
@@ -175,7 +204,7 @@ public void processOpts() {
175204
supportingFiles.add(new SupportingFile("Pair.mustache", invokerFolder, "Pair.java"));
176205
supportingFiles.add(new SupportingFile("auth/Authentication.mustache", authFolder, "Authentication.java"));
177206
}
178-
207+
179208
// library-specific files
180209
if ("okhttp-gson".equals(getLibrary())) {
181210
// the "okhttp-gson" library template requires "ApiCallback.mustache" for async call
@@ -190,25 +219,25 @@ public void processOpts() {
190219
}
191220

192221
private void sanitizeConfig() {
193-
// Sanitize any config options here. We also have to update the additionalProperties because
222+
// Sanitize any config options here. We also have to update the additionalProperties because
194223
// the whole additionalProperties object is injected into the main object passed to the mustache layer
195-
224+
196225
this.setApiPackage(sanitizePackageName(apiPackage));
197226
if (additionalProperties.containsKey(CodegenConstants.API_PACKAGE)) {
198227
this.additionalProperties.put(CodegenConstants.API_PACKAGE, apiPackage);
199228
}
200-
229+
201230
this.setModelPackage(sanitizePackageName(modelPackage));
202231
if (additionalProperties.containsKey(CodegenConstants.MODEL_PACKAGE)) {
203232
this.additionalProperties.put(CodegenConstants.MODEL_PACKAGE, modelPackage);
204233
}
205-
234+
206235
this.setInvokerPackage(sanitizePackageName(invokerPackage));
207236
if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) {
208237
this.additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage);
209238
}
210239
}
211-
240+
212241
@Override
213242
public String escapeReservedWord(String name) {
214243
return "_" + name;
@@ -295,10 +324,22 @@ public String getTypeDeclaration(Property p) {
295324
public String toDefaultValue(Property p) {
296325
if (p instanceof ArrayProperty) {
297326
final ArrayProperty ap = (ArrayProperty) p;
298-
return String.format("new ArrayList<%s>()", getTypeDeclaration(ap.getItems()));
327+
final String pattern;
328+
if (fullJavaUtil) {
329+
pattern = "new java.util.ArrayList<%s>()";
330+
} else {
331+
pattern = "new ArrayList<%s>()";
332+
}
333+
return String.format(pattern, getTypeDeclaration(ap.getItems()));
299334
} else if (p instanceof MapProperty) {
300335
final MapProperty ap = (MapProperty) p;
301-
return String.format("new HashMap<String, %s>()", getTypeDeclaration(ap.getAdditionalProperties()));
336+
final String pattern;
337+
if (fullJavaUtil) {
338+
pattern = "new java.util.HashMap<String, %s>()";
339+
} else {
340+
pattern = "new HashMap<String, %s>()";
341+
}
342+
return String.format(pattern, getTypeDeclaration(ap.getAdditionalProperties()));
302343
}
303344
return super.toDefaultValue(p);
304345
}
@@ -309,7 +350,7 @@ public String getSwaggerType(Property p) {
309350
String type = null;
310351
if (typeMapping.containsKey(swaggerType)) {
311352
type = typeMapping.get(swaggerType);
312-
if (languageSpecificPrimitives.contains(type)) {
353+
if (languageSpecificPrimitives.contains(type) || type.indexOf(".") >= 0) {
313354
return type;
314355
}
315356
} else {
@@ -395,7 +436,7 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {
395436
}
396437
return objs;
397438
}
398-
439+
399440
public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
400441
if("retrofit".equals(getLibrary())) {
401442
Map<String, Object> operations = (Map<String, Object>) objs.get("operations");
@@ -419,6 +460,10 @@ public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
419460
return objs;
420461
}
421462

463+
protected boolean needToImport(String type) {
464+
return super.needToImport(type) && type.indexOf(".") < 0;
465+
}
466+
422467
private String findCommonPrefixOfVars(List<String> vars) {
423468
String prefix = StringUtils.getCommonPrefix(vars.toArray(new String[vars.size()]));
424469
// exclude trailing characters that should be part of a valid variable

modules/swagger-codegen/src/main/resources/Java/api.mustache

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,12 @@ import {{invokerPackage}}.Configuration;
66
import {{invokerPackage}}.Pair;
77
import {{invokerPackage}}.TypeRef;
88

9-
import {{modelPackage}}.*;
10-
11-
import java.util.*;
12-
139
{{#imports}}import {{import}};
1410
{{/imports}}
1511

16-
import java.io.File;
17-
import java.util.Map;
18-
import java.util.HashMap;
12+
{{^fullJavaUtil}}
13+
import java.util.*;
14+
{{/fullJavaUtil}}
1915

2016
{{>generatedAnnotation}}
2117
{{#operations}}
@@ -59,9 +55,9 @@ public class {{classname}} {
5955
.replaceAll("\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}};
6056

6157
// query params
62-
List<Pair> {{localVariablePrefix}}queryParams = new ArrayList<Pair>();
63-
Map<String, String> {{localVariablePrefix}}headerParams = new HashMap<String, String>();
64-
Map<String, Object> {{localVariablePrefix}}formParams = new HashMap<String, Object>();
58+
{{javaUtilPrefix}}List<Pair> {{localVariablePrefix}}queryParams = new {{javaUtilPrefix}}ArrayList<Pair>();
59+
{{javaUtilPrefix}}Map<String, String> {{localVariablePrefix}}headerParams = new {{javaUtilPrefix}}HashMap<String, String>();
60+
{{javaUtilPrefix}}Map<String, Object> {{localVariablePrefix}}formParams = new {{javaUtilPrefix}}HashMap<String, Object>();
6561

6662
{{#queryParams}}
6763
{{localVariablePrefix}}queryParams.addAll({{localVariablePrefix}}apiClient.parameterToPairs("{{#collectionFormat}}{{{collectionFormat}}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));

modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/api.mustache

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,12 @@ import {{invokerPackage}}.Configuration;
66
import {{invokerPackage}}.Pair;
77
import {{invokerPackage}}.TypeRef;
88

9-
import {{modelPackage}}.*;
10-
11-
import java.util.*;
12-
139
{{#imports}}import {{import}};
1410
{{/imports}}
1511

16-
import java.io.File;
17-
import java.util.Map;
18-
import java.util.HashMap;
12+
{{^fullJavaUtil}}
13+
import java.util.*;
14+
{{/fullJavaUtil}}
1915

2016
{{>generatedAnnotation}}
2117
{{#operations}}
@@ -58,9 +54,9 @@ public class {{classname}} {
5854
.replaceAll("\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}};
5955

6056
// query params
61-
List<Pair> {{localVariablePrefix}}queryParams = new ArrayList<Pair>();
62-
Map<String, String> {{localVariablePrefix}}headerParams = new HashMap<String, String>();
63-
Map<String, Object> {{localVariablePrefix}}formParams = new HashMap<String, Object>();
57+
{{javaUtilPrefix}}List<Pair> {{localVariablePrefix}}queryParams = new {{javaUtilPrefix}}ArrayList<Pair>();
58+
{{javaUtilPrefix}}Map<String, String> {{localVariablePrefix}}headerParams = new {{javaUtilPrefix}}HashMap<String, String>();
59+
{{javaUtilPrefix}}Map<String, Object> {{localVariablePrefix}}formParams = new {{javaUtilPrefix}}HashMap<String, Object>();
6460

6561
{{#queryParams}}
6662
{{localVariablePrefix}}queryParams.addAll({{localVariablePrefix}}apiClient.parameterToPairs("{{#collectionFormat}}{{{collectionFormat}}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));

modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,17 @@ import {{invokerPackage}}.ApiException;
66
import {{invokerPackage}}.Configuration;
77
import {{invokerPackage}}.Pair;
88

9-
import {{modelPackage}}.*;
10-
119
import com.google.gson.reflect.TypeToken;
1210

1311
import com.squareup.okhttp.Call;
1412

15-
import java.lang.reflect.Type;
16-
17-
import java.util.*;
18-
1913
{{#imports}}import {{import}};
2014
{{/imports}}
2115

22-
import java.io.File;
23-
import java.util.Map;
24-
import java.util.HashMap;
16+
import java.lang.reflect.Type;
17+
{{^fullJavaUtil}}
18+
import java.util.*;
19+
{{/fullJavaUtil}}
2520

2621
{{#operations}}
2722
public class {{classname}} {
@@ -58,15 +53,15 @@ public class {{classname}} {
5853
String {{localVariablePrefix}}path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}}
5954
.replaceAll("\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}};
6055

61-
List<Pair> {{localVariablePrefix}}queryParams = new ArrayList<Pair>();{{#queryParams}}
56+
{{javaUtilPrefix}}List<Pair> {{localVariablePrefix}}queryParams = new {{javaUtilPrefix}}ArrayList<Pair>();{{#queryParams}}
6257
if ({{paramName}} != null)
6358
{{localVariablePrefix}}queryParams.addAll({{localVariablePrefix}}apiClient.parameterToPairs("{{#collectionFormat}}{{{collectionFormat}}}{{/collectionFormat}}", "{{baseName}}", {{paramName}}));{{/queryParams}}
6459

65-
Map<String, String> {{localVariablePrefix}}headerParams = new HashMap<String, String>();{{#headerParams}}
60+
{{javaUtilPrefix}}Map<String, String> {{localVariablePrefix}}headerParams = new {{javaUtilPrefix}}HashMap<String, String>();{{#headerParams}}
6661
if ({{paramName}} != null)
6762
{{localVariablePrefix}}headerParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}}));{{/headerParams}}
6863

69-
Map<String, Object> {{localVariablePrefix}}formParams = new HashMap<String, Object>();{{#formParams}}
64+
{{javaUtilPrefix}}Map<String, Object> {{localVariablePrefix}}formParams = new {{javaUtilPrefix}}HashMap<String, Object>();{{#formParams}}
7065
if ({{paramName}} != null)
7166
{{localVariablePrefix}}formParams.put("{{baseName}}", {{paramName}});{{/formParams}}
7267

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package {{package}};
22

3-
import {{modelPackage}}.*;
4-
53
import retrofit.Callback;
64
import retrofit.http.*;
75
import retrofit.mime.*;
8-
import java.util.*;
96

107
{{#imports}}import {{import}};
118
{{/imports}}
129

10+
{{^fullJavaUtil}}
11+
import java.util.*;
12+
{{/fullJavaUtil}}
13+
1314
{{#operations}}
1415
public interface {{classname}} {
1516
{{#operation}}
@@ -22,7 +23,7 @@ public interface {{classname}} {
2223
*/
2324
{{#formParams}}{{#-first}}
2425
{{#isMultipart}}@Multipart{{/isMultipart}}{{^isMultipart}}@FormUrlEncoded{{/isMultipart}}{{/-first}}{{/formParams}}
25-
@{{httpMethod}}("{{path}}")
26+
@{{httpMethod}}("{{path}}")
2627
{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}} {{nickname}}({{^allParams}});{{/allParams}}
2728
{{#allParams}}{{>libraries/retrofit/queryParams}}{{>libraries/retrofit/pathParams}}{{>libraries/retrofit/headerParams}}{{>libraries/retrofit/bodyParams}}{{>libraries/retrofit/formParams}}{{#hasMore}}, {{/hasMore}}{{^hasMore}}
2829
);{{/hasMore}}{{/allParams}}
@@ -31,15 +32,15 @@ public interface {{classname}} {
3132
* {{summary}}
3233
* Async method
3334
{{#allParams}} * @param {{paramName}} {{description}}
34-
{{/allParams}} * @param cb callback method
35+
{{/allParams}} * @param cb callback method
3536
* @return void
3637
*/
3738
{{#formParams}}{{#-first}}
3839
{{#isMultipart}}@Multipart{{/isMultipart}}{{^isMultipart}}@FormUrlEncoded{{/isMultipart}}{{/-first}}{{/formParams}}
39-
@{{httpMethod}}("{{path}}")
40+
@{{httpMethod}}("{{path}}")
4041
void {{nickname}}(
4142
{{#allParams}}{{>libraries/retrofit/queryParams}}{{>libraries/retrofit/pathParams}}{{>libraries/retrofit/headerParams}}{{>libraries/retrofit/bodyParams}}{{>libraries/retrofit/formParams}}, {{/allParams}}Callback<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}> cb
42-
);
43+
);
4344
{{/operation}}
4445
}
45-
{{/operations}}
46+
{{/operations}}

0 commit comments

Comments
 (0)