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

[servicecomb-java-chassis] branch master updated (8ef4ca9 -> 622297b)

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

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


    from 8ef4ca9  [SCB-1277]make sure demo and samples are normal
     new b5c1bba  [SCB-1280] remove unnecessary class cast
     new 622297b  [SCB-1280] add IT for nested List params

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


Summary of changes:
 .../org/apache/servicecomb/it/schema/User.java     | 25 ++++++++
 .../servicecomb/it/testcase/base/TestGeneric.java  | 65 ++++++++++++++++++++
 .../servicecomb/it/schema/GenericSchema.java       | 16 +++++
 .../swagger/generator/core/OperationGenerator.java |  2 +-
 .../generator/core/TestOperationGenerator.java     | 70 ++++++++++++++++++----
 .../swagger/invocation/converter/ConverterMgr.java |  2 +-
 6 files changed, 167 insertions(+), 13 deletions(-)


[servicecomb-java-chassis] 01/02: [SCB-1280] remove unnecessary class cast

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

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

commit b5c1bbabfe64a7a695e8a9eff9f73bff798fcab5
Author: yaohaishi <ya...@huawei.com>
AuthorDate: Wed May 8 16:27:37 2019 +0800

    [SCB-1280] remove unnecessary class cast
---
 .../swagger/generator/core/OperationGenerator.java |  2 +-
 .../generator/core/TestOperationGenerator.java     | 70 ++++++++++++++++++----
 .../swagger/invocation/converter/ConverterMgr.java |  2 +-
 3 files changed, 61 insertions(+), 13 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 eecfdc8..3a3c3fd 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
@@ -366,7 +366,7 @@ public class OperationGenerator {
       ParameterizedType targetType = (ParameterizedType) type;
       Class<?> targetCls = (Class<?>) targetType.getRawType();
       if (List.class.isAssignableFrom(targetCls)) {
-        return Types.newParameterizedType(List.class, (Class<?>) targetType.getActualTypeArguments()[0]);
+        return Types.newParameterizedType(List.class, targetType.getActualTypeArguments()[0]);
       }
     }
     return null;
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
index 9fe126f..54f4bbb 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestOperationGenerator.java
@@ -24,19 +24,29 @@ import static org.junit.Assert.assertThat;
 import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
-import io.swagger.annotations.*;
-import io.swagger.models.Response;
 import org.apache.servicecomb.foundation.test.scaffolding.spring.SpringUtils;
 import org.apache.servicecomb.swagger.extend.parameter.HttpRequestParameter;
 import org.apache.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext;
+import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Test;
 import org.springframework.util.StringValueResolver;
 
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.Extension;
+import io.swagger.annotations.ExtensionProperty;
+import io.swagger.annotations.ResponseHeader;
+import io.swagger.models.ArrayModel;
+import io.swagger.models.ModelImpl;
+import io.swagger.models.Response;
 import io.swagger.models.parameters.BodyParameter;
 import io.swagger.models.parameters.Parameter;
 import io.swagger.models.parameters.QueryParameter;
+import io.swagger.models.properties.ArrayProperty;
+import io.swagger.models.properties.StringProperty;
 
 public class TestOperationGenerator {
   @Test
@@ -145,24 +155,58 @@ public class TestOperationGenerator {
     Assert.assertNotNull(operationGenerator1.getOperation().getVendorExtensions().get("x-class-name"));
   }
 
+  @Test
+  public void testNestedListStringParam() throws NoSuchMethodException {
+    Method function = TestClass.class.getMethod("nestedListString", List.class);
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(new PojoSwaggerGeneratorContext(), TestClass.class);
+    OperationGenerator operationGenerator = new OperationGenerator(swaggerGenerator, function);
+    operationGenerator.generate();
+
+    // test response type
+    Map<String, Response> responses = operationGenerator.getOperation().getResponses();
+    Response response = responses.get("200");
+    Assert.assertEquals(ArrayModel.class, response.getResponseSchema().getClass());
+    ArrayModel arrayResponse = (ArrayModel) response.getResponseSchema();
+    Assert.assertEquals("array", arrayResponse.getType());
+    Assert.assertEquals(ArrayProperty.class, arrayResponse.getItems().getClass());
+    ArrayProperty innerArrayPropertyResp = (ArrayProperty) arrayResponse.getItems();
+    Assert.assertEquals("array", innerArrayPropertyResp.getType());
+    Assert.assertEquals(StringProperty.class, innerArrayPropertyResp.getItems().getClass());
+
+    // test param type
+    Assert.assertEquals(1, swaggerGenerator.getSwagger().getDefinitions().size());
+    ModelImpl model = (ModelImpl) swaggerGenerator.getSwagger().getDefinitions().get("nestedListStringBody");
+    Assert.assertNotNull(model);
+    Assert.assertEquals("object", model.getType());
+    Assert.assertEquals("param", model.getName());
+    Assert.assertThat(model.getProperties().keySet(), Matchers.containsInAnyOrder("param"));
+    Assert.assertEquals(ArrayProperty.class, model.getProperties().get("param").getClass());
+    ArrayProperty arrayPropertyParam = (ArrayProperty) model.getProperties().get("param");
+    Assert.assertEquals("array", arrayPropertyParam.getType());
+    Assert.assertEquals(ArrayProperty.class, arrayPropertyParam.getItems().getClass());
+    ArrayProperty innerArrayPropertyParam = (ArrayProperty) arrayPropertyParam.getItems();
+    Assert.assertEquals(StringProperty.class, innerArrayPropertyParam.getItems().getClass());
+  }
+
   private static class TestClass {
 
     @ApiResponse(code = 200, message = "200 is ok............", response = String.class,
-            responseHeaders = @ResponseHeader(name = "x-user-domain", response = String.class))
+        responseHeaders = @ResponseHeader(name = "x-user-domain", response = String.class))
     @ApiOperation(value = "value1", tags = {"tag1", "tag2"},
-            responseHeaders = {@ResponseHeader(name = "x-user-name", response = String.class),
-                    @ResponseHeader(name = "x-user-id", response = String.class)},
-            extensions= {@Extension(name="x-class-name", properties= {@ExtensionProperty(value="value", name = "key")})})
+        responseHeaders = {@ResponseHeader(name = "x-user-name", response = String.class),
+            @ResponseHeader(name = "x-user-id", response = String.class)},
+        extensions = {
+            @Extension(name = "x-class-name", properties = {@ExtensionProperty(value = "value", name = "key")})})
     public void function() {
     }
 
