You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@servicecomb.apache.org by GitBox <gi...@apache.org> on 2018/01/03 11:30:57 UTC

[GitHub] mt-monster closed pull request #481: JAV-579 support dataStrArray

mt-monster closed pull request #481: JAV-579 support dataStrArray
URL: https://github.com/apache/incubator-servicecomb-java-chassis/pull/481
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/QueryProcessorCreator.java b/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/QueryProcessorCreator.java
index 60f0a70cc..d3e6e029b 100644
--- a/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/QueryProcessorCreator.java
+++ b/common/common-rest/src/main/java/io/servicecomb/common/rest/codec/param/QueryProcessorCreator.java
@@ -18,6 +18,9 @@
 package io.servicecomb.common.rest.codec.param;
 
 import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -26,10 +29,34 @@
 
 import io.servicecomb.common.rest.codec.RestClientRequest;
 import io.swagger.models.parameters.Parameter;
+import io.swagger.models.parameters.QueryParameter;
 
 public class QueryProcessorCreator implements ParamValueProcessorCreator {
+
   public static final String PARAMTYPE = "query";
 
+  public QueryProcessorCreator() {
+    ParamValueProcessorCreatorManager.INSTANCE.register(PARAMTYPE, this);
+  }
+
+  @Override
+  public ParamValueProcessor create(Parameter parameter, Type genericParamType) {
+    JavaType targetType = TypeFactory.defaultInstance().constructType(genericParamType);
+
+    String collectionFormat = ((QueryParameter) parameter).getCollectionFormat();
+
+    if (collectionFormat == null) {
+      return new QueryProcessor(parameter.getName(), targetType);
+    } else if (collectionFormat.equals("csv")) {
+      return new CsvQueryProcessor(parameter.getName(), targetType);
+    } else if (collectionFormat.equals("multi")) {
+      return new MultiQueryProcessor(parameter.getName(), targetType);
+    }
+
+    return new QueryProcessor(parameter.getName(), targetType);
+  }
+
+
   public static class QueryProcessor extends AbstractParamProcessor {
     public QueryProcessor(String paramPath, JavaType targetType) {
       super(paramPath, targetType);
@@ -58,13 +85,68 @@ public String getProcessorType() {
     }
   }
 
-  public QueryProcessorCreator() {
-    ParamValueProcessorCreatorManager.INSTANCE.register(PARAMTYPE, this);
+
+  public static class MultiQueryProcessor extends AbstractParamProcessor {
+    public MultiQueryProcessor(String paramPath, JavaType targetType) {
+      super(paramPath, targetType);
+    }
+
+    @Override
+    public Object getValue(HttpServletRequest request) throws Exception {
+      Object value = null;
+      if (targetType.isContainerType()) {
+        value = request.getParameterValues(paramPath);
+      } else {
+        value = request.getParameter(paramPath);
+      }
+
+      return convertValue(value, targetType);
+    }
+
+    @Override
+    public void setValue(RestClientRequest clientRequest, Object arg) throws Exception {
+      // query???set
+    }
+
+    @Override
+    public String getProcessorType() {
+      return PARAMTYPE;
+    }
   }
 
-  @Override
-  public ParamValueProcessor create(Parameter parameter, Type genericParamType) {
-    JavaType targetType = TypeFactory.defaultInstance().constructType(genericParamType);
-    return new QueryProcessor(parameter.getName(), targetType);
+  public static class CsvQueryProcessor extends AbstractParamProcessor {
+
+
+    public CsvQueryProcessor(String paramPath, JavaType targetType) {
+      super(paramPath, targetType);
+    }
+
+    @Override
+    public Object getValue(HttpServletRequest request) throws Exception {
+      Object value = null;
+
+      if (targetType.isContainerType()) {
+        String[] strs = request.getParameterValues(paramPath);
+        List<String> asList = new ArrayList<>();
+        for (String str : strs) {
+          asList.addAll(Arrays.asList(str.split(",")));
+        }
+        value = asList.toArray();
+      } else {
+        value = request.getParameter(paramPath);
+      }
+
+      return convertValue(value, targetType);
+    }
+
+    @Override
+    public void setValue(RestClientRequest clientRequest, Object arg) throws Exception {
+
+    }
+
+    @Override
+    public String getProcessorType() {
+      return PARAMTYPE;
+    }
   }
-}
+}
\ No newline at end of file
diff --git a/common/common-rest/src/test/java/io/servicecomb/common/rest/codec/param/TestCsvQueryProcessor.java b/common/common-rest/src/test/java/io/servicecomb/common/rest/codec/param/TestCsvQueryProcessor.java
new file mode 100644
index 000000000..67bd9749a
--- /dev/null
+++ b/common/common-rest/src/test/java/io/servicecomb/common/rest/codec/param/TestCsvQueryProcessor.java
@@ -0,0 +1,56 @@
+package io.servicecomb.common.rest.codec.param;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
+import io.servicecomb.common.rest.codec.param.QueryProcessorCreator.CsvQueryProcessor;
+import mockit.Expectations;
+import mockit.Mocked;
+
+public class TestCsvQueryProcessor {
+  @Mocked
+  HttpServletRequest request;
+
+  private ParamValueProcessor createProcessor(String name, Class<?> type) {
+    return new CsvQueryProcessor(name, TypeFactory.defaultInstance().constructType(type));
+  }
+
+  @Test
+  public void testGetValueNormal() throws Exception {
+    new Expectations() {
+      {
+        request.getParameter("name");
+        result = "v1,v2,v3";
+      }
+    };
+
+    ParamValueProcessor processor = createProcessor("name", String.class);
+    Object value = processor.getValue(request);
+    Assert.assertEquals(value,"v1,v2,v3");
+  }
+
+  @Test
+  public void testGetValueContainerType() throws Exception {
+    new Expectations() {
+      {
+        request.getParameterValues("name");
+        result = new String[] {"v1,v2,v3"};
+      }
+    };
+
+    ParamValueProcessor processor = createProcessor("name", String[].class);
+    String[] value = (String[]) processor.getValue(request);
+    Assert.assertThat(value, Matchers.arrayContaining("v1","v2","v3"));
+  }
+
+  @Test
+  public void testGetProcessorType() {
+    ParamValueProcessor processor = createProcessor("name", String.class);
+    Assert.assertEquals("query", processor.getProcessorType());
+  }
+}
diff --git a/common/common-rest/src/test/java/io/servicecomb/common/rest/codec/param/TestQueryProcessorCreator.java b/common/common-rest/src/test/java/io/servicecomb/common/rest/codec/param/TestQueryProcessorCreator.java
index 02f4f3c70..0334fe02e 100644
--- a/common/common-rest/src/test/java/io/servicecomb/common/rest/codec/param/TestQueryProcessorCreator.java
+++ b/common/common-rest/src/test/java/io/servicecomb/common/rest/codec/param/TestQueryProcessorCreator.java
@@ -20,6 +20,8 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import io.servicecomb.common.rest.codec.param.QueryProcessorCreator.CsvQueryProcessor;
+import io.servicecomb.common.rest.codec.param.QueryProcessorCreator.MultiQueryProcessor;
 import io.servicecomb.common.rest.codec.param.QueryProcessorCreator.QueryProcessor;
 import io.swagger.models.parameters.Parameter;
 import io.swagger.models.parameters.QueryParameter;
@@ -31,9 +33,28 @@ public void testCreate() {
         ParamValueProcessorCreatorManager.INSTANCE.findValue(QueryProcessorCreator.PARAMTYPE);
     Parameter parameter = new QueryParameter();
     parameter.setName("query");
-
     ParamValueProcessor processor = creator.create(parameter, String.class);
 
     Assert.assertEquals(QueryProcessor.class, processor.getClass());
+
+    ((QueryParameter) parameter).setCollectionFormat("xxx");
+    ParamValueProcessor processorXXX = creator.create(parameter, String.class);
+
+    Assert.assertEquals(QueryProcessor.class, processorXXX.getClass());
+
+    ((QueryParameter) parameter).setCollectionFormat(null);
+    ParamValueProcessor processorNull = creator.create(parameter, String.class);
+
+    Assert.assertEquals(QueryProcessor.class, processorNull.getClass());
+
+    ((QueryParameter) parameter).setCollectionFormat("multi");
+    ParamValueProcessor processorMulti = creator.create(parameter, String.class);
+
+    Assert.assertEquals(MultiQueryProcessor.class, processorMulti.getClass());
+
+    ((QueryParameter) parameter).setCollectionFormat("csv");
+    ParamValueProcessor processorCsv = creator.create(parameter, String.class);
+
+    Assert.assertEquals(CsvQueryProcessor.class, processorCsv.getClass());
   }
 }
diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/java/io/servicecomb/demo/jaxrs/server/CodeFirstJaxrs.java b/demo/demo-jaxrs/jaxrs-server/src/main/java/io/servicecomb/demo/jaxrs/server/CodeFirstJaxrs.java
index b566b29fd..2dbb2fba3 100644
--- a/demo/demo-jaxrs/jaxrs-server/src/main/java/io/servicecomb/demo/jaxrs/server/CodeFirstJaxrs.java
+++ b/demo/demo-jaxrs/jaxrs-server/src/main/java/io/servicecomb/demo/jaxrs/server/CodeFirstJaxrs.java
@@ -17,9 +17,12 @@
 
 package io.servicecomb.demo.jaxrs.server;
 
+import java.util.Arrays;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
@@ -44,6 +47,7 @@
 import io.servicecomb.demo.server.User;
 import io.servicecomb.provider.rest.common.RestSchema;
 import io.servicecomb.swagger.extend.annotations.RawJsonRequestBody;
+import io.servicecomb.swagger.extend.annotations.RequestParamColFmt;
 import io.servicecomb.swagger.extend.annotations.ResponseHeaders;
 import io.servicecomb.swagger.invocation.Response;
 import io.servicecomb.swagger.invocation.context.ContextUtils;
@@ -202,4 +206,13 @@ public String testRawJsonAnnotation(@RawJsonRequestBody String jsonInput) {
     }
     return "hello " + person.get("name");
   }
