You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/09/19 06:43:40 UTC
[incubator-servicecomb-java-chassis] 01/02: [SCB-215] process
parameter level @ApiParam
This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 6cd13bbb280c04b7724fc09d46430ae8390c21b2
Author: wujimin <wu...@huawei.com>
AuthorDate: Mon Sep 17 17:10:56 2018 +0800
[SCB-215] process parameter level @ApiParam
---
.../swagger/generator/core/OperationGenerator.java | 6 ++
.../core/processor/annotation/AnnotationUtils.java | 96 +++++++++++++++++++++-
.../extend/parameter/PendingBodyParameter.java | 19 ++++-
3 files changed, 116 insertions(+), 5 deletions(-)
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
index 560e3aa..8c9a834 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
@@ -31,6 +31,7 @@ import javax.ws.rs.DefaultValue;
import org.apache.servicecomb.swagger.SwaggerUtils;
import org.apache.servicecomb.swagger.extend.parameter.ContextParameter;
+import org.apache.servicecomb.swagger.generator.core.processor.annotation.AnnotationUtils;
import org.apache.servicecomb.swagger.generator.core.utils.ParamUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -292,6 +293,11 @@ public class OperationGenerator {
// 没有用于描述契约的标注,根据函数原型来反射生成
context.getDefaultParamProcessor().process(this, paramIdx);
}
+
+ if (!isArgumentNotProcessed(swaggerParamCount)) {
+ Parameter parameter = providerParameters.get(this.providerParameters.size() - 1);
+ AnnotationUtils.processApiParam(paramAnnotations, parameter);
+ }
}
}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/AnnotationUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/AnnotationUtils.java
index def34bf..aebca2b 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/AnnotationUtils.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/annotation/AnnotationUtils.java
@@ -17,6 +17,7 @@
package org.apache.servicecomb.swagger.generator.core.processor.annotation;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashMap;
@@ -24,21 +25,25 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.swagger.generator.core.processor.annotation.models.ResponseConfig;
import org.apache.servicecomb.swagger.generator.core.processor.annotation.models.ResponseConfigBase;
import org.apache.servicecomb.swagger.generator.core.processor.annotation.models.ResponseHeaderConfig;
import org.springframework.util.ClassUtils;
-import org.springframework.util.StringUtils;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.Example;
+import io.swagger.annotations.ExampleProperty;
import io.swagger.annotations.ResponseHeader;
import io.swagger.converter.ModelConverters;
import io.swagger.models.Model;
import io.swagger.models.Operation;
import io.swagger.models.Response;
import io.swagger.models.Swagger;
+import io.swagger.models.parameters.AbstractSerializableParameter;
import io.swagger.models.parameters.BodyParameter;
import io.swagger.models.parameters.CookieParameter;
import io.swagger.models.parameters.FormParameter;
@@ -47,6 +52,8 @@ import io.swagger.models.parameters.Parameter;
import io.swagger.models.parameters.PathParameter;
import io.swagger.models.parameters.QueryParameter;
import io.swagger.models.properties.ArrayProperty;
+import io.swagger.models.properties.FileProperty;
+import io.swagger.models.properties.LongProperty;
import io.swagger.models.properties.MapProperty;
import io.swagger.models.properties.Property;
import io.swagger.util.ParameterProcessor;
@@ -218,4 +225,91 @@ public final class AnnotationUtils {
throw new Error("not support paramType " + paramAnnotation.paramType());
}
}
+
+ @SuppressWarnings("unchecked")
+ public static <T> T findAnnotation(Annotation[] annotations, Class<T> annotationType) {
+ for (Annotation annotation : annotations) {
+ if (annotation.annotationType().equals(annotationType)) {
+ return (T) annotation;
+ }
+ }
+
+ return null;
+ }
+
+ public static void processApiParam(Annotation[] paramAnnotations, Parameter parameter) {
+ ApiParam param = findAnnotation(paramAnnotations, ApiParam.class);
+ if (param == null) {
+ return;
+ }
+
+ if (parameter instanceof AbstractSerializableParameter) {
+ processApiParam(param, (AbstractSerializableParameter<?>) parameter);
+ return;
+ }
+
+ processApiParam(param, (BodyParameter) parameter);
+ }
+
+ protected static void processApiParam(ApiParam param, BodyParameter p) {
+ if (param.required()) {
+ p.setRequired(true);
+ }
+ if (StringUtils.isNotEmpty(param.name())) {
+ p.setName(param.name());
+ }
+ if (StringUtils.isNotEmpty(param.value())) {
+ p.setDescription(param.value());
+ }
+ if (StringUtils.isNotEmpty(param.access())) {
+ p.setAccess(param.access());
+ }
+
+ Example example = param.examples();
+ if (example != null && example.value() != null) {
+ for (ExampleProperty ex : example.value()) {
+ String mediaType = ex.mediaType();
+ String value = ex.value();
+ if (!mediaType.isEmpty() && !value.isEmpty()) {
+ p.example(mediaType.trim(), value.trim());
+ }
+ }
+ }
+ }
+
+ protected static void processApiParam(ApiParam param, AbstractSerializableParameter<?> p) {
+ if (param.required()) {
+ p.setRequired(true);
+ }
+ if (param.readOnly()) {
+ p.setReadOnly(true);
+ }
+ if (param.allowEmptyValue()) {
+ p.setAllowEmptyValue(true);
+ }
+ if (StringUtils.isNotEmpty(param.name())) {
+ p.setName(param.name());
+ }
+ if (StringUtils.isNotEmpty(param.value())) {
+ p.setDescription(param.value());
+ }
+ if (StringUtils.isNotEmpty(param.example())) {
+ p.setExample(param.example());
+ }
+ if (StringUtils.isNotEmpty(param.access())) {
+ p.setAccess(param.access());
+ }
+ if (StringUtils.isNoneEmpty(param.collectionFormat())) {
+ p.setCollectionFormat(param.collectionFormat());
+ }
+ if (StringUtils.isNotEmpty(param.type())) {
+ if ("java.io.File".equalsIgnoreCase(param.type())) {
+ p.setProperty(new FileProperty());
+ } else if ("long".equalsIgnoreCase(param.type())) {
+ p.setProperty(new LongProperty());
+ } else {
+ p.setType(param.type());
+ }
+ }
+ }
}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/extend/parameter/PendingBodyParameter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/extend/parameter/PendingBodyParameter.java
index 487b574..065b612 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/extend/parameter/PendingBodyParameter.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/extend/parameter/PendingBodyParameter.java
@@ -17,18 +17,22 @@
package org.apache.servicecomb.swagger.generator.pojo.extend.parameter;
+import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
import org.apache.servicecomb.swagger.generator.core.utils.ParamUtils;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
import io.swagger.models.ModelImpl;
import io.swagger.models.RefModel;
import io.swagger.models.parameters.BodyParameter;
import io.swagger.models.properties.Property;
import io.swagger.models.properties.PropertyBuilder;
import io.swagger.models.properties.RefProperty;
+import io.swagger.util.Json;
//
// 备选body
@@ -39,10 +43,13 @@ import io.swagger.models.properties.RefProperty;
// jaxrs、springmvc这种模式,要求符合模式本身的定义场景,不允许随意组合
//
public class PendingBodyParameter extends BodyParameter {
+ @JsonIgnore
private OperationGenerator operationGenerator;
+ @JsonIgnore
private Property property;
+ @JsonIgnore
private Type type;
public void setOperationGenerator(OperationGenerator operationGenerator) {
@@ -65,6 +72,7 @@ public class PendingBodyParameter extends BodyParameter {
this.type = type;
}
+ @JsonIgnore
public Method getMethod() {
return operationGenerator.getProviderMethod();
}
@@ -73,11 +81,14 @@ public class PendingBodyParameter extends BodyParameter {
String modelType = ParamUtils.generateBodyParameterName(operationGenerator.getProviderMethod());
RefModel model = toRefModel(modelType);
- BodyParameter bodyParameter = new BodyParameter();
- bodyParameter.setName(paramName);
- bodyParameter.setSchema(model);
+ setName(paramName);
+ setSchema(model);
- return bodyParameter;
+ try {
+ return Json.mapper().readValue(Json.mapper().writeValueAsString(this), BodyParameter.class);
+ } catch (IOException e) {
+ throw new IllegalStateException("failed to createBodyParameter.", e);
+ }
}
// swagger中的body只能是ref,不能是简单类型