Skip to content
GitLab
    • Explore Projects Groups Snippets
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • O openapi-generator
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,476
    • Issues 3,476
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 402
    • Merge requests 402
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • OpenAPI Tools
  • openapi-generator
  • Merge requests
  • !2670

Enable async option for spring-cloud library

  • Review changes

  • Download
  • Email patches
  • Plain diff
Merged Administrator requested to merge github/fork/Zomzog/2327 into master 6 years ago
  • Overview 0
  • Commits 2
  • Pipelines 0
  • Changes 23

Created by: Zomzog

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\.
  • Filed the PR against the correct branch: master, 3.4.x, 4.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language.

Description of the PR

Enable async option for spring-cloud library

Fix #2327 (closed)

@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03)

Compare
  • master (base)

and
  • latest version
    684427b9
    2 commits, 2 years ago

23 files
+ 1806
- 32

    Preferences

    File browser
    Compare changes
b‎in‎
spring-all-‎petstore.sh‎ +1 -0
spring-cloud-feign‎-async-petstore.sh‎ +35 -0
modules/openap‎i-generator/src‎
ma‎in‎
java/org/openapitoo‎ls/codegen/languages‎
SpringCod‎egen.java‎ +45 -28
resources/‎scala-finch‎
s‎bt‎ +0 -0
test/java/org/…/c‎odegen/java/spring‎
SpringCodeg‎enTest.java‎ +49 -4
samples/client/…/‎spring-cloud-async‎
.openapi-‎generator‎
VER‎SION‎ +1 -0
src/main/java/o‎rg/openapitools‎
a‎pi‎
PetAp‎i.java‎ +151 -0
PetApiCl‎ient.java‎ +8 -0
StoreA‎pi.java‎ +76 -0
StoreApiC‎lient.java‎ +8 -0
UserAp‎i.java‎ +106 -0
UserApiCl‎ient.java‎ +8 -0
config‎uration‎
ApiKeyRequestI‎nterceptor.java‎ +31 -0
ClientConfig‎uration.java‎ +49 -0
mo‎del‎
Catego‎ry.java‎ +105 -0
ModelApiRe‎sponse.java‎ +130 -0
Order‎.java‎ +241 -0
Pet.‎java‎ +262 -0
Tag.‎java‎ +105 -0
User‎.java‎ +255 -0
.openapi-gen‎erator-ignore‎ +23 -0
READ‎ME.md‎ +53 -0
pom‎.xml‎ +64 -0
bin/spring-all-petstore.sh
+ 1
- 0
  • View file @ 684427b9

  • Edit in single-file editor

  • Open in Web IDE


@@ -2,6 +2,7 @@
# Generate clients:
./bin/spring-cloud-feign-petstore.sh
./bin/spring-cloud-feign-async-petstore.sh
./bin/spring-stubs.sh
# Generate spring-mvc servers:
bin/spring-cloud-feign-async-petstore.sh 0 → 100755
+ 35
- 0
  • View file @ 684427b9

  • Edit in single-file editor

  • Open in Web IDE