+
+  @Path("/testGetStrArray")
+  @GET
+  public String[] testGetStrArray(@RequestParamColFmt(collectionFormat = "csv") String[] str) {
+    for (int i = 0; i < str.length; i++) {
+      System.out.println("*******"+str[i]);
+    }
+    return str;
+  }
 }
diff --git a/demo/demo-schema/src/main/java/io/servicecomb/demo/CodeFirstRestTemplate.java b/demo/demo-schema/src/main/java/io/servicecomb/demo/CodeFirstRestTemplate.java
index 2db5565f5..aad3f653e 100644
--- a/demo/demo-schema/src/main/java/io/servicecomb/demo/CodeFirstRestTemplate.java
+++ b/demo/demo-schema/src/main/java/io/servicecomb/demo/CodeFirstRestTemplate.java
@@ -17,21 +17,29 @@
 
 package io.servicecomb.demo;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.util.ReflectionUtils;
 import org.springframework.web.client.RestTemplate;
 
 import io.servicecomb.core.CseContext;
 import io.servicecomb.demo.compute.Person;
 import io.servicecomb.demo.ignore.InputModelForTestIgnore;
 import io.servicecomb.demo.ignore.OutputModelForTestIgnore;
+import io.servicecomb.demo.server.Test;
 import io.servicecomb.demo.server.User;
 import io.servicecomb.serviceregistry.RegistryUtils;
 import io.vertx.core.json.JsonObject;