-
     @ApiOperation(value = "value1", tags = {"tag1", "tag2"},
-            responseHeaders = {@ResponseHeader(name = "x-user-name", response = String.class),
-                    @ResponseHeader(name = "x-user-id", response = String.class)},
-            extensions= {@Extension(name="x-class-name", properties= {@ExtensionProperty(value="value", name = "key")})})
+        responseHeaders = {@ResponseHeader(name = "x-user-name", response = String.class),
+            @ResponseHeader(name = "x-user-id", response = String.class)},
+        extensions = {
+            @Extension(name = "x-class-name", properties = {@ExtensionProperty(value = "value", name = "key")})})
     @ApiResponse(code = 200, message = "200 is ok............", response = String.class,
-            responseHeaders = @ResponseHeader(name = "x-user-domain", response = String.class))
+        responseHeaders = @ResponseHeader(name = "x-user-domain", response = String.class))
     public void function1() {
     }
 
@@ -173,5 +217,9 @@ public class TestOperationGenerator {
     @SuppressWarnings("unused")
     public void functionWithNoAnnotation() {
     }
+
+    public List<List<String>> nestedListString(List<List<String>> param) {
+      return param;
+    }
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/converter/ConverterMgr.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/converter/ConverterMgr.java
index b3a4e5d..ec0e2b6 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/converter/ConverterMgr.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/converter/ConverterMgr.java
@@ -124,7 +124,7 @@ public class ConverterMgr {
       ParameterizedType targetType = (ParameterizedType) type;
       Class<?> targetCls = (Class<?>) targetType.getRawType();
       if (List.class.isAssignableFrom(targetCls)) {
-        return Types.newParameterizedType(List.class, (Class<?>) targetType.getActualTypeArguments()[0]);
+        return Types.newParameterizedType(List.class, targetType.getActualTypeArguments()[0]);
       }
     }
     return null;


[servicecomb-java-chassis] 02/02: [SCB-1280] add IT for nested List params

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

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

commit 622297b5fdf7818bcdb61688d51ea337bc24a2c3
Author: yaohaishi <ya...@huawei.com>
AuthorDate: Wed May 8 16:30:09 2019 +0800

    [SCB-1280] add IT for nested List params
---
 .../org/apache/servicecomb/it/schema/User.java     | 25 +++++++++
 .../servicecomb/it/testcase/base/TestGeneric.java  | 65 ++++++++++++++++++++++
 .../servicecomb/it/schema/GenericSchema.java       | 16 ++++++
 3 files changed, 106 insertions(+)

diff --git a/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/User.java b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/User.java
index 3f87a94..f9b38a8 100644
--- a/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/User.java
+++ b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/User.java
@@ -16,6 +16,9 @@
  */
 package org.apache.servicecomb.it.schema;
 
+import java.util.Arrays;
+import java.util.Objects;
+
 import org.apache.servicecomb.foundation.common.utils.JsonUtils;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -73,4 +76,26 @@ public class User {
       throw new IllegalStateException(e);
     }
   }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    User user = (User) o;
+    return age == user.age &&
+        index == user.index &&
+        name == null ? user.name == null : name.equals(user.name) &&
+        names == null ? user.names == null : Arrays.equals(names, user.names);
+  }
+
+  @Override
+  public int hashCode() {
+    int result = Objects.hash(name, age, index);
+    result = 31 * result + Arrays.hashCode(names);
+    return result;
+  }
 }
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/base/TestGeneric.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/base/TestGeneric.java
index 276bd37..aeea1b7 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/base/TestGeneric.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/base/TestGeneric.java
@@ -17,9 +17,11 @@
 package org.apache.servicecomb.it.testcase.base;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -32,6 +34,7 @@ import javax.xml.ws.Holder;
 import org.apache.servicecomb.it.Consumers;
 import org.apache.servicecomb.it.schema.Generic;
 import org.apache.servicecomb.it.schema.User;