#!/bin/sh
SCRIPT="$0"
echo "# START SCRIPT: $SCRIPT"
while [ -h "$SCRIPT" ] ; do
ls=`ls -ld "$SCRIPT"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
SCRIPT="$link"
else
SCRIPT=`dirname "$SCRIPT"`/"$link"
fi
done
if [ ! -d "${APP_DIR}" ]; then
APP_DIR=`dirname "$SCRIPT"`/..
APP_DIR=`cd "${APP_DIR}"; pwd`
fi
executable="./modules/openapi-generator-cli/target/openapi-generator-cli.jar"
if [ ! -f "$executable" ]
then
mvn -B clean package
fi
# if you've executed sbt assembly previously it will use that instead.
export JAVA_OPTS="${JAVA_OPTS} -Xmx1024M -DloggerPath=conf/log4j.properties"
ags="generate -t modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-cloud -i modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g spring -c bin/spring-cloud-feign-petstore.json -o samples/client/petstore/spring-cloud-async --additional-properties hideGenerationTimestamp=true,java8=true,async=true $@"
echo "Removing files and folders under samples/client/petstore/spring-cloud-async/src/main"
rm -rf samples/client/petstore/spring-cloud-async/src/main
find samples/client/petstore/spring-cloud-async -maxdepth 1 -type f ! -name "README.md" -exec rm {} +
java $JAVA_OPTS -jar $executable $ags
modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java
+ 45
- 28
  • View file @ 684427b9

  • Edit in single-file editor

  • Open in Web IDE


@@ -132,7 +132,7 @@ public class SpringCodegen extends AbstractJavaCodegen
cliOptions.add(CliOption.newBoolean(IMPLICIT_HEADERS, "Skip header parameters in the generated API methods using @ApiImplicitParams annotation.", implicitHeaders));
cliOptions.add(CliOption.newBoolean(OPENAPI_DOCKET_CONFIG, "Generate Spring OpenAPI Docket configuration class.", openapiDocketConfig));
cliOptions.add(CliOption.newBoolean(API_FIRST, "Generate the API from the OAI spec at server compile time (API first approach)", apiFirst));
cliOptions.add(CliOption.newBoolean(USE_OPTIONAL,"Use Optional container for optional parameters", useOptional));
cliOptions.add(CliOption.newBoolean(USE_OPTIONAL, "Use Optional container for optional parameters", useOptional));
cliOptions.add(CliOption.newBoolean(HATEOAS, "Use Spring HATEOAS library to allow adding HATEOAS links", hateoas));
cliOptions.add(CliOption.newBoolean(RETURN_SUCCESS_CODE, "Generated server returns 2xx code", returnSuccessCode));
cliOptions.add(CliOption.newBoolean(UNHANDLED_EXCEPTION_HANDLING, "Declare operation methods to throw a generic exception and allow unhandled exceptions (useful for Spring `@ControllerAdvice` directives).", unhandledException));
@@ -172,7 +172,7 @@ public class SpringCodegen extends AbstractJavaCodegen
@Override
public void processOpts() {
List<Pair<String,String>> configOptions = additionalProperties.entrySet().stream()
List<Pair<String, String>> configOptions = additionalProperties.entrySet().stream()
.filter(e -> !Arrays.asList(API_FIRST, "hideGenerationTimestamp").contains(e.getKey()))
.filter(e -> cliOptions.stream().map(CliOption::getOpt).anyMatch(opt -> opt.equals(e.getKey())))
.map(e -> Pair.of(e.getKey(), e.getValue().toString()))
@@ -220,7 +220,7 @@ public class SpringCodegen extends AbstractJavaCodegen
} else {
additionalProperties.put(BASE_PACKAGE, basePackage);
}
if (additionalProperties.containsKey(VIRTUAL_SERVICE)) {
this.setVirtualService(Boolean.valueOf(additionalProperties.get(VIRTUAL_SERVICE).toString()));
}
@@ -248,7 +248,7 @@ public class SpringCodegen extends AbstractJavaCodegen
}
if (additionalProperties.containsKey(REACTIVE)) {
if (!library.equals(SPRING_BOOT)) {
if (!SPRING_BOOT.equals(library)) {
throw new IllegalArgumentException("Currently, reactive option is only supported with Spring-boot");
}
this.setReactive(Boolean.valueOf(additionalProperties.get(REACTIVE).toString()));
@@ -287,7 +287,7 @@ public class SpringCodegen extends AbstractJavaCodegen
if (additionalProperties.containsKey(API_FIRST)) {
this.setApiFirst(Boolean.valueOf(additionalProperties.get(API_FIRST).toString()));
}
if (additionalProperties.containsKey(HATEOAS)) {
this.setHateoas(Boolean.valueOf(additionalProperties.get(HATEOAS).toString()));
}
@@ -398,12 +398,15 @@ public class SpringCodegen extends AbstractJavaCodegen
apiTemplateFiles.put("apiDelegate.mustache", "Delegate.java");
}
if (this.java8) {
additionalProperties.put("javaVersion", "1.8");
additionalProperties.put("jdk8-default-interface", !this.skipDefaultInterface);
if (!SPRING_CLOUD_LIBRARY.equals(library)) {
additionalProperties.put("jdk8", true);
if (SPRING_CLOUD_LIBRARY.equals(library)) {
additionalProperties.put("jdk8-default-interface", false);
} else {
additionalProperties.put("jdk8-default-interface", !this.skipDefaultInterface);
}
additionalProperties.put("jdk8", true);
if (this.async) {
additionalProperties.put(RESPONSE_WRAPPER, "CompletableFuture");
}
@@ -414,7 +417,8 @@ public class SpringCodegen extends AbstractJavaCodegen
additionalProperties.put(RESPONSE_WRAPPER, "Callable");
}
if(!this.apiFirst && !this.reactive) {
if (!this.apiFirst && !this.reactive) {
additionalProperties.put("useSpringfox", true);
}
@@ -458,7 +462,7 @@ public class SpringCodegen extends AbstractJavaCodegen
@Override
public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map<String, List<CodegenOperation>> operations) {
if((library.equals(SPRING_BOOT) || library.equals(SPRING_MVC_LIBRARY)) && !useTags) {
if ((library.equals(SPRING_BOOT) || library.equals(SPRING_MVC_LIBRARY)) && !useTags) {
String basePath = resourcePath;
if (basePath.startsWith("/")) {
basePath = basePath.substring(1);
@@ -490,7 +494,7 @@ public class SpringCodegen extends AbstractJavaCodegen
}
*/
if(!additionalProperties.containsKey(TITLE)) {
if (!additionalProperties.containsKey(TITLE)) {
// From the title, compute a reasonable name for the package and the API
String title = openAPI.getInfo().getTitle();
@@ -506,7 +510,7 @@ public class SpringCodegen extends AbstractJavaCodegen
additionalProperties.put(TITLE, this.title);
}
if(!additionalProperties.containsKey(SERVER_PORT)) {
if (!additionalProperties.containsKey(SERVER_PORT)) {
URL url = URLPathUtils.getServerURL(openAPI);
this.additionalProperties.put(SERVER_PORT, URLPathUtils.getPort(url, 8080));
}
@@ -578,7 +582,7 @@ public class SpringCodegen extends AbstractJavaCodegen
}
});
if(implicitHeaders){
if (implicitHeaders) {
removeHeadersFromAllParams(operation.allParams);
}
}
@@ -589,12 +593,12 @@ public class SpringCodegen extends AbstractJavaCodegen
private interface DataTypeAssigner {
void setReturnType(String returnType);
void setReturnContainer(String returnContainer);
}
/**
*
* @param returnType The return type that needs to be converted
* @param returnType The return type that needs to be converted
* @param dataTypeAssigner An object that will assign the data to the respective fields in the model.
*/
private void doDataTypeAssignment(String returnType, DataTypeAssigner dataTypeAssigner) {
@@ -625,29 +629,30 @@ public class SpringCodegen extends AbstractJavaCodegen
/**
* This method removes header parameters from the list of parameters and also
* corrects last allParams hasMore state.
*
* @param allParams list of all parameters
*/
private void removeHeadersFromAllParams(List<CodegenParameter> allParams) {
if(allParams.isEmpty()){
if (allParams.isEmpty()) {
return;
}
final ArrayList<CodegenParameter> copy = new ArrayList<>(allParams);
allParams.clear();
for(CodegenParameter p : copy){
if(!p.isHeaderParam){
for (CodegenParameter p : copy) {
if (!p.isHeaderParam) {
allParams.add(p);
}
}
if (!allParams.isEmpty()) {
allParams.get(allParams.size()-1).hasMore =false;
allParams.get(allParams.size() - 1).hasMore = false;
}
}
@Override
public Map<String, Object> postProcessSupportingFileData(Map<String, Object> objs) {
generateYAMLSpecFile(objs);
if(library.equals(SPRING_CLOUD_LIBRARY)) {
if (library.equals(SPRING_CLOUD_LIBRARY)) {
List<CodegenSecurity> authMethods = (List<CodegenSecurity>) objs.get("authMethods");
if (authMethods != null) {
for (CodegenSecurity authMethod : authMethods) {
@@ -717,9 +722,13 @@ public class SpringCodegen extends AbstractJavaCodegen
return this.basePackage;
}
public void setInterfaceOnly(boolean interfaceOnly) { this.interfaceOnly = interfaceOnly; }
public void setInterfaceOnly(boolean interfaceOnly) {
this.interfaceOnly = interfaceOnly;
}
public void setDelegatePattern(boolean delegatePattern) { this.delegatePattern = delegatePattern; }
public void setDelegatePattern(boolean delegatePattern) {
this.delegatePattern = delegatePattern;
}
public void setSingleContentTypes(boolean singleContentTypes) {
this.singleContentTypes = singleContentTypes;
@@ -729,13 +738,21 @@ public class SpringCodegen extends AbstractJavaCodegen
public void setJava8(boolean java8) { this.java8 = java8; }
public void setVirtualService(boolean virtualService) { this.virtualService = virtualService; }
public void setVirtualService(boolean virtualService) {
this.virtualService = virtualService;
}
public void setAsync(boolean async) { this.async = async; }
public void setAsync(boolean async) {
this.async = async;
}
public void setReactive(boolean reactive) { this.reactive = reactive; }
public void setReactive(boolean reactive) {
this.reactive = reactive;
}
public void setResponseWrapper(String responseWrapper) { this.responseWrapper = responseWrapper; }
public void setResponseWrapper(String responseWrapper) {
this.responseWrapper = responseWrapper;
}
public void setUseTags(boolean useTags) {
this.useTags = useTags;
@@ -752,7 +769,7 @@ public class SpringCodegen extends AbstractJavaCodegen
public void setApiFirst(boolean apiFirst) {
this.apiFirst = apiFirst;
}
public void setHateoas(boolean hateoas) {
this.hateoas = hateoas;
}
@@ -793,7 +810,7 @@ public class SpringCodegen extends AbstractJavaCodegen
objs = super.postProcessModelsEnum(objs);
//Add imports for Jackson
List<Map<String, String>> imports = (List<Map<String, String>>)objs.get("imports");
List<Map<String, String>> imports = (List<Map<String, String>>) objs.get("imports");
List<Object> models = (List<Object>) objs.get("models");
for (Object _mo : models) {
Map<String, Object> mo = (Map<String, Object>) _mo;
modules/openapi-generator/src/main/resources/scala-finch/sbt 100644 → 100755
+ 0
- 0
  • View file @ 684427b9

  • Edit in single-file editor

  • Open in Web IDE

File mode changed from 100644 to 100755
modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java
+ 49
- 4
  • View file @ 684427b9

  • Edit in single-file editor

  • Open in Web IDE


@@ -41,6 +41,9 @@ import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.openapitools.codegen.languages.SpringCodegen.RESPONSE_WRAPPER;
import static org.testng.Assert.assertTrue;
public class SpringCodegenTest {
@Test
@@ -103,10 +106,10 @@ public class SpringCodegenTest {
codegen.additionalProperties().put(CodegenConstants.HIDE_GENERATION_TIMESTAMP, "true");
codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "xyz.yyyyy.mmmmm.model");
codegen.additionalProperties().put(CodegenConstants.API_PACKAGE, "xyz.yyyyy.aaaaa.api");
codegen.additionalProperties().put(CodegenConstants.INVOKER_PACKAGE,"xyz.yyyyy.iiii.invoker");
codegen.additionalProperties().put(SpringCodegen.BASE_PACKAGE,"xyz.yyyyy.bbbb.base");
codegen.additionalProperties().put(SpringCodegen.CONFIG_PACKAGE,"xyz.yyyyy.cccc.config");
codegen.additionalProperties().put(SpringCodegen.SERVER_PORT,"8088");
codegen.additionalProperties().put(CodegenConstants.INVOKER_PACKAGE, "xyz.yyyyy.iiii.invoker");
codegen.additionalProperties().put(SpringCodegen.BASE_PACKAGE, "xyz.yyyyy.bbbb.base");
codegen.additionalProperties().put(SpringCodegen.CONFIG_PACKAGE, "xyz.yyyyy.cccc.config");
codegen.additionalProperties().put(SpringCodegen.SERVER_PORT, "8088");
codegen.processOpts();
OpenAPI openAPI = new OpenAPI();
@@ -179,4 +182,46 @@ public class SpringCodegenTest {
.collect(groupingBy(CliOption::getOpt))
.forEach((k,v) -> assertEquals(v.size(), 1, k + " is described multiple times"));
}
@Test
public void springcloudWithJava8DisabeJdk8() {
final SpringCodegen codegen = new SpringCodegen();
codegen.additionalProperties().put(SpringCodegen.JAVA_8, true);
codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-cloud");
codegen.processOpts();
Assert.assertEquals(codegen.additionalProperties().get("jdk8-default-interface"), false);
}
@Test
public void springcloudWithAsyncHasResponseWrapperCallable() {
final SpringCodegen codegen = new SpringCodegen();
codegen.additionalProperties().put(SpringCodegen.JAVA_8, false);
codegen.additionalProperties().put(SpringCodegen.ASYNC, true);
codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-cloud");
codegen.processOpts();
Assert.assertNull(codegen.additionalProperties().get("jdk8-default-interface"));
Assert.assertEquals(codegen.additionalProperties().get(RESPONSE_WRAPPER), "Callable");
}
@Test
public void springcloudWithAsyncAndJava8HasResponseWrapperCompletableFuture() {
final SpringCodegen codegen = new SpringCodegen();
codegen.additionalProperties().put(SpringCodegen.JAVA_8, true);
codegen.additionalProperties().put(SpringCodegen.ASYNC, true);
codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-cloud");
codegen.processOpts();
Assert.assertEquals(codegen.additionalProperties().get("jdk8-default-interface"), false);
Assert.assertEquals(codegen.additionalProperties().get(RESPONSE_WRAPPER), "CompletableFuture");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void reactiveRequiredSpringBoot() {
final SpringCodegen codegen = new SpringCodegen();
codegen.additionalProperties().put(SpringCodegen.REACTIVE, true);
codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-cloud");
codegen.processOpts();
}
}
0 Assignees
None
Assign to
Reviewer
Jim Schubert's avatar
Jim Schubert
Request review from
Labels
2
Client: Java Issue: Bug
2
Client: Java Issue: Bug
    Assign labels
  • Manage project labels

Milestone
6.2.1
6.2.1 (expired)
None
Time tracking
No estimate or time spent
Lock merge request
Unlocked
0
0 participants
Reference: OpenAPITools/openapi-generator!13630
Source branch: github/fork/Zomzog/2327

Menu

Explore Projects Groups Snippets