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,不能是简单类型