+import org.hamcrest.Matchers;
 import org.junit.Test;
 import org.springframework.http.HttpStatus;
 
@@ -54,6 +57,10 @@ public class TestGeneric {
     Generic<Map<String, List<String>>> genericMapList(Generic<Map<String, List<String>>> mapListGeneric);
 
     Generic<Map<String, List<User>>> genericMapListUser(Generic<Map<String, List<User>>> mapListUserGeneric);
+
+    List<List<String>> genericNestedListString(List<List<String>> nestedListString);
+
+    List<List<User>> genericNestedListUser(List<List<User>> nestedListUser);
   }
 
   private static Consumers<GenericIntf> consumers = new Consumers<>("generic", GenericIntf.class);
@@ -255,4 +262,62 @@ public class TestGeneric {
     String test = result.value.get("test").get(0).jsonString();
     assertEquals(test, expectUserStr);
   }
+
+  @Test
+  public void testGenericNestedListString_intfAndRt() {
+    ArrayList<List<String>> nestedListString = new ArrayList<>();
+    nestedListString.add(Arrays.asList("abc", "def"));
+    nestedListString.add(Arrays.asList("ghi", "jkl"));
+
+    List<List<String>> response = consumers.getIntf().genericNestedListString(nestedListString);
+    assertEquals(2, response.size());
+    assertThat(response.get(0), Matchers.contains("abc", "def"));
+    assertThat(response.get(1), Matchers.contains("ghi", "jkl"));
+
+    @SuppressWarnings("unchecked")
+    List<List<String>> response2 = consumers.getSCBRestTemplate()
+        .postForObject("/genericNestedListString", nestedListString, List.class);
+    assertEquals(2, response2.size());
+    assertThat(response2.get(0), Matchers.contains("abc", "def"));
+    assertThat(response2.get(1), Matchers.contains("ghi", "jkl"));
+  }
+
+  @Test
+  public void testGenericNestedListUser_intfAndRt() {
+    User user1 = new User();
+    user1.setAge(1);
+    user1.setIndex(1);
+    user1.setName("abc");
+    user1.setNames(new String[] {"1", "2", "3"});
+    User user2 = new User();
+    user2.setAge(2);
+    user2.setIndex(2);
+    user2.setName("def");
+    user2.setNames(new String[] {"4", "5"});
+    User user3 = new User();
+    user3.setAge(3);
+    user3.setIndex(3);
+    user3.setName("ghi");
+    user3.setNames(new String[] {"6", "7"});
+    User user4 = new User();
+    user4.setAge(4);
+    user4.setIndex(4);
+    user4.setName("jkl");
+    user4.setNames(new String[] {"8", "9", "10"});
+    ArrayList<List<User>> nestedListUser = new ArrayList<>();
+    nestedListUser.add(Arrays.asList(user1, user2));
+    nestedListUser.add(Arrays.asList(user3, user4));
+
+    List<List<User>> response = consumers.getIntf().genericNestedListUser(nestedListUser);
+    assertEquals(2, response.size());
+    assertThat(response.get(0), Matchers.contains(user1, user2));
+    assertThat(response.get(1), Matchers.contains(user3, user4));
+
+    @SuppressWarnings("unchecked")
+    List<List<User>> response2 = consumers.getSCBRestTemplate()
+        .postForObject("/genericNestedListUser", nestedListUser, List.class);
+    assertEquals(2, response2.size());
+    assertThat(response2.get(0), Matchers.contains(user1, user2));
+    assertThat(response2.get(1), Matchers.contains(user3, user4));
+  }
 }
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/GenericSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/GenericSchema.java
index 03bf10f..f19a0bd 100644
--- a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/GenericSchema.java
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/GenericSchema.java
@@ -98,4 +98,20 @@ public class GenericSchema {
     Assert.isInstanceOf(Map.class, mapListUserGeneric.value);
     return mapListUserGeneric;
   }
+
+  @PostMapping(path = "genericNestedListString")
+  public List<List<String>> genericNestedListString(@RequestBody List<List<String>> nestedListString) {
+    Assert.isInstanceOf(List.class, nestedListString);
+    Assert.isInstanceOf(List.class, nestedListString.get(0));
+    Assert.isInstanceOf(String.class, nestedListString.get(0).get(0));
+    return nestedListString;
+  }
+
+  @PostMapping(path = "genericNestedListUser")
+  public List<List<User>> genericNestedListUser(@RequestBody List<List<User>> nestedListUser) {
+    Assert.isInstanceOf(List.class, nestedListUser);
+    Assert.isInstanceOf(List.class, nestedListUser.get(0));
+    Assert.isInstanceOf(User.class, nestedListUser.get(0).get(0));
+    return nestedListUser;
+  }
 }