You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ch...@apache.org on 2019/11/13 08:20:04 UTC

[servicecomb-toolkit] branch master updated (58f2962 -> 3743b86)

This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git.


    from 58f2962  SCB-1570 Translate javadocs of oas-validator Fix gramma errors
     new dc85d20  add oas-generator to generate openapi v3
     new 0afd957  add oas-generator-jaxrs to support parse jaxrs code
     new fdbdafb  add oas-generator-spring to support parse spring code
     new 9916d8c  add oas-generator-servicecomb to support parse servicecomb code
     new b0d8b88  switch to oas-generator
     new 55ef5ce  add unit test
     new 04b8573  fix some bug
     new 9611763  add new processor
     new e5c71a3  reduce test log
     new 3743b86  add unit test

The 10 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 cli/pom.xml                                        |   2 +-
 .../src/test/resources/log4j2-test.xml             |  10 +-
 codegen/pom.xml                                    |  29 ++
 .../src/test/resources/log4j2-test.xml             |  10 +-
 common/pom.xml                                     |  30 --
 contractgen/pom.xml                                |  15 +
 .../contractgen/DefaultContractsGenerator.java     |  25 +-
 .../src/test/resources/log4j2-test.xml             |   2 +-
 .../docgen/ContractsSwaggerUIGenerator.java        |   8 +-
 .../docgen/ContractsSwaggerUIGeneratorTest.java    |  11 +-
 .../oas-generator-core}/pom.xml                    |  51 +--
 .../toolkit/generator/HttpStatuses.java            |   9 +-
 .../servicecomb/toolkit/generator/MediaTypes.java  |  54 +++
 .../generator/annotation/AnnotationProcessor.java  |   7 +-
 .../ApiResponseMethodAnnotationProcessor.java      |  63 +++
 .../ApiResponsesMethodAnnotationProcessor.java     |  29 +-
 .../annotation/ClassAnnotationProcessor.java       |   6 +-
 .../annotation/MethodAnnotationProcessor.java      |   6 +-
 .../generator/annotation/ModelInterceptor.java     |   9 +-
 .../OpenApiDefinitionClassAnnotationProcessor.java |  81 ++++
 .../OperationMethodAnnotationProcessor.java        |  57 +++
 .../annotation/ParamAnnotationProcessor.java       |   6 +-
 .../annotation/ParameterAnnotationProcessor.java   |  84 ++++
 .../RequestBodyParamAnnotationProcessor.java       |  57 +++
 .../toolkit/generator/context/Context.java         |  13 +-
 .../generator/context/IExtensionsContext.java      |  10 +-
 .../toolkit/generator/context/ISchemaContext.java  |  10 +-
 .../toolkit/generator/context/OasContext.java      | 165 ++++++++
 .../toolkit/generator/context/OasGenerator.java    |  65 ++++
 .../generator/context/OperationContext.java        | 309 +++++++++++++++
 .../generator/context/ParameterContext.java        | 379 ++++++++++++++++++
 .../generator/parser/AbstractAnnotationParser.java | 157 ++++++++
 .../parser/api/OpenApiAnnotationParser.java        |  57 +++
 .../generator/util/ArrayModelConverter.java        |  55 +++
 .../generator/util/LocalVariableVisitor.java       |  68 ++++
 .../toolkit/generator/util/ModelConverter.java     | 146 +++++++
 .../toolkit/generator/util/ParamUtils.java         | 122 ++++++
 .../generator/util/SwaggerAnnotationUtils.java     |  98 +++++
 .../toolkit/generator/AnnotationProcessorTest.java | 423 +++++++++++++++++++++
 .../servicecomb/toolkit/generator/ContextTest.java | 142 +++++++
 .../toolkit/generator/OasGeneratorTest.java        |  94 +++++
 .../servicecomb/toolkit/generator/ParserTest.java  |  45 ++-
 .../servicecomb/toolkit/generator/UtilsTest.java   | 102 +++++
 .../oas-generator-jaxrs}/pom.xml                   |  45 +--
 .../annotation/ConsumesAnnotationProcessor.java    |  25 +-
 .../annotation/CookieParamAnnotationProcessor.java |  14 +-
 .../annotation/FormParamAnnotationProcessor.java   |  19 +-
 .../annotation/HeaderParamAnnotationProcessor.java |  21 +-
 .../annotation/HttpMethodAnnotationProcessor.java  |  19 +-
 .../annotation/PathClassAnnotationProcessor.java   |  25 +-
 .../annotation/PathMethodAnnotationProcessor.java  |  25 +-
 .../annotation/PathParamAnnotationProcessor.java   |  20 +-
 .../annotation/QueryParamAnnotationProcessor.java  |  20 +-
 .../generator/parser/JaxRsAnnotationParser.java    |  94 +++++
 ...it.generator.parser.api.OpenApiAnnotationParser |   2 +-
 .../generator/JaxrsAnnotationProcessorTest.java    | 189 +++++++++
 .../toolkit/generator/JaxrsParserTest.java         |  59 +++
 .../oas-generator-servicecomb}/pom.xml             |  50 +--
 .../generator/parser/ServicecombJaxrsParser.java   |  18 +-
 .../generator/parser/ServicecombPojoParser.java    |  74 ++++
 .../parser/ServicecombSpringmvcParser.java         |  25 +-
 ...it.generator.parser.api.OpenApiAnnotationParser |   5 +-
 .../toolkit/generator/ServiceCombParserTest.java   |  85 +++++
 .../oas-generator-spring}/pom.xml                  |  32 +-
 .../generator/MultipartFileInterceptor.java        |  34 +-
 ...stractHttpMethodMappingAnnotationProcessor.java |  84 ++++
 .../DeleteMappingMethodAnnotationProcessor.java    |  24 +-
 .../GetMappingMethodAnnotationProcessor.java       |  20 +-
 .../PathVariableAnnotationProcessor.java           |  39 ++
 .../PostMappingMethodAnnotationProcessor.java      |  72 ++--
 .../PutMappingMethodAnnotationProcessor.java       |  18 +-
 .../annotation/RequestBodyAnnotationProcessor.java |  20 +-
 .../RequestHeaderAnnotationProcessor.java          |  46 +++
 .../RequestMappingClassAnnotationProcessor.java    |  43 +--
 .../RequestMappingMethodAnnotationProcessor.java   |  43 +--
 .../RequestParamAnnotationProcessor.java           |  46 +++
 .../annotation/RequestPartAnnotationProcessor.java |  24 +-
 .../parser/SpringmvcAnnotationParser.java          |  91 +++++
 ...b.toolkit.generator.annotation.ModelInterceptor |   2 +-
 ...it.generator.parser.api.OpenApiAnnotationParser |   2 +-
 .../generator/SpringAnnotationProcessorTest.java   | 228 +++++++++++
 .../toolkit/generator/SpringParserTest.java        |  36 +-
 oas-generator/pom.xml                              | 132 +++++++
 pom.xml                                            |  24 ++
 .../toolkit/goodbye/GoodbyeController.java         |   6 +-
 toolkit-distribution/src/release/LICENSE           |   9 +
 .../servicecomb/toolkit/plugin/GenerateUtil.java   |  17 +-
 .../toolkit/plugin/InvokeStaticMethodTest.java     |   2 +
 .../src/test/resources/log4j2-test.xml             |  10 +-
 89 files changed, 4514 insertions(+), 545 deletions(-)
 copy oas-validator/oas-validator-compatibility-spring/src/test/resources/logback-test.xml => cli/src/test/resources/log4j2-test.xml (82%)
 mode change 100644 => 100755
 copy oas-validator/oas-validator-compatibility-spring/src/test/resources/logback-test.xml => codegen/src/test/resources/log4j2-test.xml (82%)
 mode change 100644 => 100755
 copy cli/src/main/resources/log4j2.xml => contractgen/src/test/resources/log4j2-test.xml (93%)
 copy {contractgen => oas-generator/oas-generator-core}/pom.xml (61%)
 copy common/src/main/java/org/apache/servicecomb/toolkit/common/SourceType.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatuses.java (87%)
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypes.java
 copy common/src/main/java/org/apache/servicecomb/toolkit/common/SourceType.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AnnotationProcessor.java (81%)
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponseMethodAnnotationProcessor.java
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/ShowBasePathLambda.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponsesMethodAnnotationProcessor.java (51%)
 mode change 100755 => 100644
 copy common/src/main/java/org/apache/servicecomb/toolkit/common/SourceType.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ClassAnnotationProcessor.java (82%)
 copy common/src/main/java/org/apache/servicecomb/toolkit/common/SourceType.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/MethodAnnotationProcessor.java (82%)
 copy oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/diffvalidation/api/SchemaDiffValidator.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ModelInterceptor.java (80%)
 mode change 100755 => 100644
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OpenApiDefinitionClassAnnotationProcessor.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OperationMethodAnnotationProcessor.java
 copy common/src/main/java/org/apache/servicecomb/toolkit/common/SourceType.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParamAnnotationProcessor.java (80%)
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParameterAnnotationProcessor.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyParamAnnotationProcessor.java
 copy core/src/main/java/org/apache/servicecomb/toolkit/Generator.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/Context.java (79%)
 mode change 100755 => 100644
 copy core/src/main/java/org/apache/servicecomb/toolkit/Generator.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/IExtensionsContext.java (80%)
 mode change 100755 => 100644
 copy oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/diffvalidation/api/SchemaDiffValidator.java => oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ISchemaContext.java (82%)
 mode change 100755 => 100644
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OasContext.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OasGenerator.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OperationContext.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ParameterContext.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/AbstractAnnotationParser.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/api/OpenApiAnnotationParser.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ArrayModelConverter.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/LocalVariableVisitor.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ParamUtils.java
 create mode 100644 oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/SwaggerAnnotationUtils.java
 create mode 100644 oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java
 create mode 100644 oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ContextTest.java
 create mode 100644 oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/OasGeneratorTest.java
 copy oas-validator/oas-validator-compatibility/src/test/java/org/apache/servicecomb/toolkit/oasv/compatibility/CompatibilityCheckParserTest.java => oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ParserTest.java (51%)
 create mode 100644 oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
 copy {core => oas-generator/oas-generator-jaxrs}/pom.xml (67%)
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/ServiceType.java => oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ConsumesAnnotationProcessor.java (66%)
 copy oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/diffvalidation/factory/PathItemDiffValidatorFactory.java => oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/CookieParamAnnotationProcessor.java (61%)
 mode change 100755 => 100644
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/AbstractProviderDirectoryStrategy.java => oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/FormParamAnnotationProcessor.java (61%)
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/AbstractProviderDirectoryStrategy.java => oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HeaderParamAnnotationProcessor.java (60%)
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/AbstractProviderDirectoryStrategy.java => oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HttpMethodAnnotationProcessor.java (60%)
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/ServiceType.java => oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java (69%)
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/ServiceType.java => oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathMethodAnnotationProcessor.java (68%)
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/AbstractProviderDirectoryStrategy.java => oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathParamAnnotationProcessor.java (62%)
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/AbstractProviderDirectoryStrategy.java => oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/QueryParamAnnotationProcessor.java (60%)
 create mode 100644 oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/parser/JaxRsAnnotationParser.java
 copy contractgen/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.ContractsGenerator => oas-generator/oas-generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser (91%)
 create mode 100644 oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsAnnotationProcessorTest.java
 create mode 100644 oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java
 copy {core => oas-generator/oas-generator-servicecomb}/pom.xml (62%)
 copy toolkit-maven-plugin/src/main/java/org/apache/servicecomb/toolkit/plugin/MavenPluginUtil.java => oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombJaxrsParser.java (66%)
 create mode 100644 oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java
 copy oas-validator/oas-validator-web/src/main/java/org/apache/servicecomb/toolkit/oasv/web/page/controller/EditorController.java => oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombSpringmvcParser.java (68%)
 mode change 100755 => 100644
 copy codegen/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig => oas-generator/oas-generator-servicecomb/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser (78%)
 create mode 100644 oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java
 copy {integration-tests => oas-generator/oas-generator-spring}/pom.xml (71%)
 copy oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/diffvalidation/api/SchemaAddValidator.java => oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/MultipartFileInterceptor.java (56%)
 mode change 100755 => 100644
 create mode 100644 oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
 copy oas-validator/oas-validator-compatibility/src/main/java/org/apache/servicecomb/toolkit/oasv/compatibility/factory/DefaultCallbackDiffValidatorFactory.java => oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/DeleteMappingMethodAnnotationProcessor.java (51%)
 copy oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/validation/api/OpenApiValidator.java => oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/GetMappingMethodAnnotationProcessor.java (52%)
 mode change 100755 => 100644
 create mode 100644 oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathVariableAnnotationProcessor.java
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/GetGenericClassTypeLambda.java => oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PostMappingMethodAnnotationProcessor.java (50%)
 mode change 100755 => 100644
 copy oas-validator/oas-validator-core/src/main/java/org/apache/servicecomb/toolkit/oasv/diffvalidation/api/ResponseDiffValidator.java => oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PutMappingMethodAnnotationProcessor.java (53%)
 mode change 100755 => 100644
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/AbstractProviderDirectoryStrategy.java => oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyAnnotationProcessor.java (59%)
 create mode 100644 oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestHeaderAnnotationProcessor.java
 copy oas-validator/oas-validator-web/src/main/java/org/apache/servicecomb/toolkit/oasv/web/page/controller/ValidatorController.java => oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingClassAnnotationProcessor.java (57%)
 mode change 100755 => 100644
 copy oas-validator/oas-validator-web/src/main/java/org/apache/servicecomb/toolkit/oasv/web/page/controller/ValidatorController.java => oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingMethodAnnotationProcessor.java (56%)
 mode change 100755 => 100644
 create mode 100644 oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestParamAnnotationProcessor.java
 copy codegen/src/main/java/org/apache/servicecomb/toolkit/codegen/AbstractProviderDirectoryStrategy.java => oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java (52%)
 create mode 100644 oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java
 copy cli/src/main/resources/application.properties => oas-generator/oas-generator-spring/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.annotation.ModelInterceptor (92%)
 mode change 100755 => 100644
 copy contractgen/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.ContractsGenerator => oas-generator/oas-generator-spring/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser (91%)
 create mode 100644 oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java
 copy toolkit-maven-plugin/src/test/projects/demo-with-contract/src/main/java/demo/HelloEndPoint.java => oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java (52%)
 mode change 100755 => 100644
 create mode 100644 oas-generator/pom.xml
 copy oas-validator/oas-validator-compatibility-spring/src/test/resources/logback-test.xml => toolkit-maven-plugin/src/test/resources/log4j2-test.xml (82%)
 mode change 100644 => 100755


[servicecomb-toolkit] 10/10: add unit test

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit 3743b86912efb615a7783c9ac94aac2d3d139953
Author: kakulisen <18...@163.com>
AuthorDate: Tue Nov 12 15:51:14 2019 +0800

    add unit test
    
    Signed-off-by: kakulisen <18...@163.com>
---
 .../generator/util/LocalVariableVisitor.java       |  3 --
 .../toolkit/generator/AnnotationProcessorTest.java | 51 +++++++++++++++++++---
 .../servicecomb/toolkit/generator/ContextTest.java | 32 +++++++++++++-
 .../generator/parser/ServicecombPojoParser.java    |  2 +-
 .../toolkit/generator/ServiceCombParserTest.java   |  8 ++++
 .../parser/SpringmvcAnnotationParser.java          | 13 +-----
 .../toolkit/generator/SpringParserTest.java        |  1 +
 7 files changed, 88 insertions(+), 22 deletions(-)

diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/LocalVariableVisitor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/LocalVariableVisitor.java
index b7f19c1..4141d77 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/LocalVariableVisitor.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/LocalVariableVisitor.java
@@ -23,8 +23,6 @@ import org.objectweb.asm.Type;
 
 public class LocalVariableVisitor extends MethodVisitor {
 
-  private boolean isStatic;
-
   private String[] parameterNames;
 
   private final int[] lvtSlotIndex;
@@ -33,7 +31,6 @@ public class LocalVariableVisitor extends MethodVisitor {
 
   public LocalVariableVisitor(int api, String desc, boolean isStatic, String[] parameterNames) {
     super(api);
-    this.isStatic = isStatic;
     this.parameterNames = parameterNames;
     this.args = Type.getArgumentTypes(desc);
     this.lvtSlotIndex = computeLvtSlotIndices(isStatic, this.args);
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java
index a46854d..1f51291 100644
--- a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java
@@ -21,8 +21,10 @@ import java.lang.reflect.Method;
 
 import org.apache.servicecomb.toolkit.generator.annotation.ApiResponseMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.ApiResponsesMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.OpenApiDefinitionClassAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.OperationMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.ParameterAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestBodyParamAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.context.OasContext;
 import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
@@ -112,11 +114,9 @@ public class AnnotationProcessorTest {
   @Test
   public void processOperationAnnotation() throws NoSuchMethodException {
 
-    OasContext oasContext = new OasContext(null);
-    OperationContext context = new OperationContext(null, oasContext);
+    OasContext oasContext = null;
+
     OperationMethodAnnotationProcessor operationMethodAnnotationProcessor = new OperationMethodAnnotationProcessor();
-//    Operation operation = Mockito.mock(Operation.class);
-//    operationMethodAnnotationProcessor.process(operation, context);
 
     Method helloMethod = OpenapiDef.class.getDeclaredMethod("hello", String.class, Object.class);
     Operation operation = helloMethod.getAnnotation(Operation.class);
@@ -131,10 +131,51 @@ public class AnnotationProcessorTest {
         return true;
       }
     });
-    context = new OperationContext(helloMethod, oasContext);
+    OperationContext context = new OperationContext(helloMethod, oasContext);
     operationMethodAnnotationProcessor.process(operation, context);
+    Assert.assertEquals("hello-operation", context.getOperationId());
+  }
+
+  @Test
+  public void processOpenApiDefinitionClassAnnotation() throws NoSuchMethodException {
+
+    OasContext oasContext = null;
+
+    OpenApiDefinitionClassAnnotationProcessor openApiDefinitionClassAnnotationProcessor = new OpenApiDefinitionClassAnnotationProcessor();
+
+    OpenAPIDefinition openAPIDefinition = OpenapiDef.class.getAnnotation(OpenAPIDefinition.class);
+    oasContext = new OasContext(new AbstractAnnotationParser() {
+      @Override
+      public int getOrder() {
+        return 0;
+      }
+
+      @Override
+      public boolean canProcess(Class<?> cls) {
+        return true;
+      }
+    });
+    openApiDefinitionClassAnnotationProcessor.process(openAPIDefinition, oasContext);
+//    Assert.assertEquals("hello-operation", context.getOperationId());
   }
 
+  @Test
+  public void processRequestBodyAnnotation() throws NoSuchMethodException {
+
+    OasContext oasContext = new OasContext(null);
+    RequestBodyParamAnnotationProcessor operationMethodAnnotationProcessor = new RequestBodyParamAnnotationProcessor();
+
+    RequestBody requestBody = Mockito.mock(RequestBody.class);
+    Mockito.when(requestBody.content()).thenReturn(new Content[] {Mockito.mock(Content.class)});
+    Mockito.when(requestBody.ref()).thenReturn("#components/string");
+
+    Method helloMethod = OpenapiDef.class.getDeclaredMethod("hello", String.class, Object.class);
+    OperationContext operationContext = new OperationContext(helloMethod, oasContext);
+    ParameterContext parameterContext = new ParameterContext(operationContext, null);
+    operationMethodAnnotationProcessor.process(requestBody, parameterContext);
+
+    Assert.assertTrue(parameterContext.isRequestBody());
+  }
 
   @Test
   public void processParameterAnnotation() throws NoSuchMethodException, IllegalAccessException,
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ContextTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ContextTest.java
index efce736..d4e726b 100644
--- a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ContextTest.java
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ContextTest.java
@@ -34,7 +34,10 @@ import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
 import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 import org.junit.Test;
 
+import io.swagger.v3.oas.annotations.enums.ParameterStyle;
 import io.swagger.v3.oas.models.PathItem.HttpMethod;
+import io.swagger.v3.oas.models.parameters.RequestBody;
+import io.swagger.v3.oas.models.responses.ApiResponses;
 
 public class ContextTest {
 
@@ -53,6 +56,8 @@ public class ContextTest {
     context.setDefaultValue("default");
     context.setIn(InType.QUERY);
     context.setName("param1");
+    context.setDescription("desc");
+    context.setStyle(ParameterStyle.SIMPLE);
     context.addExtension("extension-key", "extension-value");
 
     assertFalse(context.isRequestBody());
@@ -72,7 +77,10 @@ public class ContextTest {
     assertEquals(parameter, context.getParameter());
     assertNotNull(context.getSchema());
     assertEquals("default", context.getDefaultValue());
+    assertEquals("desc", context.getDescription());
+    assertEquals(ParameterStyle.SIMPLE, context.getStyle());
     assertFalse(context.isRequired());
+    assertNull(context.getDeprecated());
 
     context.setIn(InType.COOKIE);
     assertFalse(context.isRequestBody());
@@ -93,6 +101,12 @@ public class ContextTest {
     context.setIn(InType.BODY);
     context.toParameter();
     assertTrue(context.isRequestBody());
+
+    context.addConsume(MediaTypes.APPLICATION_JSON);
+    assertEquals(MediaTypes.APPLICATION_JSON, context.getConsumers().get(0));
+
+    context.setRequestBody(new RequestBody());
+    assertNotNull(context.getRequestBody());
   }
 
   @Test
@@ -103,10 +117,26 @@ public class ContextTest {
     Parameter parameter = method.getParameters()[0];
     ParameterContext context = new ParameterContext(operationContext, parameter);
     context.setIn(InType.FORM);
-
+    oasContext.toOpenAPI();
     operationContext.setHttpMethod(HttpMethod.GET.name());
+    operationContext.setTags(null);
+    operationContext.setApiResponses(new ApiResponses());
+    operationContext.setDescription("desc");
+    operationContext.setConsumers(new String[] {MediaTypes.APPLICATION_JSON});
+    operationContext.addExtension("x-extension", "value");
     operationContext.toOperation();
+    oasContext.toOpenAPI();
+    oasContext.addExtension("x-extension", "value");
 
+    assertEquals("value", oasContext.getExtensions().get("x-extension"));
+    assertEquals("value", operationContext.getExtensions().get("x-extension"));
     assertEquals(HttpMethod.GET.name(), operationContext.getHttpMethod());
+    assertNotNull(operationContext.getOperation());
+    assertNotNull(operationContext.getApiResponses());
+    assertEquals(oasContext, operationContext.getOpenApiContext());
+    assertNull(operationContext.getSummary());
+    assertNull(operationContext.getTags());
+    assertEquals(MediaTypes.APPLICATION_JSON, operationContext.getConsumers()[0]);
+    assertEquals("desc", operationContext.getDescription());
   }
 }
diff --git a/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java
index bf26c42..ff467fb 100644
--- a/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java
+++ b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java
@@ -29,7 +29,7 @@ public class ServicecombPojoParser extends AbstractAnnotationParser {
 
   @Override
   public int getOrder() {
-    return 0;
+    return 100;
   }
 
   @Override
diff --git a/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java b/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java
index d9cf795..8d5bb56 100644
--- a/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java
+++ b/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java
@@ -41,11 +41,19 @@ public class ServiceCombParserTest {
     boolean canProcess = servicecombJaxrsParser.canProcess(ServicecombJaxrs.class);
     Assert.assertTrue(canProcess);
 
+    canProcess = servicecombJaxrsParser.canProcess(ServicecombPojo.class);
+    Assert.assertFalse(canProcess);
+
     canProcess = servicecombSpringmvcParser.canProcess(ServicecombSpringmvc.class);
     Assert.assertTrue(canProcess);
+    canProcess = servicecombSpringmvcParser.canProcess(ServicecombPojo.class);
+    Assert.assertFalse(canProcess);
 
     canProcess = servicecombPojoParser.canProcess(ServicecombPojo.class);
     Assert.assertTrue(canProcess);
+    canProcess = servicecombPojoParser.canProcess(ServicecombSpringmvc.class);
+    Assert.assertFalse(canProcess);
+    Assert.assertEquals(100, servicecombPojoParser.getOrder());
 
     OasContext pojoOasContext = new OasContext(servicecombPojoParser);
     servicecombPojoParser.parser(ServicecombPojo.class, pojoOasContext);
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java
index d35621f..923ad4b 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java
@@ -47,7 +47,7 @@ public class SpringmvcAnnotationParser extends AbstractAnnotationParser {
 
   @Override
   public int getOrder() {
-    return 0;
+    return 200;
   }
 
   @Override
@@ -87,16 +87,5 @@ public class SpringmvcAnnotationParser extends AbstractAnnotationParser {
     parameterAnnotationMap.put(RequestParam.class, new RequestParamAnnotationProcessor());
     parameterAnnotationMap.put(RequestHeader.class, new RequestHeaderAnnotationProcessor());
   }
-
-  public static void main(String[] args) {
-    List<Integer> integers = new ArrayList<>();
-    integers.add(1);
-    integers.add(2);
-    integers.add(5);
-    integers.add(3);
-    integers.sort(Comparator.comparingInt(Integer::intValue));
-
-    integers.forEach(System.out::println);
-  }
 }
 
diff --git a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java
index 3acce3d..8295038 100644
--- a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java
+++ b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java
@@ -29,6 +29,7 @@ public class SpringParserTest {
   public void parse() {
     SpringmvcAnnotationParser parser = new SpringmvcAnnotationParser();
 
+    Assert.assertEquals(200, parser.getOrder());
     boolean canProcess = parser.canProcess(String.class);
     Assert.assertFalse(canProcess);
 


[servicecomb-toolkit] 07/10: fix some bug

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit 04b8573838179e0e16cb8ff06b1ec1fca1608fa4
Author: kakulisen <18...@163.com>
AuthorDate: Tue Oct 29 20:23:27 2019 +0800

    fix some bug
    
    Signed-off-by: kakulisen <18...@163.com>
---
 .../org/apache/servicecomb/toolkit/generator/OperationContext.java     | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java
index b8bca12..d7ad2c7 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java
@@ -123,8 +123,7 @@ public class OperationContext {
       mediaType.schema(refSchema);
 
       Content content = new Content();
-      content.addMediaType(MediaTypeConst.TEXT_PLAIN, mediaType);
-
+      content.addMediaType(MediaTypeConst.APPLICATION_JSON, mediaType);
       apiResponse.description("OK");
       apiResponse.setContent(content);
       apiResponses.addApiResponse(HttpStatus.OK, apiResponse);


[servicecomb-toolkit] 04/10: add oas-generator-servicecomb to support parse servicecomb code

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit 9916d8c1500e2c89fed0eeece926459538f50c81
Author: kakulisen <18...@163.com>
AuthorDate: Mon Oct 28 20:48:07 2019 +0800

    add oas-generator-servicecomb to support parse servicecomb code
    
    Signed-off-by: kakulisen <18...@163.com>
---
 .../{ => oas-generator-servicecomb}/pom.xml        | 55 +++++++---------
 .../generator/parser/ServicecombJaxrsParser.java   | 34 ++++++++++
 .../generator/parser/ServicecombPojoParser.java    | 74 +++++++++++++++++++++
 .../parser/ServicecombSpringmvcParser.java         | 33 ++++++++++
 ...it.generator.parser.api.OpenApiAnnotationParser | 20 ++++++
 .../toolkit/generator/ServiceCombParserTest.java   | 76 ++++++++++++++++++++++
 oas-generator/pom.xml                              |  1 +
 7 files changed, 263 insertions(+), 30 deletions(-)

diff --git a/oas-generator/pom.xml b/oas-generator/oas-generator-servicecomb/pom.xml
similarity index 59%
copy from oas-generator/pom.xml
copy to oas-generator/oas-generator-servicecomb/pom.xml
index 849e520..55cf0c9 100644
--- a/oas-generator/pom.xml
+++ b/oas-generator/oas-generator-servicecomb/pom.xml
@@ -19,48 +19,43 @@
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>toolkit</artifactId>
+    <artifactId>oas-generator</artifactId>
     <groupId>org.apache.servicecomb.toolkit</groupId>
     <version>0.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
-  <packaging>pom</packaging>
-  <modules>
-    <module>oas-generator-core</module>
-    <module>oas-generator-jaxrs</module>
-    <module>oas-generator-spring</module>
-  </modules>
 
-  <artifactId>oas-generator</artifactId>
+  <artifactId>oas-generator-servicecomb</artifactId>
 
   <dependencies>
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-module-junit4</artifactId>
-      <version>1.6.2</version>
-      <scope>test</scope>
+      <groupId>org.apache.servicecomb.toolkit</groupId>
+      <artifactId>oas-generator-jaxrs</artifactId>
     </dependency>
 
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-api-mockito</artifactId>
-      <version>1.6.2</version>
-      <scope>test</scope>
+      <groupId>org.apache.servicecomb.toolkit</groupId>
+      <artifactId>oas-generator-spring</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>provider-rest-common</artifactId>
+      <version>1.2.0</version>
     </dependency>
-  </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.8.1</version>
-        <configuration>
-          <target>1.8</target>
-          <source>1.8</source>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>provider-pojo</artifactId>
+      <version>1.2.0</version>
+      <exclusions>
+        <exclusion>
+          <groupId>commons-lang</groupId>
+          <artifactId>commons-lang</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    
+  </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombJaxrsParser.java b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombJaxrsParser.java
new file mode 100644
index 0000000..6b79e9b
--- /dev/null
+++ b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombJaxrsParser.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.parser;
+
+import javax.ws.rs.Path;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+
+public class ServicecombJaxrsParser extends JaxRsAnnotationParser {
+
+  @Override
+  public boolean canProcess(Class<?> cls) {
+    if (cls.getAnnotation(RestSchema.class) != null && cls.getAnnotation(Path.class) != null) {
+      return true;
+    }
+
+    return false;
+  }
+}
diff --git a/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java
new file mode 100644
index 0000000..beb42d5
--- /dev/null
+++ b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.parser;
+
+import java.lang.reflect.Method;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.provider.pojo.RpcSchema;
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+
+import io.swagger.v3.oas.models.PathItem.HttpMethod;
+
+public class ServicecombPojoParser extends AbstractAnnotationParser {
+
+  @Override
+  public int getOrder() {
+    return 0;
+  }
+
+  @Override
+  public boolean canProcess(Class<?> cls) {
+    if (cls.getAnnotation(RpcSchema.class) != null) {
+      return true;
+    }
+
+    return false;
+  }
+
+
+  @Override
+  public void postParseMethodAnnotation(OperationContext context) {
+    super.postParseMethodAnnotation(context);
+
+    Method currentMethod = context.getMethod();
+
+    if (StringUtils.isEmpty(context.getHttpMethod())) {
+      context.setHttpMethod(HttpMethod.POST.toString());
+    }
+
+    if (StringUtils.isEmpty(context.getOperationId())) {
+      context.setOperationId(currentMethod.getName());
+    }
+
+    if (StringUtils.isEmpty(context.getPath())) {
+      context.setPath(correctPath(currentMethod.getName()));
+    }
+
+    if (context.getApiResponses() == null || context.getApiResponses().size() == 0) {
+      context.correctResponse(context.getApiResponses());
+    }
+  }
+
+  private String correctPath(String path) {
+    if (path == null || path.startsWith("/")) {
+      return path;
+    }
+    return "/" + path;
+  }
+}
diff --git a/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombSpringmvcParser.java b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombSpringmvcParser.java
new file mode 100644
index 0000000..7f59bc2
--- /dev/null
+++ b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombSpringmvcParser.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.parser;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+public class ServicecombSpringmvcParser extends SpringmvcAnnotationParser {
+
+  @Override
+  public boolean canProcess(Class<?> cls) {
+    if (cls.getAnnotation(RestSchema.class) != null && cls.getAnnotation(RequestMapping.class) != null) {
+      return true;
+    }
+
+    return false;
+  }
+}
diff --git a/oas-generator/oas-generator-servicecomb/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser b/oas-generator/oas-generator-servicecomb/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser
new file mode 100644
index 0000000..0658b91
--- /dev/null
+++ b/oas-generator/oas-generator-servicecomb/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.servicecomb.toolkit.generator.parser.ServicecombJaxrsParser
+org.apache.servicecomb.toolkit.generator.parser.ServicecombSpringmvcParser
+org.apache.servicecomb.toolkit.generator.parser.ServicecombPojoParser
\ No newline at end of file
diff --git a/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java b/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java
new file mode 100644
index 0000000..78c6bfc
--- /dev/null
+++ b/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import javax.ws.rs.Path;
+
+import org.apache.servicecomb.provider.pojo.RpcSchema;
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.apache.servicecomb.toolkit.generator.parser.ServicecombJaxrsParser;
+import org.apache.servicecomb.toolkit.generator.parser.ServicecombPojoParser;
+import org.apache.servicecomb.toolkit.generator.parser.ServicecombSpringmvcParser;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+public class ServiceCombParserTest {
+
+  @Test
+  public void parse() {
+
+    ServicecombJaxrsParser servicecombJaxrsParser = new ServicecombJaxrsParser();
+    ServicecombPojoParser servicecombPojoParser = new ServicecombPojoParser();
+    ServicecombSpringmvcParser servicecombSpringmvcParser = new ServicecombSpringmvcParser();
+
+    boolean canProcess = servicecombJaxrsParser.canProcess(ServicecombJaxrs.class);
+    Assert.assertTrue(canProcess);
+
+    canProcess = servicecombSpringmvcParser.canProcess(ServicecombSpringmvc.class);
+    Assert.assertTrue(canProcess);
+
+    canProcess = servicecombPojoParser.canProcess(ServicecombPojo.class);
+    Assert.assertTrue(canProcess);
+
+    OasContext pojoOasContext = new OasContext(servicecombPojoParser);
+    servicecombPojoParser.parser(ServicecombPojo.class, pojoOasContext);
+    Assert.assertNull(pojoOasContext.getBasePath());
+  }
+
+
+  @RestSchema(schemaId = "servicecombJaxrs")
+  @Path("/")
+  class ServicecombJaxrs {
+
+    @Path("/path")
+    public Object path() {
+      return null;
+    }
+  }
+
+  @RestSchema(schemaId = "servicecombSpringmvc")
+  @RequestMapping
+  class ServicecombSpringmvc {
+  }
+
+  @RpcSchema
+  class ServicecombPojo {
+    public Object path() {
+      return null;
+    }
+  }
+}
diff --git a/oas-generator/pom.xml b/oas-generator/pom.xml
index 849e520..9603fdb 100644
--- a/oas-generator/pom.xml
+++ b/oas-generator/pom.xml
@@ -29,6 +29,7 @@
     <module>oas-generator-core</module>
     <module>oas-generator-jaxrs</module>
     <module>oas-generator-spring</module>
+    <module>oas-generator-servicecomb</module>
   </modules>
 
   <artifactId>oas-generator</artifactId>


[servicecomb-toolkit] 06/10: add unit test

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit 55ef5cefe5c089d1adfb0cd6fb9132b9214df7fd
Author: kakulisen <18...@163.com>
AuthorDate: Tue Oct 29 14:24:06 2019 +0800

    add unit test
    
    Signed-off-by: kakulisen <18...@163.com>
---
 .../servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java
index 0bf7191..de047f9 100644
--- a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java
+++ b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java
@@ -183,7 +183,7 @@ public class SpringAnnotationProcessorTest {
       return "request";
     }
 
-    @GetMapping(value = "/get", consumes = {"application/json"})
+    @GetMapping(value = "/get", consumes = {"application/json"}, produces = {"application/json"})
     public String get() {
       return "get";
     }


[servicecomb-toolkit] 08/10: add new processor

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit 9611763173e08fa8101a98234e709ad1642e305a
Author: kakulisen <18...@163.com>
AuthorDate: Tue Nov 12 08:02:56 2019 +0800

    add new processor
    
    Signed-off-by: kakulisen <18...@163.com>
---
 .../contractgen/DefaultContractsGenerator.java     |   2 +-
 oas-generator/oas-generator-core/pom.xml           |  19 +-
 .../{HttpStatus.java => HttpStatuses.java}         |   2 +-
 .../{MediaTypeConst.java => MediaTypes.java}       |   2 +-
 .../toolkit/generator/ParameterContext.java        | 141 --------
 .../ApiResponseMethodAnnotationProcessor.java      |   2 +-
 .../ApiResponsesMethodAnnotationProcessor.java     |   2 +-
 .../OpenApiDefinitionClassAnnotationProcessor.java |  81 +++++
 .../OperationMethodAnnotationProcessor.java        |  50 +--
 .../annotation/ParameterAnnotationProcessor.java   |  69 ++--
 .../RequestBodyParamAnnotationProcessor.java       |  57 ++++
 .../{HttpStatus.java => context/Context.java}      |   8 +-
 .../IExtensionsContext.java}                       |   9 +-
 .../ISchemaContext.java}                           |  11 +-
 .../generator/{ => context}/OasContext.java        |  20 +-
 .../generator/{ => context}/OasGenerator.java      |   4 +-
 .../generator/{ => context}/OperationContext.java  | 142 +++++++-
 .../generator/context/ParameterContext.java        | 379 +++++++++++++++++++++
 .../generator/parser/AbstractAnnotationParser.java |  19 +-
 .../parser/api/OpenApiAnnotationParser.java        |   6 +-
 .../toolkit/generator/util/ModelConverter.java     |   4 +
 .../toolkit/generator/util/ParamUtils.java         |  18 +-
 .../generator/util/SwaggerAnnotationUtils.java     |  98 ++++++
 .../toolkit/generator/AnnotationProcessorTest.java | 263 +++++++++++++-
 .../servicecomb/toolkit/generator/ContextTest.java | 112 ++++++
 .../toolkit/generator/OasGeneratorTest.java        |   8 +-
 .../servicecomb/toolkit/generator/ParserTest.java  |   1 +
 .../servicecomb/toolkit/generator/UtilsTest.java   |  27 +-
 oas-generator/oas-generator-jaxrs/pom.xml          |  14 +-
 ...essor.java => ConsumesAnnotationProcessor.java} |  10 +-
 .../CookieParamAnnotationProcessor.java}           |  13 +-
 ...ssor.java => FormParamAnnotationProcessor.java} |  13 +-
 .../HeaderParamAnnotationProcessor.java}           |  14 +-
 .../annotation/HttpMethodAnnotationProcessor.java  |   2 +-
 .../annotation/PathClassAnnotationProcessor.java   |   2 +-
 .../annotation/PathMethodAnnotationProcessor.java  |   2 +-
 ...ssor.java => PathParamAnnotationProcessor.java} |  12 +-
 ...sor.java => QueryParamAnnotationProcessor.java} |  12 +-
 .../generator/parser/JaxRsAnnotationParser.java    |  25 ++
 .../generator/JaxrsAnnotationProcessorTest.java    | 112 +++++-
 .../toolkit/generator/JaxrsParserTest.java         |   1 +
 .../toolkit/generator/ServerOperationResource.java | 138 --------
 oas-generator/oas-generator-servicecomb/pom.xml    |   2 -
 .../generator/parser/ServicecombPojoParser.java    |   2 +-
 .../toolkit/generator/ServiceCombParserTest.java   |   1 +
 oas-generator/oas-generator-spring/pom.xml         |   1 -
 ...stractHttpMethodMappingAnnotationProcessor.java |   6 +-
 .../DeleteMappingMethodAnnotationProcessor.java    |   2 +-
 .../GetMappingMethodAnnotationProcessor.java       |   2 +-
 .../PathVariableAnnotationProcessor.java           |  10 +-
 .../PostMappingMethodAnnotationProcessor.java      |   2 +-
 .../PutMappingMethodAnnotationProcessor.java       |   2 +-
 .../annotation/RequestBodyAnnotationProcessor.java |   4 +-
 .../RequestHeaderAnnotationProcessor.java          |   7 +-
 .../RequestMappingClassAnnotationProcessor.java    |   4 +-
 .../RequestMappingMethodAnnotationProcessor.java   |   4 +-
 .../RequestParamAnnotationProcessor.java           |   5 +-
 .../annotation/RequestPartAnnotationProcessor.java |   9 +-
 .../parser/SpringmvcAnnotationParser.java          |  26 +-
 .../generator/SpringAnnotationProcessorTest.java   |  13 +-
 .../toolkit/generator/SpringParserTest.java        |   1 +
 oas-generator/pom.xml                              | 117 +++++--
 .../toolkit/goodbye/GoodbyeController.java         |   6 +-
 .../servicecomb/toolkit/plugin/GenerateUtil.java   |   4 +-
 64 files changed, 1664 insertions(+), 492 deletions(-)

diff --git a/contractgen/src/main/java/org/apache/servicecomb/toolkit/contractgen/DefaultContractsGenerator.java b/contractgen/src/main/java/org/apache/servicecomb/toolkit/contractgen/DefaultContractsGenerator.java
index e78abc5..80d6f48 100755
--- a/contractgen/src/main/java/org/apache/servicecomb/toolkit/contractgen/DefaultContractsGenerator.java
+++ b/contractgen/src/main/java/org/apache/servicecomb/toolkit/contractgen/DefaultContractsGenerator.java
@@ -37,7 +37,7 @@ import org.apache.servicecomb.provider.rest.common.RestSchema;
 import org.apache.servicecomb.toolkit.ContractsGenerator;
 import org.apache.servicecomb.toolkit.common.ContractFileType;
 import org.apache.servicecomb.toolkit.common.ImmediateClassLoader;
-import org.apache.servicecomb.toolkit.generator.OasGenerator;
+import org.apache.servicecomb.toolkit.generator.context.OasGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/oas-generator/oas-generator-core/pom.xml b/oas-generator/oas-generator-core/pom.xml
index 1a7a35c..23d5d02 100644
--- a/oas-generator/oas-generator-core/pom.xml
+++ b/oas-generator/oas-generator-core/pom.xml
@@ -27,41 +27,44 @@
 
   <artifactId>oas-generator-core</artifactId>
 
-  <properties>
-    <swagger.version>2.0.9</swagger.version>
-  </properties>
 
   <dependencies>
     <dependency>
       <groupId>io.swagger.core.v3</groupId>
       <artifactId>swagger-models</artifactId>
-      <version>${swagger.version}</version>
     </dependency>
 
     <dependency>
       <groupId>io.swagger.core.v3</groupId>
       <artifactId>swagger-annotations</artifactId>
-      <version>${swagger.version}</version>
     </dependency>
 
     <dependency>
       <groupId>io.swagger.core.v3</groupId>
       <artifactId>swagger-core</artifactId>
-      <version>${swagger.version}</version>
     </dependency>
 
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
-      <version>4.12</version>
     </dependency>
 
     <dependency>
       <groupId>org.ow2.asm</groupId>
       <artifactId>asm</artifactId>
-      <version>7.2</version>
     </dependency>
 
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-module-junit4</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-api-mockito</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatuses.java
similarity index 96%
copy from oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
copy to oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatuses.java
index 00a12e3..0064daa 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatuses.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.toolkit.generator;
 
-public class HttpStatus {
+public class HttpStatuses {
 
   public static String OK = "200";
 
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypeConst.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypes.java
similarity index 98%
rename from oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypeConst.java
rename to oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypes.java
index 624e143..eb8a587 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypeConst.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypes.java
@@ -22,7 +22,7 @@ package org.apache.servicecomb.toolkit.generator;
  *
  * @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7">HTTP/1.1 section 3.7</a>
  */
-public class MediaTypeConst {
+public class MediaTypes {
 
   public final static String WILDCARD = "*/*";
 
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/ParameterContext.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/ParameterContext.java
deleted file mode 100644
index 15e6721..0000000
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/ParameterContext.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.generator;
-
-import java.lang.reflect.Parameter;
-import java.lang.reflect.Type;
-
-import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
-import org.apache.servicecomb.toolkit.generator.util.ParamUtils;
-
-import io.swagger.v3.oas.annotations.enums.ParameterIn;
-import io.swagger.v3.oas.models.Components;
-import io.swagger.v3.oas.models.media.Schema;
-
-public class ParameterContext {
-
-  private OperationContext parentContext;
-
-  private boolean required;
-
-  private String name;
-
-  Parameter parameter;
-
-  private Object defaultValue;
-
-
-  io.swagger.v3.oas.models.parameters.Parameter oasParameter = new io.swagger.v3.oas.models.parameters.Parameter();
-
-  public ParameterContext(OperationContext parentContext, Parameter parameter) {
-    this.parentContext = parentContext;
-    this.parameter = parameter;
-    this.parentContext.addParameter(this);
-  }
-
-
-  public io.swagger.v3.oas.models.parameters.Parameter toOasParameter() {
-
-    if (parameter == null) {
-      return null;
-    }
-    ensureName();
-    if (oasParameter.getSchema() == null) {
-      Schema refSchema = ModelConverter.getSchema(parameter.getType(), getComponents());
-      oasParameter.schema(refSchema);
-    }
-
-    if (oasParameter.getIn() == null) {
-      oasParameter.setIn(ParameterIn.QUERY.toString());
-    }
-
-    if (defaultValue != null) {
-      required = false;
-      oasParameter.getSchema().setDefault(defaultValue);
-    }
-
-    oasParameter.setRequired(required);
-
-    return oasParameter;
-  }
-
-  private void ensureName() {
-    if (name == null) {
-      // 尝试获取实际参数名
-      name = ParamUtils.getParamterName(parentContext.getMethod(), parameter);
-    }
-
-    if (name == null) {
-      name = parameter.getName();
-    }
-
-    oasParameter.setName(name);
-  }
-
-  public OperationContext getOperationContext() {
-    return parentContext;
-  }
-
-  public Type getActualType() {
-    return parameter.getParameterizedType();
-  }
-
-  public Object getDefaultValue() {
-    return defaultValue;
-  }
-
-  public void setDefaultValue(Object defaultValue) {
-    this.defaultValue = defaultValue;
-  }
-
-  public Components getComponents() {
-    return parentContext.getComponents();
-  }
-
-  public io.swagger.v3.oas.models.parameters.Parameter getOasParameter() {
-    return oasParameter;
-  }
-
-  public Parameter getParameter() {
-    return parameter;
-  }
-
-  public void setParameter(Parameter parameter) {
-    this.parameter = parameter;
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public boolean isRequired() {
-    return required;
-  }
-
-  public void setRequired(boolean required) {
-    this.required = required;
-  }
-
-  public void setType(String type) {
-    oasParameter.setIn(type);
-  }
-}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponseMethodAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponseMethodAnnotationProcessor.java
index 3cbbe0a..ea2a748 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponseMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponseMethodAnnotationProcessor.java
@@ -20,7 +20,7 @@ package org.apache.servicecomb.toolkit.generator.annotation;
 import java.util.Optional;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 
 import io.swagger.v3.oas.annotations.headers.Header;
 import io.swagger.v3.oas.annotations.media.Content;
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponsesMethodAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponsesMethodAnnotationProcessor.java
index 54747ae..c6b481b 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponsesMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponsesMethodAnnotationProcessor.java
@@ -19,7 +19,7 @@ package org.apache.servicecomb.toolkit.generator.annotation;
 
 import java.util.Arrays;
 
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.responses.ApiResponses;
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OpenApiDefinitionClassAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OpenApiDefinitionClassAnnotationProcessor.java
new file mode 100644
index 0000000..cc0a631
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OpenApiDefinitionClassAnnotationProcessor.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
+
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.License;
+import io.swagger.v3.oas.models.servers.Server;
+import io.swagger.v3.oas.models.tags.Tag;
+
+public class OpenApiDefinitionClassAnnotationProcessor implements
+    ClassAnnotationProcessor<OpenAPIDefinition, OasContext> {
+
+  @Override
+  public void process(OpenAPIDefinition openAPIDefinition, OasContext context) {
+
+    Info infoAnnotation = openAPIDefinition.info();
+    io.swagger.v3.oas.models.info.Info info = new io.swagger.v3.oas.models.info.Info();
+    License license = new License();
+    Contact contact = new Contact();
+
+    license.url(infoAnnotation.license().url());
+    license.name(infoAnnotation.license().name());
+    contact.name(infoAnnotation.contact().name());
+    contact.url(infoAnnotation.contact().url());
+    contact.email(infoAnnotation.contact().email());
+
+    info
+        .description(infoAnnotation.description())
+        .title(infoAnnotation.title())
+        .version(infoAnnotation.version())
+        .license(license)
+        .contact(contact);
+    context.getOpenAPI().info(info);
+
+    if (openAPIDefinition.servers() != null) {
+      List<Server> serverList = new ArrayList<>();
+      for (io.swagger.v3.oas.annotations.servers.Server serverAnnotation : openAPIDefinition.servers()) {
+        Server server = new Server();
+        server.url(serverAnnotation.url());
+        server.description(serverAnnotation.description());
+        serverList.add(server);
+      }
+      context.getOpenAPI().servers(serverList);
+    }
+
+    if (openAPIDefinition.tags() != null) {
+      List<Tag> tagList = new ArrayList<>();
+      for (io.swagger.v3.oas.annotations.tags.Tag tagAnnotation : openAPIDefinition.tags()) {
+        Tag tag = new Tag();
+        tag
+            .name(tagAnnotation.name())
+            .description(tagAnnotation.description());
+        tagList.add(tag);
+      }
+
+      context.getOpenAPI().tags(tagList);
+    }
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OperationMethodAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OperationMethodAnnotationProcessor.java
index 517ea5b..52e7977 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OperationMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OperationMethodAnnotationProcessor.java
@@ -17,16 +17,15 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Optional;
+
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
+import org.apache.servicecomb.toolkit.generator.util.SwaggerAnnotationUtils;
 
-import io.swagger.v3.oas.annotations.ExternalDocumentation;
 import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.extensions.Extension;
-import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
-import io.swagger.v3.oas.annotations.servers.Server;
 
 public class OperationMethodAnnotationProcessor implements MethodAnnotationProcessor<Operation, OperationContext> {
 
@@ -34,24 +33,25 @@ public class OperationMethodAnnotationProcessor implements MethodAnnotationProce
   public void process(Operation annotation, OperationContext context) {
 
     context.setOperationId(annotation.operationId());
-    String s = annotation.operationId();
-    boolean deprecated = annotation.deprecated();
-    String description = annotation.description();
-    Extension[] extensions = annotation.extensions();
-    ExternalDocumentation externalDocumentation = annotation.externalDocs();
-    RequestBody requestBody = annotation.requestBody();
+    context.setDeprecated(annotation.deprecated());
+    context.setDescription(annotation.description());
+
+    Map<String, Object> extensionsFromAnnotation = SwaggerAnnotationUtils
+        .getExtensionsFromAnnotation(annotation.extensions());
+    Optional.ofNullable(extensionsFromAnnotation)
+        .ifPresent(extensions -> extensions.forEach(context::addExtension));
+
     ApiResponse[] responses = annotation.responses();
-    String method = annotation.method();
-    Server[] servers = annotation.servers();
-    SecurityRequirement[] security = annotation.security();
-    String[] tags = annotation.tags();
-    String summary = annotation.summary();
-    Parameter[] parameters = annotation.parameters();
-
-//    context.getOpenAPI().setPaths();
-
-    // responseReference未解析
-    // hidden未解析
-    // authorizations未解析
+    MethodAnnotationProcessor apiResponseAnnotationProcessor = context.getParser()
+        .findMethodAnnotationProcessor(ApiResponse.class);
+
+    for (ApiResponse response : responses) {
+      Optional.ofNullable(apiResponseAnnotationProcessor)
+          .ifPresent(processor -> processor.process(response, context));
+    }
+
+    context.setHttpMethod(annotation.method());
+    context.setSummary(annotation.summary());
+    Arrays.stream(annotation.tags()).forEach(context::addTag);
   }
 }
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParameterAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParameterAnnotationProcessor.java
index 139bb0b..9648106 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParameterAnnotationProcessor.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParameterAnnotationProcessor.java
@@ -17,37 +17,68 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import java.lang.reflect.Type;
-import java.util.Arrays;
+import java.util.Collections;
 
-import org.apache.commons.lang3.StringUtils;
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
+import org.apache.servicecomb.toolkit.generator.util.SwaggerAnnotationUtils;
 
-import io.swagger.v3.core.util.ParameterProcessor;
-import io.swagger.v3.core.util.ReflectionUtils;
 import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.enums.Explode;
 import io.swagger.v3.oas.annotations.media.Schema;
 
 public class ParameterAnnotationProcessor implements ParamAnnotationProcessor<Parameter, ParameterContext> {
 
   @Override
-  public void process(Parameter parameter, ParameterContext parameterContext) {
+  public void process(Parameter parameterAnnotation, ParameterContext paramCtx) {
 
-    Schema schema = parameter.schema();
-    Type type = parameterContext.getActualType();
-    if (schema != null) {
+    Schema schema = parameterAnnotation.schema();
 
-      if (StringUtils.isNotEmpty(schema.type())) {
-        parameterContext.setType(schema.type());
-        type = ReflectionUtils.typeFromString(schema.type());
-      }
+    io.swagger.v3.oas.models.media.Schema schemaFromAnnotation = SwaggerAnnotationUtils.getSchemaFromAnnotation(schema);
+    if (schemaFromAnnotation != null) {
+      paramCtx.setSchema(schemaFromAnnotation);
     }
 
-    ParameterProcessor
-        .applyAnnotations(parameterContext.getOasParameter(), type, Arrays.asList(parameter),
-            parameterContext.getComponents(),
-            null, null, null);
+    paramCtx.setRequired(parameterAnnotation.required());
+    paramCtx.setAllowEmptyValue(parameterAnnotation.allowEmptyValue());
+    paramCtx.setAllowReserved(parameterAnnotation.allowReserved());
+    paramCtx.setDeprecated(parameterAnnotation.deprecated());
+    paramCtx.setExample(parameterAnnotation.example());
+
+    switch (parameterAnnotation.in()) {
+      case HEADER:
+        paramCtx.setIn(InType.HEADER);
+        break;
+      case COOKIE:
+        paramCtx.setIn(InType.COOKIE);
+        break;
+      case PATH:
+        paramCtx.setIn(InType.PATH);
+        break;
+      case QUERY:
+      case DEFAULT:
+      default:
+        paramCtx.setIn(InType.QUERY);
+    }
+
+    paramCtx.setDescription(parameterAnnotation.description());
+    paramCtx.setRef(parameterAnnotation.ref());
+    paramCtx.setName(parameterAnnotation.name());
+    paramCtx.setExplode(getExplode(parameterAnnotation.explode()));
+    paramCtx.applyAnnotations(Collections.singletonList(parameterAnnotation));
+  }
 
-    parameterContext.setRequired(parameter.required());
+  private Boolean getExplode(Explode explode) {
+
+    switch (explode) {
+      case TRUE: {
+        return true;
+      }
+      case FALSE:
+      case DEFAULT:
+      default: {
+        return false;
+      }
+    }
   }
 }
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyParamAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyParamAnnotationProcessor.java
new file mode 100644
index 0000000..def5d28
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyParamAnnotationProcessor.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
+import org.apache.servicecomb.toolkit.generator.util.SwaggerAnnotationUtils;
+
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
+
+public class RequestBodyParamAnnotationProcessor implements ParamAnnotationProcessor<RequestBody, ParameterContext> {
+
+  @Override
+  public void process(RequestBody requestBodyAnnotation, ParameterContext context) {
+
+    context.setIn(InType.BODY);
+    io.swagger.v3.oas.models.parameters.RequestBody requestBody = new io.swagger.v3.oas.models.parameters.RequestBody();
+
+    requestBody.setRequired(requestBodyAnnotation.required());
+    requestBody.setDescription(requestBodyAnnotation.description());
+
+    if (StringUtils.isNotEmpty(requestBodyAnnotation.ref())) {
+      requestBody.set$ref(requestBodyAnnotation.ref());
+    }
+
+    Content[] contentAnnotations = requestBodyAnnotation.content();
+
+    List<io.swagger.v3.oas.models.media.Content> contentsFromAnnotation = SwaggerAnnotationUtils
+        .getContentFromAnnotation(contentAnnotations);
+
+    Optional.ofNullable(contentsFromAnnotation).ifPresent(contents -> {
+      requestBody.content(contents.get(0));
+    });
+
+    context.setRequestBody(requestBody);
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/Context.java
similarity index 79%
copy from oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
copy to oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/Context.java
index 00a12e3..51a0500 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/Context.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.generator;
+package org.apache.servicecomb.toolkit.generator.context;
 
-public class HttpStatus {
-
-  public static String OK = "200";
+import org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
 
+public interface Context {
+  OpenApiAnnotationParser getParser();
 }
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/IExtensionsContext.java
similarity index 78%
copy from oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
copy to oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/IExtensionsContext.java
index 00a12e3..ffb8b81 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/IExtensionsContext.java
@@ -15,10 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.generator;
+package org.apache.servicecomb.toolkit.generator.context;
 
-public class HttpStatus {
+import java.util.Map;
 
-  public static String OK = "200";
+public interface IExtensionsContext extends Context {
 
+  void addExtension(String name, Object value);
+
+  Map<String, Object> getExtensions();
 }
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ISchemaContext.java
similarity index 77%
rename from oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
rename to oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ISchemaContext.java
index 00a12e3..bc0b1ec 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ISchemaContext.java
@@ -15,10 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.generator;
+package org.apache.servicecomb.toolkit.generator.context;
 
-public class HttpStatus {
+import io.swagger.v3.oas.models.media.Schema;
 
-  public static String OK = "200";
+public interface ISchemaContext extends Context, IExtensionsContext {
 
-}
+  Schema getSchema();
+
+  void setSchema(Schema schema);
+}
\ No newline at end of file
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasContext.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OasContext.java
similarity index 87%
rename from oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasContext.java
rename to oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OasContext.java
index 3be7edb..22bc2c7 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasContext.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OasContext.java
@@ -15,11 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.generator;
+package org.apache.servicecomb.toolkit.generator.context;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
@@ -32,7 +33,7 @@ import io.swagger.v3.oas.models.Paths;
 import io.swagger.v3.oas.models.info.Info;
 import io.swagger.v3.oas.models.servers.Server;
 
-public class OasContext {
+public class OasContext implements IExtensionsContext {
 
   private OpenAPI openAPI;
 
@@ -44,6 +45,8 @@ public class OasContext {
 
   private OpenApiAnnotationParser parser;
 
+  private List<ISchemaContext> schemaCtxList = new ArrayList<>();
+
   public OasContext(OpenApiAnnotationParser parser) {
     this(new OpenAPI(), parser);
   }
@@ -83,7 +86,7 @@ public class OasContext {
     correctComponents();
 
     openAPI.servers(Collections.singletonList(new Server().url(basePath)));
-
+    schemaCtxList.forEach(schemaCtx -> openAPI.schema(schemaCtx.getSchema().getName(), schemaCtx.getSchema()));
     return openAPI;
   }
 
@@ -117,6 +120,7 @@ public class OasContext {
     }
   }
 
+  @Override
   public OpenApiAnnotationParser getParser() {
     return parser;
   }
@@ -148,4 +152,14 @@ public class OasContext {
   public void addOperation(OperationContext operation) {
     operationList.add(operation);
   }
+
+  @Override
+  public void addExtension(String name, Object value) {
+    openAPI.addExtension(name, value);
+  }
+
+  @Override
+  public Map<String, Object> getExtensions() {
+    return openAPI.getExtensions();
+  }
 }
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasGenerator.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OasGenerator.java
similarity index 92%
rename from oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasGenerator.java
rename to oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OasGenerator.java
index 540f320..e31d6d3 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasGenerator.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OasGenerator.java
@@ -15,9 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.generator;
+package org.apache.servicecomb.toolkit.generator.context;
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Optional;
 import java.util.ServiceLoader;
@@ -33,6 +34,7 @@ public class OasGenerator {
 
   static {
     ServiceLoader.load(OpenApiAnnotationParser.class).forEach(parserList::add);
+    parserList.sort(Comparator.comparingInt(OpenApiAnnotationParser::getOrder));
   }
 
   public OpenAPI generate(Class<?> cls) {
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OperationContext.java
similarity index 56%
rename from oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java
rename to oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OperationContext.java
index d7ad2c7..02d8352 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OperationContext.java
@@ -15,14 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.toolkit.generator;
+package org.apache.servicecomb.toolkit.generator.context;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.HttpStatuses;
+import org.apache.servicecomb.toolkit.generator.MediaTypes;
 import org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
 import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
 
@@ -31,12 +34,16 @@ import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.Operation;
 import io.swagger.v3.oas.models.media.Content;
 import io.swagger.v3.oas.models.media.MediaType;
+import io.swagger.v3.oas.models.media.ObjectSchema;
 import io.swagger.v3.oas.models.media.Schema;
 import io.swagger.v3.oas.models.parameters.Parameter;
+import io.swagger.v3.oas.models.parameters.RequestBody;
 import io.swagger.v3.oas.models.responses.ApiResponse;
 import io.swagger.v3.oas.models.responses.ApiResponses;
 
-public class OperationContext {
+public class OperationContext implements IExtensionsContext {
+
+  private static final RequestBody nullRequestBody = new RequestBody();
 
   private OasContext parentContext;
 
@@ -52,10 +59,20 @@ public class OperationContext {
 
   private ApiResponses apiResponses = new ApiResponses();
 
-  private List<ParameterContext> parameterContextList = new ArrayList<>();
+  private List<ParameterContext> parameterContexts = new ArrayList<>();
 
   private OpenApiAnnotationParser parser;
 
+  private Boolean deprecated = false;
+
+  private String description = null;
+
+  private String summary;
+
+  private List<String> tags;
+
+  private String[] consumers;
+
   public OperationContext(Method method, OasContext parentContext) {
     this.parentContext = parentContext;
     this.method = method;
@@ -63,10 +80,7 @@ public class OperationContext {
     this.parentContext.addOperation(this);
   }
 
-  public void addParameter(ParameterContext context) {
-    parameterContextList.add(context);
-  }
-
+  @Override
   public OpenApiAnnotationParser getParser() {
     return parser;
   }
@@ -89,9 +103,45 @@ public class OperationContext {
     correctResponse(apiResponses);
     operation.setResponses(apiResponses);
 
+    RequestBody requestBody = new RequestBody();
+    Content content = new Content();
+    MediaType mediaType = new MediaType();
+
     // 处理参数
-    List<Parameter> parameterList = parameterContextList.stream()
-        .map(parameterContext -> parameterContext.toOasParameter())
+    List<Parameter> parameterList = parameterContexts.stream()
+        .map(parameterContext ->
+        {
+          // requestBody
+          if (parameterContext.isRequestBody()) {
+
+            Schema schema = mediaType.getSchema();
+            if (schema == null) {
+              schema = new ObjectSchema();
+              mediaType.schema(schema);
+            }
+            schema.addProperties(parameterContext.getName(), parameterContext.getSchema());
+            if (consumers != null) {
+              for (String consume : getConsumers()) {
+                content.addMediaType(consume, mediaType);
+              }
+            } else {
+              if (parameterContext.getConsumers() != null && parameterContext.getConsumers().size() > 0) {
+                for (String consume : parameterContext.getConsumers()) {
+                  content.addMediaType(consume, mediaType);
+                }
+              } else {
+                content.addMediaType(MediaTypes.APPLICATION_JSON, mediaType);
+              }
+            }
+
+            requestBody.setContent(content);
+            requestBody.setRequired(parameterContext.getRequired());
+            return null;
+          }
+
+          // parameter
+          return parameterContext.toParameter();
+        })
         .filter(parameter -> parameter != null)
         .collect(Collectors.toList());
 
@@ -99,9 +149,16 @@ public class OperationContext {
       operation.parameters(parameterList);
     }
 
+    if (!nullRequestBody.equals(requestBody)) {
+      operation.setRequestBody(requestBody);
+    }
     return operation;
   }
 
+  public void setRequestBody(RequestBody requestBody) {
+    operation.requestBody(requestBody);
+  }
+
   public void correctResponse(ApiResponses apiResponses) {
 
     if (apiResponses == null) {
@@ -109,7 +166,7 @@ public class OperationContext {
     }
     // 处理响应
     // 没有注解被处理
-    if (apiResponses.get(HttpStatus.OK) == null) {
+    if (apiResponses.get(HttpStatuses.OK) == null) {
       ApiResponse apiResponse = new ApiResponse();
 
       Class<?> returnType = method.getReturnType();
@@ -123,10 +180,10 @@ public class OperationContext {
       mediaType.schema(refSchema);
 
       Content content = new Content();
-      content.addMediaType(MediaTypeConst.APPLICATION_JSON, mediaType);
+      content.addMediaType(MediaTypes.APPLICATION_JSON, mediaType);
       apiResponse.description("OK");
       apiResponse.setContent(content);
-      apiResponses.addApiResponse(HttpStatus.OK, apiResponse);
+      apiResponses.addApiResponse(HttpStatuses.OK, apiResponse);
     }
   }
 
@@ -188,4 +245,65 @@ public class OperationContext {
     }
     this.httpMethod = httpMethod.toUpperCase();
   }
+
+  public Boolean getDeprecated() {
+    return deprecated;
+  }
+
+  public void setDeprecated(Boolean deprecated) {
+    this.deprecated = deprecated;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public String getSummary() {
+    return summary;
+  }
+
+  public void setSummary(String summary) {
+    this.summary = summary;
+  }
+
+  public List<String> getTags() {
+    return tags;
+  }
+
+  public void setTags(List<String> tags) {
+    this.tags = tags;
+  }
+
+  public void addTag(String tag) {
+    if (tags == null) {
+      tags = new ArrayList<>();
+    }
+    tags.add(tag);
+  }
+
+  @Override
+  public void addExtension(String name, Object value) {
+    operation.addExtension(name, value);
+  }
+
+  @Override
+  public Map<String, Object> getExtensions() {
+    return operation.getExtensions();
+  }
+
+  public String[] getConsumers() {
+    return consumers;
+  }
+
+  public void setConsumers(String[] consumers) {
+    this.consumers = consumers;
+  }
+
+  public void addParamCtx(ParameterContext ctx) {
+    this.parameterContexts.add(ctx);
+  }
 }
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ParameterContext.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ParameterContext.java
new file mode 100644
index 0000000..57d66b1
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ParameterContext.java
@@ -0,0 +1,379 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.context;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Parameter;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
+import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
+import org.apache.servicecomb.toolkit.generator.util.ParamUtils;
+
+import io.swagger.v3.core.util.ParameterProcessor;
+import io.swagger.v3.core.util.ReflectionUtils;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.enums.ParameterStyle;
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.examples.Example;
+import io.swagger.v3.oas.models.media.Content;
+import io.swagger.v3.oas.models.media.Schema;
+import io.swagger.v3.oas.models.parameters.RequestBody;
+
+public class ParameterContext implements ISchemaContext, IExtensionsContext {
+
+  private final static Schema nullSchema = new Schema();
+
+  private OperationContext parentContext;
+
+  private Parameter parameter;
+
+  private Object defaultValue;
+
+  private io.swagger.v3.oas.models.parameters.Parameter oasParameter = new io.swagger.v3.oas.models.parameters.Parameter();
+
+  private String name = null;
+
+  private InType in = null;
+
+  private String description = null;
+
+  private Boolean required = null;
+
+  private Boolean deprecated = null;
+
+  private Boolean allowEmptyValue = null;
+
+  private ParameterStyle style;
+
+  private Boolean explode = null;
+
+  private Boolean allowReserved = null;
+
+  private Schema schema;
+
+  private Object example = null;
+
+  private Map<String, Example> examples = null;
+
+  private Content content = null;
+
+  private String ref = null;
+
+  private RequestBody requestBody;
+
+  private List<String> consumers;
+
+  public ParameterContext(OperationContext parentContext, Parameter parameter) {
+    this.parentContext = parentContext;
+    this.parameter = parameter;
+    parentContext.addParamCtx(this);
+  }
+
+  public io.swagger.v3.oas.models.parameters.Parameter toParameter() {
+
+    if (parameter == null) {
+      return null;
+    }
+    ensureName();
+    if (schema == null || nullSchema.equals(schema)) {
+      schema = ModelConverter.getSchema(parameter.getType(), getComponents());
+      oasParameter.schema(schema);
+    }
+
+    if (in == null) {
+      oasParameter.setIn(ParameterIn.QUERY.toString());
+    } else {
+      switch (in) {
+        case PATH: {
+          oasParameter.setIn(ParameterIn.PATH.toString());
+          break;
+        }
+        case QUERY: {
+          oasParameter.setIn(ParameterIn.QUERY.toString());
+          break;
+        }
+        case COOKIE: {
+          oasParameter.setIn(ParameterIn.COOKIE.toString());
+          break;
+        }
+        case HEADER: {
+          oasParameter.setIn(ParameterIn.HEADER.toString());
+          break;
+        }
+        default:
+          oasParameter.setIn(ParameterIn.QUERY.toString());
+      }
+    }
+
+    if (defaultValue != null) {
+      required = false;
+      oasParameter.getSchema().setDefault(defaultValue);
+    }
+
+    oasParameter.setRequired(required);
+    return oasParameter;
+  }
+
+  public boolean isRequestBody() {
+    if (in != null && (in.equals(InType.BODY) || in.equals(InType.FORM))) {
+      return true;
+    }
+    return false;
+  }
+
+  public void applyAnnotations(List<Annotation> annotations) {
+    ParameterProcessor
+        .applyAnnotations(oasParameter, getType(), annotations,
+            getComponents(),
+            null, null, null);
+  }
+
+  private void ensureName() {
+    if (StringUtils.isEmpty(name)) {
+      // try get real type
+      name = ParamUtils.getParameterName(parentContext.getMethod(), parameter);
+    }
+
+    if (StringUtils.isEmpty(name)) {
+      name = parameter.getName();
+    }
+
+    oasParameter.setName(name);
+  }
+
+  public OperationContext getOperationContext() {
+    return parentContext;
+  }
+
+  public Object getDefaultValue() {
+    return defaultValue;
+  }
+
+  public void setDefaultValue(Object defaultValue) {
+    this.defaultValue = defaultValue;
+  }
+
+  public Components getComponents() {
+    return parentContext.getComponents();
+  }
+
+  public io.swagger.v3.oas.models.parameters.Parameter getOasParameter() {
+    return oasParameter;
+  }
+
+  public Parameter getParameter() {
+    return parameter;
+  }
+
+  public void setParameter(Parameter parameter) {
+    this.parameter = parameter;
+  }
+
+  public boolean isRequired() {
+    return required;
+  }
+
+  public Type getType() {
+
+    if (getRealType() != null) {
+      return getRealType();
+    }
+
+    if (StringUtils.isNotEmpty(oasParameter.getIn())) {
+      return ReflectionUtils.typeFromString(oasParameter.getIn());
+    }
+
+    return null;
+  }
+
+  public void addConsume(String consume) {
+    if (consumers == null) {
+      consumers = new ArrayList<>();
+    }
+    consumers.add(consume);
+  }
+
+  public List<String> getConsumers() {
+    return consumers;
+  }
+
+  public Type getRealType() {
+    return parameter.getParameterizedType();
+  }
+
+  public void setRequestBody(RequestBody requestBody) {
+    required = requestBody.getRequired();
+    description = requestBody.getDescription();
+    this.requestBody = requestBody;
+  }
+
+  public RequestBody getRequestBody() {
+    return requestBody;
+  }
+
+  @Override
+  public Schema getSchema() {
+
+    Schema refSchema = oasParameter.getSchema();
+    if (refSchema == null || nullSchema.equals(refSchema)) {
+      refSchema = ModelConverter.getSchema(parameter.getType(), getComponents());
+      oasParameter.schema(refSchema);
+    }
+
+    return refSchema;
+  }
+
+  @Override
+  public void setSchema(Schema schema) {
+    this.schema = schema;
+  }
+
+  @Override
+  public void addExtension(String name, Object value) {
+    oasParameter.addExtension(name, value);
+  }
+
+  @Override
+  public Map<String, Object> getExtensions() {
+    return oasParameter.getExtensions();
+  }
+
+  @Override
+  public OpenApiAnnotationParser getParser() {
+    return parentContext.getParser();
+  }
+
+  public String getName() {
+    ensureName();
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public InType getIn() {
+    return in;
+  }
+
+  public void setIn(InType in) {
+    this.in = in;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public Boolean getRequired() {
+    return required;
+  }
+
+  public void setRequired(Boolean required) {
+    this.required = required;
+  }
+
+  public Boolean getDeprecated() {
+    return deprecated;
+  }
+
+  public void setDeprecated(Boolean deprecated) {
+    this.deprecated = deprecated;
+  }
+
+  public Boolean getAllowEmptyValue() {
+    return allowEmptyValue;
+  }
+
+  public void setAllowEmptyValue(Boolean allowEmptyValue) {
+    this.allowEmptyValue = allowEmptyValue;
+  }
+
+  public ParameterStyle getStyle() {
+    return style;
+  }
+
+  public void setStyle(ParameterStyle style) {
+    this.style = style;
+  }
+
+  public Boolean getExplode() {
+    return explode;
+  }
+
+  public void setExplode(Boolean explode) {
+    this.explode = explode;
+  }
+
+  public Boolean getAllowReserved() {
+    return allowReserved;
+  }
+
+  public void setAllowReserved(Boolean allowReserved) {
+    this.allowReserved = allowReserved;
+  }
+
+  public Object getExample() {
+    return example;
+  }
+
+  public void setExample(Object example) {
+    this.example = example;
+  }
+
+  public Map<String, Example> getExamples() {
+    return examples;
+  }
+
+  public void setExamples(Map<String, Example> examples) {
+    this.examples = examples;
+  }
+
+  public Content getContent() {
+    return content;
+  }
+
+  public void setContent(Content content) {
+    this.content = content;
+  }
+
+  public String getRef() {
+    return ref;
+  }
+
+  public void setRef(String ref) {
+    this.ref = ref;
+  }
+
+  public enum InType {
+    QUERY,
+    PATH,
+    HEADER,
+    COOKIE,
+    FORM,
+    BODY
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/AbstractAnnotationParser.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/AbstractAnnotationParser.java
index 5b3a4fa..0f44a3c 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/AbstractAnnotationParser.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/AbstractAnnotationParser.java
@@ -25,21 +25,25 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.servicecomb.toolkit.generator.OasContext;
-import org.apache.servicecomb.toolkit.generator.OperationContext;
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
 import org.apache.servicecomb.toolkit.generator.annotation.AnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.ApiResponseMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.ApiResponsesMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.ClassAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.MethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.OpenApiDefinitionClassAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.OperationMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.ParamAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.ParameterAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestBodyParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
 import org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
 
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.responses.ApiResponses;
 
@@ -49,11 +53,11 @@ public abstract class AbstractAnnotationParser implements OpenApiAnnotationParse
 
   private OasContext context;
 
-  protected Map<Class, ClassAnnotationProcessor> classAnnotationMap = new HashMap<>();
+  protected Map<Class<? extends Annotation>, ClassAnnotationProcessor> classAnnotationMap = new HashMap<>();
 
-  protected Map<Class, MethodAnnotationProcessor> methodAnnotationMap = new HashMap<>();
+  protected Map<Class<? extends Annotation>, MethodAnnotationProcessor> methodAnnotationMap = new HashMap<>();
 
-  protected Map<Class, ParamAnnotationProcessor> parameterAnnotationMap = new HashMap<>();
+  protected Map<Class<? extends Annotation>, ParamAnnotationProcessor> parameterAnnotationMap = new HashMap<>();
 
   public AbstractAnnotationParser() {
     initMethodAnnotationProcessor();
@@ -128,11 +132,12 @@ public abstract class AbstractAnnotationParser implements OpenApiAnnotationParse
   }
 
   public void initClassAnnotationProcessor() {
-
+    classAnnotationMap.put(OpenAPIDefinition.class, new OpenApiDefinitionClassAnnotationProcessor());
   }
 
   public void initParameterAnnotationProcessor() {
     parameterAnnotationMap.put(Parameter.class, new ParameterAnnotationProcessor());
+    parameterAnnotationMap.put(RequestBody.class, new RequestBodyParamAnnotationProcessor());
   }
 
   @Override
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/api/OpenApiAnnotationParser.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/api/OpenApiAnnotationParser.java
index 1fbdd9e..f4f722e 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/api/OpenApiAnnotationParser.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/api/OpenApiAnnotationParser.java
@@ -19,9 +19,9 @@ package org.apache.servicecomb.toolkit.generator.parser.api;
 
 import java.lang.annotation.Annotation;
 
-import org.apache.servicecomb.toolkit.generator.OasContext;
-import org.apache.servicecomb.toolkit.generator.OperationContext;
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
 import org.apache.servicecomb.toolkit.generator.annotation.ClassAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.MethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.ParamAnnotationProcessor;
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
index 0370c31..307863d 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
@@ -60,6 +60,10 @@ public class ModelConverter {
     interceptorMgr.sort(Comparator.comparingInt(ModelInterceptor::order));
   }
 
+  public static void unRegisterInterceptor(ModelInterceptor interceptor) {
+    interceptorMgr.remove(interceptor);
+  }
+
   public static Schema getSchema(Class<?> cls) {
     return getSchema(cls, null);
   }
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ParamUtils.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ParamUtils.java
index 9093630..3a2e815 100644
--- a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ParamUtils.java
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ParamUtils.java
@@ -36,14 +36,14 @@ public class ParamUtils {
 
   private static final String STATIC_CLASS_INIT = "<clinit>";
 
-  public static final Map<Method, String[]> paramterCache = new HashMap();
+  public static final Map<Method, String[]> parameterCache = new HashMap();
 
-  public static String getParamterName(Method method, Parameter parameter) {
+  public static String getParameterName(Method method, Parameter parameter) {
 
-    String[] parameterNames = paramterCache.get(method);
+    String[] parameterNames = parameterCache.get(method);
 
     if (parameterNames == null) {
-      parameterNames = initParamterNames(method);
+      parameterNames = initParameterNames(method);
       if (parameterNames == null) {
         return null;
       }
@@ -67,10 +67,10 @@ public class ParamUtils {
     return -1;
   }
 
-  private static String[] initParamterNames(Method m) {
+  private static String[] initParameterNames(Method m) {
 
     boolean isStatic = Modifier.isStatic(m.getModifiers());
-    String[] paramterNames = new String[m.getParameterCount()];
+    String[] parameterNames = new String[m.getParameterCount()];
 
     try {
 
@@ -101,7 +101,7 @@ public class ParamUtils {
           }
 
           if (!isSyntheticOrBridged(access) && !STATIC_CLASS_INIT.equals(name)) {
-            return new LocalVariableVisitor(this.api, descriptor, isStatic, paramterNames);
+            return new LocalVariableVisitor(this.api, descriptor, isStatic, parameterNames);
           }
 
           return methodVisitor;
@@ -111,9 +111,9 @@ public class ParamUtils {
       e.printStackTrace();
     }
 
-    paramterCache.put(m, paramterNames);
+    parameterCache.put(m, parameterNames);
 
-    return paramterNames;
+    return parameterNames;
   }
 
   private static boolean isSyntheticOrBridged(int access) {
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/SwaggerAnnotationUtils.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/SwaggerAnnotationUtils.java
new file mode 100644
index 0000000..0058d1b
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/SwaggerAnnotationUtils.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import io.swagger.v3.oas.annotations.extensions.Extension;
+import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
+import io.swagger.v3.oas.annotations.media.Encoding;
+import io.swagger.v3.oas.models.media.Content;
+import io.swagger.v3.oas.models.media.MediaType;
+import io.swagger.v3.oas.models.media.Schema;
+
+public class SwaggerAnnotationUtils {
+
+  public static List<Content> getContentFromAnnotation(
+      io.swagger.v3.oas.annotations.media.Content... contentAnnotations) {
+
+    if (contentAnnotations == null || contentAnnotations.length < 1) {
+      return null;
+    }
+
+    List<Content> contents = new ArrayList<>();
+
+    for (io.swagger.v3.oas.annotations.media.Content contentAnnotation : contentAnnotations) {
+      io.swagger.v3.oas.models.media.Content content = new io.swagger.v3.oas.models.media.Content();
+      MediaType mediaType = new MediaType();
+      Encoding[] encodingAnnotations = contentAnnotation.encoding();
+      Optional.ofNullable(encodingAnnotations).ifPresent(encodings -> {
+        for (Encoding encodingAnnotation : encodings) {
+          io.swagger.v3.oas.models.media.Encoding encoding = new io.swagger.v3.oas.models.media.Encoding();
+          encoding.contentType(encodingAnnotation.contentType());
+          encoding.allowReserved(encodingAnnotation.allowReserved());
+          encoding.explode(encodingAnnotation.explode());
+          mediaType.addEncoding(encodingAnnotation.name(), encoding);
+        }
+      });
+      content.addMediaType(contentAnnotation.mediaType(), mediaType);
+      contents.add(content);
+    }
+    return contents;
+  }
+
+  public static Schema getSchemaFromAnnotation(io.swagger.v3.oas.annotations.media.Schema schema) {
+    if (schema == null) {
+      return null;
+    }
+    Schema schemaObj = new Schema();
+    schemaObj.setName(schema.name());
+    schemaObj.setDescription(schema.description());
+    schemaObj.setType(schema.type());
+    schemaObj.setTitle(schema.title());
+    schemaObj.setNullable(schema.nullable());
+    schemaObj.setDefault(schema.defaultValue());
+    schemaObj.setFormat(schema.format());
+    schemaObj.setDeprecated(schema.deprecated());
+    Map<String, Object> extensionsFromAnnotation = getExtensionsFromAnnotation(schema.extensions());
+    schemaObj.extensions(extensionsFromAnnotation);
+    return schemaObj;
+  }
+
+  public static Map<String, Object> getExtensionsFromAnnotation(Extension... extensions) {
+    if (extensions == null || extensions.length < 1) {
+      return null;
+    }
+
+    Map<String, Object> extensionMap = new HashMap<>();
+    for (Extension extension : extensions) {
+      ExtensionProperty[] properties = extension.properties();
+      Optional.ofNullable(properties).ifPresent(props -> {
+        for (ExtensionProperty prop : props) {
+          extensionMap.put(prop.name(), prop.value());
+        }
+      });
+    }
+
+    return extensionMap;
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java
index c6bbf56..a46854d 100644
--- a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java
@@ -23,16 +23,38 @@ import org.apache.servicecomb.toolkit.generator.annotation.ApiResponseMethodAnno
 import org.apache.servicecomb.toolkit.generator.annotation.ApiResponsesMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.OperationMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.ParameterAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
 import org.apache.servicecomb.toolkit.generator.parser.AbstractAnnotationParser;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import io.swagger.v3.oas.annotations.ExternalDocumentation;
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.enums.Explode;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.enums.ParameterStyle;
+import io.swagger.v3.oas.annotations.extensions.Extension;
+import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
+import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.info.Contact;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.info.License;
+import io.swagger.v3.oas.annotations.links.Link;
 import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.ExampleObject;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.servers.Server;
+import io.swagger.v3.oas.annotations.servers.ServerVariable;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.models.media.StringSchema;
 
 public class AnnotationProcessorTest {
@@ -46,7 +68,7 @@ public class AnnotationProcessorTest {
     ApiResponse apiResponse = Mockito.mock(ApiResponse.class);
     Content[] contents = new Content[1];
     contents[0] = Mockito.mock(Content.class);
-    Mockito.when(contents[0].mediaType()).thenReturn(MediaTypeConst.APPLICATION_JSON);
+    Mockito.when(contents[0].mediaType()).thenReturn(MediaTypes.APPLICATION_JSON);
     Mockito.when(apiResponse.content()).thenReturn(contents);
     Mockito.when(apiResponse.responseCode()).thenReturn("200");
     apiResProcessor.process(apiResponse, context);
@@ -75,7 +97,7 @@ public class AnnotationProcessorTest {
     ApiResponses apiResponses = Mockito.mock(ApiResponses.class);
     Content[] contents = new Content[1];
     contents[0] = Mockito.mock(Content.class);
-    Mockito.when(contents[0].mediaType()).thenReturn(MediaTypeConst.APPLICATION_JSON);
+    Mockito.when(contents[0].mediaType()).thenReturn(MediaTypes.APPLICATION_JSON);
     ApiResponse apiResponse = Mockito.mock(ApiResponse.class);
     Mockito.when(apiResponse.content()).thenReturn(contents);
     Mockito.when(apiResponse.responseCode()).thenReturn("200");
@@ -88,12 +110,28 @@ public class AnnotationProcessorTest {
   }
 
   @Test
-  public void processOperationAnnotation() {
+  public void processOperationAnnotation() throws NoSuchMethodException {
 
     OasContext oasContext = new OasContext(null);
     OperationContext context = new OperationContext(null, oasContext);
     OperationMethodAnnotationProcessor operationMethodAnnotationProcessor = new OperationMethodAnnotationProcessor();
-    Operation operation = Mockito.mock(Operation.class);
+//    Operation operation = Mockito.mock(Operation.class);
+//    operationMethodAnnotationProcessor.process(operation, context);
+
+    Method helloMethod = OpenapiDef.class.getDeclaredMethod("hello", String.class, Object.class);
+    Operation operation = helloMethod.getAnnotation(Operation.class);
+    oasContext = new OasContext(new AbstractAnnotationParser() {
+      @Override
+      public int getOrder() {
+        return 0;
+      }
+
+      @Override
+      public boolean canProcess(Class<?> cls) {
+        return true;
+      }
+    });
+    context = new OperationContext(helloMethod, oasContext);
     operationMethodAnnotationProcessor.process(operation, context);
   }
 
@@ -114,7 +152,7 @@ public class AnnotationProcessorTest {
     ParameterAnnotationProcessor parameterAnnotationProcessor = new ParameterAnnotationProcessor();
 
     parameterAnnotationProcessor.process(parameterDeclaredAnnotation, parameterContext);
-    io.swagger.v3.oas.models.parameters.Parameter oasParameter = parameterContext.toOasParameter();
+    io.swagger.v3.oas.models.parameters.Parameter oasParameter = parameterContext.toParameter();
     Assert.assertEquals("param", oasParameter.getName());
     Assert.assertEquals(StringSchema.class, oasParameter.getSchema().getClass());
     Assert.assertTrue(parameterContext.isRequired());
@@ -126,4 +164,219 @@ public class AnnotationProcessorTest {
     public void parameter(@Parameter(required = true) String param) {
     }
   }
+
+  @OpenAPIDefinition(
+      info = @Info(
+          title = "openapi definition",
+          description = "test openapi definition",
+          termsOfService = "",
+          contact = @Contact(
+              name = "developer",
+              url = "developer.com",
+              email = "developer@developer.com",
+              extensions = {
+                  @Extension(
+                      name = "ext1",
+                      properties = {
+                          @ExtensionProperty(
+                              name = "k1",
+                              value = "v1",
+                              parseValue = true
+                          )
+                      })
+              }
+          ),
+          license = @License(
+              name = "Apache License v2.0",
+              url = "",
+              extensions = {
+                  @Extension(
+                      name = "ext2",
+                      properties = {
+                          @ExtensionProperty(
+                              name = "k1",
+                              value = "v1",
+                              parseValue = true
+                          )
+                      }
+                  )
+              }
+          ),
+          version = "0.2.0",
+          extensions = {
+              @Extension(
+                  name = "ext3",
+                  properties = {
+                      @ExtensionProperty(
+                          name = "k1",
+                          value = "v2"
+                      )
+                  }
+              )
+          }
+      ),
+      tags = {
+          @Tag(
+              name = "",
+              description = "",
+              externalDocs = @ExternalDocumentation(
+                  description = "",
+                  url = "",
+                  extensions = {
+                      @Extension(
+                          name = "ext4",
+                          properties = {
+                              @ExtensionProperty(
+                                  name = "k1",
+                                  value = "v2"
+                              )
+                          }
+                      )
+                  }
+              )
+          )
+      },
+      servers = {
+          @Server(
+              url = "http://localhost",
+              description = "",
+              variables = {
+                  @ServerVariable(
+                      name = "",
+                      description = "",
+                      defaultValue = "",
+                      allowableValues = {},
+                      extensions = {
+                          @Extension(
+                              name = "",
+                              properties = @ExtensionProperty(
+                                  name = "",
+                                  value = "",
+                                  parseValue = true
+                              )
+                          )
+                      }
+                  )
+              }
+          )
+      },
+      security = {},
+      externalDocs = @ExternalDocumentation(
+          description = "",
+          url = "",
+          extensions = {
+              @Extension(
+                  name = "",
+                  properties = @ExtensionProperty(
+                      name = "",
+                      value = "",
+                      parseValue = true
+                  )
+              )
+          }
+      ),
+      extensions = {
+          @Extension(
+              name = "",
+              properties = @ExtensionProperty(
+                  name = "",
+                  value = "",
+                  parseValue = true
+              )
+          )
+      }
+  )
+  class OpenapiDef {
+
+    @Operation(
+        operationId = "hello-operation",
+        method = "GET",
+        tags = {
+            "OpenapiDef"
+        },
+        summary = "",
+        requestBody = @RequestBody(
+
+        ),
+        externalDocs = @ExternalDocumentation(),
+        parameters = {
+            @Parameter(
+                name = "name123",
+                in = ParameterIn.QUERY,
+                description = "user name",
+                required = true,
+                deprecated = false,
+                allowEmptyValue = true,
+                style = ParameterStyle.SIMPLE,
+                explode = Explode.DEFAULT,
+                allowReserved = true,
+                // Ignored if the properties content or array are specified
+                schema = @Schema(
+                    type = "string"
+                ),
+                hidden = false,
+                example = "",
+                examples = {
+                    @ExampleObject
+                },
+                extensions = {},
+                ref = ""
+            )
+        },
+        responses = {
+            @ApiResponse(
+                description = "success",
+                responseCode = "200",
+                headers = {
+                    @Header(name = "Content-Type",
+                        description = "content type",
+                        schema = @Schema(
+                            implementation = String.class
+                        ),
+                        required = true,
+                        deprecated = false
+                    )
+                },
+                links = {
+                    @Link()
+                },
+                content = {
+                    @Content()
+                },
+                extensions = {
+                    @Extension(
+                        name = "",
+                        properties = {}
+                    )
+                }
+
+            )
+        },
+        deprecated = false,
+        security = {
+            @SecurityRequirement(
+                name = "oauth2",
+                scopes = {
+                    "app1"
+                }
+            )
+        },
+        servers = {
+            @Server(
+                url = "http://localhost:8080/hello"
+            )
+        },
+        extensions = {
+            @Extension(
+                name = "",
+                properties = {}
+            )
+        },
+        hidden = false,
+        ignoreJsonView = false
+    )
+    public String hello(String name, Object notParameter) {
+      return "hello";
+    }
+  }
 }
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ContextTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ContextTest.java
new file mode 100644
index 0000000..efce736
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ContextTest.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.Collections;
+
+import org.apache.servicecomb.toolkit.generator.AnnotationProcessorTest.OpenapiDef;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
+import org.junit.Test;
+
+import io.swagger.v3.oas.models.PathItem.HttpMethod;
+
+public class ContextTest {
+
+  @Test
+  public void realParameterContext() throws NoSuchMethodException {
+    Method method = OpenapiDef.class.getDeclaredMethod("hello", String.class, Object.class);
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext = new OperationContext(method, oasContext);
+
+    Parameter parameter = method.getParameters()[0];
+    ParameterContext context = new ParameterContext(operationContext, parameter);
+    context.setRequired(true);
+    context.setSchema(null);
+
+    assertTrue(context.isRequired());
+    context.setDefaultValue("default");
+    context.setIn(InType.QUERY);
+    context.setName("param1");
+    context.addExtension("extension-key", "extension-value");
+
+    assertFalse(context.isRequestBody());
+
+    context.toParameter();
+    context.applyAnnotations(Collections.emptyList());
+
+    assertEquals("param1", context.getName());
+    assertEquals(InType.QUERY, context.getIn());
+    assertEquals(String.class, context.getRealType());
+    assertEquals(String.class, context.getType());
+    assertEquals(operationContext.getComponents(), context.getComponents());
+    assertEquals(operationContext, context.getOperationContext());
+    assertNull(context.getExtensions());
+    assertNotNull(context.getOasParameter());
+    assertNull(context.getParser());
+    assertEquals(parameter, context.getParameter());
+    assertNotNull(context.getSchema());
+    assertEquals("default", context.getDefaultValue());
+    assertFalse(context.isRequired());
+
+    context.setIn(InType.COOKIE);
+    assertFalse(context.isRequestBody());
+    context.toParameter();
+
+    context.setIn(InType.HEADER);
+    assertFalse(context.isRequestBody());
+    context.toParameter();
+
+    context.setIn(InType.PATH);
+    assertFalse(context.isRequestBody());
+    context.toParameter();
+
+    context.setIn(InType.FORM);
+    assertTrue(context.isRequestBody());
+    context.toParameter();
+
+    context.setIn(InType.BODY);
+    context.toParameter();
+    assertTrue(context.isRequestBody());
+  }
+
+  @Test
+  public void operationContext() throws NoSuchMethodException {
+    Method method = OpenapiDef.class.getDeclaredMethod("hello", String.class, Object.class);
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext = new OperationContext(method, oasContext);
+    Parameter parameter = method.getParameters()[0];
+    ParameterContext context = new ParameterContext(operationContext, parameter);
+    context.setIn(InType.FORM);
+
+    operationContext.setHttpMethod(HttpMethod.GET.name());
+    operationContext.toOperation();
+
+    assertEquals(HttpMethod.GET.name(), operationContext.getHttpMethod());
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/OasGeneratorTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/OasGeneratorTest.java
index d454d7d..66f4a72 100644
--- a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/OasGeneratorTest.java
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/OasGeneratorTest.java
@@ -22,10 +22,14 @@ import java.lang.reflect.Parameter;
 import java.util.HashSet;
 import java.util.Set;
 
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OasGenerator;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 import org.junit.Assert;
 import org.junit.Test;
 
-import io.swagger.v3.oas.annotations.enums.ParameterIn;
 import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.PathItem.HttpMethod;
 
@@ -70,7 +74,7 @@ public class OasGeneratorTest {
     ParameterContext parameterContext = new ParameterContext(operationContext, parameter);
     parameterContext.setName(parameter.getName());
     parameterContext.setRequired(true);
-    parameterContext.setType(ParameterIn.QUERY.toString());
+    parameterContext.setIn(InType.QUERY);
 
     Assert.assertEquals(parameter.getName(), parameterContext.getName());
 
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ParserTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ParserTest.java
index c0b37e3..e85c205 100644
--- a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ParserTest.java
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ParserTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.servicecomb.toolkit.generator;
 
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
 import org.apache.servicecomb.toolkit.generator.parser.AbstractAnnotationParser;
 import org.junit.Test;
 
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
index 224dbf9..1ef65d1 100644
--- a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
@@ -17,15 +17,22 @@
 
 package org.apache.servicecomb.toolkit.generator;
 
+import static org.mockito.Mockito.when;
+
 import java.lang.reflect.Method;
 import java.lang.reflect.Parameter;
+import java.util.List;
 
 import org.apache.servicecomb.toolkit.generator.annotation.ModelInterceptor;
 import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
 import org.apache.servicecomb.toolkit.generator.util.ParamUtils;
+import org.apache.servicecomb.toolkit.generator.util.SwaggerAnnotationUtils;
 import org.junit.Assert;
 import org.junit.Test;
+import org.mockito.Mockito;
 
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Encoding;
 import io.swagger.v3.oas.models.Components;
 import io.swagger.v3.oas.models.media.ArraySchema;
 import io.swagger.v3.oas.models.media.Schema;
@@ -38,8 +45,8 @@ public class UtilsTest {
 
     Method method = ParameterClass.class.getMethod("method", String.class);
     Parameter parameter = method.getParameters()[0];
-    String paramterName = ParamUtils.getParamterName(method, parameter);
-    Assert.assertEquals("param", paramterName);
+    String parameterName = ParamUtils.getParameterName(method, parameter);
+    Assert.assertEquals("param", parameterName);
   }
 
   @Test
@@ -60,7 +67,7 @@ public class UtilsTest {
     schema = ModelConverter.getSchema(ParameterClass.class, components);
     Assert.assertNotNull(schema.get$ref());
 
-    ModelConverter.registerInterceptor(new ModelInterceptor() {
+    ModelInterceptor mockModelInterceptor = new ModelInterceptor() {
       @Override
       public int order() {
         return 0;
@@ -70,10 +77,22 @@ public class UtilsTest {
       public Schema process(Class<?> cls, Components components) {
         return new Schema().name("unknown");
       }
-    });
+    };
 
+    ModelConverter.registerInterceptor(mockModelInterceptor);
     schema = ModelConverter.getSchema(ParameterClass.class);
     Assert.assertEquals("unknown", schema.getName());
+    ModelConverter.unRegisterInterceptor(mockModelInterceptor);
+  }
+
+  @Test
+  public void getContentFromAnnotation() {
+    Content contents = Mockito.mock(Content.class);
+    when(contents.encoding()).thenReturn(new Encoding[] {Mockito.mock(Encoding.class)});
+    List<io.swagger.v3.oas.models.media.Content> contentFromAnnotation = SwaggerAnnotationUtils
+        .getContentFromAnnotation(contents);
+
+    Assert.assertEquals(1, contentFromAnnotation.size());
   }
 
   class ParameterClass {
diff --git a/oas-generator/oas-generator-jaxrs/pom.xml b/oas-generator/oas-generator-jaxrs/pom.xml
index b634cb0..807d9cf 100644
--- a/oas-generator/oas-generator-jaxrs/pom.xml
+++ b/oas-generator/oas-generator-jaxrs/pom.xml
@@ -36,7 +36,19 @@
     <dependency>
       <groupId>javax.ws.rs</groupId>
       <artifactId>javax.ws.rs-api</artifactId>
-      <version>2.1</version>
+    </dependency>
+
+
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-module-junit4</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-api-mockito</artifactId>
+      <scope>test</scope>
     </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ConsumesAnnotationProcessor.java
similarity index 72%
copy from oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
copy to oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ConsumesAnnotationProcessor.java
index 42c5f72..66a7f80 100644
--- a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ConsumesAnnotationProcessor.java
@@ -17,13 +17,13 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import javax.ws.rs.Path;
+import javax.ws.rs.Consumes;
 
-import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 
-public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path, OasContext> {
+public class ConsumesAnnotationProcessor implements MethodAnnotationProcessor<Consumes, OperationContext> {
   @Override
-  public void process(Path path, OasContext context) {
-    context.setBasePath(path.value());
+  public void process(Consumes consumes, OperationContext operationContext) {
+    operationContext.setConsumers(consumes.value());
   }
 }
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/CookieParamAnnotationProcessor.java
similarity index 66%
copy from oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java
copy to oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/CookieParamAnnotationProcessor.java
index 1fdcc55..c03a2f9 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/CookieParamAnnotationProcessor.java
@@ -17,12 +17,15 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
-import org.springframework.web.bind.annotation.RequestPart;
+import javax.ws.rs.CookieParam;
 
-public class RequestPartAnnotationProcessor implements ParamAnnotationProcessor<RequestPart, ParameterContext> {
-  @Override
-  public void process(RequestPart requestPart, ParameterContext parameterContext) {
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 
+public class CookieParamAnnotationProcessor implements ParamAnnotationProcessor<CookieParam, ParameterContext> {
+  @Override
+  public void process(CookieParam cookieParam, ParameterContext parameterContext) {
+    parameterContext.setIn(InType.COOKIE);
+    parameterContext.setName(cookieParam.value());
   }
 }
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/FormParamAnnotationProcessor.java
similarity index 65%
copy from oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
copy to oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/FormParamAnnotationProcessor.java
index 42c5f72..fc2723b 100644
--- a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/FormParamAnnotationProcessor.java
@@ -17,13 +17,16 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import javax.ws.rs.Path;
+import javax.ws.rs.FormParam;
 
-import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 
-public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path, OasContext> {
+public class FormParamAnnotationProcessor implements ParamAnnotationProcessor<FormParam, ParameterContext> {
   @Override
-  public void process(Path path, OasContext context) {
-    context.setBasePath(path.value());
+  public void process(FormParam formParam, ParameterContext parameterContext) {
+
+    parameterContext.setIn(InType.FORM);
+    parameterContext.setName(formParam.value());
   }
 }
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HeaderParamAnnotationProcessor.java
similarity index 66%
copy from oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java
copy to oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HeaderParamAnnotationProcessor.java
index 1fdcc55..fa9baf9 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HeaderParamAnnotationProcessor.java
@@ -1,3 +1,4 @@
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -17,12 +18,15 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
-import org.springframework.web.bind.annotation.RequestPart;
+import javax.ws.rs.HeaderParam;
 
-public class RequestPartAnnotationProcessor implements ParamAnnotationProcessor<RequestPart, ParameterContext> {
-  @Override
-  public void process(RequestPart requestPart, ParameterContext parameterContext) {
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 
+public class HeaderParamAnnotationProcessor implements ParamAnnotationProcessor<HeaderParam, ParameterContext> {
+  @Override
+  public void process(HeaderParam headerParam, ParameterContext parameterContext) {
+    parameterContext.setIn(InType.HEADER);
+    parameterContext.setName(headerParam.value());
   }
 }
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HttpMethodAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HttpMethodAnnotationProcessor.java
index fbe0e83..6e46240 100644
--- a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HttpMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HttpMethodAnnotationProcessor.java
@@ -21,7 +21,7 @@ import java.lang.annotation.Annotation;
 
 import javax.ws.rs.HttpMethod;
 
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 
 public class HttpMethodAnnotationProcessor implements MethodAnnotationProcessor<Annotation, OperationContext> {
   @Override
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
index 42c5f72..783389c 100644
--- a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
@@ -19,7 +19,7 @@ package org.apache.servicecomb.toolkit.generator.annotation;
 
 import javax.ws.rs.Path;
 
-import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
 
 public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path, OasContext> {
   @Override
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathMethodAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathMethodAnnotationProcessor.java
index 187006c..9743c99 100644
--- a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathMethodAnnotationProcessor.java
@@ -19,7 +19,7 @@ package org.apache.servicecomb.toolkit.generator.annotation;
 
 import javax.ws.rs.Path;
 
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 
 public class PathMethodAnnotationProcessor implements MethodAnnotationProcessor<Path, OperationContext> {
   @Override
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathParamAnnotationProcessor.java
similarity index 66%
copy from oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
copy to oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathParamAnnotationProcessor.java
index 42c5f72..24b8cff 100644
--- a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathParamAnnotationProcessor.java
@@ -17,13 +17,15 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
 
-import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 
-public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path, OasContext> {
+public class PathParamAnnotationProcessor implements ParamAnnotationProcessor<PathParam, ParameterContext> {
   @Override
-  public void process(Path path, OasContext context) {
-    context.setBasePath(path.value());
+  public void process(PathParam pathParam, ParameterContext context) {
+    context.setIn(InType.PATH);
+    context.setName(pathParam.value());
   }
 }
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/QueryParamAnnotationProcessor.java
similarity index 65%
copy from oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
copy to oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/QueryParamAnnotationProcessor.java
index 42c5f72..01d3c08 100644
--- a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/QueryParamAnnotationProcessor.java
@@ -17,13 +17,15 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
 
-import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 
-public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path, OasContext> {
+public class QueryParamAnnotationProcessor implements ParamAnnotationProcessor<QueryParam, ParameterContext> {
   @Override
-  public void process(Path path, OasContext context) {
-    context.setBasePath(path.value());
+  public void process(QueryParam queryParam, ParameterContext parameterContext) {
+    parameterContext.setIn(InType.QUERY);
+    parameterContext.setName(queryParam.value());
   }
 }
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/parser/JaxRsAnnotationParser.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/parser/JaxRsAnnotationParser.java
index a5b0b12..a623e91 100644
--- a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/parser/JaxRsAnnotationParser.java
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/parser/JaxRsAnnotationParser.java
@@ -17,7 +17,10 @@
 
 package org.apache.servicecomb.toolkit.generator.parser;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.CookieParam;
 import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
 import javax.ws.rs.HEAD;
 import javax.ws.rs.OPTIONS;
@@ -25,10 +28,20 @@ import javax.ws.rs.PATCH;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
 
+import org.apache.servicecomb.toolkit.generator.annotation.ConsumesAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.CookieParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.FormParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.HeaderParamAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.HttpMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.PathClassAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.PathMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PathParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.QueryParamAnnotationProcessor;
+
+import io.swagger.v3.oas.annotations.headers.Header;
 
 public class JaxRsAnnotationParser extends AbstractAnnotationParser {
 
@@ -51,6 +64,18 @@ public class JaxRsAnnotationParser extends AbstractAnnotationParser {
     methodAnnotationMap.put(PUT.class, httpMethodAnnotationProcessor);
     methodAnnotationMap.put(OPTIONS.class, httpMethodAnnotationProcessor);
     methodAnnotationMap.put(HEAD.class, httpMethodAnnotationProcessor);
+    methodAnnotationMap.put(Consumes.class, new ConsumesAnnotationProcessor());
+  }
+
+  @Override
+  public void initParameterAnnotationProcessor() {
+    super.initParameterAnnotationProcessor();
+
+    parameterAnnotationMap.put(QueryParam.class, new QueryParamAnnotationProcessor());
+    parameterAnnotationMap.put(CookieParam.class, new CookieParamAnnotationProcessor());
+    parameterAnnotationMap.put(FormParam.class, new FormParamAnnotationProcessor());
+    parameterAnnotationMap.put(PathParam.class, new PathParamAnnotationProcessor());
+    parameterAnnotationMap.put(Header.class, new HeaderParamAnnotationProcessor());
   }
 
   @Override
diff --git a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsAnnotationProcessorTest.java b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsAnnotationProcessorTest.java
index 72f49e5..be36790 100644
--- a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsAnnotationProcessorTest.java
+++ b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsAnnotationProcessorTest.java
@@ -17,13 +17,29 @@
 
 package org.apache.servicecomb.toolkit.generator;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.CookieParam;
+import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
 import javax.ws.rs.HttpMethod;
 import javax.ws.rs.Path;
-
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
+
+import org.apache.servicecomb.toolkit.generator.annotation.AnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.ConsumesAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.CookieParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.FormParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.HeaderParamAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.HttpMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.PathClassAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.PathMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PathParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.QueryParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -70,6 +86,100 @@ public class JaxrsAnnotationProcessorTest {
     Assert.assertEquals("/path", operationContext.getPath());
   }
 
+  @Test
+  public void processConsumersAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext = new OperationContext(null, oasContext);
+    AnnotationProcessor annotationProcessor = new ConsumesAnnotationProcessor();
+
+    Consumes consumes = Mockito.mock(Consumes.class);
+    Mockito.when(consumes.value()).thenReturn(new String[] {MediaTypes.APPLICATION_JSON});
+    annotationProcessor.process(consumes, operationContext);
+
+    Assert.assertEquals(MediaTypes.APPLICATION_JSON, operationContext.getConsumers()[0]);
+  }
+
+  @Test
+  public void processCookieParamAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext = new OperationContext(null, oasContext);
+    ParameterContext parameterContext = new ParameterContext(operationContext, null);
+    AnnotationProcessor annotationProcessor = new CookieParamAnnotationProcessor();
+
+    CookieParam cookieParam = Mockito.mock(CookieParam.class);
+    Mockito.when(cookieParam.value()).thenReturn("param");
+    annotationProcessor.process(cookieParam, parameterContext);
+
+    Assert.assertEquals("param", parameterContext.getName());
+  }
+
+  @Test
+  public void processFormParamAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext = new OperationContext(null, oasContext);
+    ParameterContext parameterContext = new ParameterContext(operationContext, null);
+    AnnotationProcessor annotationProcessor = new FormParamAnnotationProcessor();
+
+    FormParam formParam = Mockito.mock(FormParam.class);
+    Mockito.when(formParam.value()).thenReturn("param");
+    annotationProcessor.process(formParam, parameterContext);
+
+    Assert.assertEquals("param", parameterContext.getName());
+    Assert.assertTrue(parameterContext.isRequestBody());
+  }
+
+  @Test
+  public void processHeaderParamAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext = new OperationContext(null, oasContext);
+    ParameterContext parameterContext = new ParameterContext(operationContext, null);
+    AnnotationProcessor annotationProcessor = new HeaderParamAnnotationProcessor();
+
+    HeaderParam headerParam = Mockito.mock(HeaderParam.class);
+    Mockito.when(headerParam.value()).thenReturn("param");
+    annotationProcessor.process(headerParam, parameterContext);
+
+    Assert.assertEquals("param", parameterContext.getName());
+    Assert.assertFalse(parameterContext.isRequestBody());
+  }
+
+  @Test
+  public void processPathParamAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext = new OperationContext(null, oasContext);
+    ParameterContext parameterContext = new ParameterContext(operationContext, null);
+    AnnotationProcessor annotationProcessor = new PathParamAnnotationProcessor();
+
+    PathParam pathParam = Mockito.mock(PathParam.class);
+    Mockito.when(pathParam.value()).thenReturn("param");
+    annotationProcessor.process(pathParam, parameterContext);
+
+    Assert.assertEquals("param", parameterContext.getName());
+    Assert.assertFalse(parameterContext.isRequestBody());
+  }
+
+
+  @Test
+  public void processQueryParamAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext = new OperationContext(null, oasContext);
+    ParameterContext parameterContext = new ParameterContext(operationContext, null);
+    AnnotationProcessor annotationProcessor = new QueryParamAnnotationProcessor();
+
+    QueryParam queryParam = Mockito.mock(QueryParam.class);
+    Mockito.when(queryParam.value()).thenReturn("param");
+    annotationProcessor.process(queryParam, parameterContext);
+
+    Assert.assertEquals("param", parameterContext.getName());
+    Assert.assertFalse(parameterContext.isRequestBody());
+  }
+
   class GetClass {
     @GET
     public String get() {
diff --git a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java
index cef30d2..2591de4 100644
--- a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java
+++ b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java
@@ -19,6 +19,7 @@ package org.apache.servicecomb.toolkit.generator;
 
 import javax.ws.rs.Path;
 
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
 import org.apache.servicecomb.toolkit.generator.parser.JaxRsAnnotationParser;
 import org.junit.Assert;
 import org.junit.Test;
diff --git a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/ServerOperationResource.java b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/ServerOperationResource.java
deleted file mode 100644
index 604e4f5..0000000
--- a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/ServerOperationResource.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.toolkit.generator;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.QueryParam;
-
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-
-@Path("")
-public class ServerOperationResource {
-
-  @Path("/serversoperation")
-  @GET
-  @ApiResponse(
-      responseCode = "500",
-      description = "voila!",
-      content = {
-          @Content(
-              mediaType = "application/json",
-              schema = @Schema(implementation = String.class)
-          ),
-          @Content(
-              mediaType = "application/xml",
-              schema = @Schema(implementation = String.class)
-          )
-      })
-  @ApiResponse(responseCode = "400")
-  @ApiResponse(responseCode = "404", description = "User not found")
-  @Operation(operationId = "getPet", description = "Pets Example")
-  public ResponseBean getPet() {
-    return new ResponseBean();
-  }
-
-
-  @Path("/serversoperation2")
-  @POST
-  @Operation(operationId = "getPet2", description = "Pets Example")
-  public String getPet2(@Parameter(required = true) @QueryParam("pet") String pet) {
-    return "";
-  }
-
-
-  @Path("/serversoperation3")
-  @POST
-  @Operation(operationId = "getPet3", description = "Pets Example")
-  public String getPet3(String[] pet1, String pet2, RequestBean[] requestBean) {
-    return "";
-  }
-
-  @Path("/serversoperation4")
-  @POST
-  @Operation(operationId = "getPet4", description = "Pets Example")
-  public String getPet4(String[] pet1, RequestBean responseBean) {
-    return "";
-  }
-
-  public String noResource() {
-    return "no resource";
-  }
-
-  class RequestBean {
-
-    private String name;
-
-    private String content;
-
-    public String getName() {
-      return name;
-    }
-
-    public void setName(String name) {
-      this.name = name;
-    }
-
-    public String getContent() {
-      return content;
-    }
-
-    public void setContent(String content) {
-      this.content = content;
-    }
-  }
-
-  class ResponseBean {
-
-    private String status;
-
-    private String content;
-
-    private RequestBean request;
-
-    public String getStatus() {
-      return status;
-    }
-
-    public void setStatus(String status) {
-      this.status = status;
-    }
-
-    public String getContent() {
-      return content;
-    }
-
-    public void setContent(String content) {
-      this.content = content;
-    }
-
-    public RequestBean getRequest() {
-      return request;
-    }
-
-    public void setRequest(RequestBean request) {
-      this.request = request;
-    }
-  }
-}
diff --git a/oas-generator/oas-generator-servicecomb/pom.xml b/oas-generator/oas-generator-servicecomb/pom.xml
index 55cf0c9..1b250c4 100644
--- a/oas-generator/oas-generator-servicecomb/pom.xml
+++ b/oas-generator/oas-generator-servicecomb/pom.xml
@@ -41,13 +41,11 @@
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>provider-rest-common</artifactId>
-      <version>1.2.0</version>
     </dependency>
 
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>provider-pojo</artifactId>
-      <version>1.2.0</version>
       <exclusions>
         <exclusion>
           <groupId>commons-lang</groupId>
diff --git a/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java
index beb42d5..bf26c42 100644
--- a/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java
+++ b/oas-generator/oas-generator-servicecomb/src/main/java/org/apache/servicecomb/toolkit/generator/parser/ServicecombPojoParser.java
@@ -21,7 +21,7 @@ import java.lang.reflect.Method;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.provider.pojo.RpcSchema;
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 
 import io.swagger.v3.oas.models.PathItem.HttpMethod;
 
diff --git a/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java b/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java
index 78c6bfc..d9cf795 100644
--- a/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java
+++ b/oas-generator/oas-generator-servicecomb/src/test/java/org/apache/servicecomb/toolkit/generator/ServiceCombParserTest.java
@@ -21,6 +21,7 @@ import javax.ws.rs.Path;
 
 import org.apache.servicecomb.provider.pojo.RpcSchema;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
 import org.apache.servicecomb.toolkit.generator.parser.ServicecombJaxrsParser;
 import org.apache.servicecomb.toolkit.generator.parser.ServicecombPojoParser;
 import org.apache.servicecomb.toolkit.generator.parser.ServicecombSpringmvcParser;
diff --git a/oas-generator/oas-generator-spring/pom.xml b/oas-generator/oas-generator-spring/pom.xml
index c2d70f0..7e832f5 100644
--- a/oas-generator/oas-generator-spring/pom.xml
+++ b/oas-generator/oas-generator-spring/pom.xml
@@ -35,7 +35,6 @@
     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-web</artifactId>
-      <version>5.2.0.RELEASE</version>
     </dependency>
   </dependencies>
 
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
index fe795ea..753f84e 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
@@ -21,8 +21,8 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import org.apache.servicecomb.toolkit.generator.HttpStatus;
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.HttpStatuses;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -78,7 +78,7 @@ public abstract class AbstractHttpMethodMappingAnnotationProcessor<Annotation, C
         content.addMediaType(produce, mediaType);
       }
       apiResponse.setContent(content);
-      operationContext.addResponse(HttpStatus.OK, apiResponse);
+      operationContext.addResponse(HttpStatuses.OK, apiResponse);
     }
   }
 }
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/DeleteMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/DeleteMappingMethodAnnotationProcessor.java
index a53736f..ffa871f 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/DeleteMappingMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/DeleteMappingMethodAnnotationProcessor.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/GetMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/GetMappingMethodAnnotationProcessor.java
index 7bbf769..43f9dc9 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/GetMappingMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/GetMappingMethodAnnotationProcessor.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathVariableAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathVariableAnnotationProcessor.java
index bc752f3..1c6de47 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathVariableAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathVariableAnnotationProcessor.java
@@ -18,24 +18,22 @@
 package org.apache.servicecomb.toolkit.generator.annotation;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 import org.apache.servicecomb.toolkit.generator.util.ParamUtils;
 import org.springframework.web.bind.annotation.PathVariable;
 
-import io.swagger.v3.oas.annotations.enums.ParameterIn;
-
 public class PathVariableAnnotationProcessor implements ParamAnnotationProcessor<PathVariable, ParameterContext> {
   @Override
   public void process(PathVariable pathVariable, ParameterContext parameterContext) {
-
     String paramName = pathVariable.name();
     if (StringUtils.isEmpty(paramName)) {
       paramName = ParamUtils
-          .getParamterName(parameterContext.getOperationContext().getMethod(), parameterContext.getParameter());
+          .getParameterName(parameterContext.getOperationContext().getMethod(), parameterContext.getParameter());
     }
 
+    parameterContext.setIn(InType.PATH);
     parameterContext.setName(paramName);
     parameterContext.setRequired(pathVariable.required());
-    parameterContext.setType(ParameterIn.PATH.toString());
   }
 }
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PostMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PostMappingMethodAnnotationProcessor.java
index 9848cca..9131c50 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PostMappingMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PostMappingMethodAnnotationProcessor.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PutMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PutMappingMethodAnnotationProcessor.java
index 53f4738..fc03129 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PutMappingMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PutMappingMethodAnnotationProcessor.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyAnnotationProcessor.java
index 2b0a114..a132596 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyAnnotationProcessor.java
@@ -17,13 +17,15 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 import org.springframework.web.bind.annotation.RequestBody;
 
 public class RequestBodyAnnotationProcessor implements ParamAnnotationProcessor<RequestBody, ParameterContext> {
 
   @Override
   public void process(RequestBody requestBody, ParameterContext parameterContext) {
+    parameterContext.setIn(InType.BODY);
     parameterContext.setRequired(requestBody.required());
   }
 }
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestHeaderAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestHeaderAnnotationProcessor.java
index ece07cc..4c04628 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestHeaderAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestHeaderAnnotationProcessor.java
@@ -18,18 +18,17 @@
 package org.apache.servicecomb.toolkit.generator.annotation;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.ValueConstants;
 
-import io.swagger.v3.oas.annotations.enums.ParameterIn;
-
 public class RequestHeaderAnnotationProcessor implements ParamAnnotationProcessor<RequestHeader, ParameterContext> {
 
   @Override
   public void process(RequestHeader requestHeader, ParameterContext parameterContext) {
-    parameterContext.setType(ParameterIn.HEADER.toString());
+    parameterContext.setIn(InType.HEADER);
     parameterContext.setRequired(requestHeader.required());
 
     if (!ObjectUtils.isEmpty(requestHeader.defaultValue()) && !ValueConstants.DEFAULT_NONE
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingClassAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingClassAnnotationProcessor.java
index a44bb0d..ad01f16 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingClassAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingClassAnnotationProcessor.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 public class RequestMappingClassAnnotationProcessor implements
@@ -31,7 +31,7 @@ public class RequestMappingClassAnnotationProcessor implements
       return;
     }
 
-    // swagger仅支持配一个basePath
+    // swagger only support one basePath
     if (paths.length > 1) {
       throw new Error("not support multi path for " + oasContext.getCls().getName());
     }
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingMethodAnnotationProcessor.java
index bdcc3fc..040f559 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingMethodAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingMethodAnnotationProcessor.java
@@ -17,7 +17,7 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 public class RequestMappingMethodAnnotationProcessor implements
@@ -31,7 +31,7 @@ public class RequestMappingMethodAnnotationProcessor implements
       return;
     }
 
-    // swagger仅支持配一个basePath
+    // swagger only support one basePath
     if (paths.length > 1) {
       throw new Error("not support multi path for " + operationContext.getMethod().getName());
     }
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestParamAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestParamAnnotationProcessor.java
index 8a127c3..7db9897 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestParamAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestParamAnnotationProcessor.java
@@ -18,7 +18,8 @@
 package org.apache.servicecomb.toolkit.generator.annotation;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ValueConstants;
@@ -27,6 +28,8 @@ public class RequestParamAnnotationProcessor implements ParamAnnotationProcessor
 
   @Override
   public void process(RequestParam requestParam, ParameterContext parameterContext) {
+
+    parameterContext.setIn(InType.QUERY);
     String name = requestParam.value();
     if (StringUtils.isEmpty(name)) {
       name = requestParam.name();
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java
index 1fdcc55..68c88d2 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java
@@ -17,12 +17,17 @@
 
 package org.apache.servicecomb.toolkit.generator.annotation;
 
-import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.MediaTypes;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext.InType;
 import org.springframework.web.bind.annotation.RequestPart;
 
 public class RequestPartAnnotationProcessor implements ParamAnnotationProcessor<RequestPart, ParameterContext> {
   @Override
   public void process(RequestPart requestPart, ParameterContext parameterContext) {
-
+    parameterContext.setIn(InType.BODY);
+    parameterContext.addConsume(MediaTypes.MULTIPART_FORM_DATA);
+    parameterContext.setRequired(requestPart.required());
+    parameterContext.setName(requestPart.name());
   }
 }
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java
index 59a65c3..d35621f 100644
--- a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java
@@ -17,20 +17,30 @@
 
 package org.apache.servicecomb.toolkit.generator.parser;
 
-import org.apache.servicecomb.toolkit.generator.OasContext;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
 import org.apache.servicecomb.toolkit.generator.annotation.GetMappingMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.PathVariableAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.PostMappingMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.PutMappingMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.RequestBodyAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestHeaderAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.RequestMappingClassAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.RequestMappingMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestPartAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.bind.annotation.RestController;
 
 public class SpringmvcAnnotationParser extends AbstractAnnotationParser {
@@ -73,6 +83,20 @@ public class SpringmvcAnnotationParser extends AbstractAnnotationParser {
     super.initParameterAnnotationProcessor();
     parameterAnnotationMap.put(PathVariable.class, new PathVariableAnnotationProcessor());
     parameterAnnotationMap.put(RequestBody.class, new RequestBodyAnnotationProcessor());
+    parameterAnnotationMap.put(RequestPart.class, new RequestPartAnnotationProcessor());
+    parameterAnnotationMap.put(RequestParam.class, new RequestParamAnnotationProcessor());
+    parameterAnnotationMap.put(RequestHeader.class, new RequestHeaderAnnotationProcessor());
+  }
+
+  public static void main(String[] args) {
+    List<Integer> integers = new ArrayList<>();
+    integers.add(1);
+    integers.add(2);
+    integers.add(5);
+    integers.add(3);
+    integers.sort(Comparator.comparingInt(Integer::intValue));
+
+    integers.forEach(System.out::println);
   }
 }
 
diff --git a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java
index de047f9..adfd48a 100644
--- a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java
+++ b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java
@@ -31,6 +31,9 @@ import org.apache.servicecomb.toolkit.generator.annotation.RequestMappingClassAn
 import org.apache.servicecomb.toolkit.generator.annotation.RequestMappingMethodAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.RequestParamAnnotationProcessor;
 import org.apache.servicecomb.toolkit.generator.annotation.RequestPartAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
+import org.apache.servicecomb.toolkit.generator.context.OperationContext;
+import org.apache.servicecomb.toolkit.generator.context.ParameterContext;
 import org.junit.Assert;
 import org.junit.Test;
 import org.springframework.web.bind.annotation.DeleteMapping;
@@ -117,7 +120,7 @@ public class SpringAnnotationProcessorTest {
     operationContext = new OperationContext(requestParamMethod, oasContext);
     parameterContext = new ParameterContext(operationContext, requestParamMethodParam);
     requestParamAnnotationProcessor.process(requestParamAnnotation, parameterContext);
-    io.swagger.v3.oas.models.parameters.Parameter oasParameter = parameterContext.toOasParameter();
+    io.swagger.v3.oas.models.parameters.Parameter oasParameter = parameterContext.toParameter();
     Assert.assertNull(parameterContext.getDefaultValue());
     Assert.assertNull(oasParameter.getSchema().getDefault());
 
@@ -129,7 +132,7 @@ public class SpringAnnotationProcessorTest {
     operationContext = new OperationContext(pathVariableMethod, oasContext);
     parameterContext = new ParameterContext(operationContext, pathVariableMethodParam);
     pathVariableAnnotationProcessor.process(pathVariableAnnotation, parameterContext);
-    parameterContext.toOasParameter();
+    parameterContext.toParameter();
     Assert.assertTrue(parameterContext.isRequired());
 
     RequestPartAnnotationProcessor requestPartAnnotationProcessor = new RequestPartAnnotationProcessor();
@@ -140,7 +143,7 @@ public class SpringAnnotationProcessorTest {
     operationContext = new OperationContext(requestPartMethod, oasContext);
     parameterContext = new ParameterContext(operationContext, requestPartMethodParam);
     requestPartAnnotationProcessor.process(requestPartParamAnnotation, parameterContext);
-    oasParameter = parameterContext.toOasParameter();
+    oasParameter = parameterContext.toParameter();
     Assert.assertNull(parameterContext.getDefaultValue());
     Assert.assertEquals(FileSchema.class, oasParameter.getSchema().getClass());
 
@@ -152,7 +155,7 @@ public class SpringAnnotationProcessorTest {
     operationContext = new OperationContext(requestPartMethod, oasContext);
     parameterContext = new ParameterContext(operationContext, requestHeaderMethodParam);
     requestHeaderAnnotationProcessor.process(requestHeaderParamAnnotation, parameterContext);
-    oasParameter = parameterContext.toOasParameter();
+    oasParameter = parameterContext.toParameter();
     Assert.assertNull(parameterContext.getDefaultValue());
     Assert.assertNull(oasParameter.getSchema().getDefault());
 
@@ -164,7 +167,7 @@ public class SpringAnnotationProcessorTest {
     operationContext = new OperationContext(requestBodyMethod, oasContext);
     parameterContext = new ParameterContext(operationContext, requestBodyMethodParam);
     requestBodyAnnotationProcessor.process(requestBodyParamAnnotation, parameterContext);
-    parameterContext.toOasParameter();
+    parameterContext.toParameter();
     Assert.assertTrue(parameterContext.isRequired());
   }
 
diff --git a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java
index fd8dfb2..3acce3d 100644
--- a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java
+++ b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.servicecomb.toolkit.generator;
 
+import org.apache.servicecomb.toolkit.generator.context.OasContext;
 import org.apache.servicecomb.toolkit.generator.parser.SpringmvcAnnotationParser;
 import org.junit.Assert;
 import org.junit.Test;
diff --git a/oas-generator/pom.xml b/oas-generator/pom.xml
index 9603fdb..3477019 100644
--- a/oas-generator/pom.xml
+++ b/oas-generator/pom.xml
@@ -34,34 +34,99 @@
 
   <artifactId>oas-generator</artifactId>
 
-  <dependencies>
-    <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-module-junit4</artifactId>
-      <version>1.6.2</version>
-      <scope>test</scope>
-    </dependency>
+  <properties>
+    <swagger.version>2.0.10</swagger.version>
+    <junit.version>4.12</junit.version>
+    <asm.version>7.2</asm.version>
+    <powermock.version>1.6.2</powermock.version>
+    <javachassis.version>1.2.0</javachassis.version>
+    <spring.version>5.1.6.RELEASE</spring.version>
+  </properties>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>io.swagger.core.v3</groupId>
+        <artifactId>swagger-models</artifactId>
+        <version>${swagger.version}</version>
+      </dependency>
 
-    <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-api-mockito</artifactId>
-      <version>1.6.2</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
+      <dependency>
+        <groupId>io.swagger.core.v3</groupId>
+        <artifactId>swagger-annotations</artifactId>
+        <version>${swagger.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>io.swagger.core.v3</groupId>
+        <artifactId>swagger-core</artifactId>
+        <version>${swagger.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>junit</groupId>
+        <artifactId>junit</artifactId>
+        <version>${junit.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.ow2.asm</groupId>
+        <artifactId>asm</artifactId>
+        <version>${asm.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>javax.ws.rs</groupId>
+        <artifactId>javax.ws.rs-api</artifactId>
+        <version>2.1</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.apache.servicecomb</groupId>
+        <artifactId>provider-rest-common</artifactId>
+        <version>${javachassis.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.apache.servicecomb</groupId>
+        <artifactId>provider-pojo</artifactId>
+        <version>${javachassis.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.springframework</groupId>
+        <artifactId>spring-web</artifactId>
+        <version>${spring.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.powermock</groupId>
+        <artifactId>powermock-module-junit4</artifactId>
+        <version>${powermock.version}</version>
+        <scope>test</scope>
+      </dependency>
+
+      <dependency>
+        <groupId>org.powermock</groupId>
+        <artifactId>powermock-api-mockito</artifactId>
+        <version>${powermock.version}</version>
+        <scope>test</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
 
   <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.8.1</version>
-        <configuration>
-          <target>1.8</target>
-          <source>1.8</source>
-        </configuration>
-      </plugin>
-    </plugins>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.3</version>
+          <configuration>
+            <target>1.8</target>
+            <source>1.8</source>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
   </build>
-
 </project>
\ No newline at end of file
diff --git a/samples/generate-from-code-sample/GoodbyeService/src/main/java/org/apache/servicecomb/toolkit/goodbye/GoodbyeController.java b/samples/generate-from-code-sample/GoodbyeService/src/main/java/org/apache/servicecomb/toolkit/goodbye/GoodbyeController.java
index a9ed58a..8d627a5 100644
--- a/samples/generate-from-code-sample/GoodbyeService/src/main/java/org/apache/servicecomb/toolkit/goodbye/GoodbyeController.java
+++ b/samples/generate-from-code-sample/GoodbyeService/src/main/java/org/apache/servicecomb/toolkit/goodbye/GoodbyeController.java
@@ -17,15 +17,19 @@
 
 package org.apache.servicecomb.toolkit.goodbye;
 
+import javax.servlet.http.Part;
+
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 @RestController
 public class GoodbyeController {
 
   @GetMapping("/goodbye/{name}")
-  public String sayGoodbye(@PathVariable("name") String name) {
+  public String sayGoodbye(@PathVariable("name") String name, @RequestPart MultipartFile file, @RequestPart Part part) {
     return "Goodbye," + name;
   }
 }
diff --git a/toolkit-maven-plugin/src/main/java/org/apache/servicecomb/toolkit/plugin/GenerateUtil.java b/toolkit-maven-plugin/src/main/java/org/apache/servicecomb/toolkit/plugin/GenerateUtil.java
index f0dbb00..81f7e93 100755
--- a/toolkit-maven-plugin/src/main/java/org/apache/servicecomb/toolkit/plugin/GenerateUtil.java
+++ b/toolkit-maven-plugin/src/main/java/org/apache/servicecomb/toolkit/plugin/GenerateUtil.java
@@ -68,7 +68,7 @@ class GenerateUtil {
     contractConfig.put("outputDir", contractOutput);
     contractConfig.put("contractFileType", contractFileType);
 
-    // TODO: support users to add other getGenerator type soon
+    // TODO: support users to addParamCtx other getGenerator type soon
     ContractsGenerator contractGenerator = GeneratorFactory.getGenerator(ContractsGenerator.class, type);
     Objects.requireNonNull(contractGenerator).configure(contractConfig);
 
@@ -77,7 +77,7 @@ class GenerateUtil {
 
   static void generateDocument(String contractLocation, String documentOutput, String type) throws IOException {
 
-    // TODO: support users to add other getGenerator type soon
+    // TODO: support users to addParamCtx other getGenerator type soon
     DocGenerator docGenerator = GeneratorFactory.getGenerator(DocGenerator.class, type);
     if (docGenerator == null) {
       throw new RuntimeException("Cannot found document generator's implementation");


[servicecomb-toolkit] 09/10: reduce test log

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit e5c71a39d488458fe060d71eff68f09459f8d073
Author: kakulisen <18...@163.com>
AuthorDate: Tue Nov 12 14:12:00 2019 +0800

    reduce test log
    
    Signed-off-by: kakulisen <18...@163.com>
---
 cli/pom.xml                                        |  2 +-
 cli/src/test/resources/log4j2-test.xml             | 26 ++++++++++++++++
 codegen/pom.xml                                    | 29 ++++++++++++++++++
 codegen/src/test/resources/log4j2-test.xml         | 26 ++++++++++++++++
 contractgen/src/test/resources/log4j2-test.xml     | 35 ++++++++++++++++++++++
 .../toolkit/generator/JaxrsParserTest.java         |  8 -----
 .../toolkit/plugin/InvokeStaticMethodTest.java     |  2 ++
 .../src/test/resources/log4j2-test.xml             | 26 ++++++++++++++++
 8 files changed, 145 insertions(+), 9 deletions(-)

diff --git a/cli/pom.xml b/cli/pom.xml
index 4499804..00618bf 100644
--- a/cli/pom.xml
+++ b/cli/pom.xml
@@ -30,7 +30,7 @@
 
   <properties>
     <main.class>org.apache.servicecomb.toolkit.cli.ToolkitMain</main.class>
-    <log4j2.version>2.11.0</log4j2.version>
+    <log4j2.version>2.3</log4j2.version>
   </properties>
 
   <dependencies>
diff --git a/cli/src/test/resources/log4j2-test.xml b/cli/src/test/resources/log4j2-test.xml
new file mode 100755
index 0000000..c085ac3
--- /dev/null
+++ b/cli/src/test/resources/log4j2-test.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!--this is sample configuration, please modify as your wish-->
+
+<configuration>
+  <loggers>
+    <logger name="org.openapitools" additivity="false" level="OFF">
+    </logger>
+  </loggers>
+</configuration>
\ No newline at end of file
diff --git a/codegen/pom.xml b/codegen/pom.xml
index 8871d42..4963938 100644
--- a/codegen/pom.xml
+++ b/codegen/pom.xml
@@ -34,6 +34,7 @@
     <swagger-codegen-version>2.4.3</swagger-codegen-version>
     <maven-plugin-version>1.0.0</maven-plugin-version>
     <junit-version>4.8.1</junit-version>
+    <log4j2.version>2.3</log4j2.version>
   </properties>
 
   <dependencies>
@@ -55,10 +56,38 @@
           <groupId>com.google.guava</groupId>
           <artifactId>listenablefuture</artifactId>
         </exclusion>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-simple</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
 
     <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-slf4j-impl</artifactId>
+      <version>${log4j2.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+      <version>${log4j2.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <version>${log4j2.version}</version>
+    </dependency>
+
+    <dependency><!-- 桥接:告诉commons logging使用Log4j2 -->
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-jcl</artifactId>
+      <version>${log4j2.version}</version>
+    </dependency>
+
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
diff --git a/codegen/src/test/resources/log4j2-test.xml b/codegen/src/test/resources/log4j2-test.xml
new file mode 100755
index 0000000..c085ac3
--- /dev/null
+++ b/codegen/src/test/resources/log4j2-test.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!--this is sample configuration, please modify as your wish-->
+
+<configuration>
+  <loggers>
+    <logger name="org.openapitools" additivity="false" level="OFF">
+    </logger>
+  </loggers>
+</configuration>
\ No newline at end of file
diff --git a/contractgen/src/test/resources/log4j2-test.xml b/contractgen/src/test/resources/log4j2-test.xml
new file mode 100755
index 0000000..59976dc
--- /dev/null
+++ b/contractgen/src/test/resources/log4j2-test.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!--this is sample configuration, please modify as your wish-->
+
+<configuration>
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%m%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <Root level="info">
+      <AppenderRef ref="Console"/>
+    </Root>
+    <Logger name="org.openapitools" additivity="false" level="ERROR">
+      <AppenderRef ref="Console"/>
+    </Logger>
+  </Loggers>
+</configuration>
\ No newline at end of file
diff --git a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java
index 2591de4..27ef273 100644
--- a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java
+++ b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java
@@ -56,12 +56,4 @@ public class JaxrsParserTest {
       return "no resource";
     }
   }
-
-  public static void main(String[] args) {
-    OneResource.class.getMethods();
-    Components components1 = new Components();
-    Components components2 = new Components();
-
-    System.out.println(components1.equals(components2));
-  }
 }
diff --git a/toolkit-maven-plugin/src/test/java/org/apache/servicecomb/toolkit/plugin/InvokeStaticMethodTest.java b/toolkit-maven-plugin/src/test/java/org/apache/servicecomb/toolkit/plugin/InvokeStaticMethodTest.java
index e66cd70..8c9aab1 100755
--- a/toolkit-maven-plugin/src/test/java/org/apache/servicecomb/toolkit/plugin/InvokeStaticMethodTest.java
+++ b/toolkit-maven-plugin/src/test/java/org/apache/servicecomb/toolkit/plugin/InvokeStaticMethodTest.java
@@ -41,11 +41,13 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 @RunWith(PowerMockRunner.class)
 @PrepareForTest({FileUtils.class, GenerateUtil.class})
+@PowerMockIgnore({"javax.management.*"})
 public class InvokeStaticMethodTest {
 
   @Rule
diff --git a/toolkit-maven-plugin/src/test/resources/log4j2-test.xml b/toolkit-maven-plugin/src/test/resources/log4j2-test.xml
new file mode 100755
index 0000000..c085ac3
--- /dev/null
+++ b/toolkit-maven-plugin/src/test/resources/log4j2-test.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!--this is sample configuration, please modify as your wish-->
+
+<configuration>
+  <loggers>
+    <logger name="org.openapitools" additivity="false" level="OFF">
+    </logger>
+  </loggers>
+</configuration>
\ No newline at end of file


[servicecomb-toolkit] 01/10: add oas-generator to generate openapi v3

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit dc85d20a22f17451e30a2f6780e39acee1203393
Author: kakulisen <18...@163.com>
AuthorDate: Sat Oct 26 09:01:21 2019 +0800

    add oas-generator to generate openapi v3
    
    Signed-off-by: kakulisen <18...@163.com>
---
 oas-generator/oas-generator-core/pom.xml           |  68 ++++++++
 .../servicecomb/toolkit/generator/HttpStatus.java  |  24 +++
 .../toolkit/generator/MediaTypeConst.java          |  54 ++++++
 .../servicecomb/toolkit/generator/OasContext.java  | 151 ++++++++++++++++
 .../toolkit/generator/OasGenerator.java            |  63 +++++++
 .../toolkit/generator/OperationContext.java        | 192 +++++++++++++++++++++
 .../toolkit/generator/ParameterContext.java        | 141 +++++++++++++++
 .../generator/annotation/AnnotationProcessor.java  |  22 +++
 .../ApiResponseMethodAnnotationProcessor.java      |  63 +++++++
 .../ApiResponsesMethodAnnotationProcessor.java     |  39 +++++
 .../annotation/ClassAnnotationProcessor.java       |  21 +++
 .../annotation/MethodAnnotationProcessor.java      |  21 +++
 .../generator/annotation/ModelInterceptor.java     |  28 +++
 .../OperationMethodAnnotationProcessor.java        |  57 ++++++
 .../annotation/ParamAnnotationProcessor.java       |  21 +++
 .../annotation/ParameterAnnotationProcessor.java   |  53 ++++++
 .../generator/parser/AbstractAnnotationParser.java | 152 ++++++++++++++++
 .../parser/api/OpenApiAnnotationParser.java        |  57 ++++++
 .../generator/util/ArrayModelConverter.java        |  55 ++++++
 .../generator/util/LocalVariableVisitor.java       |  71 ++++++++
 .../toolkit/generator/util/ModelConverter.java     | 142 +++++++++++++++
 .../toolkit/generator/util/ParamUtils.java         | 122 +++++++++++++
 .../toolkit/generator/AnnotationProcessorTest.java | 129 ++++++++++++++
 .../toolkit/generator/OasGeneratorTest.java        |  90 ++++++++++
 .../servicecomb/toolkit/generator/ParserTest.java  |  55 ++++++
 .../servicecomb/toolkit/generator/UtilsTest.java   |  83 +++++++++
 oas-generator/pom.xml                              |  64 +++++++
 27 files changed, 2038 insertions(+)

diff --git a/oas-generator/oas-generator-core/pom.xml b/oas-generator/oas-generator-core/pom.xml
new file mode 100644
index 0000000..1a7a35c
--- /dev/null
+++ b/oas-generator/oas-generator-core/pom.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>oas-generator</artifactId>
+    <groupId>org.apache.servicecomb.toolkit</groupId>
+    <version>0.2.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>oas-generator-core</artifactId>
+
+  <properties>
+    <swagger.version>2.0.9</swagger.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>io.swagger.core.v3</groupId>
+      <artifactId>swagger-models</artifactId>
+      <version>${swagger.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.swagger.core.v3</groupId>
+      <artifactId>swagger-annotations</artifactId>
+      <version>${swagger.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.swagger.core.v3</groupId>
+      <artifactId>swagger-core</artifactId>
+      <version>${swagger.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.12</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.ow2.asm</groupId>
+      <artifactId>asm</artifactId>
+      <version>7.2</version>
+    </dependency>
+
+  </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
new file mode 100644
index 0000000..00a12e3
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/HttpStatus.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+public class HttpStatus {
+
+  public static String OK = "200";
+
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypeConst.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypeConst.java
new file mode 100644
index 0000000..624e143
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/MediaTypeConst.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+/**
+ * Common media type constants
+ *
+ * @see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7">HTTP/1.1 section 3.7</a>
+ */
+public class MediaTypeConst {
+
+  public final static String WILDCARD = "*/*";
+
+  public final static String APPLICATION_XML = "application/xml";
+
+  public final static String APPLICATION_ATOM_XML = "application/atom+xml";
+
+  public final static String APPLICATION_XHTML_XML = "application/xhtml+xml";
+
+  public final static String APPLICATION_SVG_XML = "application/svg+xml";
+
+  public final static String APPLICATION_JSON = "application/json";
+
+  public final static String APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded";
+
+  public final static String MULTIPART_FORM_DATA = "multipart/form-data";
+
+  public final static String APPLICATION_OCTET_STREAM = "application/octet-stream";
+
+  public final static String TEXT_PLAIN = "text/plain";
+
+  public final static String TEXT_XML = "text/xml";
+
+  public final static String TEXT_HTML = "text/html";
+
+  public final static String SERVER_SENT_EVENTS = "text/event-stream";
+
+  public final static String APPLICATION_JSON_PATCH_JSON = "application/json-patch+json";
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasContext.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasContext.java
new file mode 100644
index 0000000..3be7edb
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasContext.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.PathItem;
+import io.swagger.v3.oas.models.PathItem.HttpMethod;
+import io.swagger.v3.oas.models.Paths;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.servers.Server;
+
+public class OasContext {
+
+  private OpenAPI openAPI;
+
+  private String basePath;
+
+  private Class<?> cls;
+
+  private List<OperationContext> operationList = new ArrayList<>();
+
+  private OpenApiAnnotationParser parser;
+
+  public OasContext(OpenApiAnnotationParser parser) {
+    this(new OpenAPI(), parser);
+  }
+
+  public OasContext(OpenAPI openAPI, OpenApiAnnotationParser parser) {
+    this.openAPI = openAPI;
+    this.parser = parser;
+  }
+
+  public OpenAPI toOpenAPI() {
+    ensurePaths();
+    for (OperationContext operationCtx : operationList) {
+      if (!operationCtx.hasOperation()) {
+        continue;
+      }
+
+      if (openAPI.getPaths() == null) {
+        openAPI.setPaths(new Paths());
+      }
+
+      PathItem pathItem = openAPI.getPaths().get(operationCtx.getPath());
+      if (pathItem == null) {
+        pathItem = new PathItem();
+        openAPI.path(operationCtx.getPath(), pathItem);
+      }
+      pathItem.operation(HttpMethod.valueOf(operationCtx.getHttpMethod()), operationCtx.toOperation());
+    }
+
+    // 如果没有restful资源则返回null
+    if (openAPI.getPaths() == null || openAPI.getPaths().size() == 0) {
+      return null;
+    }
+
+    openAPI.info(new Info().title("gen").version("1.0.0"));
+
+    correctBasepath();
+    correctComponents();
+
+    openAPI.servers(Collections.singletonList(new Server().url(basePath)));
+
+    return openAPI;
+  }
+
+  private void correctComponents() {
+    Components nullComponents = new Components();
+    if (nullComponents.equals(getComponents())) {
+      openAPI.setComponents(null);
+    }
+  }
+
+  private void correctBasepath() {
+    if (StringUtils.isEmpty(basePath)) {
+      basePath = "/";
+    }
+
+    if (!basePath.startsWith("/")) {
+      basePath = "/" + basePath;
+    }
+  }
+
+  public Components getComponents() {
+    if (openAPI.getComponents() == null) {
+      openAPI.setComponents(new Components());
+    }
+    return openAPI.getComponents();
+  }
+
+  private void ensurePaths() {
+    if (openAPI.getPaths() == null) {
+      openAPI.setPaths(new Paths());
+    }
+  }
+
+  public OpenApiAnnotationParser getParser() {
+    return parser;
+  }
+
+  public void setParser(OpenApiAnnotationParser parser) {
+    this.parser = parser;
+  }
+
+  public OpenAPI getOpenAPI() {
+    return openAPI;
+  }
+
+  public String getBasePath() {
+    return basePath;
+  }
+
+  public Class<?> getCls() {
+    return cls;
+  }
+
+  public void setCls(Class<?> cls) {
+    this.cls = cls;
+  }
+
+  public void setBasePath(String basePath) {
+    this.basePath = basePath;
+  }
+
+  public void addOperation(OperationContext operation) {
+    operationList.add(operation);
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasGenerator.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasGenerator.java
new file mode 100644
index 0000000..540f320
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OasGenerator.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.ServiceLoader;
+import java.util.Set;
+
+import org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
+
+import io.swagger.v3.oas.models.OpenAPI;
+
+public class OasGenerator {
+
+  private static List<OpenApiAnnotationParser> parserList = new ArrayList<>();
+
+  static {
+    ServiceLoader.load(OpenApiAnnotationParser.class).forEach(parserList::add);
+  }
+
+  public OpenAPI generate(Class<?> cls) {
+
+    Optional<OpenApiAnnotationParser> parserOptional = parserList.stream().filter(parser -> parser.canProcess(cls))
+        .findFirst();
+
+    if (!parserOptional.isPresent()) {
+      return null;
+    }
+    OasContext context = new OasContext(parserOptional.get());
+    parserOptional.get().parser(cls, context);
+    return context.toOpenAPI();
+  }
+
+  public List<OpenAPI> generate(Set<Class> classes) {
+
+    List<OpenAPI> openApiList = new ArrayList<>();
+    for (Class cls : classes) {
+      OpenAPI openAPI = generate(cls);
+      if (openAPI != null) {
+        openApiList.add(openAPI);
+      }
+    }
+
+    return openApiList;
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java
new file mode 100644
index 0000000..b8bca12
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/OperationContext.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
+import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.Operation;
+import io.swagger.v3.oas.models.media.Content;
+import io.swagger.v3.oas.models.media.MediaType;
+import io.swagger.v3.oas.models.media.Schema;
+import io.swagger.v3.oas.models.parameters.Parameter;
+import io.swagger.v3.oas.models.responses.ApiResponse;
+import io.swagger.v3.oas.models.responses.ApiResponses;
+
+public class OperationContext {
+
+  private OasContext parentContext;
+
+  private Method method;
+
+  private Operation operation = new Operation();
+
+  private String operationId;
+
+  private String path;
+
+  private String httpMethod;
+
+  private ApiResponses apiResponses = new ApiResponses();
+
+  private List<ParameterContext> parameterContextList = new ArrayList<>();
+
+  private OpenApiAnnotationParser parser;
+
+  public OperationContext(Method method, OasContext parentContext) {
+    this.parentContext = parentContext;
+    this.method = method;
+    this.parser = parentContext.getParser();
+    this.parentContext.addOperation(this);
+  }
+
+  public void addParameter(ParameterContext context) {
+    parameterContextList.add(context);
+  }
+
+  public OpenApiAnnotationParser getParser() {
+    return parser;
+  }
+
+  public boolean hasOperation() {
+    return httpMethod != null && method != null;
+  }
+
+  public Operation toOperation() {
+
+    if (!hasOperation()) {
+      return null;
+    }
+
+    if (StringUtils.isEmpty(operationId)) {
+      operationId = method.getName();
+    }
+
+    operation.operationId(operationId);
+    correctResponse(apiResponses);
+    operation.setResponses(apiResponses);
+
+    // 处理参数
+    List<Parameter> parameterList = parameterContextList.stream()
+        .map(parameterContext -> parameterContext.toOasParameter())
+        .filter(parameter -> parameter != null)
+        .collect(Collectors.toList());
+
+    if (parameterList.size() > 0) {
+      operation.parameters(parameterList);
+    }
+
+    return operation;
+  }
+
+  public void correctResponse(ApiResponses apiResponses) {
+
+    if (apiResponses == null) {
+      return;
+    }
+    // 处理响应
+    // 没有注解被处理
+    if (apiResponses.get(HttpStatus.OK) == null) {
+      ApiResponse apiResponse = new ApiResponse();
+
+      Class<?> returnType = method.getReturnType();
+      if (returnType == Void.TYPE || returnType == Void.class) {
+        return;
+      }
+
+      MediaType mediaType = new MediaType();
+
+      Schema refSchema = ModelConverter.getSchema(returnType, getComponents());
+      mediaType.schema(refSchema);
+
+      Content content = new Content();
+      content.addMediaType(MediaTypeConst.TEXT_PLAIN, mediaType);
+
+      apiResponse.description("OK");
+      apiResponse.setContent(content);
+      apiResponses.addApiResponse(HttpStatus.OK, apiResponse);
+    }
+  }
+
+  public Components getComponents() {
+    return parentContext.getComponents();
+  }
+
+  public void addResponse(String key, ApiResponse response) {
+    apiResponses.addApiResponse(key, response);
+  }
+
+  public ApiResponses getApiResponses() {
+    return apiResponses;
+  }
+
+  public void setApiResponses(ApiResponses apiResponses) {
+    this.apiResponses = apiResponses;
+  }
+
+  public String getOperationId() {
+    return operationId;
+  }
+
+  public void setOperationId(String operationId) {
+    this.operationId = operationId;
+  }
+
+  public String getPath() {
+    return path;
+  }
+
+  public void setPath(String path) {
+    this.path = path;
+  }
+
+  public Operation getOperation() {
+    return operation;
+  }
+
+  public OpenAPI getOpenAPI() {
+    return parentContext.getOpenAPI();
+  }
+
+  public Method getMethod() {
+    return method;
+  }
+
+  public OasContext getOpenApiContext() {
+    return parentContext;
+  }
+
+  public String getHttpMethod() {
+    return httpMethod;
+  }
+
+  public void setHttpMethod(String httpMethod) {
+    if (this.httpMethod != null) {
+      throw new IllegalArgumentException(String.format("too many http method in the method %s", method.getName()));
+    }
+    this.httpMethod = httpMethod.toUpperCase();
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/ParameterContext.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/ParameterContext.java
new file mode 100644
index 0000000..15e6721
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/ParameterContext.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import java.lang.reflect.Parameter;
+import java.lang.reflect.Type;
+
+import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
+import org.apache.servicecomb.toolkit.generator.util.ParamUtils;
+
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.media.Schema;
+
+public class ParameterContext {
+
+  private OperationContext parentContext;
+
+  private boolean required;
+
+  private String name;
+
+  Parameter parameter;
+
+  private Object defaultValue;
+
+
+  io.swagger.v3.oas.models.parameters.Parameter oasParameter = new io.swagger.v3.oas.models.parameters.Parameter();
+
+  public ParameterContext(OperationContext parentContext, Parameter parameter) {
+    this.parentContext = parentContext;
+    this.parameter = parameter;
+    this.parentContext.addParameter(this);
+  }
+
+
+  public io.swagger.v3.oas.models.parameters.Parameter toOasParameter() {
+
+    if (parameter == null) {
+      return null;
+    }
+    ensureName();
+    if (oasParameter.getSchema() == null) {
+      Schema refSchema = ModelConverter.getSchema(parameter.getType(), getComponents());
+      oasParameter.schema(refSchema);
+    }
+
+    if (oasParameter.getIn() == null) {
+      oasParameter.setIn(ParameterIn.QUERY.toString());
+    }
+
+    if (defaultValue != null) {
+      required = false;
+      oasParameter.getSchema().setDefault(defaultValue);
+    }
+
+    oasParameter.setRequired(required);
+
+    return oasParameter;
+  }
+
+  private void ensureName() {
+    if (name == null) {
+      // 尝试获取实际参数名
+      name = ParamUtils.getParamterName(parentContext.getMethod(), parameter);
+    }
+
+    if (name == null) {
+      name = parameter.getName();
+    }
+
+    oasParameter.setName(name);
+  }
+
+  public OperationContext getOperationContext() {
+    return parentContext;
+  }
+
+  public Type getActualType() {
+    return parameter.getParameterizedType();
+  }
+
+  public Object getDefaultValue() {
+    return defaultValue;
+  }
+
+  public void setDefaultValue(Object defaultValue) {
+    this.defaultValue = defaultValue;
+  }
+
+  public Components getComponents() {
+    return parentContext.getComponents();
+  }
+
+  public io.swagger.v3.oas.models.parameters.Parameter getOasParameter() {
+    return oasParameter;
+  }
+
+  public Parameter getParameter() {
+    return parameter;
+  }
+
+  public void setParameter(Parameter parameter) {
+    this.parameter = parameter;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public boolean isRequired() {
+    return required;
+  }
+
+  public void setRequired(boolean required) {
+    this.required = required;
+  }
+
+  public void setType(String type) {
+    oasParameter.setIn(type);
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AnnotationProcessor.java
new file mode 100644
index 0000000..5827b55
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AnnotationProcessor.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+public interface AnnotationProcessor<Annotation, Context> {
+  void process(Annotation annotation, Context context);
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponseMethodAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponseMethodAnnotationProcessor.java
new file mode 100644
index 0000000..3cbbe0a
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponseMethodAnnotationProcessor.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import java.util.Optional;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+
+import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.models.media.MediaType;
+
+public class ApiResponseMethodAnnotationProcessor implements
+    MethodAnnotationProcessor<ApiResponse, OperationContext> {
+  @Override
+  public void process(ApiResponse response, OperationContext context) {
+
+    io.swagger.v3.oas.models.responses.ApiResponse apiResponse = new io.swagger.v3.oas.models.responses.ApiResponse();
+
+    Content[] contentAnnotations = response.content();
+    Optional.ofNullable(contentAnnotations).ifPresent(contents -> {
+      for (Content contentAnnotation : contents) {
+        io.swagger.v3.oas.models.media.Content content = new io.swagger.v3.oas.models.media.Content();
+        MediaType mediaType = new MediaType();
+        content.addMediaType(contentAnnotation.mediaType(), mediaType);
+        apiResponse.setContent(content);
+      }
+    });
+
+    if (StringUtils.isNotEmpty(response.description())) {
+      apiResponse.setDescription(response.description());
+    }
+
+    Header[] headersAnnotation = response.headers();
+    Optional.ofNullable(headersAnnotation).ifPresent(headers -> {
+      for (Header headerAnnotation : headers) {
+        io.swagger.v3.oas.models.headers.Header header = new io.swagger.v3.oas.models.headers.Header();
+        header.description(headerAnnotation.description());
+        header.deprecated(headerAnnotation.deprecated());
+        apiResponse.addHeaderObject(headerAnnotation.name(), header);
+      }
+    });
+
+    context.addResponse(response.responseCode(), apiResponse);
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponsesMethodAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponsesMethodAnnotationProcessor.java
new file mode 100644
index 0000000..54747ae
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ApiResponsesMethodAnnotationProcessor.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import java.util.Arrays;
+
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+
+public class ApiResponsesMethodAnnotationProcessor implements
+    MethodAnnotationProcessor<ApiResponses, OperationContext> {
+  @Override
+  public void process(ApiResponses responses, OperationContext context) {
+
+    MethodAnnotationProcessor apiResponseAnnotationProcessor = context.getParser()
+        .findMethodAnnotationProcessor(ApiResponse.class);
+
+    if (apiResponseAnnotationProcessor != null) {
+      Arrays.stream(responses.value()).forEach(response -> apiResponseAnnotationProcessor.process(response, context));
+    }
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ClassAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ClassAnnotationProcessor.java
new file mode 100644
index 0000000..55d11be
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ClassAnnotationProcessor.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+public interface ClassAnnotationProcessor<Annotation, Context> extends AnnotationProcessor<Annotation, Context> {
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/MethodAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/MethodAnnotationProcessor.java
new file mode 100644
index 0000000..cff77a6
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/MethodAnnotationProcessor.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+public interface MethodAnnotationProcessor<Annotation, Context> extends AnnotationProcessor<Annotation, Context> {
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ModelInterceptor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ModelInterceptor.java
new file mode 100644
index 0000000..8415e1a
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ModelInterceptor.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.media.Schema;
+
+public interface ModelInterceptor {
+
+  int order();
+
+  Schema process(Class<?> cls, Components components);
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OperationMethodAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OperationMethodAnnotationProcessor.java
new file mode 100644
index 0000000..517ea5b
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/OperationMethodAnnotationProcessor.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+
+import io.swagger.v3.oas.annotations.ExternalDocumentation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.extensions.Extension;
+import io.swagger.v3.oas.annotations.parameters.RequestBody;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.servers.Server;
+
+public class OperationMethodAnnotationProcessor implements MethodAnnotationProcessor<Operation, OperationContext> {
+
+  @Override
+  public void process(Operation annotation, OperationContext context) {
+
+    context.setOperationId(annotation.operationId());
+    String s = annotation.operationId();
+    boolean deprecated = annotation.deprecated();
+    String description = annotation.description();
+    Extension[] extensions = annotation.extensions();
+    ExternalDocumentation externalDocumentation = annotation.externalDocs();
+    RequestBody requestBody = annotation.requestBody();
+    ApiResponse[] responses = annotation.responses();
+    String method = annotation.method();
+    Server[] servers = annotation.servers();
+    SecurityRequirement[] security = annotation.security();
+    String[] tags = annotation.tags();
+    String summary = annotation.summary();
+    Parameter[] parameters = annotation.parameters();
+
+//    context.getOpenAPI().setPaths();
+
+    // responseReference未解析
+    // hidden未解析
+    // authorizations未解析
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParamAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParamAnnotationProcessor.java
new file mode 100644
index 0000000..5b2b393
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParamAnnotationProcessor.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+public interface ParamAnnotationProcessor<Annotation, ParameterContext> extends AnnotationProcessor<Annotation, ParameterContext> {
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParameterAnnotationProcessor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParameterAnnotationProcessor.java
new file mode 100644
index 0000000..139bb0b
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/ParameterAnnotationProcessor.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import java.lang.reflect.Type;
+import java.util.Arrays;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.ParameterContext;
+
+import io.swagger.v3.core.util.ParameterProcessor;
+import io.swagger.v3.core.util.ReflectionUtils;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+public class ParameterAnnotationProcessor implements ParamAnnotationProcessor<Parameter, ParameterContext> {
+
+  @Override
+  public void process(Parameter parameter, ParameterContext parameterContext) {
+
+    Schema schema = parameter.schema();
+    Type type = parameterContext.getActualType();
+    if (schema != null) {
+
+      if (StringUtils.isNotEmpty(schema.type())) {
+        parameterContext.setType(schema.type());
+        type = ReflectionUtils.typeFromString(schema.type());
+      }
+    }
+
+    ParameterProcessor
+        .applyAnnotations(parameterContext.getOasParameter(), type, Arrays.asList(parameter),
+            parameterContext.getComponents(),
+            null, null, null);
+
+    parameterContext.setRequired(parameter.required());
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/AbstractAnnotationParser.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/AbstractAnnotationParser.java
new file mode 100644
index 0000000..5b3a4fa
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/AbstractAnnotationParser.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.parser;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.annotation.AnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.ApiResponseMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.ApiResponsesMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.ClassAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.MethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.OperationMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.ParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.ParameterAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+
+public abstract class AbstractAnnotationParser implements OpenApiAnnotationParser {
+
+  private Class<?> cls;
+
+  private OasContext context;
+
+  protected Map<Class, ClassAnnotationProcessor> classAnnotationMap = new HashMap<>();
+
+  protected Map<Class, MethodAnnotationProcessor> methodAnnotationMap = new HashMap<>();
+
+  protected Map<Class, ParamAnnotationProcessor> parameterAnnotationMap = new HashMap<>();
+
+  public AbstractAnnotationParser() {
+    initMethodAnnotationProcessor();
+    initClassAnnotationProcessor();
+    initParameterAnnotationProcessor();
+  }
+
+  @Override
+  public void parser(Class<?> cls, OasContext context) {
+
+    this.cls = cls;
+    this.context = context;
+
+    if (!canProcess(cls)) {
+      return;
+    }
+
+    for (Annotation clsAnnotation : cls.getAnnotations()) {
+      AnnotationProcessor annotationProcessor = classAnnotationMap.get(clsAnnotation.annotationType());
+      if (annotationProcessor == null) {
+        continue;
+      }
+      annotationProcessor.process(clsAnnotation, context);
+    }
+    postParseClassAnnotaion(context);
+
+    List<Method> methods = Arrays.asList(cls.getDeclaredMethods());
+    methods.sort(Comparator.comparing(Method::getName));
+    for (Method m : methods) {
+      OperationContext operationContext = new OperationContext(m, context);
+      for (Annotation methodAnnotation : m.getAnnotations()) {
+        MethodAnnotationProcessor annotationProcessor = methodAnnotationMap.get(methodAnnotation.annotationType());
+        if (annotationProcessor != null) {
+          annotationProcessor.process(methodAnnotation, operationContext);
+        }
+      }
+
+      postParseMethodAnnotation(operationContext);
+
+      java.lang.reflect.Parameter[] parameters = m.getParameters();
+
+      for (java.lang.reflect.Parameter parameter : parameters) {
+        ParameterContext parameterContext = new ParameterContext(operationContext, parameter);
+        for (Annotation paramAnnotation : parameter.getAnnotations()) {
+          ParamAnnotationProcessor paramAnnotationProcessor = parameterAnnotationMap
+              .get(paramAnnotation.annotationType());
+          if (paramAnnotationProcessor != null) {
+            paramAnnotationProcessor.process(paramAnnotation, parameterContext);
+          }
+        }
+        postParseParameterAnnotation(parameterContext);
+      }
+    }
+  }
+
+  @Override
+  public void postParseClassAnnotaion(OasContext context) {
+  }
+
+  @Override
+  public void postParseMethodAnnotation(OperationContext context) {
+  }
+
+  @Override
+  public void postParseParameterAnnotation(ParameterContext context) {
+  }
+
+  public void initMethodAnnotationProcessor() {
+    methodAnnotationMap.put(Operation.class, new OperationMethodAnnotationProcessor());
+    methodAnnotationMap.put(ApiResponse.class, new ApiResponseMethodAnnotationProcessor());
+    methodAnnotationMap.put(ApiResponses.class, new ApiResponsesMethodAnnotationProcessor());
+  }
+
+  public void initClassAnnotationProcessor() {
+
+  }
+
+  public void initParameterAnnotationProcessor() {
+    parameterAnnotationMap.put(Parameter.class, new ParameterAnnotationProcessor());
+  }
+
+  @Override
+  public ClassAnnotationProcessor findClassAnnotationProcessor(Class<? extends Annotation> annotationType) {
+    return classAnnotationMap.get(annotationType);
+  }
+
+  @Override
+  public MethodAnnotationProcessor findMethodAnnotationProcessor(Class<? extends Annotation> annotationType) {
+    return methodAnnotationMap.get(annotationType);
+  }
+
+  @Override
+  public ParamAnnotationProcessor findParameterAnnotationProcessor(Class<? extends Annotation> annotationType) {
+    return parameterAnnotationMap.get(annotationType);
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/api/OpenApiAnnotationParser.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/api/OpenApiAnnotationParser.java
new file mode 100644
index 0000000..1fbdd9e
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/parser/api/OpenApiAnnotationParser.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.parser.api;
+
+import java.lang.annotation.Annotation;
+
+import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.annotation.ClassAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.MethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.ParamAnnotationProcessor;
+
+public interface OpenApiAnnotationParser {
+
+  /**
+   *
+   * @param cls
+   * @param context
+   */
+  void parser(Class<?> cls, OasContext context);
+
+  /**
+   * 用于排序, 对于同一个类,同时只能为springmvc或者jaxrs其中一种
+   * @return
+   */
+  int getOrder();
+
+  boolean canProcess(Class<?> cls);
+
+  void postParseClassAnnotaion(OasContext context);
+
+  void postParseMethodAnnotation(OperationContext context);
+
+  void postParseParameterAnnotation(ParameterContext context);
+
+  ClassAnnotationProcessor findClassAnnotationProcessor(Class<? extends Annotation> annotationType);
+
+  MethodAnnotationProcessor findMethodAnnotationProcessor(Class<? extends Annotation> annotationType);
+
+  ParamAnnotationProcessor findParameterAnnotationProcessor(Class<? extends Annotation> annotationType);
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ArrayModelConverter.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ArrayModelConverter.java
new file mode 100644
index 0000000..f52c57d
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ArrayModelConverter.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.util;
+
+import java.util.Iterator;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
+import io.swagger.v3.core.converter.AnnotatedType;
+import io.swagger.v3.core.converter.ModelConverter;
+import io.swagger.v3.core.converter.ModelConverterContext;
+import io.swagger.v3.core.jackson.AbstractModelConverter;
+import io.swagger.v3.oas.models.media.ArraySchema;
+import io.swagger.v3.oas.models.media.Schema;
+
+public class ArrayModelConverter extends AbstractModelConverter {
+
+  protected ArrayModelConverter(ObjectMapper mapper) {
+    super(mapper);
+  }
+
+  @Override
+  public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
+
+    String typeName = _typeName(TypeFactory.defaultInstance().constructType(type.getType()));
+
+    ArraySchema schema;
+    if ("Array".equals(typeName)) {
+      schema = new ArraySchema();
+      if (!(type.getType() instanceof Class)) {
+        return null;
+      }
+      Schema itemSchema = context.resolve(new AnnotatedType(((Class) type.getType()).getComponentType()));
+      schema.setItems(itemSchema);
+      return schema;
+    }
+    return super.resolve(type, context, chain);
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/LocalVariableVisitor.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/LocalVariableVisitor.java
new file mode 100644
index 0000000..b7f19c1
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/LocalVariableVisitor.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.util;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
+
+public class LocalVariableVisitor extends MethodVisitor {
+
+  private boolean isStatic;
+
+  private String[] parameterNames;
+
+  private final int[] lvtSlotIndex;
+
+  private final Type[] args;
+
+  public LocalVariableVisitor(int api, String desc, boolean isStatic, String[] parameterNames) {
+    super(api);
+    this.isStatic = isStatic;
+    this.parameterNames = parameterNames;
+    this.args = Type.getArgumentTypes(desc);
+    this.lvtSlotIndex = computeLvtSlotIndices(isStatic, this.args);
+  }
+
+  @Override
+  public void visitLocalVariable(String name, String descriptor, String signature, Label start, Label end,
+      int index) {
+
+    for (int i = 0; i < this.lvtSlotIndex.length; i++) {
+      if (this.lvtSlotIndex[i] == index) {
+        this.parameterNames[i] = name;
+      }
+    }
+    super.visitLocalVariable(name, descriptor, signature, start, end, index);
+  }
+
+  int[] computeLvtSlotIndices(boolean isStatic, Type[] paramTypes) {
+    int[] lvtIndex = new int[paramTypes.length];
+    int nextIndex = (isStatic ? 0 : 1);
+    for (int i = 0; i < paramTypes.length; i++) {
+      lvtIndex[i] = nextIndex;
+      if (isWideType(paramTypes[i])) {
+        nextIndex += 2;
+      } else {
+        nextIndex++;
+      }
+    }
+    return lvtIndex;
+  }
+
+  private boolean isWideType(Type aType) {
+    return (aType == Type.LONG_TYPE || aType == Type.DOUBLE_TYPE);
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
new file mode 100644
index 0000000..0370c31
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.ServiceLoader;
+
+import org.apache.servicecomb.toolkit.generator.annotation.ModelInterceptor;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+import io.swagger.v3.core.converter.AnnotatedType;
+import io.swagger.v3.core.converter.ModelConverterContextImpl;
+import io.swagger.v3.core.jackson.ModelResolver;
+import io.swagger.v3.core.util.PrimitiveType;
+import io.swagger.v3.core.util.RefUtils;
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.media.ArraySchema;
+import io.swagger.v3.oas.models.media.Schema;
+
+public class ModelConverter {
+
+  private static final ModelConverterContextImpl context;
+
+  private static final List<ModelInterceptor> interceptorMgr = new ArrayList<>();
+
+  static {
+
+    ServiceLoader.load(ModelInterceptor.class).forEach(ModelConverter::registerInterceptor);
+
+    ArrayModelConverter arrayModelConverter = new ArrayModelConverter(mapper());
+    ModelResolver modelResolver = new ModelResolver(mapper());
+
+    context = new ModelConverterContextImpl(Arrays.asList(arrayModelConverter, modelResolver));
+  }
+
+  public static void registerInterceptor(ModelInterceptor interceptor) {
+    interceptorMgr.add(interceptor);
+    interceptorMgr.sort(Comparator.comparingInt(ModelInterceptor::order));
+  }
+
+  public static Schema getSchema(Class<?> cls) {
+    return getSchema(cls, null);
+  }
+
+  public static Schema getSchema(Class<?> cls, Components components) {
+
+    for (ModelInterceptor interceptor : interceptorMgr) {
+      Schema schema = interceptor.process(cls, components);
+      if (schema != null) {
+        return schema;
+      }
+    }
+
+    Schema schema = PrimitiveType.createProperty(cls);
+    if (schema == null) {
+      schema = context
+          .resolve(new AnnotatedType(cls));
+    }
+
+    if (components == null) {
+      return schema;
+    }
+
+    Schema refSchema = schema;
+
+    if (shouldExtractRef(schema)) {
+      ensureSchemaNameExist(schema);
+      schema.$ref(null);
+      components.addSchemas(schema.getName(), schema);
+      refSchema = new Schema();
+      refSchema.set$ref(RefUtils.constructRef(schema.getName()));
+    }
+
+    if (schema instanceof ArraySchema) {
+      ArraySchema arraySchema = (ArraySchema) schema;
+      Schema itemSchema = arraySchema.getItems();
+      if (shouldExtractRef(itemSchema)) {
+        ensureSchemaNameExist(itemSchema);
+        itemSchema.$ref(null);
+        components.addSchemas(itemSchema.getName(), itemSchema);
+
+        Schema itemRefSchema = new Schema();
+        itemRefSchema.set$ref(RefUtils.constructRef(itemSchema.getName()));
+        arraySchema.setItems(itemRefSchema);
+      }
+
+      refSchema = arraySchema;
+    }
+
+    return refSchema;
+  }
+
+  private static void ensureSchemaNameExist(Schema schema) {
+    if (schema.getName() != null) {
+      return;
+    }
+
+    if (schema.get$ref() != null) {
+      schema.setName((String) RefUtils.extractSimpleName(schema.get$ref()).getKey());
+      return;
+    }
+  }
+
+  public static boolean shouldExtractRef(Schema schema) {
+    if (schema.getName() != null || schema.get$ref() != null) {
+      return true;
+    }
+    return false;
+  }
+
+
+  public static ObjectMapper mapper() {
+    ObjectMapper mapper = new ObjectMapper();
+    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+    return mapper;
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ParamUtils.java b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ParamUtils.java
new file mode 100644
index 0000000..9093630
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ParamUtils.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Parameter;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+
+public class ParamUtils {
+
+  private static final String STATIC_CLASS_INIT = "<clinit>";
+
+  public static final Map<Method, String[]> paramterCache = new HashMap();
+
+  public static String getParamterName(Method method, Parameter parameter) {
+
+    String[] parameterNames = paramterCache.get(method);
+
+    if (parameterNames == null) {
+      parameterNames = initParamterNames(method);
+      if (parameterNames == null) {
+        return null;
+      }
+    }
+
+    int paramIndex = getParamIndex(method, parameter);
+    if (paramIndex >= 0) {
+      return parameterNames[paramIndex];
+    }
+
+    return null;
+  }
+
+  private static int getParamIndex(Method method, Parameter parameter) {
+    Parameter[] parameters = method.getParameters();
+    for (int i = 0; i < parameters.length; i++) {
+      if (parameters[i].equals(parameter)) {
+        return i;
+      }
+    }
+    return -1;
+  }
+
+  private static String[] initParamterNames(Method m) {
+
+    boolean isStatic = Modifier.isStatic(m.getModifiers());
+    String[] paramterNames = new String[m.getParameterCount()];
+
+    try {
+
+      String className = m.getDeclaringClass().getName();
+      String classRawName = className.replace('.', '/') + ".class";
+
+      InputStream is = null;
+      ClassLoader classLoader = m.getDeclaringClass().getClassLoader();
+      if (classLoader != null) {
+        is = classLoader.getResourceAsStream(classRawName);
+      } else {
+        is = m.getDeclaringClass().getResourceAsStream(classRawName);
+      }
+
+      if (is == null) {
+        return null;
+      }
+      ClassReader clsReader = new ClassReader(is);
+      ClassWriter clsWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+
+      clsReader.accept(new ClassVisitor(Opcodes.ASM7, clsWriter) {
+        @Override
+        public MethodVisitor visitMethod(int access, String name, String descriptor, String signature,
+            String[] exceptions) {
+          MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions);
+          if (!m.getName().equals(name) || !descriptor.equals(Type.getMethodDescriptor(m))) {
+            return methodVisitor;
+          }
+
+          if (!isSyntheticOrBridged(access) && !STATIC_CLASS_INIT.equals(name)) {
+            return new LocalVariableVisitor(this.api, descriptor, isStatic, paramterNames);
+          }
+
+          return methodVisitor;
+        }
+      }, 0);
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+
+    paramterCache.put(m, paramterNames);
+
+    return paramterNames;
+  }
+
+  private static boolean isSyntheticOrBridged(int access) {
+    return (((access & Opcodes.ACC_SYNTHETIC) | (access & Opcodes.ACC_BRIDGE)) > 0);
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java
new file mode 100644
index 0000000..c6bbf56
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/AnnotationProcessorTest.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import java.lang.reflect.Method;
+
+import org.apache.servicecomb.toolkit.generator.annotation.ApiResponseMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.ApiResponsesMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.OperationMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.ParameterAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.parser.AbstractAnnotationParser;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.models.media.StringSchema;
+
+public class AnnotationProcessorTest {
+
+  @Test
+  public void processApiResponseAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext context = new OperationContext(null, oasContext);
+    ApiResponseMethodAnnotationProcessor apiResProcessor = new ApiResponseMethodAnnotationProcessor();
+    ApiResponse apiResponse = Mockito.mock(ApiResponse.class);
+    Content[] contents = new Content[1];
+    contents[0] = Mockito.mock(Content.class);
+    Mockito.when(contents[0].mediaType()).thenReturn(MediaTypeConst.APPLICATION_JSON);
+    Mockito.when(apiResponse.content()).thenReturn(contents);
+    Mockito.when(apiResponse.responseCode()).thenReturn("200");
+    apiResProcessor.process(apiResponse, context);
+
+    Assert.assertNotNull(context.getApiResponses().get("200"));
+    Assert.assertNull(context.getApiResponses().get("500"));
+  }
+
+  @Test
+  public void processApiResponsesAnnotation() {
+
+    OasContext oasContext = new OasContext(new AbstractAnnotationParser() {
+      @Override
+      public int getOrder() {
+        return 0;
+      }
+
+      @Override
+      public boolean canProcess(Class<?> cls) {
+        return true;
+      }
+    });
+
+    OperationContext context = new OperationContext(null, oasContext);
+    ApiResponsesMethodAnnotationProcessor apiRessProcessor = new ApiResponsesMethodAnnotationProcessor();
+    ApiResponses apiResponses = Mockito.mock(ApiResponses.class);
+    Content[] contents = new Content[1];
+    contents[0] = Mockito.mock(Content.class);
+    Mockito.when(contents[0].mediaType()).thenReturn(MediaTypeConst.APPLICATION_JSON);
+    ApiResponse apiResponse = Mockito.mock(ApiResponse.class);
+    Mockito.when(apiResponse.content()).thenReturn(contents);
+    Mockito.when(apiResponse.responseCode()).thenReturn("200");
+    Mockito.when(apiResponses.value()).thenReturn(new ApiResponse[] {apiResponse});
+
+    apiRessProcessor.process(apiResponses, context);
+
+    Assert.assertNotNull(context.getApiResponses().get("200"));
+    Assert.assertNull(context.getApiResponses().get("500"));
+  }
+
+  @Test
+  public void processOperationAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext context = new OperationContext(null, oasContext);
+    OperationMethodAnnotationProcessor operationMethodAnnotationProcessor = new OperationMethodAnnotationProcessor();
+    Operation operation = Mockito.mock(Operation.class);
+    operationMethodAnnotationProcessor.process(operation, context);
+  }
+
+
+  @Test
+  public void processParameterAnnotation() throws NoSuchMethodException, IllegalAccessException,
+      InstantiationException {
+
+    OasContext oasContext = new OasContext(null);
+    Method parameterMethod = ParameterClass.class.getMethod("parameter", String.class);
+    OperationContext operationContext = new OperationContext(parameterMethod, oasContext);
+    java.lang.reflect.Parameter[] parameters = parameterMethod.getParameters();
+    Assert.assertEquals(parameters.length, 1);
+    java.lang.reflect.Parameter parameter = parameters[0];
+    Parameter parameterDeclaredAnnotation = parameter.getDeclaredAnnotation(Parameter.class);
+
+    ParameterContext parameterContext = new ParameterContext(operationContext, parameter);
+    ParameterAnnotationProcessor parameterAnnotationProcessor = new ParameterAnnotationProcessor();
+
+    parameterAnnotationProcessor.process(parameterDeclaredAnnotation, parameterContext);
+    io.swagger.v3.oas.models.parameters.Parameter oasParameter = parameterContext.toOasParameter();
+    Assert.assertEquals("param", oasParameter.getName());
+    Assert.assertEquals(StringSchema.class, oasParameter.getSchema().getClass());
+    Assert.assertTrue(parameterContext.isRequired());
+    Assert.assertEquals(operationContext, parameterContext.getOperationContext());
+    Assert.assertNull(parameterContext.getDefaultValue());
+  }
+
+  class ParameterClass {
+    public void parameter(@Parameter(required = true) String param) {
+    }
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/OasGeneratorTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/OasGeneratorTest.java
new file mode 100644
index 0000000..d454d7d
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/OasGeneratorTest.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.PathItem.HttpMethod;
+
+public class OasGeneratorTest {
+
+  @Test
+  public void generatorOas() {
+
+    Set<Class> classSet = new HashSet<>();
+    classSet.add(NoResource.class);
+    classSet.add(OneResource.class);
+    OasGenerator generator = new OasGenerator();
+    generator.generate(classSet);
+  }
+
+  @Test
+  public void constructOasContext() throws NoSuchMethodException {
+    OasContext oasContext = new OasContext(null);
+
+    Method method = OneResource.class.getMethod("name", String.class);
+    OperationContext operationContext = new OperationContext(method, oasContext);
+    operationContext.setHttpMethod(HttpMethod.GET.name());
+    operationContext.setOperationId(method.getName());
+    operationContext.setPath("/operation");
+
+    oasContext.addOperation(operationContext);
+    oasContext.setCls(method.getDeclaringClass());
+    oasContext.setBasePath("/oas");
+    oasContext.setParser(null);
+
+    Assert.assertEquals("/oas", oasContext.getBasePath());
+    Assert.assertEquals(method.getDeclaringClass(), oasContext.getCls());
+    Assert.assertNull(oasContext.getParser());
+
+    Assert.assertEquals("/operation", operationContext.getPath());
+    Assert.assertEquals(HttpMethod.GET.name(), operationContext.getHttpMethod());
+    Assert.assertEquals(oasContext.getComponents(), operationContext.getComponents());
+    Assert.assertEquals(null, operationContext.getApiResponses().getDefault());
+    Assert.assertEquals(oasContext.getOpenAPI(), operationContext.getOpenAPI());
+
+    Parameter parameter = method.getParameters()[0];
+    ParameterContext parameterContext = new ParameterContext(operationContext, parameter);
+    parameterContext.setName(parameter.getName());
+    parameterContext.setRequired(true);
+    parameterContext.setType(ParameterIn.QUERY.toString());
+
+    Assert.assertEquals(parameter.getName(), parameterContext.getName());
+
+    OpenAPI openAPI = oasContext.toOpenAPI();
+    Assert.assertNotNull(openAPI);
+  }
+
+  class NoResource {
+
+  }
+
+  class OneResource {
+    public String name(String name) {
+      return name;
+    }
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ParserTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ParserTest.java
new file mode 100644
index 0000000..c0b37e3
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/ParserTest.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import org.apache.servicecomb.toolkit.generator.parser.AbstractAnnotationParser;
+import org.junit.Test;
+
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+
+public class ParserTest {
+
+  @Test
+  public void parse() {
+    AbstractAnnotationParser parser = new TestParser();
+
+    parser.parser(UnParser.class, new OasContext(parser));
+  }
+
+  class TestParser extends AbstractAnnotationParser {
+
+    @Override
+    public int getOrder() {
+      return 0;
+    }
+
+    @Override
+    public boolean canProcess(Class<?> cls) {
+      return true;
+    }
+  }
+
+  @OpenAPIDefinition
+  class UnParser {
+    @ApiResponse
+    public String name(String name) {
+      return name;
+    }
+  }
+}
diff --git a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
new file mode 100644
index 0000000..224dbf9
--- /dev/null
+++ b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+
+import org.apache.servicecomb.toolkit.generator.annotation.ModelInterceptor;
+import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
+import org.apache.servicecomb.toolkit.generator.util.ParamUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.media.ArraySchema;
+import io.swagger.v3.oas.models.media.Schema;
+import io.swagger.v3.oas.models.media.StringSchema;
+
+public class UtilsTest {
+
+  @Test
+  public void getParameterName() throws NoSuchMethodException {
+
+    Method method = ParameterClass.class.getMethod("method", String.class);
+    Parameter parameter = method.getParameters()[0];
+    String paramterName = ParamUtils.getParamterName(method, parameter);
+    Assert.assertEquals("param", paramterName);
+  }
+
+  @Test
+  public void getSchema() {
+    Schema schema = ModelConverter.getSchema(String.class);
+    Assert.assertEquals(StringSchema.class, schema.getClass());
+
+    schema = ModelConverter.getSchema(ParameterClass.class);
+    Assert.assertEquals(Schema.class, schema.getClass());
+
+    schema = ModelConverter.getSchema(String[].class);
+    Assert.assertEquals(ArraySchema.class, schema.getClass());
+
+    Components components = new Components();
+    schema = ModelConverter.getSchema(ParameterClass[].class, components);
+    Assert.assertEquals(ArraySchema.class, schema.getClass());
+
+    schema = ModelConverter.getSchema(ParameterClass.class, components);
+    Assert.assertNotNull(schema.get$ref());
+
+    ModelConverter.registerInterceptor(new ModelInterceptor() {
+      @Override
+      public int order() {
+        return 0;
+      }
+
+      @Override
+      public Schema process(Class<?> cls, Components components) {
+        return new Schema().name("unknown");
+      }
+    });
+
+    schema = ModelConverter.getSchema(ParameterClass.class);
+    Assert.assertEquals("unknown", schema.getName());
+  }
+
+  class ParameterClass {
+    public void method(String param) {
+    }
+  }
+}
diff --git a/oas-generator/pom.xml b/oas-generator/pom.xml
new file mode 100644
index 0000000..123ec2c
--- /dev/null
+++ b/oas-generator/pom.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>toolkit</artifactId>
+    <groupId>org.apache.servicecomb.toolkit</groupId>
+    <version>0.2.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <packaging>pom</packaging>
+  <modules>
+    <module>oas-generator-core</module>
+  </modules>
+
+  <artifactId>oas-generator</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-module-junit4</artifactId>
+      <version>1.6.2</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.powermock</groupId>
+      <artifactId>powermock-api-mockito</artifactId>
+      <version>1.6.2</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.8.1</version>
+        <configuration>
+          <target>1.8</target>
+          <source>1.8</source>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
\ No newline at end of file


[servicecomb-toolkit] 05/10: switch to oas-generator

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit b0d8b88d77317a470e6f351db2a6771db076f351
Author: kakulisen <18...@163.com>
AuthorDate: Tue Oct 29 09:23:43 2019 +0800

    switch to oas-generator
    
    Signed-off-by: kakulisen <18...@163.com>
---
 common/pom.xml                                     | 30 ----------------------
 contractgen/pom.xml                                | 15 +++++++++++
 .../contractgen/DefaultContractsGenerator.java     | 25 +++++++++---------
 .../docgen/ContractsSwaggerUIGenerator.java        |  8 +++---
 .../docgen/ContractsSwaggerUIGeneratorTest.java    | 11 ++++----
 pom.xml                                            | 24 +++++++++++++++++
 toolkit-distribution/src/release/LICENSE           |  9 +++++++
 .../servicecomb/toolkit/plugin/GenerateUtil.java   | 13 ++++++++--
 8 files changed, 80 insertions(+), 55 deletions(-)

diff --git a/common/pom.xml b/common/pom.xml
index 6855da3..0149615 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -55,36 +55,6 @@
     </dependency>
 
     <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>swagger-generator-springmvc</artifactId>
-      <version>1.2.0</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>swagger-generator-jaxrs</artifactId>
-      <version>1.2.0</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>provider-rest-common</artifactId>
-      <version>1.2.0</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>provider-pojo</artifactId>
-      <version>1.2.0</version>
-      <exclusions>
-        <exclusion>
-          <groupId>commons-lang</groupId>
-          <artifactId>commons-lang</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
diff --git a/contractgen/pom.xml b/contractgen/pom.xml
index ffcadf6..b5c5a87 100644
--- a/contractgen/pom.xml
+++ b/contractgen/pom.xml
@@ -35,6 +35,21 @@
     </dependency>
 
     <dependency>
+      <groupId>org.apache.servicecomb.toolkit</groupId>
+      <artifactId>oas-generator-jaxrs</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.servicecomb.toolkit</groupId>
+      <artifactId>oas-generator-spring</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.servicecomb.toolkit</groupId>
+      <artifactId>oas-generator-servicecomb</artifactId>
+    </dependency>
+    
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
diff --git a/contractgen/src/main/java/org/apache/servicecomb/toolkit/contractgen/DefaultContractsGenerator.java b/contractgen/src/main/java/org/apache/servicecomb/toolkit/contractgen/DefaultContractsGenerator.java
index 49dd5b9..e78abc5 100755
--- a/contractgen/src/main/java/org/apache/servicecomb/toolkit/contractgen/DefaultContractsGenerator.java
+++ b/contractgen/src/main/java/org/apache/servicecomb/toolkit/contractgen/DefaultContractsGenerator.java
@@ -30,29 +30,26 @@ import java.util.List;
 import java.util.Map;
 import java.util.Vector;
 
-import org.apache.commons.lang3.StringUtils;
+import javax.ws.rs.Path;
+
 import org.apache.servicecomb.provider.pojo.RpcSchema;
 import org.apache.servicecomb.provider.rest.common.RestSchema;
-import org.apache.servicecomb.swagger.SwaggerUtils;
-import org.apache.servicecomb.swagger.generator.core.CompositeSwaggerGeneratorContext;
-import org.apache.servicecomb.swagger.generator.core.SwaggerGenerator;
-import org.apache.servicecomb.swagger.generator.core.SwaggerGeneratorContext;
 import org.apache.servicecomb.toolkit.ContractsGenerator;
 import org.apache.servicecomb.toolkit.common.ContractFileType;
 import org.apache.servicecomb.toolkit.common.ImmediateClassLoader;
+import org.apache.servicecomb.toolkit.generator.OasGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.ws.rs.Path;
+import io.swagger.v3.core.util.Yaml;
+import io.swagger.v3.oas.models.OpenAPI;
 
 public class DefaultContractsGenerator implements ContractsGenerator {
 
   private static Logger LOGGER = LoggerFactory.getLogger(DefaultContractsGenerator.class);
 
-  private static CompositeSwaggerGeneratorContext compositeSwaggerGeneratorContext = new CompositeSwaggerGeneratorContext();
-
   private Map<String, Object> config;
 
   private List<String> classpathUrls;
@@ -125,12 +122,14 @@ public class DefaultContractsGenerator implements ContractsGenerator {
           continue;
         }
 
-        SwaggerGeneratorContext generatorContext =
-            compositeSwaggerGeneratorContext.selectContext(loadClass);
+        OasGenerator oasGenerator = new OasGenerator();
+        OpenAPI oas = oasGenerator.generate(loadClass);
 
-        SwaggerGenerator generator = new SwaggerGenerator(generatorContext, loadClass);
+        if (oas == null) {
+          continue;
+        }
 
-        String swaggerString = SwaggerUtils.swaggerToString(generator.generate());
+        String oasPretty = Yaml.pretty(oas);
 
         File outputFile = new File(
             outputDir + File.separator + loadClass.getSimpleName() + contractfileType
@@ -143,7 +142,7 @@ public class DefaultContractsGenerator implements ContractsGenerator {
           outputFile.createNewFile();
         }
 
-        Files.write(Paths.get(outputFile.toURI()), swaggerString.getBytes());
+        Files.write(Paths.get(outputFile.toURI()), oasPretty.getBytes());
       }
     } catch (IOException e) {
       throw new RuntimeException(e);
diff --git a/docgen/src/main/java/org/apache/servicecomb/toolkit/docgen/ContractsSwaggerUIGenerator.java b/docgen/src/main/java/org/apache/servicecomb/toolkit/docgen/ContractsSwaggerUIGenerator.java
index 4277652..1bf2e7a 100755
--- a/docgen/src/main/java/org/apache/servicecomb/toolkit/docgen/ContractsSwaggerUIGenerator.java
+++ b/docgen/src/main/java/org/apache/servicecomb/toolkit/docgen/ContractsSwaggerUIGenerator.java
@@ -32,8 +32,8 @@ import org.apache.servicecomb.toolkit.DocGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.swagger.models.Swagger;
-import io.swagger.util.Json;
+import io.swagger.v3.core.util.Json;
+import io.swagger.v3.oas.models.OpenAPI;
 
 public class ContractsSwaggerUIGenerator implements DocGenerator {
 
@@ -43,7 +43,7 @@ public class ContractsSwaggerUIGenerator implements DocGenerator {
 
   private final static String DOC_SUFFIX = ".html";
 
-  private Swagger contractContent;
+  private OpenAPI contractContent;
 
   private String outputPath = ".";
 
@@ -55,7 +55,7 @@ public class ContractsSwaggerUIGenerator implements DocGenerator {
 
   @Override
   public void configure(Map<String, Object> config) {
-    this.contractContent = (Swagger) config.get("contractContent");
+    this.contractContent = (OpenAPI) config.get("contractContent");
     this.outputPath = (String) config.get("outputPath");
   }
 
diff --git a/docgen/src/test/java/org/apache/servicecomb/toolkit/docgen/ContractsSwaggerUIGeneratorTest.java b/docgen/src/test/java/org/apache/servicecomb/toolkit/docgen/ContractsSwaggerUIGeneratorTest.java
index 46238be..e1c9662 100644
--- a/docgen/src/test/java/org/apache/servicecomb/toolkit/docgen/ContractsSwaggerUIGeneratorTest.java
+++ b/docgen/src/test/java/org/apache/servicecomb/toolkit/docgen/ContractsSwaggerUIGeneratorTest.java
@@ -33,16 +33,14 @@ import org.apache.servicecomb.toolkit.GeneratorFactory;
 import org.junit.Assert;
 import org.junit.Test;
 
-import io.swagger.models.Swagger;
-import io.swagger.parser.Swagger20Parser;
+import io.swagger.parser.OpenAPIParser;
+import io.swagger.v3.parser.core.models.SwaggerParseResult;
 
 public class ContractsSwaggerUIGeneratorTest {
 
   @Test
   public void testContractTransferToSwaggerUI() throws IOException {
 
-    Swagger20Parser swagger20Parser = new Swagger20Parser();
-
     InputStream in = ContractsSwaggerUIGeneratorTest.class.getClassLoader().getResourceAsStream("HelloEndPoint.yaml");
 
     StringBuilder sb = new StringBuilder();
@@ -52,14 +50,15 @@ public class ContractsSwaggerUIGeneratorTest {
       sb.append(new String(bytes, 0, len));
     }
 
-    Swagger swagger = swagger20Parser.parse(sb.toString());
+    OpenAPIParser openAPIParser = new OpenAPIParser();
+    SwaggerParseResult swaggerParseResult = openAPIParser.readContents(sb.toString(), null, null);
 
     Path tempDir = Files.createTempDirectory(null);
     Path outputPath = Paths.get(tempDir.toFile().getAbsolutePath()
         + File.separator + "swagger-ui.html");
     DocGenerator docGenerator = GeneratorFactory.getGenerator(DocGenerator.class, "default");
     Map<String, Object> docGeneratorConfig = new HashMap<>();
-    docGeneratorConfig.put("contractContent", swagger);
+    docGeneratorConfig.put("contractContent", swaggerParseResult.getOpenAPI());
     docGeneratorConfig.put("outputPath", outputPath.toFile().getCanonicalPath());
     Objects.requireNonNull(docGenerator).configure(docGeneratorConfig);
     docGenerator.generate();
diff --git a/pom.xml b/pom.xml
index 768f030..75c7d8c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -111,6 +111,7 @@
     <module>integration-tests</module>
     <module>contractgen</module>
     <module>oas-validator</module>
+    <module>oas-generator</module>
   </modules>
 
   <dependencyManagement>
@@ -199,6 +200,29 @@
         <version>${project.version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>org.apache.servicecomb.toolkit</groupId>
+        <artifactId>oas-generator-core</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.apache.servicecomb.toolkit</groupId>
+        <artifactId>oas-generator-servicecomb</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.apache.servicecomb.toolkit</groupId>
+        <artifactId>oas-generator-jaxrs</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.apache.servicecomb.toolkit</groupId>
+        <artifactId>oas-generator-spring</artifactId>
+        <version>${project.version}</version>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 
diff --git a/toolkit-distribution/src/release/LICENSE b/toolkit-distribution/src/release/LICENSE
index af84657..ff090bc 100644
--- a/toolkit-distribution/src/release/LICENSE
+++ b/toolkit-distribution/src/release/LICENSE
@@ -307,6 +307,13 @@ You can find a copy of the License at licenses/LICENSE-cal10n
 * Compiler assisted localization library (CAL10N) - API (ch.qos.cal10n:cal10n-api:0.8.1 - http://cal10n.qos.ch/cal10n-api)
 * Compiler assisted localization library (CAL10N) - API (ch.qos.cal10n:cal10n-api:0.7.4 - http://cal10n.qos.ch/cal10n-api)
 
+===========================================================================
+This product bundles of asm which is licensed under BSD 3-Clause License
+For details, see https://github.com/hamcrest/JavaHamcrest/blob/master/LICENSE.txt
+You can find a copy of the License at licenses/LICENSE-asm
+
+* asm (org.ow2.asm:asm:7.2 - http://asm.ow2.io/)
+
 ================================================================
 This product bundles the following libraries which are licensed
 under the Apache License v2.
@@ -429,6 +436,8 @@ For details, see their respective project links.
 * org.xmlunit:xmlunit-core (org.xmlunit:xmlunit-core:2.6.2 - https://www.xmlunit.org/)
 * project ':json-path' (com.jayway.jsonpath:json-path:2.4.0 - https://github.com/jayway/JsonPath)
 * swagger-annotations (io.swagger.core.v3:swagger-annotations:2.0.8 - https://github.com/swagger-api/swagger-core/modules/swagger-annotations)
+* Spring Web (org.springframework:spring-web:5.2.0.RELEASE - https://github.com/spring-projects/spring-framework)
+* swagger-annotations (io.swagger:swagger-annotations:1.5.22 - https://github.com/swagger-api/swagger-core/modules/swagger-annotations)
 * swagger-annotations (io.swagger.core.v3:swagger-annotations:2.0.9 - https://github.com/swagger-api/swagger-core/modules/swagger-annotations)
 * swagger-annotations (io.swagger:swagger-annotations:1.5.22 - https://github.com/swagger-api/swagger-core/modules/swagger-annotations)
 * swagger-codegen (core library) (io.swagger:swagger-codegen:2.4.3 - https://github.com/swagger-api/swagger-codegen/modules/swagger-codegen)
diff --git a/toolkit-maven-plugin/src/main/java/org/apache/servicecomb/toolkit/plugin/GenerateUtil.java b/toolkit-maven-plugin/src/main/java/org/apache/servicecomb/toolkit/plugin/GenerateUtil.java
index 4a2f0b2..f0dbb00 100755
--- a/toolkit-maven-plugin/src/main/java/org/apache/servicecomb/toolkit/plugin/GenerateUtil.java
+++ b/toolkit-maven-plugin/src/main/java/org/apache/servicecomb/toolkit/plugin/GenerateUtil.java
@@ -35,7 +35,6 @@ import java.util.Optional;
 
 import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.project.MavenProject;
-import org.apache.servicecomb.swagger.SwaggerUtils;
 import org.apache.servicecomb.toolkit.CodeGenerator;
 import org.apache.servicecomb.toolkit.ContractsGenerator;
 import org.apache.servicecomb.toolkit.DocGenerator;
@@ -45,6 +44,10 @@ import org.apache.servicecomb.toolkit.codegen.MicroServiceFramework;
 import org.apache.servicecomb.toolkit.codegen.ProjectMetaConstant;
 import org.openapitools.codegen.config.CodegenConfigurator;
 
+import io.swagger.parser.OpenAPIParser;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.parser.core.models.SwaggerParseResult;
+
 class GenerateUtil {
 
   private static String providerProjectNameSuffix = "-provider";
@@ -90,7 +93,13 @@ class GenerateUtil {
         }
         Map<String, Object> docGeneratorConfig = new HashMap<>();
 
-        docGeneratorConfig.put("contractContent", SwaggerUtils.parseSwagger(file.toUri().toURL()));
+        SwaggerParseResult swaggerParseResult = new OpenAPIParser()
+            .readLocation(file.toUri().toURL().toString(), null, null);
+        OpenAPI openAPI = swaggerParseResult.getOpenAPI();
+        if (openAPI == null) {
+          return super.visitFile(file, attrs);
+        }
+        docGeneratorConfig.put("contractContent", openAPI);
         docGeneratorConfig.put("outputPath",
             documentOutput + File.separator + file.getParent().toFile().getName() + File.separator + file.toFile()
                 .getName()


[servicecomb-toolkit] 03/10: add oas-generator-spring to support parse spring code

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit fdbdafbf61715d822a5812bd67ca64ffbf3e30b8
Author: kakulisen <18...@163.com>
AuthorDate: Mon Oct 28 10:17:35 2019 +0800

    add oas-generator-spring to support parse spring code
    
    Signed-off-by: kakulisen <18...@163.com>
---
 oas-generator/{ => oas-generator-spring}/pom.xml   |  37 +---
 .../generator/MultipartFileInterceptor.java        |  44 ++++
 ...stractHttpMethodMappingAnnotationProcessor.java |  84 ++++++++
 .../DeleteMappingMethodAnnotationProcessor.java    |  35 ++++
 .../GetMappingMethodAnnotationProcessor.java       |  35 ++++
 .../PathVariableAnnotationProcessor.java           |  41 ++++
 .../PostMappingMethodAnnotationProcessor.java      |  35 ++++
 .../PutMappingMethodAnnotationProcessor.java       |  35 ++++
 .../annotation/RequestBodyAnnotationProcessor.java |  29 +++
 .../RequestHeaderAnnotationProcessor.java          |  47 +++++
 .../RequestMappingClassAnnotationProcessor.java    |  41 ++++
 .../RequestMappingMethodAnnotationProcessor.java   |  41 ++++
 .../RequestParamAnnotationProcessor.java           |  43 ++++
 .../annotation/RequestPartAnnotationProcessor.java |  28 +++
 .../parser/SpringmvcAnnotationParser.java          |  78 +++++++
 ...b.toolkit.generator.annotation.ModelInterceptor |  18 ++
 ...it.generator.parser.api.OpenApiAnnotationParser |  18 ++
 .../generator/SpringAnnotationProcessorTest.java   | 225 +++++++++++++++++++++
 .../toolkit/generator/SpringParserTest.java        |  45 +++++
 oas-generator/pom.xml                              |   1 +
 20 files changed, 930 insertions(+), 30 deletions(-)

diff --git a/oas-generator/pom.xml b/oas-generator/oas-generator-spring/pom.xml
similarity index 60%
copy from oas-generator/pom.xml
copy to oas-generator/oas-generator-spring/pom.xml
index dafeed5..c2d70f0 100644
--- a/oas-generator/pom.xml
+++ b/oas-generator/oas-generator-spring/pom.xml
@@ -19,47 +19,24 @@
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>toolkit</artifactId>
+    <artifactId>oas-generator</artifactId>
     <groupId>org.apache.servicecomb.toolkit</groupId>
     <version>0.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
-  <packaging>pom</packaging>
-  <modules>
-    <module>oas-generator-core</module>
-    <module>oas-generator-jaxrs</module>
-  </modules>
 
-  <artifactId>oas-generator</artifactId>
+  <artifactId>oas-generator-spring</artifactId>
 
   <dependencies>
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-module-junit4</artifactId>
-      <version>1.6.2</version>
-      <scope>test</scope>
+      <groupId>org.apache.servicecomb.toolkit</groupId>
+      <artifactId>oas-generator-core</artifactId>
     </dependency>
-
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-api-mockito</artifactId>
-      <version>1.6.2</version>
-      <scope>test</scope>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-web</artifactId>
+      <version>5.2.0.RELEASE</version>
     </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.8.1</version>
-        <configuration>
-          <target>1.8</target>
-          <source>1.8</source>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
 </project>
\ No newline at end of file
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/MultipartFileInterceptor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/MultipartFileInterceptor.java
new file mode 100644
index 0000000..4857143
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/MultipartFileInterceptor.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import org.apache.servicecomb.toolkit.generator.annotation.ModelInterceptor;
+import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
+import org.springframework.web.multipart.MultipartFile;
+
+import io.swagger.v3.oas.models.Components;
+import io.swagger.v3.oas.models.media.FileSchema;
+import io.swagger.v3.oas.models.media.Schema;
+
+public class MultipartFileInterceptor implements ModelInterceptor {
+
+  @Override
+  public int order() {
+    return 100;
+  }
+
+  @Override
+  public Schema process(Class<?> cls, Components components) {
+
+    if (!MultipartFile.class.equals(cls)) {
+      return null;
+    }
+
+    return new FileSchema();
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
new file mode 100644
index 0000000..fe795ea
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.servicecomb.toolkit.generator.HttpStatus;
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import io.swagger.v3.oas.models.media.Content;
+import io.swagger.v3.oas.models.media.MediaType;
+import io.swagger.v3.oas.models.media.Schema;
+import io.swagger.v3.oas.models.responses.ApiResponse;
+
+public abstract class AbstractHttpMethodMappingAnnotationProcessor<Annotation, Context> implements
+    MethodAnnotationProcessor<Annotation, Context> {
+
+  protected void processPath(String[] paths, OperationContext operationContext) {
+    if (null == paths || paths.length == 0) {
+      return;
+    }
+
+    if (paths.length > 1) {
+      throw new Error(String.format("not allowed multi path for %s:%s",
+          operationContext.getMethod().getDeclaringClass().getName(),
+          operationContext.getMethod().getName()));
+    }
+
+    operationContext.setPath(paths[0]);
+  }
+
+  protected void processMethod(RequestMethod requestMethod, OperationContext operationContext) {
+    operationContext.setHttpMethod(requestMethod.name());
+  }
+
+  protected void processConsumes(String[] consumes, OperationContext operationContext) {
+    if (null == consumes || consumes.length == 0) {
+      return;
+    }
+  }
+
+  protected void processProduces(String[] produces, OperationContext operationContext) {
+    if (null == produces || produces.length == 0) {
+      return;
+    }
+
+    List<String> produceList = Arrays.stream(produces).filter(s -> !StringUtils.isEmpty(s))
+        .collect(Collectors.toList());
+
+    if (!produceList.isEmpty()) {
+      ApiResponse apiResponse = new ApiResponse();
+      Content content = new Content();
+      MediaType mediaType = new MediaType();
+      Schema schema = ModelConverter
+          .getSchema(operationContext.getMethod().getReturnType(), operationContext.getComponents());
+      mediaType.schema(schema);
+      for (String produce : produceList) {
+        content.addMediaType(produce, mediaType);
+      }
+      apiResponse.setContent(content);
+      operationContext.addResponse(HttpStatus.OK, apiResponse);
+    }
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/DeleteMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/DeleteMappingMethodAnnotationProcessor.java
new file mode 100644
index 0000000..a53736f
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/DeleteMappingMethodAnnotationProcessor.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+public class DeleteMappingMethodAnnotationProcessor extends
+    AbstractHttpMethodMappingAnnotationProcessor<DeleteMapping, OperationContext> {
+
+  @Override
+  public void process(DeleteMapping deleteMapping, OperationContext operationContext) {
+    processPath(deleteMapping.path(), operationContext);
+    processPath(deleteMapping.value(), operationContext);
+    processMethod(RequestMethod.DELETE, operationContext);
+    processConsumes(deleteMapping.consumes(), operationContext);
+    processProduces(deleteMapping.produces(), operationContext);
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/GetMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/GetMappingMethodAnnotationProcessor.java
new file mode 100644
index 0000000..7bbf769
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/GetMappingMethodAnnotationProcessor.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+public class GetMappingMethodAnnotationProcessor extends AbstractHttpMethodMappingAnnotationProcessor<GetMapping, OperationContext> {
+
+  @Override
+  public void process(GetMapping getMapping, OperationContext operationContext) {
+    processPath(getMapping.path(), operationContext);
+    this.processPath(getMapping.path(), operationContext);
+    this.processPath(getMapping.value(), operationContext);
+    this.processMethod(RequestMethod.GET, operationContext);
+    this.processConsumes(getMapping.consumes(), operationContext);
+    this.processProduces(getMapping.produces(), operationContext);
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathVariableAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathVariableAnnotationProcessor.java
new file mode 100644
index 0000000..bc752f3
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathVariableAnnotationProcessor.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.apache.servicecomb.toolkit.generator.util.ParamUtils;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+
+public class PathVariableAnnotationProcessor implements ParamAnnotationProcessor<PathVariable, ParameterContext> {
+  @Override
+  public void process(PathVariable pathVariable, ParameterContext parameterContext) {
+
+    String paramName = pathVariable.name();
+    if (StringUtils.isEmpty(paramName)) {
+      paramName = ParamUtils
+          .getParamterName(parameterContext.getOperationContext().getMethod(), parameterContext.getParameter());
+    }
+
+    parameterContext.setName(paramName);
+    parameterContext.setRequired(pathVariable.required());
+    parameterContext.setType(ParameterIn.PATH.toString());
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PostMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PostMappingMethodAnnotationProcessor.java
new file mode 100644
index 0000000..9848cca
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PostMappingMethodAnnotationProcessor.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+public class PostMappingMethodAnnotationProcessor extends AbstractHttpMethodMappingAnnotationProcessor<PostMapping, OperationContext> {
+
+  @Override
+  public void process(PostMapping postMapping, OperationContext operationContext) {
+
+    this.processPath(postMapping.path(), operationContext);
+    this.processPath(postMapping.value(), operationContext);
+    this.processMethod(RequestMethod.POST, operationContext);
+    this.processConsumes(postMapping.consumes(), operationContext);
+    this.processProduces(postMapping.produces(), operationContext);
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PutMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PutMappingMethodAnnotationProcessor.java
new file mode 100644
index 0000000..53f4738
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PutMappingMethodAnnotationProcessor.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+public class PutMappingMethodAnnotationProcessor extends AbstractHttpMethodMappingAnnotationProcessor<PutMapping, OperationContext> {
+
+  @Override
+  public void process(PutMapping putMapping, OperationContext operationContext) {
+
+    this.processPath(putMapping.path(), operationContext);
+    this.processPath(putMapping.value(), operationContext);
+    this.processMethod(RequestMethod.PUT, operationContext);
+    this.processConsumes(putMapping.consumes(), operationContext);
+    this.processProduces(putMapping.produces(), operationContext);
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyAnnotationProcessor.java
new file mode 100644
index 0000000..2b0a114
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestBodyAnnotationProcessor.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.springframework.web.bind.annotation.RequestBody;
+
+public class RequestBodyAnnotationProcessor implements ParamAnnotationProcessor<RequestBody, ParameterContext> {
+
+  @Override
+  public void process(RequestBody requestBody, ParameterContext parameterContext) {
+    parameterContext.setRequired(requestBody.required());
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestHeaderAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestHeaderAnnotationProcessor.java
new file mode 100644
index 0000000..ece07cc
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestHeaderAnnotationProcessor.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.ValueConstants;
+
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+
+public class RequestHeaderAnnotationProcessor implements ParamAnnotationProcessor<RequestHeader, ParameterContext> {
+
+  @Override
+  public void process(RequestHeader requestHeader, ParameterContext parameterContext) {
+    parameterContext.setType(ParameterIn.HEADER.toString());
+    parameterContext.setRequired(requestHeader.required());
+
+    if (!ObjectUtils.isEmpty(requestHeader.defaultValue()) && !ValueConstants.DEFAULT_NONE
+        .equals(requestHeader.defaultValue())) {
+      parameterContext.setDefaultValue(requestHeader.defaultValue());
+    }
+
+    String name = requestHeader.name();
+    if (StringUtils.isEmpty(name)) {
+      name = requestHeader.value();
+    }
+
+    parameterContext.setName(name);
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingClassAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingClassAnnotationProcessor.java
new file mode 100644
index 0000000..a44bb0d
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingClassAnnotationProcessor.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+public class RequestMappingClassAnnotationProcessor implements
+    ClassAnnotationProcessor<RequestMapping, OasContext> {
+
+  @Override
+  public void process(RequestMapping requestMapping, OasContext oasContext) {
+
+    String[] paths = requestMapping.value();
+    if (null == paths || paths.length == 0) {
+      return;
+    }
+
+    // swagger仅支持配一个basePath
+    if (paths.length > 1) {
+      throw new Error("not support multi path for " + oasContext.getCls().getName());
+    }
+
+    oasContext.setBasePath(paths[0]);
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingMethodAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingMethodAnnotationProcessor.java
new file mode 100644
index 0000000..bdcc3fc
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestMappingMethodAnnotationProcessor.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+public class RequestMappingMethodAnnotationProcessor implements
+    MethodAnnotationProcessor<RequestMapping, OperationContext> {
+
+  @Override
+  public void process(RequestMapping requestMapping, OperationContext operationContext) {
+
+    String[] paths = requestMapping.value();
+    if (null == paths || paths.length == 0) {
+      return;
+    }
+
+    // swagger仅支持配一个basePath
+    if (paths.length > 1) {
+      throw new Error("not support multi path for " + operationContext.getMethod().getName());
+    }
+
+    operationContext.setPath(paths[0]);
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestParamAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestParamAnnotationProcessor.java
new file mode 100644
index 0000000..8a127c3
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestParamAnnotationProcessor.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ValueConstants;
+
+public class RequestParamAnnotationProcessor implements ParamAnnotationProcessor<RequestParam, ParameterContext> {
+
+  @Override
+  public void process(RequestParam requestParam, ParameterContext parameterContext) {
+    String name = requestParam.value();
+    if (StringUtils.isEmpty(name)) {
+      name = requestParam.name();
+    }
+
+    parameterContext.setName(name);
+    parameterContext.setRequired(requestParam.required());
+    if (!ObjectUtils.isEmpty(requestParam.defaultValue()) && !ValueConstants.DEFAULT_NONE
+        .equals(requestParam.defaultValue())) {
+      parameterContext.setDefaultValue(requestParam.defaultValue());
+      parameterContext.setRequired(false);
+    }
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java
new file mode 100644
index 0000000..1fdcc55
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/RequestPartAnnotationProcessor.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import org.apache.servicecomb.toolkit.generator.ParameterContext;
+import org.springframework.web.bind.annotation.RequestPart;
+
+public class RequestPartAnnotationProcessor implements ParamAnnotationProcessor<RequestPart, ParameterContext> {
+  @Override
+  public void process(RequestPart requestPart, ParameterContext parameterContext) {
+
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java
new file mode 100644
index 0000000..59a65c3
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/parser/SpringmvcAnnotationParser.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.parser;
+
+import org.apache.servicecomb.toolkit.generator.OasContext;
+import org.apache.servicecomb.toolkit.generator.annotation.GetMappingMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PathVariableAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PostMappingMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PutMappingMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestBodyAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestMappingClassAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestMappingMethodAnnotationProcessor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+public class SpringmvcAnnotationParser extends AbstractAnnotationParser {
+
+  @Override
+  public int getOrder() {
+    return 0;
+  }
+
+  @Override
+  public void parser(Class<?> cls, OasContext context) {
+    super.parser(cls, context);
+  }
+
+  @Override
+  public boolean canProcess(Class<?> cls) {
+    if (cls.getAnnotation(RestController.class) != null) {
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public void initClassAnnotationProcessor() {
+    super.initClassAnnotationProcessor();
+    classAnnotationMap.put(RequestMapping.class, new RequestMappingClassAnnotationProcessor());
+  }
+
+  @Override
+  public void initMethodAnnotationProcessor() {
+    super.initMethodAnnotationProcessor();
+    methodAnnotationMap.put(RequestMapping.class, new RequestMappingMethodAnnotationProcessor());
+    methodAnnotationMap.put(GetMapping.class, new GetMappingMethodAnnotationProcessor());
+    methodAnnotationMap.put(PutMapping.class, new PutMappingMethodAnnotationProcessor());
+    methodAnnotationMap.put(PostMapping.class, new PostMappingMethodAnnotationProcessor());
+  }
+
+  @Override
+  public void initParameterAnnotationProcessor() {
+    super.initParameterAnnotationProcessor();
+    parameterAnnotationMap.put(PathVariable.class, new PathVariableAnnotationProcessor());
+    parameterAnnotationMap.put(RequestBody.class, new RequestBodyAnnotationProcessor());
+  }
+}
+
diff --git a/oas-generator/oas-generator-spring/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.annotation.ModelInterceptor b/oas-generator/oas-generator-spring/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.annotation.ModelInterceptor
new file mode 100644
index 0000000..50c3a84
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.annotation.ModelInterceptor
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.servicecomb.toolkit.generator.MultipartFileInterceptor
\ No newline at end of file
diff --git a/oas-generator/oas-generator-spring/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser b/oas-generator/oas-generator-spring/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser
new file mode 100644
index 0000000..7d4e564
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.servicecomb.toolkit.generator.parser.SpringmvcAnnotationParser
\ No newline at end of file
diff --git a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java
new file mode 100644
index 0000000..0bf7191
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringAnnotationProcessorTest.java
@@ -0,0 +1,225 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+
+import org.apache.servicecomb.toolkit.generator.annotation.DeleteMappingMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.GetMappingMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PathVariableAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PostMappingMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PutMappingMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestBodyAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestHeaderAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestMappingClassAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestMappingMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestParamAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.RequestPartAnnotationProcessor;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import io.swagger.v3.oas.models.media.FileSchema;
+
+public class SpringAnnotationProcessorTest {
+
+  @Test
+  public void getHttpMethod() throws NoSuchMethodException {
+
+    OasContext oasContext = new OasContext(null);
+    Class<HttpMethodResource> httpMethodResourceClass = HttpMethodResource.class;
+    RequestMapping requestMappingClassAnnotation = httpMethodResourceClass.getAnnotation(RequestMapping.class);
+    RequestMappingClassAnnotationProcessor requestMappingClassAnnotationProcessor = new RequestMappingClassAnnotationProcessor();
+    requestMappingClassAnnotationProcessor.process(requestMappingClassAnnotation, oasContext);
+    Assert.assertEquals(requestMappingClassAnnotation.value()[0], oasContext.getBasePath());
+
+    RequestMappingMethodAnnotationProcessor requestMappingMethodAnnotationProcessor = new RequestMappingMethodAnnotationProcessor();
+    Method requestMethod = httpMethodResourceClass.getMethod("request");
+    RequestMapping requestMappingMethodAnnotation = requestMethod.getAnnotation(RequestMapping.class);
+    OperationContext requestOperationContext = new OperationContext(requestMethod, oasContext);
+    requestMappingMethodAnnotationProcessor.process(requestMappingMethodAnnotation, requestOperationContext);
+    Assert
+        .assertEquals(requestMappingMethodAnnotation.value()[0],
+            requestOperationContext.getPath());
+
+    GetMappingMethodAnnotationProcessor getMappingMethodAnnotationProcessor = new GetMappingMethodAnnotationProcessor();
+    Method getMethod = httpMethodResourceClass.getMethod("get");
+    GetMapping getMappingAnnotation = getMethod.getAnnotation(GetMapping.class);
+    OperationContext getOperationContext = new OperationContext(getMethod, oasContext);
+    getMappingMethodAnnotationProcessor.process(getMappingAnnotation, getOperationContext);
+    Assert
+        .assertEquals(getMappingAnnotation.value()[0], getOperationContext.getPath());
+
+    PostMappingMethodAnnotationProcessor postMappingMethodAnnotationProcessor = new PostMappingMethodAnnotationProcessor();
+    Method postMethod = httpMethodResourceClass.getMethod("post");
+    PostMapping postMappingAnnotation = postMethod.getAnnotation(PostMapping.class);
+    OperationContext postOperationContext = new OperationContext(postMethod, oasContext);
+    postMappingMethodAnnotationProcessor.process(postMappingAnnotation, postOperationContext);
+    Assert
+        .assertEquals(postMappingAnnotation.value()[0], postOperationContext.getPath());
+
+    PutMappingMethodAnnotationProcessor putMappingMethodAnnotationProcessor = new PutMappingMethodAnnotationProcessor();
+    Method putMethod = httpMethodResourceClass.getMethod("put");
+    PutMapping putMappingAnnotation = putMethod.getAnnotation(PutMapping.class);
+    OperationContext putOperationContext = new OperationContext(putMethod, oasContext);
+    putMappingMethodAnnotationProcessor.process(putMappingAnnotation, putOperationContext);
+    Assert
+        .assertEquals(putMappingAnnotation.value()[0], putOperationContext.getPath());
+
+    DeleteMappingMethodAnnotationProcessor deleteMappingMethodAnnotationProcessor = new DeleteMappingMethodAnnotationProcessor();
+    Method deleteMethod = httpMethodResourceClass.getMethod("delete");
+    DeleteMapping delelteMappingAnnotation = deleteMethod.getAnnotation(DeleteMapping.class);
+    OperationContext deleteOperationContext = new OperationContext(deleteMethod, oasContext);
+    deleteMappingMethodAnnotationProcessor.process(delelteMappingAnnotation, deleteOperationContext);
+    Assert
+        .assertEquals(delelteMappingAnnotation.value()[0], deleteOperationContext.getPath());
+  }
+
+  @Test
+  public void parseParameter() throws NoSuchMethodException {
+    Class<ParamAnnotationResource> paramAnnotationResourceClass = ParamAnnotationResource.class;
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext;
+    ParameterContext parameterContext;
+
+    RequestParamAnnotationProcessor requestParamAnnotationProcessor = new RequestParamAnnotationProcessor();
+    Method requestParamMethod = paramAnnotationResourceClass.getMethod("requestParam", String.class);
+    Parameter requestParamMethodParam = requestParamMethod.getParameters()[0];
+    RequestParam requestParamAnnotation = requestParamMethodParam
+        .getAnnotation(RequestParam.class);
+    operationContext = new OperationContext(requestParamMethod, oasContext);
+    parameterContext = new ParameterContext(operationContext, requestParamMethodParam);
+    requestParamAnnotationProcessor.process(requestParamAnnotation, parameterContext);
+    io.swagger.v3.oas.models.parameters.Parameter oasParameter = parameterContext.toOasParameter();
+    Assert.assertNull(parameterContext.getDefaultValue());
+    Assert.assertNull(oasParameter.getSchema().getDefault());
+
+    PathVariableAnnotationProcessor pathVariableAnnotationProcessor = new PathVariableAnnotationProcessor();
+    Method pathVariableMethod = paramAnnotationResourceClass.getMethod("pathVariable", String.class);
+    Parameter pathVariableMethodParam = pathVariableMethod.getParameters()[0];
+    PathVariable pathVariableAnnotation = pathVariableMethodParam
+        .getAnnotation(PathVariable.class);
+    operationContext = new OperationContext(pathVariableMethod, oasContext);
+    parameterContext = new ParameterContext(operationContext, pathVariableMethodParam);
+    pathVariableAnnotationProcessor.process(pathVariableAnnotation, parameterContext);
+    parameterContext.toOasParameter();
+    Assert.assertTrue(parameterContext.isRequired());
+
+    RequestPartAnnotationProcessor requestPartAnnotationProcessor = new RequestPartAnnotationProcessor();
+    Method requestPartMethod = paramAnnotationResourceClass.getMethod("requestPart", MultipartFile.class);
+    Parameter requestPartMethodParam = requestPartMethod.getParameters()[0];
+    RequestPart requestPartParamAnnotation = requestPartMethodParam
+        .getAnnotation(RequestPart.class);
+    operationContext = new OperationContext(requestPartMethod, oasContext);
+    parameterContext = new ParameterContext(operationContext, requestPartMethodParam);
+    requestPartAnnotationProcessor.process(requestPartParamAnnotation, parameterContext);
+    oasParameter = parameterContext.toOasParameter();
+    Assert.assertNull(parameterContext.getDefaultValue());
+    Assert.assertEquals(FileSchema.class, oasParameter.getSchema().getClass());
+
+    RequestHeaderAnnotationProcessor requestHeaderAnnotationProcessor = new RequestHeaderAnnotationProcessor();
+    Method requestHeaderMethod = paramAnnotationResourceClass.getMethod("requestHeader", String.class);
+    Parameter requestHeaderMethodParam = requestHeaderMethod.getParameters()[0];
+    RequestHeader requestHeaderParamAnnotation = requestHeaderMethodParam
+        .getAnnotation(RequestHeader.class);
+    operationContext = new OperationContext(requestPartMethod, oasContext);
+    parameterContext = new ParameterContext(operationContext, requestHeaderMethodParam);
+    requestHeaderAnnotationProcessor.process(requestHeaderParamAnnotation, parameterContext);
+    oasParameter = parameterContext.toOasParameter();
+    Assert.assertNull(parameterContext.getDefaultValue());
+    Assert.assertNull(oasParameter.getSchema().getDefault());
+
+    RequestBodyAnnotationProcessor requestBodyAnnotationProcessor = new RequestBodyAnnotationProcessor();
+    Method requestBodyMethod = paramAnnotationResourceClass.getMethod("requestBody", String.class);
+    Parameter requestBodyMethodParam = requestBodyMethod.getParameters()[0];
+    RequestBody requestBodyParamAnnotation = requestBodyMethodParam
+        .getAnnotation(RequestBody.class);
+    operationContext = new OperationContext(requestBodyMethod, oasContext);
+    parameterContext = new ParameterContext(operationContext, requestBodyMethodParam);
+    requestBodyAnnotationProcessor.process(requestBodyParamAnnotation, parameterContext);
+    parameterContext.toOasParameter();
+    Assert.assertTrue(parameterContext.isRequired());
+  }
+
+  @Test
+  public void interceptorModel() {
+    MultipartFileInterceptor interceptor = new MultipartFileInterceptor();
+    Assert.assertEquals(100, interceptor.order());
+  }
+
+  @RestController
+  @RequestMapping("/path")
+  class HttpMethodResource {
+
+    @RequestMapping("/request")
+    public String request() {
+      return "request";
+    }
+
+    @GetMapping(value = "/get", consumes = {"application/json"})
+    public String get() {
+      return "get";
+    }
+
+    @PostMapping("/post")
+    public String post() {
+      return "post";
+    }
+
+    @PutMapping("/put")
+    public String put() {
+      return "put";
+    }
+
+    @DeleteMapping("/delete")
+    public String delete() {
+      return "delete";
+    }
+  }
+
+
+  class ParamAnnotationResource {
+
+    public void requestParam(@RequestParam("param") String param) {
+    }
+
+    public void requestBody(@RequestBody String param) {
+    }
+
+    public void requestHeader(@RequestHeader String headerParam) {
+    }
+
+    public void requestPart(@RequestPart MultipartFile file) {
+    }
+
+    public void pathVariable(@PathVariable String path) {
+    }
+  }
+}
diff --git a/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java
new file mode 100644
index 0000000..fd8dfb2
--- /dev/null
+++ b/oas-generator/oas-generator-spring/src/test/java/org/apache/servicecomb/toolkit/generator/SpringParserTest.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import org.apache.servicecomb.toolkit.generator.parser.SpringmvcAnnotationParser;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.web.bind.annotation.RestController;
+
+public class SpringParserTest {
+
+  @Test
+  public void parse() {
+    SpringmvcAnnotationParser parser = new SpringmvcAnnotationParser();
+
+    boolean canProcess = parser.canProcess(String.class);
+    Assert.assertFalse(canProcess);
+
+    canProcess = parser.canProcess(SpringmvcController.class);
+    Assert.assertTrue(canProcess);
+
+    OasContext oasContext = new OasContext(parser);
+    parser.parser(SpringmvcController.class, oasContext);
+  }
+
+  @RestController
+  class SpringmvcController {
+
+  }
+}
diff --git a/oas-generator/pom.xml b/oas-generator/pom.xml
index dafeed5..849e520 100644
--- a/oas-generator/pom.xml
+++ b/oas-generator/pom.xml
@@ -28,6 +28,7 @@
   <modules>
     <module>oas-generator-core</module>
     <module>oas-generator-jaxrs</module>
+    <module>oas-generator-spring</module>
   </modules>
 
   <artifactId>oas-generator</artifactId>


[servicecomb-toolkit] 02/10: add oas-generator-jaxrs to support parse jaxrs code

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit 0afd957bf3a040d43274b64b2ba5567c57aab6c4
Author: kakulisen <18...@163.com>
AuthorDate: Sat Oct 26 09:13:44 2019 +0800

    add oas-generator-jaxrs to support parse jaxrs code
    
    Signed-off-by: kakulisen <18...@163.com>
---
 oas-generator/{ => oas-generator-jaxrs}/pom.xml    |  36 ++----
 .../annotation/HttpMethodAnnotationProcessor.java  |  32 +++++
 .../annotation/PathClassAnnotationProcessor.java   |  29 +++++
 .../annotation/PathMethodAnnotationProcessor.java  |  29 +++++
 .../generator/parser/JaxRsAnnotationParser.java    |  69 +++++++++++
 ...it.generator.parser.api.OpenApiAnnotationParser |  18 +++
 .../generator/JaxrsAnnotationProcessorTest.java    |  79 ++++++++++++
 .../toolkit/generator/JaxrsParserTest.java         |  66 ++++++++++
 .../toolkit/generator/ServerOperationResource.java | 138 +++++++++++++++++++++
 oas-generator/pom.xml                              |   1 +
 10 files changed, 468 insertions(+), 29 deletions(-)

diff --git a/oas-generator/pom.xml b/oas-generator/oas-generator-jaxrs/pom.xml
similarity index 61%
copy from oas-generator/pom.xml
copy to oas-generator/oas-generator-jaxrs/pom.xml
index 123ec2c..b634cb0 100644
--- a/oas-generator/pom.xml
+++ b/oas-generator/oas-generator-jaxrs/pom.xml
@@ -19,46 +19,24 @@
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>toolkit</artifactId>
+    <artifactId>oas-generator</artifactId>
     <groupId>org.apache.servicecomb.toolkit</groupId>
     <version>0.2.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
-  <packaging>pom</packaging>
-  <modules>
-    <module>oas-generator-core</module>
-  </modules>
 
-  <artifactId>oas-generator</artifactId>
+  <artifactId>oas-generator-jaxrs</artifactId>
 
   <dependencies>
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-module-junit4</artifactId>
-      <version>1.6.2</version>
-      <scope>test</scope>
+      <groupId>org.apache.servicecomb.toolkit</groupId>
+      <artifactId>oas-generator-core</artifactId>
     </dependency>
 
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-api-mockito</artifactId>
-      <version>1.6.2</version>
-      <scope>test</scope>
+      <groupId>javax.ws.rs</groupId>
+      <artifactId>javax.ws.rs-api</artifactId>
+      <version>2.1</version>
     </dependency>
   </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.8.1</version>
-        <configuration>
-          <target>1.8</target>
-          <source>1.8</source>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
 </project>
\ No newline at end of file
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HttpMethodAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HttpMethodAnnotationProcessor.java
new file mode 100644
index 0000000..fbe0e83
--- /dev/null
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/HttpMethodAnnotationProcessor.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import java.lang.annotation.Annotation;
+
+import javax.ws.rs.HttpMethod;
+
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+
+public class HttpMethodAnnotationProcessor implements MethodAnnotationProcessor<Annotation, OperationContext> {
+  @Override
+  public void process(Annotation annotation, OperationContext operationContext) {
+    HttpMethod httpMethod = annotation.annotationType().getAnnotation(HttpMethod.class);
+    operationContext.setHttpMethod(httpMethod.value());
+  }
+}
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
new file mode 100644
index 0000000..42c5f72
--- /dev/null
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathClassAnnotationProcessor.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import javax.ws.rs.Path;
+
+import org.apache.servicecomb.toolkit.generator.OasContext;
+
+public class PathClassAnnotationProcessor implements ClassAnnotationProcessor<Path, OasContext> {
+  @Override
+  public void process(Path path, OasContext context) {
+    context.setBasePath(path.value());
+  }
+}
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathMethodAnnotationProcessor.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathMethodAnnotationProcessor.java
new file mode 100644
index 0000000..187006c
--- /dev/null
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/PathMethodAnnotationProcessor.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.annotation;
+
+import javax.ws.rs.Path;
+
+import org.apache.servicecomb.toolkit.generator.OperationContext;
+
+public class PathMethodAnnotationProcessor implements MethodAnnotationProcessor<Path, OperationContext> {
+  @Override
+  public void process(Path path, OperationContext context) {
+    context.setPath(path.value());
+  }
+}
diff --git a/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/parser/JaxRsAnnotationParser.java b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/parser/JaxRsAnnotationParser.java
new file mode 100644
index 0000000..a5b0b12
--- /dev/null
+++ b/oas-generator/oas-generator-jaxrs/src/main/java/org/apache/servicecomb/toolkit/generator/parser/JaxRsAnnotationParser.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator.parser;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HEAD;
+import javax.ws.rs.OPTIONS;
+import javax.ws.rs.PATCH;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+
+import org.apache.servicecomb.toolkit.generator.annotation.HttpMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PathClassAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PathMethodAnnotationProcessor;
+
+public class JaxRsAnnotationParser extends AbstractAnnotationParser {
+
+  @Override
+  public void initClassAnnotationProcessor() {
+    super.initClassAnnotationProcessor();
+    classAnnotationMap.put(Path.class, new PathClassAnnotationProcessor());
+  }
+
+  @Override
+  public void initMethodAnnotationProcessor() {
+    super.initMethodAnnotationProcessor();
+    methodAnnotationMap.put(Path.class, new PathMethodAnnotationProcessor());
+
+    HttpMethodAnnotationProcessor httpMethodAnnotationProcessor = new HttpMethodAnnotationProcessor();
+    methodAnnotationMap.put(GET.class, httpMethodAnnotationProcessor);
+    methodAnnotationMap.put(POST.class, httpMethodAnnotationProcessor);
+    methodAnnotationMap.put(DELETE.class, httpMethodAnnotationProcessor);
+    methodAnnotationMap.put(PATCH.class, httpMethodAnnotationProcessor);
+    methodAnnotationMap.put(PUT.class, httpMethodAnnotationProcessor);
+    methodAnnotationMap.put(OPTIONS.class, httpMethodAnnotationProcessor);
+    methodAnnotationMap.put(HEAD.class, httpMethodAnnotationProcessor);
+  }
+
+  @Override
+  public int getOrder() {
+    return 100;
+  }
+
+  @Override
+  public boolean canProcess(Class<?> cls) {
+
+    if (cls.getAnnotation(Path.class) != null) {
+      return true;
+    }
+    return false;
+  }
+}
diff --git a/oas-generator/oas-generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser b/oas-generator/oas-generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser
new file mode 100644
index 0000000..7f60cef
--- /dev/null
+++ b/oas-generator/oas-generator-jaxrs/src/main/resources/META-INF/services/org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.servicecomb.toolkit.generator.parser.JaxRsAnnotationParser
\ No newline at end of file
diff --git a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsAnnotationProcessorTest.java b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsAnnotationProcessorTest.java
new file mode 100644
index 0000000..72f49e5
--- /dev/null
+++ b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsAnnotationProcessorTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.HttpMethod;
+import javax.ws.rs.Path;
+
+import org.apache.servicecomb.toolkit.generator.annotation.HttpMethodAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PathClassAnnotationProcessor;
+import org.apache.servicecomb.toolkit.generator.annotation.PathMethodAnnotationProcessor;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class JaxrsAnnotationProcessorTest {
+
+  @Test
+  public void processApiResponseAnnotation() throws NoSuchMethodException {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext context = new OperationContext(null, oasContext);
+    HttpMethodAnnotationProcessor httpMethodAnnotationProcessor = new HttpMethodAnnotationProcessor();
+
+    GET get = GetClass.class.getMethod("get").getAnnotation(GET.class);
+    httpMethodAnnotationProcessor.process(get, context);
+
+    Assert.assertEquals(HttpMethod.GET, context.getHttpMethod());
+  }
+
+  @Test
+  public void processPathClassAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    PathClassAnnotationProcessor httpMethodAnnotationProcessor = new PathClassAnnotationProcessor();
+
+    Path path = Mockito.mock(Path.class);
+    Mockito.when(path.value()).thenReturn("/path");
+    httpMethodAnnotationProcessor.process(path, oasContext);
+
+    Assert.assertEquals("/path", oasContext.getBasePath());
+  }
+
+  @Test
+  public void processPathMethodAnnotation() {
+
+    OasContext oasContext = new OasContext(null);
+    OperationContext operationContext = new OperationContext(null, oasContext);
+    PathMethodAnnotationProcessor pathMethodAnnotationProcessor = new PathMethodAnnotationProcessor();
+
+    Path path = Mockito.mock(Path.class);
+    Mockito.when(path.value()).thenReturn("/path");
+    pathMethodAnnotationProcessor.process(path, operationContext);
+
+    Assert.assertEquals("/path", operationContext.getPath());
+  }
+
+  class GetClass {
+    @GET
+    public String get() {
+      return "get";
+    }
+  }
+}
diff --git a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java
new file mode 100644
index 0000000..cef30d2
--- /dev/null
+++ b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/JaxrsParserTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import javax.ws.rs.Path;
+
+import org.apache.servicecomb.toolkit.generator.parser.JaxRsAnnotationParser;
+import org.junit.Assert;
+import org.junit.Test;
+
+import io.swagger.v3.oas.models.Components;
+
+public class JaxrsParserTest {
+
+  @Test
+  public void parseJaxrs() {
+
+    JaxRsAnnotationParser parser = new JaxRsAnnotationParser();
+    boolean canProcess = parser.canProcess(NoResource.class);
+    Assert.assertEquals(false, canProcess);
+
+    canProcess = parser.canProcess(OneResource.class);
+    Assert.assertEquals(true, canProcess);
+
+    OasContext context = new OasContext(parser);
+    parser.parser(OneResource.class, context);
+  }
+
+  class NoResource {
+    public String name() {
+      return "no resource";
+    }
+  }
+
+  @Path("/path")
+  class OneResource {
+
+    @Path("/name")
+    public String name() {
+      return "no resource";
+    }
+  }
+
+  public static void main(String[] args) {
+    OneResource.class.getMethods();
+    Components components1 = new Components();
+    Components components2 = new Components();
+
+    System.out.println(components1.equals(components2));
+  }
+}
diff --git a/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/ServerOperationResource.java b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/ServerOperationResource.java
new file mode 100644
index 0000000..604e4f5
--- /dev/null
+++ b/oas-generator/oas-generator-jaxrs/src/test/java/org/apache/servicecomb/toolkit/generator/ServerOperationResource.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.toolkit.generator;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+
+@Path("")
+public class ServerOperationResource {
+
+  @Path("/serversoperation")
+  @GET
+  @ApiResponse(
+      responseCode = "500",
+      description = "voila!",
+      content = {
+          @Content(
+              mediaType = "application/json",
+              schema = @Schema(implementation = String.class)
+          ),
+          @Content(
+              mediaType = "application/xml",
+              schema = @Schema(implementation = String.class)
+          )
+      })
+  @ApiResponse(responseCode = "400")
+  @ApiResponse(responseCode = "404", description = "User not found")
+  @Operation(operationId = "getPet", description = "Pets Example")
+  public ResponseBean getPet() {
+    return new ResponseBean();
+  }
+
+
+  @Path("/serversoperation2")
+  @POST
+  @Operation(operationId = "getPet2", description = "Pets Example")
+  public String getPet2(@Parameter(required = true) @QueryParam("pet") String pet) {
+    return "";
+  }
+
+
+  @Path("/serversoperation3")
+  @POST
+  @Operation(operationId = "getPet3", description = "Pets Example")
+  public String getPet3(String[] pet1, String pet2, RequestBean[] requestBean) {
+    return "";
+  }
+
+  @Path("/serversoperation4")
+  @POST
+  @Operation(operationId = "getPet4", description = "Pets Example")
+  public String getPet4(String[] pet1, RequestBean responseBean) {
+    return "";
+  }
+
+  public String noResource() {
+    return "no resource";
+  }
+
+  class RequestBean {
+
+    private String name;
+
+    private String content;
+
+    public String getName() {
+      return name;
+    }
+
+    public void setName(String name) {
+      this.name = name;
+    }
+
+    public String getContent() {
+      return content;
+    }
+
+    public void setContent(String content) {
+      this.content = content;
+    }
+  }
+
+  class ResponseBean {
+
+    private String status;
+
+    private String content;
+
+    private RequestBean request;
+
+    public String getStatus() {
+      return status;
+    }
+
+    public void setStatus(String status) {
+      this.status = status;
+    }
+
+    public String getContent() {
+      return content;
+    }
+
+    public void setContent(String content) {
+      this.content = content;
+    }
+
+    public RequestBean getRequest() {
+      return request;
+    }
+
+    public void setRequest(RequestBean request) {
+      this.request = request;
+    }
+  }
+}
diff --git a/oas-generator/pom.xml b/oas-generator/pom.xml
index 123ec2c..dafeed5 100644
--- a/oas-generator/pom.xml
+++ b/oas-generator/pom.xml
@@ -27,6 +27,7 @@
   <packaging>pom</packaging>
   <modules>
     <module>oas-generator-core</module>
+    <module>oas-generator-jaxrs</module>
   </modules>
 
   <artifactId>oas-generator</artifactId>