@@ -68,6 +76,7 @@ public void testCodeFirst(RestTemplate template, String microserviceName, String
       }
 
       testRawJson(template, cseUrlPrefix);
+      testGetStrArray(template, cseUrlPrefix);
     }
   }
 
@@ -249,4 +258,20 @@ protected void testRawJson(RestTemplate template, String cseUrlPrefix) {
     String output = template.postForObject(cseUrlPrefix + "rawJsonAnnotation", input, String.class);
     TestMgr.check("hello zyy", output);
   }
+
+
+  protected void testGetStrArray(RestTemplate template, String cseUrlPrefix) {
+
+    String[] instrArray = {"a1,b1,c1"};
+    ArrayList result = template.getForObject(cseUrlPrefix + "testGetStrArray?str=a1,b1,c1", ArrayList.class);
+    ArrayList result1 = template
+        .getForObject(cseUrlPrefix + "testGetStrArray?str={instrArray}", ArrayList.class, "a1,b1,c1");
+    ArrayList result2 = template
+        .getForObject(cseUrlPrefix + "testGetStrArray?str={instrArray}", ArrayList.class, instrArray);
+
+    String[] output = {"a1", "b1", "c1"};
+    TestMgr.check(true, Arrays.asList(output).equals(result));
+    TestMgr.check(true, Arrays.asList(output).equals(result1));
+    TestMgr.check(true, Arrays.asList(output).equals(result2));
+  }
 }
diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java b/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java
index 96d6d8e4b..bd409e1e8 100644
--- a/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java
+++ b/demo/demo-springmvc/springmvc-server/src/main/java/io/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java
@@ -343,4 +343,12 @@ public String metricsForTest() {
       throw new InvocationException(500, "500", "JsonProcessingException", e);
     }
   }
+
+  @RequestMapping(path = "/testGetStrArray", method = RequestMethod.GET)
+  public String[] testGetStrArray(@RequestParamColFmt(collectionFormat = "csv") String[] str) {
+    for (int i = 0; i < str.length; i++) {
+      System.out.println("*******"+str[i]);
+    }
+    return str;
+  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/extend/annotations/RequestParamColFmt.java b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/extend/annotations/RequestParamColFmt.java
new file mode 100644
index 000000000..802f89e4b
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/extend/annotations/RequestParamColFmt.java
@@ -0,0 +1,24 @@
+package io.servicecomb.swagger.extend.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.springframework.core.annotation.AliasFor;
+
+@Target({ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface RequestParamColFmt {
+  @AliasFor("name")
+  String value() default "";
+
+  @AliasFor("value")
+  String name() default "";
+
+  boolean required() default false;
+
+  String collectionFormat() default "";
+}
diff --git a/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/processor/parametertype/RequestParamColFmtAnnotationProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/processor/parametertype/RequestParamColFmtAnnotationProcessor.java
new file mode 100644
index 000000000..8dd16e9a2
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/processor/parametertype/RequestParamColFmtAnnotationProcessor.java
@@ -0,0 +1,25 @@
+package io.servicecomb.swagger.generator.core.processor.parametertype;
+
+import io.servicecomb.swagger.extend.annotations.RequestParamColFmt;
+import io.servicecomb.swagger.generator.core.OperationGenerator;
+import io.servicecomb.swagger.generator.core.processor.parameter.AbstractParameterProcessor;
+import io.swagger.models.parameters.QueryParameter;
+
+public class RequestParamColFmtAnnotationProcessor extends AbstractParameterProcessor<QueryParameter> {
+  @Override
+  protected QueryParameter createParameter() {
+    return null;
+  }
+
+  @Override
+  protected String getAnnotationParameterName(Object annotation) {
+    return null;
+  }
+
+  protected void fillParameter(Object annotation, OperationGenerator operationGenerator, int paramIdx,QueryParameter parameter){
+    setParameterName(annotation, operationGenerator, paramIdx, parameter);
+    setParameterType(operationGenerator, paramIdx, parameter);
+    String collectionFormat = ((RequestParamColFmt) annotation).collectionFormat();
+    parameter.setCollectionFormat(collectionFormat);
+  }
+}
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/io/servicecomb/swagger/generator/jaxrs/JaxrsSwaggerGeneratorContext.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/io/servicecomb/swagger/generator/jaxrs/JaxrsSwaggerGeneratorContext.java
index 3ab4321c2..a6c3e1240 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/io/servicecomb/swagger/generator/jaxrs/JaxrsSwaggerGeneratorContext.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/io/servicecomb/swagger/generator/jaxrs/JaxrsSwaggerGeneratorContext.java
@@ -34,6 +34,8 @@
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 
+import io.servicecomb.swagger.extend.annotations.RequestParamColFmt;
+import io.servicecomb.swagger.generator.core.processor.parametertype.RequestParamColFmtAnnotationProcessor;
 import io.servicecomb.swagger.generator.core.utils.ClassUtils;
 import io.servicecomb.swagger.generator.jaxrs.processor.annotation.ConsumesAnnotationProcessor;
 import io.servicecomb.swagger.generator.jaxrs.processor.annotation.CookieParamAnnotationProcessor;
@@ -110,5 +112,6 @@ protected void initParameterAnnotationMgr() {
 
     parameterAnnotationMgr.register(HeaderParam.class, new HeaderParamAnnotationProcessor());
     parameterAnnotationMgr.register(QueryParam.class, new QueryParamAnnotationProcessor());
+    parameterAnnotationMgr.register(RequestParamColFmt.class, new RequestParamColFmtAnnotationProcessor());
   }
 }


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services