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 <[email protected]> AuthorDate: Tue Nov 12 08:02:56 2019 +0800 add new processor Signed-off-by: kakulisen <[email protected]> --- .../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 = "[email protected]", + 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");
