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 2019/07/04 09:38:10 UTC

[servicecomb-java-chassis] branch weak-contract-type updated (d7c08e5 -> 42c59e4)

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

liubao pushed a change to branch weak-contract-type
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git.


    from d7c08e5  [SCB-1346][WIP][WEAK] only special type need convert logic
     new e1d1c7d  [SCB-1212[WIP][WEAK] response mapper not depend on swagger class generation
     new 396eed0  [SCB-1212[WIP][WEAK] add ScbResponse mapper
     new 6c108b3  [SCB-1212[WIP][WEAK] consumer response mapper switch to new mechanism
     new f944fbf  [SCB-1212[WIP][WEAK] producer response mapper switch to new mechanism
     new e0e8bd7  [SCB-1212[WIP][WEAK] SwaggerEnvironment switch to new mechanism
     new 9473d94  [SCB-1212[WIP][WEAK] jaxrs response mapper switch to new mechanism
     new 42c59e4  [SCB-1212[WIP][WEAK] springMVC response mapper switch to new mechanism

The 7 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:
 .../swagger/engine/SwaggerEnvironment.java         |  22 ++--
 .../swagger/engine/SwaggerProducer.java            |  22 ++++
 .../generator/ScbResponseProcessor.java}           |  19 ++--
 .../invocation/response/ResponseMapperFactory.java |  10 +-
 .../response/ResponseMapperFactorys.java           |  19 +---
 .../swagger/invocation/response/ResponseMeta.java  |  63 ------------
 .../invocation/response/ResponseMetaMapper.java    |   4 +-
 .../swagger/invocation/response/ResponsesMeta.java |  96 +++++++++++-------
 ...letableFutureConsumerResponseMapperFactory.java |   6 +-
 .../CseResponseConsumerResponseMapperFactory.java  |   4 +-
 .../consumer/DefaultConsumerResponseMapper.java    |   9 +-
 .../DefaultConsumerResponseMapperFactory.java      |  16 +--
 .../OptionalConsumerResponseMapperFactory.java     |   6 +-
 ...letableFutureProducerResponseMapperFactory.java |   6 +-
 .../CseResponseProducerResponseMapperFactory.java  |   4 +-
 .../producer/DefaultProducerResponseMapper.java    |  10 +-
 .../DefaultProducerResponseMapperFactory.java      |  16 +--
 .../OptionalProducerResponseMapperFactory.java     |   6 +-
 ...icecomb.swagger.generator.ResponseTypeProcessor |   2 +-
 .../swagger/engine/TestSwaggerEnvironment.java     |  62 ++----------
 .../response/TestResponseMapperFactorys.java       |  89 -----------------
 .../invocation/response/TestResponsesMeta.java     |  37 +++----
 ...letableFutureConsumerResponseMapperFactory.java |  76 --------------
 .../TestConsumerResponseMapperFactorys.java        |  96 ++++++++++++++++++
 ...stCseResponseConsumerResponseMapperFactory.java |  43 --------
 .../TestDefaultConsumerResponseMapper.java         |  37 -------
 .../TestDefaultConsumerResponseMapperFactory.java  |  51 ----------
 ...letableFutureProducerResponseMapperFactory.java |  76 --------------
 ...stCseResponseProducerResponseMapperFactory.java |  45 ---------
 .../TestDefaultProducerResponseMapper.java         |  40 --------
 .../TestDefaultProducerResponseMapperFactory.java  |  55 ----------
 .../TestProducerResponseMapperFactorys.java        | 111 +++++++++++++++++++++
 .../swagger-invocation/invocation-jaxrs/pom.xml    |  12 ++-
 .../response/JaxrsConsumerResponseMapper.java      |  16 ++-
 .../JaxrsConsumerResponseMapperFactory.java        |   4 +-
 .../JaxrsProducerResponseMapperFactory.java        |   4 +-
 .../response/TestJaxrsConsumerResponseMapper.java  | 100 +++++++------------
 .../TestJaxrsConsumerResponseMapperFactory.java    |  43 --------
 .../TestJaxrsProducerResponseMapperFactory.java    |   6 +-
 .../response/SpringmvcConsumerResponseMapper.java  |  18 +++-
 .../SpringmvcConsumerResponseMapperFactory.java    |   6 +-
 .../SpringmvcProducerResponseMapperFactory.java    |   6 +-
 .../TestSpringmvcConsumerResponseMapper.java       |  79 +++++++++++----
 ...TestSpringmvcConsumerResponseMapperFactory.java | 101 -------------------
 ...TestSpringmvcProducerResponseMapperFactory.java |  20 ++--
 45 files changed, 516 insertions(+), 1057 deletions(-)
 copy swagger/{swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/annotation/PathMethodAnnotationProcessor.java => swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/generator/ScbResponseProcessor.java} (65%)
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMeta.java
 copy common/common-rest/src/main/resources/META-INF/services/org.apache.servicecomb.common.rest.filter.HttpServerFilter => swagger/swagger-invocation/invocation-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ResponseTypeProcessor (91%)
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponseMapperFactorys.java
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestCompletableFutureConsumerResponseMapperFactory.java
 create mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestConsumerResponseMapperFactorys.java
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestCseResponseConsumerResponseMapperFactory.java
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestDefaultConsumerResponseMapper.java
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestDefaultConsumerResponseMapperFactory.java
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestCompletableFutureProducerResponseMapperFactory.java
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestCseResponseProducerResponseMapperFactory.java
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestDefaultProducerResponseMapper.java
 delete mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestDefaultProducerResponseMapperFactory.java
 create mode 100644 swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestProducerResponseMapperFactorys.java
 delete mode 100644 swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapperFactory.java
 delete mode 100644 swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapperFactory.java


[servicecomb-java-chassis] 02/07: [SCB-1212[WIP][WEAK] add ScbResponse mapper

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

liubao pushed a commit to branch weak-contract-type
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 396eed071209a2e30e3ab60bb1d10e0d39b1cff9
Author: wujimin <wu...@huawei.com>
AuthorDate: Wed Jul 3 21:40:15 2019 +0800

    [SCB-1212[WIP][WEAK] add ScbResponse mapper
---
 .../invocation/generator/ScbResponseProcessor.java | 37 ++++++++++++++++++++++
 ...icecomb.swagger.generator.ResponseTypeProcessor | 18 +++++++++++
 2 files changed, 55 insertions(+)

diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/generator/ScbResponseProcessor.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/generator/ScbResponseProcessor.java
new file mode 100644
index 0000000..f77062d
--- /dev/null
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/generator/ScbResponseProcessor.java
@@ -0,0 +1,37 @@
+/*
+ * 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.swagger.invocation.generator;
+
+import java.lang.reflect.Type;
+
+import org.apache.servicecomb.swagger.generator.OperationGenerator;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+import org.apache.servicecomb.swagger.generator.core.processor.response.DefaultResponseTypeProcessor;
+import org.apache.servicecomb.swagger.invocation.Response;
+
+public class ScbResponseProcessor extends DefaultResponseTypeProcessor {
+  @Override
+  public Class<?> getProcessType() {
+    return Response.class;
+  }
+
+  @Override
+  public Type extractResponseType(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      Type genericResponseType) {
+    return null;
+  }
+}
diff --git a/swagger/swagger-invocation/invocation-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ResponseTypeProcessor b/swagger/swagger-invocation/invocation-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ResponseTypeProcessor
new file mode 100644
index 0000000..1a722b7
--- /dev/null
+++ b/swagger/swagger-invocation/invocation-core/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ResponseTypeProcessor
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.servicecomb.swagger.invocation.generator.ScbResponseProcessor
\ No newline at end of file


[servicecomb-java-chassis] 05/07: [SCB-1212[WIP][WEAK] SwaggerEnvironment switch to new mechanism

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

liubao pushed a commit to branch weak-contract-type
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit e0e8bd7ac91e61172be423022685d96c5fadc97d
Author: wujimin <wu...@huawei.com>
AuthorDate: Wed Jul 3 22:46:11 2019 +0800

    [SCB-1212[WIP][WEAK] SwaggerEnvironment switch to new mechanism
---
 .../swagger/engine/SwaggerEnvironment.java         | 22 ++++----
 .../swagger/engine/SwaggerProducer.java            | 22 ++++++++
 .../swagger/engine/TestSwaggerEnvironment.java     | 62 +++-------------------
 3 files changed, 39 insertions(+), 67 deletions(-)

diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java
index 03cf6da..b3f787d 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java
@@ -50,17 +50,14 @@ import io.swagger.util.Json;
 public class SwaggerEnvironment {
   private static final Logger LOGGER = LoggerFactory.getLogger(SwaggerEnvironment.class);
 
-  private ResponseMapperFactorys<ProducerResponseMapper> producerResponseMapperFactorys =
-      new ResponseMapperFactorys<>(ProducerResponseMapperFactory.class);
-
-  private ResponseMapperFactorys<ConsumerResponseMapper> consumerResponseMapperFactorys =
-      new ResponseMapperFactorys<>(ConsumerResponseMapperFactory.class);
-
   public SwaggerConsumer createConsumer(Class<?> consumerIntf, Swagger swagger) {
     Map<Class<?>, ContextArgumentMapperFactory> contextFactorys = SPIServiceUtils
         .getOrLoadSortedService(ConsumerContextArgumentMapperFactory.class)
         .stream()
         .collect(Collectors.toMap(ConsumerContextArgumentMapperFactory::getContextClass, Function.identity()));
+    ResponseMapperFactorys<ConsumerResponseMapper> consumerResponseMapperFactorys =
+        new ResponseMapperFactorys<>(ConsumerResponseMapperFactory.class);
+
     SwaggerOperations swaggerOperations = new SwaggerOperations(swagger);
 
     SwaggerConsumer consumer = new SwaggerConsumer();
@@ -83,10 +80,8 @@ public class SwaggerEnvironment {
           consumerMethod,
           swaggerOperation);
       ConsumerArgumentsMapper argsMapper = creator.createArgumentsMapper();
-      ConsumerResponseMapper responseMapper = null;
-//      consumerResponseMapperFactorys.createResponseMapper(
-//          swaggerOperation.getGenericReturnType(),
-//          consumerMethod.getGenericReturnType());
+      ConsumerResponseMapper responseMapper = consumerResponseMapperFactorys
+          .createResponseMapper(consumerMethod.getGenericReturnType());
 
       SwaggerConsumerOperation op = new SwaggerConsumerOperation();
       op.setConsumerMethod(consumerMethod);
@@ -119,13 +114,18 @@ public class SwaggerEnvironment {
         .getOrLoadSortedService(ProducerContextArgumentMapperFactory.class)
         .stream()
         .collect(Collectors.toMap(ProducerContextArgumentMapperFactory::getContextClass, Function.identity()));
+    ResponseMapperFactorys<ProducerResponseMapper> producerResponseMapperFactorys =
+        new ResponseMapperFactorys<>(ProducerResponseMapperFactory.class);
+
     SwaggerOperations swaggerOperations = new SwaggerOperations(swagger);
 
     Class<?> producerCls = BeanUtils.getImplClassFromBean(producerInstance);
     Map<String, Method> visibleProducerMethods = retrieveVisibleMethods(producerCls);
 
     SwaggerProducer producer = new SwaggerProducer();
+    producer.setSwagger(swagger);
     producer.setProducerCls(producerCls);
+    producer.setProducerInstance(producerInstance);
     for (SwaggerOperation swaggerOperation : swaggerOperations.getOperations().values()) {
       String operationId = swaggerOperation.getOperationId();
       // producer参数不一定等于swagger参数
@@ -145,7 +145,6 @@ public class SwaggerEnvironment {
           swaggerOperation);
       ProducerArgumentsMapper argsMapper = creator.createArgumentsMapper();
       ProducerResponseMapper responseMapper = producerResponseMapperFactorys.createResponseMapper(
-          swaggerMethod.getGenericReturnType(),
           producerMethod.getGenericReturnType());
 
       SwaggerProducerOperation op = new SwaggerProducerOperation();
@@ -153,6 +152,7 @@ public class SwaggerEnvironment {
       op.setProducerInstance(producerInstance);
       op.setProducerMethod(producerMethod);
       op.setSwaggerOperation(swaggerOperation);
+      op.setSwaggerParameterTypes(creator.getSwaggerParameterTypes());
       op.setArgumentsMapper(argsMapper);
       op.setResponseMapper(responseMapper);
 
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerProducer.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerProducer.java
index 32968f2..e7918ce 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerProducer.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerProducer.java
@@ -20,9 +20,15 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
+import io.swagger.models.Swagger;
+
 public class SwaggerProducer {
   private Class<?> producerCls;
 
+  private Object producerInstance;
+
+  private Swagger swagger;
+
   // key is operationId
   private Map<String, SwaggerProducerOperation> opMap = new HashMap<>();
 
@@ -34,6 +40,22 @@ public class SwaggerProducer {
     this.producerCls = producerCls;
   }
 
+  public Object getProducerInstance() {
+    return producerInstance;
+  }
+
+  public void setProducerInstance(Object producerInstance) {
+    this.producerInstance = producerInstance;
+  }
+
+  public Swagger getSwagger() {
+    return swagger;
+  }
+
+  public void setSwagger(Swagger swagger) {
+    this.swagger = swagger;
+  }
+
   public void addOperation(SwaggerProducerOperation op) {
     opMap.put(op.getOperationId(), op);
   }
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/engine/TestSwaggerEnvironment.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/engine/TestSwaggerEnvironment.java
index 0a888cc..6b86fae 100644
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/engine/TestSwaggerEnvironment.java
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/engine/TestSwaggerEnvironment.java
@@ -22,50 +22,22 @@ import static org.hamcrest.core.IsNull.notNullValue;
 import static org.hamcrest.core.IsNull.nullValue;
 import static org.junit.Assert.assertThat;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.servicecomb.common.javassist.JavassistUtils;
-import org.apache.servicecomb.engine.SwaggerEnvironmentForTest;
-import org.apache.servicecomb.swagger.generator.jaxrs.JaxrsSwaggerGeneratorContext;
-import org.apache.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext;
-import org.apache.servicecomb.swagger.invocation.arguments.ArgumentsMapperConfig;
-import org.apache.servicecomb.swagger.invocation.arguments.producer.JaxRSProducerArgumentsMapperFactory;
-import org.apache.servicecomb.swagger.invocation.arguments.producer.ProducerArgumentsMapperFactory;
-import org.apache.servicecomb.swagger.invocation.arguments.producer.SpringMVCProducerArgumentsMapperFactory;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.invocation.models.ProducerImpl;
-import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import mockit.Deencapsulation;
+import io.swagger.models.Swagger;
 
 public class TestSwaggerEnvironment {
-  private static SwaggerEnvironmentForTest env = new SwaggerEnvironmentForTest();
+  private static SwaggerEnvironment env = new SwaggerEnvironment();
 
   private static SwaggerProducer producer;
 
-  private static ProducerArgumentsMapperFactory defaultProducerArgumentsMapperFactory;
-
   @BeforeClass
   public static void init() {
-    producer = env.createProducer(new ProducerImpl());
-    defaultProducerArgumentsMapperFactory = new ProducerArgumentsMapperFactory();
-    List<ProducerArgumentsMapperFactory> producerArgumentsMapperFactoryList = new ArrayList<>();
-    producerArgumentsMapperFactoryList.add(new JaxRSProducerArgumentsMapperFactory());
-    producerArgumentsMapperFactoryList.add(new SpringMVCProducerArgumentsMapperFactory());
-    producerArgumentsMapperFactoryList.add(new ProducerArgumentsMapperFactory());
-
-    Deencapsulation.setField(
-        env.getSwaggerEnvironment(), "producerArgumentsFactory", defaultProducerArgumentsMapperFactory);
-    Deencapsulation.setField(
-        env.getSwaggerEnvironment(), "producerArgumentsMapperFactoryList", producerArgumentsMapperFactoryList);
-  }
-
-  @AfterClass
-  public static void tearDown() {
-    JavassistUtils.clearByClassLoader(env.getClassLoader());
+    producer = env.createProducer(new ProducerImpl(), null);
   }
 
   @Test
@@ -90,32 +62,10 @@ public class TestSwaggerEnvironment {
 
   @Test
   public void createConsumer_consumerMethodSetBigger() {
-    SwaggerConsumer swaggerConsumer = env.getSwaggerEnvironment()
-        .createConsumer(ConsumerIntf.class, ContractIntf.class);
+    Swagger swagger = SwaggerGenerator.generate(ContractIntf.class);
+    SwaggerConsumer swaggerConsumer = env.createConsumer(ConsumerIntf.class, swagger);
 
     Assert.assertNotNull(swaggerConsumer.findOperation("exist"));
     Assert.assertNull(swaggerConsumer.findOperation("notExist"));
   }
-
-  @Test
-  public void selectProducerArgumentsMapperFactory() {
-    final ArgumentsMapperConfig config = new ArgumentsMapperConfig();
-    config.setSwaggerGeneratorContext(new JaxrsSwaggerGeneratorContext());
-
-    final ProducerArgumentsMapperFactory producerArgumentsMapperFactory = env.getSwaggerEnvironment()
-        .selectProducerArgumentsMapperFactory(config);
-
-    Assert.assertEquals(JaxRSProducerArgumentsMapperFactory.class, producerArgumentsMapperFactory.getClass());
-  }
-
-  @Test
-  public void selectProducerArgumentsMapperFactoryOnReturnDefault() {
-    final ArgumentsMapperConfig config = new ArgumentsMapperConfig();
-    config.setSwaggerGeneratorContext(new PojoSwaggerGeneratorContext());
-
-    final ProducerArgumentsMapperFactory producerArgumentsMapperFactory = env.getSwaggerEnvironment()
-        .selectProducerArgumentsMapperFactory(config);
-
-    Assert.assertSame(defaultProducerArgumentsMapperFactory, producerArgumentsMapperFactory);
-  }
 }


[servicecomb-java-chassis] 06/07: [SCB-1212[WIP][WEAK] jaxrs response mapper switch to new mechanism

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

liubao pushed a commit to branch weak-contract-type
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 9473d949839019ea2d89e500dddf186d08189da9
Author: wujimin <wu...@huawei.com>
AuthorDate: Wed Jul 3 23:11:59 2019 +0800

    [SCB-1212[WIP][WEAK] jaxrs response mapper switch to new mechanism
---
 .../swagger-invocation/invocation-jaxrs/pom.xml    |  12 ++-
 .../response/JaxrsConsumerResponseMapper.java      |  16 +++-
 .../JaxrsConsumerResponseMapperFactory.java        |   4 +-
 .../JaxrsProducerResponseMapperFactory.java        |   4 +-
 .../response/TestJaxrsConsumerResponseMapper.java  | 100 ++++++++-------------
 .../TestJaxrsConsumerResponseMapperFactory.java    |  43 ---------
 .../TestJaxrsProducerResponseMapperFactory.java    |   6 +-
 7 files changed, 69 insertions(+), 116 deletions(-)

diff --git a/swagger/swagger-invocation/invocation-jaxrs/pom.xml b/swagger/swagger-invocation/invocation-jaxrs/pom.xml
index 37c017d..df3a21a 100644
--- a/swagger/swagger-invocation/invocation-jaxrs/pom.xml
+++ b/swagger/swagger-invocation/invocation-jaxrs/pom.xml
@@ -26,11 +26,21 @@
   <artifactId>swagger-invocation-jaxrs</artifactId>
   <name>Java Chassis::Swagger::Invocation::JAXRS</name>
 
-
   <dependencies>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>swagger-invocation-core</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>swagger-generator-jaxrs</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.glassfish.jersey.core</groupId>
+      <artifactId>jersey-client</artifactId>
+      <version>2.28</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>
diff --git a/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsConsumerResponseMapper.java
index f499b7b..f8b5373 100644
--- a/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsConsumerResponseMapper.java
+++ b/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsConsumerResponseMapper.java
@@ -32,9 +32,19 @@ public class JaxrsConsumerResponseMapper implements ConsumerResponseMapper {
         javax.ws.rs.core.Response.status(response.getStatus()).entity(response.getResult());
 
     Map<String, List<Object>> headers = response.getHeaders().getHeaderMap();
-    if (headers != null) {
-      for (Entry<String, List<Object>> entry : headers.entrySet()) {
-        responseBuilder.header(entry.getKey(), entry.getValue());
+    if (headers == null) {
+      return responseBuilder.build();
+    }
+
+    for (Entry<String, List<Object>> entry : headers.entrySet()) {
+      if (entry.getValue() == null) {
+        continue;
+      }
+
+      for (Object value : entry.getValue()) {
+        if (value != null) {
+          responseBuilder.header(entry.getKey(), value);
+        }
       }
     }
 
diff --git a/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsConsumerResponseMapperFactory.java
index abf491e..c0b0b6b 100644
--- a/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsConsumerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsConsumerResponseMapperFactory.java
@@ -26,13 +26,13 @@ import org.apache.servicecomb.swagger.invocation.response.consumer.ConsumerRespo
 
 public class JaxrsConsumerResponseMapperFactory implements ConsumerResponseMapperFactory {
   @Override
-  public boolean isMatch(Type swaggerType, Type consumerType) {
+  public boolean isMatch(Type consumerType) {
     return Response.class.equals(consumerType);
   }
 
   @Override
   public ConsumerResponseMapper createResponseMapper(ResponseMapperFactorys<ConsumerResponseMapper> factorys,
-      Type swaggerType, Type consumerType) {
+      Type consumerType) {
     return new JaxrsConsumerResponseMapper();
   }
 }
diff --git a/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsProducerResponseMapperFactory.java
index 14a0ff6..7afbdcd 100644
--- a/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsProducerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-jaxrs/src/main/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/JaxrsProducerResponseMapperFactory.java
@@ -26,13 +26,13 @@ import org.apache.servicecomb.swagger.invocation.response.producer.ProducerRespo
 
 public class JaxrsProducerResponseMapperFactory implements ProducerResponseMapperFactory {
   @Override
-  public boolean isMatch(Type swaggerType, Type producerType) {
+  public boolean isMatch(Type producerType) {
     return Response.class.equals(producerType);
   }
 
   @Override
   public ProducerResponseMapper createResponseMapper(ResponseMapperFactorys<ProducerResponseMapper> factorys,
-      Type swaggerType, Type producerType) {
+      Type producerType) {
     return new JaxrsProducerResponseMapper();
   }
 }
diff --git a/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapper.java
index b35a4e9..423bfe3 100644
--- a/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapper.java
+++ b/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapper.java
@@ -16,89 +16,65 @@
  */
 package org.apache.servicecomb.swagger.invocation.jaxrs.response;
 
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.ws.rs.core.Response.ResponseBuilder;
-import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.ext.RuntimeDelegate;
-
-import org.apache.servicecomb.swagger.invocation.Response;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Response;
+
+import org.apache.servicecomb.swagger.engine.SwaggerConsumer;
+import org.apache.servicecomb.swagger.engine.SwaggerConsumerOperation;
+import org.apache.servicecomb.swagger.engine.SwaggerEnvironment;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import mockit.Expectations;
-import mockit.Mock;
-import mockit.MockUp;
-import mockit.Mocked;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.models.Swagger;
 
 public class TestJaxrsConsumerResponseMapper {
-  JaxrsConsumerResponseMapper mapper = new JaxrsConsumerResponseMapper();
-
-  int status;
+  @Path("/")
+  interface ConsumerResponseForTest {
+    @ApiResponse(code = 200, message = "", response = String.class)
+    @Path("/jaxrsResponse")
+    @GET
+    javax.ws.rs.core.Response jaxrsResponse();
+  }
 
-  Object entity;
+  SwaggerEnvironment environment = new SwaggerEnvironment();
 
-  Map<String, Object> headers = new LinkedHashMap<>();
+  SwaggerConsumer swaggerConsumer;
 
-  ResponseBuilder responseBuilder;
+  String result = "abc";
 
-  @Mocked
-  RuntimeDelegate runtimeDelegate;
+  org.apache.servicecomb.swagger.invocation.Response response = org.apache.servicecomb.swagger.invocation.Response
+      .ok(result);
 
   @Before
   public void setup() {
-    responseBuilder = new MockUp<ResponseBuilder>() {
-      @Mock
-      ResponseBuilder status(int status) {
-        TestJaxrsConsumerResponseMapper.this.status = status;
-        return responseBuilder;
-      }
-
-      @Mock
-      ResponseBuilder entity(Object entity) {
-        TestJaxrsConsumerResponseMapper.this.entity = entity;
-        return responseBuilder;
-      }
-
-      @Mock
-      ResponseBuilder header(String name, Object value) {
-        headers.put(name, value);
-        return responseBuilder;
-      }
-    }.getMockInstance();
-
-    new Expectations() {
-      {
-        runtimeDelegate.createResponseBuilder();
-        result = responseBuilder;
-      }
-    };
+    Swagger swagger = SwaggerGenerator.generate(ConsumerResponseForTest.class);
+    swaggerConsumer = environment.createConsumer(ConsumerResponseForTest.class, swagger);
   }
 
   @SuppressWarnings("unchecked")
   @Test
-  public void mapResponse_withHeaders() {
-    Response response = Response.create(Status.OK, "ret");
-    response.getHeaders().addHeader("h", "v");
-    mapper.mapResponse(response);
+  public void jaxrsResponse() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("jaxrsResponse");
 
-    Assert.assertEquals(Status.OK.getStatusCode(), status);
-    Assert.assertEquals("ret", entity);
-    Assert.assertEquals(1, headers.size());
-    Assert.assertThat((List<Object>) headers.get("h"), Matchers.contains("v"));
+    Response jaxrsResponse = (Response) operation.getResponseMapper().mapResponse(response);
+    Assert.assertEquals(result, jaxrsResponse.getEntity());
+    Assert.assertTrue(jaxrsResponse.getHeaders().isEmpty());
   }
 
   @Test
-  public void mapResponse_withoutHeaders() {
-    Response response = Response.create(Status.OK, "ret");
-    mapper.mapResponse(response);
-
-    Assert.assertEquals(Status.OK.getStatusCode(), status);
-    Assert.assertEquals("ret", entity);
-    Assert.assertEquals(0, headers.size());
+  public void jaxrsResponseWithHeaders() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("jaxrsResponse");
+    response.getHeaders().addHeader("h", "v1").addHeader("h", "v2").addHeader("h", (Object) null);
+    response.getHeaders().getHeaderMap().put("h1", null);
+
+    Response jaxrsResponse = (Response) operation.getResponseMapper().mapResponse(response);
+    Assert.assertEquals(result, jaxrsResponse.getEntity());
+    Assert.assertEquals(1, jaxrsResponse.getHeaders().size());
+    Assert.assertThat(jaxrsResponse.getHeaders().get("h"), Matchers.contains("v1", "v2"));
   }
 }
diff --git a/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapperFactory.java
deleted file mode 100644
index f57149d..0000000
--- a/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsConsumerResponseMapperFactory.java
+++ /dev/null
@@ -1,43 +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.swagger.invocation.jaxrs.response;
-
-import javax.ws.rs.core.Response;
-
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class TestJaxrsConsumerResponseMapperFactory {
-  JaxrsConsumerResponseMapperFactory factory = new JaxrsConsumerResponseMapperFactory();
-
-  @Test
-  public void isMatch_true() {
-    Assert.assertTrue(factory.isMatch(null, Response.class));
-  }
-
-  @Test
-  public void isMatch_false() {
-    Assert.assertFalse(factory.isMatch(null, String.class));
-  }
-
-  @Test
-  public void createResponseMapper() {
-    Assert.assertThat(factory.createResponseMapper(null, null, null),
-        Matchers.instanceOf(JaxrsConsumerResponseMapper.class));
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsProducerResponseMapperFactory.java
index 179def7..5b768d0 100644
--- a/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsProducerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-jaxrs/src/test/java/org/apache/servicecomb/swagger/invocation/jaxrs/response/TestJaxrsProducerResponseMapperFactory.java
@@ -27,17 +27,17 @@ public class TestJaxrsProducerResponseMapperFactory {
 
   @Test
   public void isMatch_true() {
-    Assert.assertTrue(factory.isMatch(null, Response.class));
+    Assert.assertTrue(factory.isMatch(Response.class));
   }
 
   @Test
   public void isMatch_false() {
-    Assert.assertFalse(factory.isMatch(null, String.class));
+    Assert.assertFalse(factory.isMatch(String.class));
   }
 
   @Test
   public void createResponseMapper() {
-    Assert.assertThat(factory.createResponseMapper(null, null, null),
+    Assert.assertThat(factory.createResponseMapper(null, null),
         Matchers.instanceOf(JaxrsProducerResponseMapper.class));
   }
 }


[servicecomb-java-chassis] 04/07: [SCB-1212[WIP][WEAK] producer response mapper switch to new mechanism

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

liubao pushed a commit to branch weak-contract-type
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit f944fbf53d39f5e285bfa8760b12d4cda6cfeff6
Author: wujimin <wu...@huawei.com>
AuthorDate: Wed Jul 3 21:53:07 2019 +0800

    [SCB-1212[WIP][WEAK] producer response mapper switch to new mechanism
---
 ...letableFutureProducerResponseMapperFactory.java |   6 +-
 .../CseResponseProducerResponseMapperFactory.java  |   4 +-
 .../producer/DefaultProducerResponseMapper.java    |  10 +-
 .../DefaultProducerResponseMapperFactory.java      |  16 +--
 .../OptionalProducerResponseMapperFactory.java     |   6 +-
 ...letableFutureProducerResponseMapperFactory.java |  76 --------------
 ...stCseResponseProducerResponseMapperFactory.java |  45 ---------
 .../TestDefaultProducerResponseMapper.java         |  40 --------
 .../TestDefaultProducerResponseMapperFactory.java  |  55 ----------
 .../TestProducerResponseMapperFactorys.java        | 111 +++++++++++++++++++++
 10 files changed, 123 insertions(+), 246 deletions(-)

diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/CompletableFutureProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/CompletableFutureProducerResponseMapperFactory.java
index 2191608..5476719 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/CompletableFutureProducerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/CompletableFutureProducerResponseMapperFactory.java
@@ -24,7 +24,7 @@ import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys
 
 public class CompletableFutureProducerResponseMapperFactory implements ProducerResponseMapperFactory {
   @Override
-  public boolean isMatch(Type swaggerType, Type producerType) {
+  public boolean isMatch(Type producerType) {
     if (!ParameterizedType.class.isAssignableFrom(producerType.getClass())) {
       return false;
     }
@@ -34,8 +34,8 @@ public class CompletableFutureProducerResponseMapperFactory implements ProducerR
 
   @Override
   public ProducerResponseMapper createResponseMapper(ResponseMapperFactorys<ProducerResponseMapper> factorys,
-      Type swaggerType, Type producerType) {
+      Type producerType) {
     Type realProducerType = ((ParameterizedType) producerType).getActualTypeArguments()[0];
-    return factorys.createResponseMapper(swaggerType, realProducerType);
+    return factorys.createResponseMapper(realProducerType);
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/CseResponseProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/CseResponseProducerResponseMapperFactory.java
index b736522..4434872 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/CseResponseProducerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/CseResponseProducerResponseMapperFactory.java
@@ -25,13 +25,13 @@ public class CseResponseProducerResponseMapperFactory implements ProducerRespons
   private static final ProducerResponseMapper SAME = (status, response) -> (Response) response;
 
   @Override
-  public boolean isMatch(Type swaggerType, Type producerType) {
+  public boolean isMatch(Type producerType) {
     return producerType.equals(Response.class);
   }
 
   @Override
   public ProducerResponseMapper createResponseMapper(ResponseMapperFactorys<ProducerResponseMapper> factorys,
-      Type swaggerType, Type producerType) {
+      Type producerType) {
     return SAME;
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/DefaultProducerResponseMapper.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/DefaultProducerResponseMapper.java
index 2d35e7c..aa4f2ce 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/DefaultProducerResponseMapper.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/DefaultProducerResponseMapper.java
@@ -19,18 +19,10 @@ package org.apache.servicecomb.swagger.invocation.response.producer;
 import javax.ws.rs.core.Response.StatusType;
 
 import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.Converter;
 
 public class DefaultProducerResponseMapper implements ProducerResponseMapper {
-  private Converter converter;
-
-  public DefaultProducerResponseMapper(Converter converter) {
-    this.converter = converter;
-  }
-
   @Override
   public Response mapResponse(StatusType status, Object response) {
-    Object swaggerResult = converter.convert(response);
-    return Response.create(status, swaggerResult);
+    return Response.create(status, response);
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/DefaultProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/DefaultProducerResponseMapperFactory.java
index 5e28204..dbf1df3 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/DefaultProducerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/DefaultProducerResponseMapperFactory.java
@@ -18,32 +18,22 @@ package org.apache.servicecomb.swagger.invocation.response.producer;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.invocation.converter.Converter;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
 import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys;
 
 public class DefaultProducerResponseMapperFactory implements ProducerResponseMapperFactory {
-  private ConverterMgr converterMgr;
-
-  @Override
-  public void setConverterMgr(ConverterMgr converterMgr) {
-    this.converterMgr = converterMgr;
-  }
-
   @Override
   public int getOrder() {
     return Integer.MAX_VALUE;
   }
 
   @Override
-  public boolean isMatch(Type swaggerType, Type producerType) {
+  public boolean isMatch(Type producerType) {
     return true;
   }
 
   @Override
   public ProducerResponseMapper createResponseMapper(ResponseMapperFactorys<ProducerResponseMapper> factorys,
-      Type swaggerType, Type producerType) {
-    Converter converter = converterMgr.findConverter(producerType, swaggerType);
-    return new DefaultProducerResponseMapper(converter);
+      Type producerType) {
+    return new DefaultProducerResponseMapper();
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/OptionalProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/OptionalProducerResponseMapperFactory.java
index 4e0fcd6..b7b45a1 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/OptionalProducerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/producer/OptionalProducerResponseMapperFactory.java
@@ -24,7 +24,7 @@ import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys
 
 public class OptionalProducerResponseMapperFactory implements ProducerResponseMapperFactory {
   @Override
-  public boolean isMatch(Type swaggerType, Type producerType) {
+  public boolean isMatch(Type producerType) {
     if (!ParameterizedType.class.isAssignableFrom(producerType.getClass())) {
       return false;
     }
@@ -34,9 +34,9 @@ public class OptionalProducerResponseMapperFactory implements ProducerResponseMa
 
   @Override
   public ProducerResponseMapper createResponseMapper(ResponseMapperFactorys<ProducerResponseMapper> factorys,
-      Type swaggerType, Type producerType) {
+      Type producerType) {
     Type realProducerType = ((ParameterizedType) producerType).getActualTypeArguments()[0];
-    ProducerResponseMapper realMapper = factorys.createResponseMapper(swaggerType, realProducerType);
+    ProducerResponseMapper realMapper = factorys.createResponseMapper(realProducerType);
     return new OptionalProducerResponseMapper(realMapper);
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestCompletableFutureProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestCompletableFutureProducerResponseMapperFactory.java
deleted file mode 100644
index a1c8c47..0000000
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestCompletableFutureProducerResponseMapperFactory.java
+++ /dev/null
@@ -1,76 +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.swagger.invocation.response.producer;
-
-import java.lang.reflect.Method;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-import javax.ws.rs.core.Response.Status;
-
-import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
-import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys;
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class TestCompletableFutureProducerResponseMapperFactory {
-  CompletableFutureProducerResponseMapperFactory factory = new CompletableFutureProducerResponseMapperFactory();
-
-  ConverterMgr converterMgr = new ConverterMgr();
-
-  ResponseMapperFactorys<ProducerResponseMapper> factorys =
-      new ResponseMapperFactorys<>(ProducerResponseMapperFactory.class, converterMgr);
-
-  public CompletableFuture<String[]> producer() {
-    return null;
-  }
-
-  public List<String> swagger() {
-    return null;
-  }
-
-  @Test
-  public void isMatch_true() {
-    Method method = ReflectUtils.findMethod(this.getClass(), "producer");
-    Assert.assertTrue(factory.isMatch(null, method.getGenericReturnType()));
-  }
-
-  @Test
-  public void isMatch_Parameterized_false() {
-    Method method = ReflectUtils.findMethod(this.getClass(), "swagger");
-    Assert.assertFalse(factory.isMatch(null, method.getGenericReturnType()));
-  }
-
-  @Test
-  public void isMatch_false() {
-    Assert.assertFalse(factory.isMatch(null, String.class));
-  }
-
-  @Test
-  public void completableFuture() {
-    Method producerMethod = ReflectUtils.findMethod(this.getClass(), "producer");
-    Method swaggerMethod = ReflectUtils.findMethod(this.getClass(), "swagger");
-    ProducerResponseMapper mapper = factory
-        .createResponseMapper(factorys, swaggerMethod.getGenericReturnType(), producerMethod.getGenericReturnType());
-
-    Response response = mapper.mapResponse(Status.OK, new String[] {"a", "b"});
-    Assert.assertThat(response.getResult(), Matchers.contains("a", "b"));
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestCseResponseProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestCseResponseProducerResponseMapperFactory.java
deleted file mode 100644
index 22f2ddc..0000000
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestCseResponseProducerResponseMapperFactory.java
+++ /dev/null
@@ -1,45 +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.swagger.invocation.response.producer;
-
-import javax.ws.rs.core.Response.Status;
-
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class TestCseResponseProducerResponseMapperFactory {
-  CseResponseProducerResponseMapperFactory factory = new CseResponseProducerResponseMapperFactory();
-
-  @Test
-  public void isMatch_true() {
-    Assert.assertTrue(factory.isMatch(String.class, Response.class));
-  }
-
-  @Test
-  public void isMatch_false() {
-    Assert.assertFalse(factory.isMatch(String.class, String.class));
-  }
-
-  @Test
-  public void createResponseMapper() {
-    ProducerResponseMapper mapper = factory.createResponseMapper(null, null, Response.class);
-    Response response = Response.ok(null);
-
-    Assert.assertSame(response, mapper.mapResponse(Status.OK, response));
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestDefaultProducerResponseMapper.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestDefaultProducerResponseMapper.java
deleted file mode 100644
index c9e980b..0000000
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestDefaultProducerResponseMapper.java
+++ /dev/null
@@ -1,40 +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.swagger.invocation.response.producer;
-
-import javax.ws.rs.core.Response.Status;
-
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.Converter;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class TestDefaultProducerResponseMapper {
-  ConverterMgr mgr = new ConverterMgr();
-
-  Converter converter = mgr.findConverter(Integer.class, String.class);
-
-  DefaultProducerResponseMapper mapper = new DefaultProducerResponseMapper(converter);
-
-  @Test
-  public void mapResponse() {
-    Response result = mapper.mapResponse(Status.OK, 1);
-    Assert.assertSame(Status.OK, result.getStatus());
-    Assert.assertEquals("1", result.getResult());
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestDefaultProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestDefaultProducerResponseMapperFactory.java
deleted file mode 100644
index 42aaac9..0000000
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestDefaultProducerResponseMapperFactory.java
+++ /dev/null
@@ -1,55 +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.swagger.invocation.response.producer;
-
-import javax.ws.rs.core.Response.Status;
-
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class TestDefaultProducerResponseMapperFactory {
-  static ConverterMgr mgr = new ConverterMgr();
-
-  static DefaultProducerResponseMapperFactory factory = new DefaultProducerResponseMapperFactory();
-
-  @BeforeClass
-  public static void setup() {
-    factory.setConverterMgr(mgr);
-  }
-
-  @Test
-  public void getOrder() {
-    Assert.assertEquals(Integer.MAX_VALUE, factory.getOrder());
-  }
-
-  @Test
-  public void isMatch() {
-    Assert.assertTrue(factory.isMatch(null, null));
-  }
-
-  @Test
-  public void createResponseMapper() {
-    ProducerResponseMapper mapper = factory.createResponseMapper(null, String.class, Integer.class);
-    Response result = mapper.mapResponse(Status.OK, 1);
-
-    Assert.assertSame(Status.OK, result.getStatus());
-    Assert.assertEquals("1", result.getResult());
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestProducerResponseMapperFactorys.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestProducerResponseMapperFactorys.java
new file mode 100644
index 0000000..d06a541
--- /dev/null
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/producer/TestProducerResponseMapperFactorys.java
@@ -0,0 +1,111 @@
+/*
+ * 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.swagger.invocation.response.producer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+
+import javax.ws.rs.core.Response.Status;
+
+import org.apache.servicecomb.swagger.engine.SwaggerEnvironment;
+import org.apache.servicecomb.swagger.engine.SwaggerProducer;
+import org.apache.servicecomb.swagger.engine.SwaggerProducerOperation;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+import org.apache.servicecomb.swagger.invocation.Response;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import io.swagger.annotations.ApiResponse;
+import io.swagger.models.Swagger;
+
+public class TestProducerResponseMapperFactorys {
+  static class ResponseForTest {
+    public String normal() {
+      return "normal";
+    }
+
+    public CompletableFuture<String> async() {
+      return CompletableFuture.completedFuture("async");
+    }
+
+    @ApiResponse(code = 200, message = "", response = String.class)
+    public Response scbResponse() {
+      return Response.ok("scb");
+    }
+
+    @ApiResponse(code = 200, message = "", response = String.class)
+    public javax.ws.rs.core.Response jaxrsResponse() {
+      return javax.ws.rs.core.Response.ok("jaxrs").build();
+    }
+
+    public Optional<String> optional() {
+      return Optional.of("optional");
+    }
+  }
+
+  static SwaggerEnvironment environment = new SwaggerEnvironment();
+
+  static SwaggerProducer swaggerProducer;
+
+  static ResponseForTest instance = new ResponseForTest();
+
+  static String result = "abc";
+
+  static Response response = Response.ok(result);
+
+  @BeforeClass
+  public static void setup() {
+    Swagger swagger = SwaggerGenerator.generate(ResponseForTest.class);
+    swaggerProducer = environment.createProducer(instance, swagger);
+  }
+
+  @Test
+  public void should_mapper_to_normal_string() {
+    SwaggerProducerOperation operation = swaggerProducer.findOperation("normal");
+    assertThat(operation.getResponseMapper()).isInstanceOf(DefaultProducerResponseMapper.class);
+    assertThat((String) operation.getResponseMapper().mapResponse(Status.OK, instance.normal()).getResult())
+        .isEqualTo("normal");
+  }
+
+  @Test
+  public void should_mapper_to_completableFuture_element_string() throws ExecutionException, InterruptedException {
+    SwaggerProducerOperation operation = swaggerProducer.findOperation("async");
+    assertThat(operation.getResponseMapper()).isInstanceOf(DefaultProducerResponseMapper.class);
+    assertThat((String) operation.getResponseMapper().mapResponse(Status.OK, instance.async().get()).getResult())
+        .isEqualTo("async");
+  }
+
+  @Test
+  public void should_mapper_to_scbResponse_string() {
+    SwaggerProducerOperation operation = swaggerProducer.findOperation("scbResponse");
+    assertThat(operation.getResponseMapper().getClass().getName())
+        .startsWith(CseResponseProducerResponseMapperFactory.class.getName());
+    assertThat((String) operation.getResponseMapper().mapResponse(Status.OK, instance.scbResponse()).getResult())
+        .isEqualTo("scb");
+  }
+
+  @Test
+  public void should_mapper_to_optional_string() {
+    SwaggerProducerOperation operation = swaggerProducer.findOperation("optional");
+    assertThat(operation.getResponseMapper()).isInstanceOf(OptionalProducerResponseMapper.class);
+    assertThat((String) operation.getResponseMapper().mapResponse(Status.OK, instance.optional()).getResult())
+        .isEqualTo("optional");
+  }
+}


[servicecomb-java-chassis] 07/07: [SCB-1212[WIP][WEAK] springMVC response mapper switch to new mechanism

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

liubao pushed a commit to branch weak-contract-type
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 42c59e4a9f8696f63a8b8744175f67a6cf93d45d
Author: wujimin <wu...@huawei.com>
AuthorDate: Wed Jul 3 23:15:24 2019 +0800

    [SCB-1212[WIP][WEAK] springMVC response mapper switch to new mechanism
---
 .../response/SpringmvcConsumerResponseMapper.java  |  18 +++-
 .../SpringmvcConsumerResponseMapperFactory.java    |   6 +-
 .../SpringmvcProducerResponseMapperFactory.java    |   6 +-
 .../TestSpringmvcConsumerResponseMapper.java       |  79 +++++++++++-----
 ...TestSpringmvcConsumerResponseMapperFactory.java | 101 ---------------------
 ...TestSpringmvcProducerResponseMapperFactory.java |  20 ++--
 6 files changed, 84 insertions(+), 146 deletions(-)

diff --git a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java
index 92e439b..b50ac32 100644
--- a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java
+++ b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java
@@ -37,12 +37,20 @@ public class SpringmvcConsumerResponseMapper implements ConsumerResponseMapper {
   public Object mapResponse(Response response) {
     HttpStatus status = HttpStatus.valueOf(response.getStatusCode());
 
-    HttpHeaders httpHeaders = null;
     Map<String, List<Object>> headers = response.getHeaders().getHeaderMap();
-    if (headers != null) {
-      httpHeaders = new HttpHeaders();
-      for (Entry<String, List<Object>> entry : headers.entrySet()) {
-        for (Object value : entry.getValue()) {
+    if (headers == null) {
+      Object realResult = realMapper.mapResponse(response);
+      return new ResponseEntity<>(realResult, null, status);
+    }
+
+    HttpHeaders httpHeaders = new HttpHeaders();
+    for (Entry<String, List<Object>> entry : headers.entrySet()) {
+      if (entry.getValue() == null) {
+        continue;
+      }
+
+      for (Object value : entry.getValue()) {
+        if (value != null) {
           httpHeaders.add(entry.getKey(), String.valueOf(value));
         }
       }
diff --git a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapperFactory.java
index 3887e4a..9fa48f7 100644
--- a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapperFactory.java
@@ -26,7 +26,7 @@ import org.springframework.http.ResponseEntity;
 
 public class SpringmvcConsumerResponseMapperFactory implements ConsumerResponseMapperFactory {
   @Override
-  public boolean isMatch(Type swaggerType, Type consumerType) {
+  public boolean isMatch(Type consumerType) {
     if (!ParameterizedType.class.isAssignableFrom(consumerType.getClass())) {
       return false;
     }
@@ -36,9 +36,9 @@ public class SpringmvcConsumerResponseMapperFactory implements ConsumerResponseM
 
   @Override
   public ConsumerResponseMapper createResponseMapper(ResponseMapperFactorys<ConsumerResponseMapper> factorys,
-      Type swaggerType, Type consumerType) {
+      Type consumerType) {
     Type realConsumerType = ((ParameterizedType) consumerType).getActualTypeArguments()[0];
-    ConsumerResponseMapper realMapper = factorys.createResponseMapper(swaggerType, realConsumerType);
+    ConsumerResponseMapper realMapper = factorys.createResponseMapper(realConsumerType);
     return new SpringmvcConsumerResponseMapper(realMapper);
   }
 }
diff --git a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcProducerResponseMapperFactory.java
index d01a93d..c3bee1c 100644
--- a/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcProducerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-springmvc/src/main/java/org/apache/servicecomb/swagger/invocation/springmvc/response/SpringmvcProducerResponseMapperFactory.java
@@ -26,7 +26,7 @@ import org.springframework.http.ResponseEntity;
 
 public class SpringmvcProducerResponseMapperFactory implements ProducerResponseMapperFactory {
   @Override
-  public boolean isMatch(Type swaggerType, Type producerType) {
+  public boolean isMatch(Type producerType) {
     if (!ParameterizedType.class.isAssignableFrom(producerType.getClass())) {
       return false;
     }
@@ -36,9 +36,9 @@ public class SpringmvcProducerResponseMapperFactory implements ProducerResponseM
 
   @Override
   public ProducerResponseMapper createResponseMapper(ResponseMapperFactorys<ProducerResponseMapper> factorys,
-      Type swaggerType, Type producerType) {
+      Type producerType) {
     Type realProducerType = ((ParameterizedType) producerType).getActualTypeArguments()[0];
-    ProducerResponseMapper realMapper = factorys.createResponseMapper(swaggerType, realProducerType);
+    ProducerResponseMapper realMapper = factorys.createResponseMapper(realProducerType);
     return new SpringmvcProducerResponseMapper(realMapper);
   }
 }
diff --git a/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapper.java
index 357d163..3fb9f2e 100644
--- a/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapper.java
+++ b/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapper.java
@@ -16,53 +16,88 @@
  */
 package org.apache.servicecomb.swagger.invocation.springmvc.response;
 
-import javax.ws.rs.core.Response.Status;
+import java.util.concurrent.CompletableFuture;
 
+import org.apache.servicecomb.swagger.engine.SwaggerConsumer;
+import org.apache.servicecomb.swagger.engine.SwaggerConsumerOperation;
+import org.apache.servicecomb.swagger.engine.SwaggerEnvironment;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapper;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.springframework.http.ResponseEntity;
 
-import mockit.Expectations;
-import mockit.Mocked;
+import io.swagger.models.Swagger;
 
 public class TestSpringmvcConsumerResponseMapper {
-  @Mocked
-  ConsumerResponseMapper realMapper;
+  interface ConsumerResponseForTest {
+    ResponseEntity<String> responseEntity();
 
-  SpringmvcConsumerResponseMapper mapper;
+    CompletableFuture<ResponseEntity<String>> asyncResponseEntity();
+  }
+
+  SwaggerEnvironment environment = new SwaggerEnvironment();
+
+  SwaggerConsumer swaggerConsumer;
+
+  String result = "abc";
 
-  Response response = Response.ok("1");
+  Response response = Response.ok(result);
 
   @Before
   public void setup() {
-    mapper = new SpringmvcConsumerResponseMapper(realMapper);
-
-    new Expectations() {
-      {
-        realMapper.mapResponse(response);
-        result = 1;
-      }
-    };
+    Swagger swagger = SwaggerGenerator.generate(ConsumerResponseForTest.class);
+    swaggerConsumer = environment.createConsumer(ConsumerResponseForTest.class, swagger);
   }
 
   @Test
-  public void mapResponse_withoutHeader() {
+  public void responseEntity() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("responseEntity");
+
     @SuppressWarnings("unchecked")
-    ResponseEntity<Integer> responseEntity = (ResponseEntity<Integer>) mapper.mapResponse(response);
-    Assert.assertEquals((Integer) 1, responseEntity.getBody());
-    Assert.assertEquals(Status.OK.getStatusCode(), responseEntity.getStatusCodeValue());
+    ResponseEntity<String> responseEntity = (ResponseEntity<String>) operation.getResponseMapper()
+        .mapResponse(response);
+    Assert.assertEquals(result, responseEntity.getBody());
+    Assert.assertTrue(responseEntity.getHeaders().isEmpty());
   }
 
   @Test
-  public void mapResponse_withHeader() {
+  public void responseEntityWithHeader() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("responseEntity");
     response.getHeaders().addHeader("h", "v");
 
     @SuppressWarnings("unchecked")
-    ResponseEntity<Integer> responseEntity = (ResponseEntity<Integer>) mapper.mapResponse(response);
+    ResponseEntity<String> responseEntity = (ResponseEntity<String>) operation.getResponseMapper()
+        .mapResponse(response);
+    Assert.assertEquals(result, responseEntity.getBody());
+    Assert.assertEquals(1, responseEntity.getHeaders().size());
     Assert.assertThat(responseEntity.getHeaders().get("h"), Matchers.contains("v"));
   }
+
+  @Test
+  public void asyncResponseEntity() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("asyncResponseEntity");
+
+    @SuppressWarnings("unchecked")
+    ResponseEntity<String> responseEntity = (ResponseEntity<String>) operation.getResponseMapper()
+        .mapResponse(response);
+    Assert.assertEquals(result, responseEntity.getBody());
+    Assert.assertTrue(responseEntity.getHeaders().isEmpty());
+  }
+
+  @Test
+  public void asyncResponseEntityWithHeader() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("asyncResponseEntity");
+    response.getHeaders().addHeader("h", "v1").addHeader("h", "v2");
+    response.getHeaders().getHeaderMap().put("h1", null);
+
+    @SuppressWarnings("unchecked")
+    ResponseEntity<String> responseEntity = (ResponseEntity<String>) operation.getResponseMapper()
+        .mapResponse(response);
+    Assert.assertEquals(result, responseEntity.getBody());
+    Assert.assertEquals(1, responseEntity.getHeaders().size());
+    Assert.assertThat(responseEntity.getHeaders().get("h"), Matchers.contains("v1", "v2"));
+  }
 }
diff --git a/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapperFactory.java
deleted file mode 100644
index 769443b..0000000
--- a/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapperFactory.java
+++ /dev/null
@@ -1,101 +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.swagger.invocation.springmvc.response;
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
-import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys;
-import org.apache.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapper;
-import org.apache.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapperFactory;
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-import org.junit.Test;
-import org.springframework.http.ResponseEntity;
-
-public class TestSpringmvcConsumerResponseMapperFactory {
-  SpringmvcConsumerResponseMapperFactory factory = new SpringmvcConsumerResponseMapperFactory();
-
-  ConverterMgr converterMgr = new ConverterMgr();
-
-  ResponseMapperFactorys<ConsumerResponseMapper> factorys =
-      new ResponseMapperFactorys<>(ConsumerResponseMapperFactory.class, converterMgr);
-
-  public CompletableFuture<ResponseEntity<String[]>> asyncResponseEntityMethod() {
-    return null;
-  }
-
-  public ResponseEntity<String[]> responseEntity() {
-    return null;
-  }
-
-  public List<String> list() {
-    return null;
-  }
-
-  @Test
-  public void isMatch_true() {
-    Method method = ReflectUtils.findMethod(this.getClass(), "responseEntity");
-    Assert.assertTrue(factory.isMatch(null, method.getGenericReturnType()));
-  }
-
-  @Test
-  public void isMatch_Parameterized_false() {
-    Method method = ReflectUtils.findMethod(this.getClass(), "list");
-    Assert.assertFalse(factory.isMatch(null, method.getGenericReturnType()));
-  }
-
-  @Test
-  public void isMatch_false() {
-    Assert.assertFalse(factory.isMatch(null, String.class));
-  }
-
-  @Test
-  public void createResponseMapper() {
-    Method responseEntityMethod = ReflectUtils.findMethod(this.getClass(), "responseEntity");
-    Method listMethod = ReflectUtils.findMethod(this.getClass(), "list");
-
-    ConsumerResponseMapper mapper = factory
-        .createResponseMapper(factorys, listMethod.getGenericReturnType(), responseEntityMethod.getGenericReturnType());
-    Assert.assertThat(mapper, Matchers.instanceOf(SpringmvcConsumerResponseMapper.class));
-
-    Response response = Response.ok(Arrays.asList("a", "b"));
-    @SuppressWarnings("unchecked")
-    ResponseEntity<String[]> responseEntity = (ResponseEntity<String[]>) mapper.mapResponse(response);
-    Assert.assertThat(responseEntity.getBody(), Matchers.arrayContaining("a", "b"));
-  }
-
-  @Test
-  public void asyncResponseEntity() {
-    Method responseEntityMethod = ReflectUtils.findMethod(this.getClass(), "asyncResponseEntityMethod");
-    Method listMethod = ReflectUtils.findMethod(this.getClass(), "list");
-
-    ConsumerResponseMapper mapper = factorys
-        .createResponseMapper(listMethod.getGenericReturnType(), responseEntityMethod.getGenericReturnType());
-    Assert.assertThat(mapper, Matchers.instanceOf(SpringmvcConsumerResponseMapper.class));
-
-    Response response = Response.ok(Arrays.asList("a", "b"));
-    @SuppressWarnings("unchecked")
-    ResponseEntity<String[]> responseEntity = (ResponseEntity<String[]>) mapper.mapResponse(response);
-    Assert.assertThat(responseEntity.getBody(), Matchers.arrayContaining("a", "b"));
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcProducerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcProducerResponseMapperFactory.java
index cd0668e..d65b3e0 100644
--- a/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcProducerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-springmvc/src/test/java/org/apache/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcProducerResponseMapperFactory.java
@@ -21,7 +21,6 @@ import java.util.List;
 
 import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
 import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
 import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys;
 import org.apache.servicecomb.swagger.invocation.response.producer.ProducerResponseMapper;
 import org.apache.servicecomb.swagger.invocation.response.producer.ProducerResponseMapperFactory;
@@ -34,10 +33,8 @@ import org.springframework.http.ResponseEntity;
 public class TestSpringmvcProducerResponseMapperFactory {
   SpringmvcProducerResponseMapperFactory factory = new SpringmvcProducerResponseMapperFactory();
 
-  ConverterMgr converterMgr = new ConverterMgr();
-
-  ResponseMapperFactorys<ProducerResponseMapper> factorys =
-      new ResponseMapperFactorys<>(ProducerResponseMapperFactory.class, converterMgr);
+  ResponseMapperFactorys<ProducerResponseMapper> factorys = new ResponseMapperFactorys<>(
+      ProducerResponseMapperFactory.class);
 
   public ResponseEntity<String[]> responseEntity() {
     return null;
@@ -50,31 +47,30 @@ public class TestSpringmvcProducerResponseMapperFactory {
   @Test
   public void isMatch_true() {
     Method method = ReflectUtils.findMethod(this.getClass(), "responseEntity");
-    Assert.assertTrue(factory.isMatch(null, method.getGenericReturnType()));
+    Assert.assertTrue(factory.isMatch(method.getGenericReturnType()));
   }
 
   @Test
   public void isMatch_Parameterized_false() {
     Method method = ReflectUtils.findMethod(this.getClass(), "list");
-    Assert.assertFalse(factory.isMatch(null, method.getGenericReturnType()));
+    Assert.assertFalse(factory.isMatch(method.getGenericReturnType()));
   }
 
   @Test
   public void isMatch_false() {
-    Assert.assertFalse(factory.isMatch(null, String.class));
+    Assert.assertFalse(factory.isMatch(String.class));
   }
 
   @Test
   public void createResponseMapper() {
     Method responseEntityMethod = ReflectUtils.findMethod(this.getClass(), "responseEntity");
-    Method listMethod = ReflectUtils.findMethod(this.getClass(), "list");
 
     ProducerResponseMapper mapper = factory
-        .createResponseMapper(factorys, listMethod.getGenericReturnType(), responseEntityMethod.getGenericReturnType());
+        .createResponseMapper(factorys, responseEntityMethod.getGenericReturnType());
     Assert.assertThat(mapper, Matchers.instanceOf(SpringmvcProducerResponseMapper.class));
 
-    ResponseEntity<String[]> responseEntity = new ResponseEntity<String[]>(new String[] {"a", "b"}, HttpStatus.OK);
+    ResponseEntity<String[]> responseEntity = new ResponseEntity<>(new String[] {"a", "b"}, HttpStatus.OK);
     Response response = mapper.mapResponse(null, responseEntity);
-    Assert.assertThat(response.getResult(), Matchers.contains("a", "b"));
+    Assert.assertThat(response.getResult(), Matchers.arrayContaining("a", "b"));
   }
 }


[servicecomb-java-chassis] 01/07: [SCB-1212[WIP][WEAK] response mapper not depend on swagger class generation

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

liubao pushed a commit to branch weak-contract-type
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit e1d1c7db7b3f684a4c783d743da0c28a6871a9b1
Author: wujimin <wu...@huawei.com>
AuthorDate: Wed Jul 3 21:37:57 2019 +0800

    [SCB-1212[WIP][WEAK] response mapper not depend on swagger class generation
---
 .../invocation/response/ResponseMapperFactory.java | 10 +--
 .../response/ResponseMapperFactorys.java           | 19 +----
 .../swagger/invocation/response/ResponseMeta.java  | 63 --------------
 .../invocation/response/ResponseMetaMapper.java    |  4 +-
 .../swagger/invocation/response/ResponsesMeta.java | 96 +++++++++++++---------
 .../response/TestResponseMapperFactorys.java       | 89 --------------------
 .../invocation/response/TestResponsesMeta.java     | 37 ++++-----
 7 files changed, 83 insertions(+), 235 deletions(-)

diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMapperFactory.java
index 70d8871..73a2f1a 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMapperFactory.java
@@ -18,18 +18,12 @@ package org.apache.servicecomb.swagger.invocation.response;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
-
 public interface ResponseMapperFactory<MAPPER> {
   default int getOrder() {
     return 0;
   }
 
-  default void setConverterMgr(ConverterMgr converterMgr) {
-  }
-
-  boolean isMatch(Type swaggerType, Type providerType);
+  boolean isMatch(Type providerType);
 
-  MAPPER createResponseMapper(ResponseMapperFactorys<MAPPER> factorys, Type swaggerType,
-      Type providerType);
+  MAPPER createResponseMapper(ResponseMapperFactorys<MAPPER> factorys, Type providerType);
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMapperFactorys.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMapperFactorys.java
index 92e95c6..9a37037 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMapperFactorys.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMapperFactorys.java
@@ -20,37 +20,26 @@ import java.lang.reflect.Type;
 import java.util.List;
 
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
 
 public class ResponseMapperFactorys<MAPPER> {
   private List<ResponseMapperFactory<MAPPER>> factorys;
 
-  public ResponseMapperFactorys(Class<? extends ResponseMapperFactory<MAPPER>> factoryCls, ConverterMgr converterMgr) {
-    this(factoryCls);
-    this.setConverterMgr(converterMgr);
-  }
-
   @SuppressWarnings("unchecked")
   public ResponseMapperFactorys(Class<? extends ResponseMapperFactory<MAPPER>> factoryCls) {
     factorys = (List<ResponseMapperFactory<MAPPER>>) SPIServiceUtils.getSortedService(factoryCls);
   }
 
-  public void setConverterMgr(ConverterMgr converterMgr) {
-    factorys.forEach(factory -> factory.setConverterMgr(converterMgr));
-  }
-
-  public MAPPER createResponseMapper(Type swaggerType, Type providerType) {
+  public MAPPER createResponseMapper(Type providerType) {
     for (ResponseMapperFactory<MAPPER> factory : factorys) {
-      if (!factory.isMatch(swaggerType, providerType)) {
+      if (!factory.isMatch(providerType)) {
         continue;
       }
 
-      return factory.createResponseMapper(this, swaggerType, providerType);
+      return factory.createResponseMapper(this, providerType);
     }
 
     throw new IllegalStateException(
-        String.format("can not find response mapper for %s and %s, this should never happened.",
-            swaggerType.getTypeName(),
+        String.format("can not find response mapper for %s, this should never happened.",
             providerType.getTypeName()));
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMeta.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMeta.java
deleted file mode 100644
index 3aade01..0000000
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMeta.java
+++ /dev/null
@@ -1,63 +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.swagger.invocation.response;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator;
-
-import com.fasterxml.jackson.databind.JavaType;
-
-import io.swagger.models.Response;
-import io.swagger.models.properties.Property;
-
-public class ResponseMeta {
-  /**
-   * swagger中定义的statusCode与java类型的映射,方便consumer端transport将码流转换为具体的类型
-   */
-  private JavaType javaType;
-
-  private Map<String, JavaType> headers = new HashMap<>();
-
-  public void init(SwaggerToClassGenerator swaggerToClassGenerator, Response response) {
-    if (javaType == null) {
-      javaType = swaggerToClassGenerator.convert(response.getResponseSchema());
-    }
-
-    if (response.getHeaders() == null) {
-      return;
-    }
-    for (Entry<String, Property> entry : response.getHeaders().entrySet()) {
-      JavaType headerJavaType = swaggerToClassGenerator.convert(entry.getValue());
-      headers.put(entry.getKey(), headerJavaType);
-    }
-  }
-
-  public JavaType getJavaType() {
-    return javaType;
-  }
-
-  public void setJavaType(JavaType javaType) {
-    this.javaType = javaType;
-  }
-
-  public Map<String, JavaType> getHeaders() {
-    return headers;
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMetaMapper.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMetaMapper.java
index e357711..8de01af 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMetaMapper.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponseMetaMapper.java
@@ -19,10 +19,12 @@ package org.apache.servicecomb.swagger.invocation.response;
 
 import java.util.Map;
 
+import com.fasterxml.jackson.databind.JavaType;
+
 public interface ResponseMetaMapper {
   default int getOrder() {
     return 0;
   }
 
-  Map<Integer, ResponseMeta> getMapper();
+  Map<Integer, JavaType> getMapper();
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponsesMeta.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponsesMeta.java
index 881cb81..2321eb3 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponsesMeta.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/ResponsesMeta.java
@@ -16,7 +16,8 @@
  */
 package org.apache.servicecomb.swagger.invocation.response;
 
-import java.lang.reflect.Type;
+import static io.swagger.util.ReflectionUtils.isVoid;
+
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -24,18 +25,43 @@ import java.util.Map.Entry;
 import javax.ws.rs.core.Response.Status;
 
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator;
+import org.apache.servicecomb.swagger.converter.ConverterMgr;
 import org.apache.servicecomb.swagger.invocation.context.HttpStatus;
 import org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData;
 import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory;
 
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.SimpleType;
-import com.fasterxml.jackson.databind.type.TypeFactory;
 
 import io.swagger.models.Operation;
 import io.swagger.models.Response;
-
+import io.swagger.models.Swagger;
+
+/**
+ * <pre>
+ * two Scenes:
+ * 1.consumer interface + swagger
+ *   interface declare success response type
+ *   and can declare exceptions response type by annotations
+ *   consumer interface meta never changed and has high priority
+ *
+ *   so, merge them to be one ResponsesMeta
+ *
+ * 2.restTemplate + swagger
+ *   can only declare success response type
+ *   and not stable
+ *
+ *   so, will wrap swagger meta
+ *
+ *   note:
+ *   old version support: List&lt;User&gt; users = restTemplate.postForObject(...., List.class)
+ *     in fact, in this time, type is determined by swagger meta
+ *   new version:
+ *     1) if request response type is List/Set/Map, and there is element type defined, then use swagger type,
+ *     2) other times use request response type
+ *     3) compare to old version, add support of ParameterizedTypeReference
+ * </pre>
+ */
 public class ResponsesMeta {
   private static final JavaType COMMON_EXCEPTION_JAVA_TYPE = SimpleType.constructUnsafe(CommonExceptionData.class);
 
@@ -44,65 +70,61 @@ public class ResponsesMeta {
   private static final ResponseMetaMapper GLOBAL_DEFAULT_MAPPER = SPIServiceUtils
       .getPriorityHighestService(ResponseMetaMapper.class);
 
-  private Map<Integer, ResponseMeta> responseMap = new HashMap<>();
+  private Map<Integer, JavaType> responseMap = new HashMap<>();
 
-  private ResponseMeta defaultResponse;
+  private JavaType defaultResponse;
 
-  // 最后一个参数returnType用于兼容场景
-  // 历史版本中swagger中定义的return可能没定义class名,此时consumer与swagger接口是一致的
-  // 如果不传return类型进来,完全以swagger为标准,会导致生成的class不等于return
-  public void init(SwaggerToClassGenerator swaggerToClassGenerator, Operation operation, Type returnType) {
-    initSuccessResponse(returnType);
-    initGlobalDefaultMapper();
+  public void init(Swagger swagger, Operation operation) {
+    if (responseMap.isEmpty()) {
+      responseMap.put(Status.OK.getStatusCode(), OBJECT_JAVA_TYPE);
+      initGlobalDefaultMapper();
+    }
 
     for (Entry<String, Response> entry : operation.getResponses().entrySet()) {
+      JavaType javaType = ConverterMgr.findJavaType(swagger, entry.getValue().getResponseSchema());
+
       if ("default".equals(entry.getKey())) {
-        defaultResponse = new ResponseMeta();
-        defaultResponse.init(swaggerToClassGenerator, entry.getValue());
+        defaultResponse = javaType;
         continue;
       }
 
       Integer statusCode = Integer.parseInt(entry.getKey());
-      ResponseMeta responseMeta = responseMap.computeIfAbsent(statusCode, k -> new ResponseMeta());
-      responseMeta.init(swaggerToClassGenerator, entry.getValue());
+      JavaType existing = responseMap.get(statusCode);
+      if (existing == null || !isVoid(javaType)) {
+        responseMap.put(statusCode, javaType);
+      }
     }
 
-    initInternalErrorResponse();
+    responseMap.putIfAbsent(ExceptionFactory.CONSUMER_INNER_STATUS_CODE, COMMON_EXCEPTION_JAVA_TYPE);
+    responseMap.putIfAbsent(ExceptionFactory.PRODUCER_INNER_STATUS_CODE, COMMON_EXCEPTION_JAVA_TYPE);
 
     if (defaultResponse == null) {
       // swagger中没有定义default,加上default专用于处理exception
-      ResponseMeta responseMeta = new ResponseMeta();
-      responseMeta.setJavaType(OBJECT_JAVA_TYPE);
-
-      defaultResponse = responseMeta;
+      defaultResponse = OBJECT_JAVA_TYPE;
     }
   }
 
-  protected void initSuccessResponse(Type returnType) {
-    ResponseMeta successResponse = new ResponseMeta();
-    successResponse.setJavaType(TypeFactory.defaultInstance().constructType(returnType));
-    responseMap.put(Status.OK.getStatusCode(), successResponse);
-  }
-
-  protected void initInternalErrorResponse() {
-    ResponseMeta internalErrorResponse = new ResponseMeta();
-    internalErrorResponse.setJavaType(COMMON_EXCEPTION_JAVA_TYPE);
-    responseMap.putIfAbsent(ExceptionFactory.CONSUMER_INNER_STATUS_CODE, internalErrorResponse);
-    responseMap.putIfAbsent(ExceptionFactory.PRODUCER_INNER_STATUS_CODE, internalErrorResponse);
+  public void cloneTo(ResponsesMeta target) {
+    target.defaultResponse = defaultResponse;
+    target.responseMap.putAll(responseMap);
   }
 
   protected void initGlobalDefaultMapper() {
     if (GLOBAL_DEFAULT_MAPPER != null) {
-      Map<Integer, ResponseMeta> mappers = GLOBAL_DEFAULT_MAPPER.getMapper();
+      Map<Integer, JavaType> mappers = GLOBAL_DEFAULT_MAPPER.getMapper();
       if (mappers != null) {
         responseMap.putAll(mappers);
       }
     }
   }
 
-  public ResponseMeta findResponseMeta(int statusCode) {
-    ResponseMeta responseMeta = responseMap.get(statusCode);
-    if (responseMeta == null) {
+  public Map<Integer, JavaType> getResponseMap() {
+    return responseMap;
+  }
+
+  public JavaType findResponseType(int statusCode) {
+    JavaType responseType = responseMap.get(statusCode);
+    if (responseType == null) {
       if (HttpStatus.isSuccess(statusCode)) {
         return responseMap.get(Status.OK.getStatusCode());
       }
@@ -110,6 +132,6 @@ public class ResponsesMeta {
       return defaultResponse;
     }
 
-    return responseMeta;
+    return responseType;
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponseMapperFactorys.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponseMapperFactorys.java
deleted file mode 100644
index bd6f61d..0000000
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponseMapperFactorys.java
+++ /dev/null
@@ -1,89 +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.swagger.invocation.response;
-
-import java.util.List;
-
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.Converter;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
-import org.apache.servicecomb.swagger.invocation.converter.impl.ConverterSame;
-import org.apache.servicecomb.swagger.invocation.response.consumer.CompletableFutureConsumerResponseMapperFactory;
-import org.apache.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapper;
-import org.apache.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapperFactory;
-import org.apache.servicecomb.swagger.invocation.response.consumer.CseResponseConsumerResponseMapperFactory;
-import org.apache.servicecomb.swagger.invocation.response.consumer.DefaultConsumerResponseMapper;
-import org.apache.servicecomb.swagger.invocation.response.consumer.DefaultConsumerResponseMapperFactory;
-import org.apache.servicecomb.swagger.invocation.response.consumer.OptionalConsumerResponseMapperFactory;
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import mockit.Deencapsulation;
-
-public class TestResponseMapperFactorys {
-  ResponseMapperFactorys<ConsumerResponseMapper> consumerResponseMapperFactorys =
-      new ResponseMapperFactorys<>(ConsumerResponseMapperFactory.class);
-
-  List<ResponseMapperFactory<ConsumerResponseMapper>> factorys =
-      Deencapsulation.getField(consumerResponseMapperFactorys, "factorys");
-
-  ConverterMgr converterMgr = new ConverterMgr();
-
-  @Before
-  public void setup() {
-    consumerResponseMapperFactorys.setConverterMgr(converterMgr);
-  }
-
-  @SuppressWarnings("unchecked")
-  @Test
-  public void construct() {
-    Assert.assertThat(factorys,
-        Matchers.containsInAnyOrder(Matchers.instanceOf(CseResponseConsumerResponseMapperFactory.class),
-            Matchers.instanceOf(CompletableFutureConsumerResponseMapperFactory.class),
-            Matchers.instanceOf(DefaultConsumerResponseMapperFactory.class),
-            Matchers.instanceOf(OptionalConsumerResponseMapperFactory.class)));
-  }
-
-  @Test
-  public void setConverterMgr() {
-    DefaultConsumerResponseMapperFactory mapper = (DefaultConsumerResponseMapperFactory) factorys.stream()
-        .filter(m -> m instanceof DefaultConsumerResponseMapperFactory)
-        .findFirst()
-        .get();
-    Assert.assertSame(converterMgr, Deencapsulation.getField(mapper, "converterMgr"));
-  }
-
-  @Test
-  public void createResponseMapper_default() {
-    ConsumerResponseMapper mapper = consumerResponseMapperFactorys.createResponseMapper(String.class, String.class);
-    Assert.assertThat(mapper, Matchers.instanceOf(DefaultConsumerResponseMapper.class));
-
-    Converter converter = Deencapsulation.getField(mapper, "converter");
-    Assert.assertSame(ConverterSame.getInstance(), converter);
-  }
-
-  @Test
-  public void createResponseMapper_cseResponse() {
-    ConsumerResponseMapper mapper = consumerResponseMapperFactorys.createResponseMapper(String.class, Response.class);
-
-    Response response = Response.ok(null);
-    Object result = mapper.mapResponse(response);
-    Assert.assertSame(response, result);
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponsesMeta.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponsesMeta.java
index f6077ce..219bb0c 100644
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponsesMeta.java
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/TestResponsesMeta.java
@@ -16,12 +16,12 @@
  */
 package org.apache.servicecomb.swagger.invocation.response;
 
-import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator;
-import org.apache.servicecomb.swagger.generator.core.SwaggerGenerator;
-import org.apache.servicecomb.swagger.generator.core.unittest.UnitTestSwaggerUtils;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
 import org.junit.Assert;
 import org.junit.Test;
 
+import com.fasterxml.jackson.databind.JavaType;
+
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import io.swagger.annotations.ResponseHeader;
@@ -44,33 +44,26 @@ public class TestResponsesMeta {
 
   @Test
   public void test() {
-    SwaggerGenerator generator = UnitTestSwaggerUtils.generateSwagger(ResponseMetaImpl.class);
-    Swagger swagger = generator.getSwagger();
+    Swagger swagger = SwaggerGenerator.generate(ResponseMetaImpl.class);
     Operation operation = swagger.getPath("/add").getPost();
 
-    SwaggerToClassGenerator swaggerToClassGenerator = new SwaggerToClassGenerator(new ClassLoader() {
-    }, swagger, "ms.sid");
     ResponsesMeta meta = new ResponsesMeta();
-    meta.init(swaggerToClassGenerator, operation, int.class);
+    meta.init(swagger, operation);
 
-    ResponseMeta resp = meta.findResponseMeta(200);
-    // Response currently is based on return type not swagger type
-    Assert.assertEquals(int.class, resp.getJavaType().getRawClass());
+    JavaType resp = meta.findResponseType(200);
+    Assert.assertEquals(Integer.class, resp.getRawClass());
 
-    resp = meta.findResponseMeta(201);
-    // Response currently is based on return type not swagger type. For this test case there is one problem need to discuss.
-    // If SUCCESS family, do we should use OK response type?
-    Assert.assertEquals(int.class, resp.getJavaType().getRawClass());
+    resp = meta.findResponseType(201);
+    Assert.assertEquals(Integer.class, resp.getRawClass());
 
-    resp = meta.findResponseMeta(400);
-    Assert.assertEquals(String.class, resp.getJavaType().getRawClass());
+    resp = meta.findResponseType(400);
+    Assert.assertEquals(String.class, resp.getRawClass());
 
-    resp = meta.findResponseMeta(401);
-    Assert.assertEquals(Long.class, resp.getJavaType().getRawClass());
-    Assert.assertEquals(Integer.class, resp.getHeaders().get("h1").getRawClass());
+    resp = meta.findResponseType(401);
+    Assert.assertEquals(Long.class, resp.getRawClass());
 
-    resp = meta.findResponseMeta(500);
+    resp = meta.findResponseType(500);
     // changed to Object for new version to keep user defined error data not lose and can be parsed.
-    Assert.assertEquals(Object.class, resp.getJavaType().getRawClass());
+    Assert.assertEquals(Object.class, resp.getRawClass());
   }
 }


[servicecomb-java-chassis] 03/07: [SCB-1212[WIP][WEAK] consumer response mapper switch to new mechanism

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

liubao pushed a commit to branch weak-contract-type
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit 6c108b3e68ffed0ca1801db9056c97b424149257
Author: wujimin <wu...@huawei.com>
AuthorDate: Wed Jul 3 21:51:13 2019 +0800

    [SCB-1212[WIP][WEAK] consumer response mapper switch to new mechanism
---
 ...letableFutureConsumerResponseMapperFactory.java |  6 +-
 .../CseResponseConsumerResponseMapperFactory.java  |  4 +-
 .../consumer/DefaultConsumerResponseMapper.java    |  9 +-
 .../DefaultConsumerResponseMapperFactory.java      | 16 +---
 .../OptionalConsumerResponseMapperFactory.java     |  6 +-
 ...letableFutureConsumerResponseMapperFactory.java | 76 -----------------
 .../TestConsumerResponseMapperFactorys.java        | 96 ++++++++++++++++++++++
 ...stCseResponseConsumerResponseMapperFactory.java | 43 ----------
 .../TestDefaultConsumerResponseMapper.java         | 37 ---------
 .../TestDefaultConsumerResponseMapperFactory.java  | 51 ------------
 10 files changed, 108 insertions(+), 236 deletions(-)

diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/CompletableFutureConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/CompletableFutureConsumerResponseMapperFactory.java
index 742958d..eabe5fd 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/CompletableFutureConsumerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/CompletableFutureConsumerResponseMapperFactory.java
@@ -24,7 +24,7 @@ import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys
 
 public class CompletableFutureConsumerResponseMapperFactory implements ConsumerResponseMapperFactory {
   @Override
-  public boolean isMatch(Type swaggerType, Type consumerType) {
+  public boolean isMatch(Type consumerType) {
     if (!ParameterizedType.class.isAssignableFrom(consumerType.getClass())) {
       return false;
     }
@@ -34,8 +34,8 @@ public class CompletableFutureConsumerResponseMapperFactory implements ConsumerR
 
   @Override
   public ConsumerResponseMapper createResponseMapper(ResponseMapperFactorys<ConsumerResponseMapper> factorys,
-      Type swaggerType, Type consumerType) {
+      Type consumerType) {
     Type realConsumerType = ((ParameterizedType) consumerType).getActualTypeArguments()[0];
-    return factorys.createResponseMapper(swaggerType, realConsumerType);
+    return factorys.createResponseMapper(realConsumerType);
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/CseResponseConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/CseResponseConsumerResponseMapperFactory.java
index 86c294b..34fcafd 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/CseResponseConsumerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/CseResponseConsumerResponseMapperFactory.java
@@ -25,13 +25,13 @@ public class CseResponseConsumerResponseMapperFactory implements ConsumerRespons
   private static final ConsumerResponseMapper SAME = response -> response;
 
   @Override
-  public boolean isMatch(Type swaggerType, Type consumerType) {
+  public boolean isMatch(Type consumerType) {
     return Response.class.equals(consumerType);
   }
 
   @Override
   public ConsumerResponseMapper createResponseMapper(ResponseMapperFactorys<ConsumerResponseMapper> factorys,
-      Type swaggerType, Type consumerType) {
+      Type consumerType) {
     return SAME;
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/DefaultConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/DefaultConsumerResponseMapper.java
index e43e37e..d430050 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/DefaultConsumerResponseMapper.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/DefaultConsumerResponseMapper.java
@@ -17,17 +17,10 @@
 package org.apache.servicecomb.swagger.invocation.response.consumer;
 
 import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.Converter;
 
 public class DefaultConsumerResponseMapper implements ConsumerResponseMapper {
-  private Converter converter;
-
-  public DefaultConsumerResponseMapper(Converter converter) {
-    this.converter = converter;
-  }
-
   @Override
   public Object mapResponse(Response response) {
-    return converter.convert(response.getResult());
+    return response.getResult();
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/DefaultConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/DefaultConsumerResponseMapperFactory.java
index bdd9643..0dd56c0 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/DefaultConsumerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/DefaultConsumerResponseMapperFactory.java
@@ -18,32 +18,22 @@ package org.apache.servicecomb.swagger.invocation.response.consumer;
 
 import java.lang.reflect.Type;
 
-import org.apache.servicecomb.swagger.invocation.converter.Converter;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
 import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys;
 
 public class DefaultConsumerResponseMapperFactory implements ConsumerResponseMapperFactory {
-  private ConverterMgr converterMgr;
-
-  @Override
-  public void setConverterMgr(ConverterMgr converterMgr) {
-    this.converterMgr = converterMgr;
-  }
-
   @Override
   public int getOrder() {
     return Integer.MAX_VALUE;
   }
 
   @Override
-  public boolean isMatch(Type swaggerType, Type consumerType) {
+  public boolean isMatch(Type consumerType) {
     return true;
   }
 
   @Override
   public ConsumerResponseMapper createResponseMapper(ResponseMapperFactorys<ConsumerResponseMapper> factorys,
-      Type swaggerType, Type consumerType) {
-    Converter converter = converterMgr.findConverter(swaggerType, consumerType);
-    return new DefaultConsumerResponseMapper(converter);
+      Type consumerType) {
+    return new DefaultConsumerResponseMapper();
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/OptionalConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/OptionalConsumerResponseMapperFactory.java
index 29b95dc..8c08afd 100644
--- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/OptionalConsumerResponseMapperFactory.java
+++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/invocation/response/consumer/OptionalConsumerResponseMapperFactory.java
@@ -24,7 +24,7 @@ import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys
 
 public class OptionalConsumerResponseMapperFactory implements ConsumerResponseMapperFactory {
   @Override
-  public boolean isMatch(Type swaggerType, Type consumerType) {
+  public boolean isMatch(Type consumerType) {
     if (!ParameterizedType.class.isAssignableFrom(consumerType.getClass())) {
       return false;
     }
@@ -34,9 +34,9 @@ public class OptionalConsumerResponseMapperFactory implements ConsumerResponseMa
 
   @Override
   public ConsumerResponseMapper createResponseMapper(ResponseMapperFactorys<ConsumerResponseMapper> factorys,
-      Type swaggerType, Type consumerType) {
+      Type consumerType) {
     Type realConsumerType = ((ParameterizedType) consumerType).getActualTypeArguments()[0];
-    ConsumerResponseMapper realMapper = factorys.createResponseMapper(swaggerType, realConsumerType);
+    ConsumerResponseMapper realMapper = factorys.createResponseMapper(realConsumerType);
     return new OptionalConsumerResponseMapper(realMapper);
   }
 }
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestCompletableFutureConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestCompletableFutureConsumerResponseMapperFactory.java
deleted file mode 100644
index ea4cc49..0000000
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestCompletableFutureConsumerResponseMapperFactory.java
+++ /dev/null
@@ -1,76 +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.swagger.invocation.response.consumer;
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
-import org.apache.servicecomb.swagger.invocation.response.ResponseMapperFactorys;
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class TestCompletableFutureConsumerResponseMapperFactory {
-  CompletableFutureConsumerResponseMapperFactory factory = new CompletableFutureConsumerResponseMapperFactory();
-
-  ConverterMgr converterMgr = new ConverterMgr();
-
-  ResponseMapperFactorys<ConsumerResponseMapper> factorys =
-      new ResponseMapperFactorys<>(ConsumerResponseMapperFactory.class, converterMgr);
-
-  public CompletableFuture<String[]> consumer() {
-    return null;
-  }
-
-  public List<String> swagger() {
-    return null;
-  }
-
-  @Test
-  public void isMatch_true() {
-    Method method = ReflectUtils.findMethod(this.getClass(), "consumer");
-    Assert.assertTrue(factory.isMatch(null, method.getGenericReturnType()));
-  }
-
-  @Test
-  public void isMatch_Parameterized_false() {
-    Method method = ReflectUtils.findMethod(this.getClass(), "swagger");
-    Assert.assertFalse(factory.isMatch(null, method.getGenericReturnType()));
-  }
-
-  @Test
-  public void isMatch_false() {
-    Assert.assertFalse(factory.isMatch(null, String.class));
-  }
-
-  @Test
-  public void completableFuture() {
-    Method consumerMethod = ReflectUtils.findMethod(this.getClass(), "consumer");
-    Method swaggerMethod = ReflectUtils.findMethod(this.getClass(), "swagger");
-    ConsumerResponseMapper mapper = factory
-        .createResponseMapper(factorys, swaggerMethod.getGenericReturnType(), consumerMethod.getGenericReturnType());
-
-    Response response = Response.ok(Arrays.asList("a", "b"));
-    String[] arr = (String[]) mapper.mapResponse(response);
-    Assert.assertThat(arr, Matchers.arrayContaining("a", "b"));
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestConsumerResponseMapperFactorys.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestConsumerResponseMapperFactorys.java
new file mode 100644
index 0000000..d9e64a3
--- /dev/null
+++ b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestConsumerResponseMapperFactorys.java
@@ -0,0 +1,96 @@
+/*
+ * 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.swagger.invocation.response.consumer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.servicecomb.swagger.engine.SwaggerConsumer;
+import org.apache.servicecomb.swagger.engine.SwaggerConsumerOperation;
+import org.apache.servicecomb.swagger.engine.SwaggerEnvironment;
+import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
+import org.apache.servicecomb.swagger.invocation.Response;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import io.swagger.annotations.ApiResponse;
+import io.swagger.models.Swagger;
+
+public class TestConsumerResponseMapperFactorys {
+  interface ConsumerResponseForTest {
+    String normal();
+
+    CompletableFuture<String> async();
+
+    @ApiResponse(code = 200, message = "", response = String.class)
+    Response scbResponse();
+
+    @ApiResponse(code = 200, message = "", response = String.class)
+    javax.ws.rs.core.Response jaxrsResponse();
+
+    Optional<String> optional();
+  }
+
+  SwaggerEnvironment environment = new SwaggerEnvironment();
+
+  SwaggerConsumer swaggerConsumer;
+
+  String result = "abc";
+
+  Response response = Response.ok(result);
+
+  @Before
+  public void setup() {
+    Swagger swagger = SwaggerGenerator.generate(ConsumerResponseForTest.class);
+    swaggerConsumer = environment.createConsumer(ConsumerResponseForTest.class, swagger);
+  }
+
+  @Test
+  public void should_mapper_to_normal_string() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("normal");
+    assertThat(operation.getResponseMapper()).isInstanceOf(DefaultConsumerResponseMapper.class);
+    Assert.assertEquals(result, operation.getResponseMapper().mapResponse(response));
+  }
+
+  @Test
+  public void should_mapper_to_completableFuture_element_string() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("async");
+    assertThat(operation.getResponseMapper()).isInstanceOf(DefaultConsumerResponseMapper.class);
+    Assert.assertEquals(result, operation.getResponseMapper().mapResponse(response));
+  }
+
+  @Test
+  public void should_mapper_to_scbResponse_string() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("scbResponse");
+    assertThat(operation.getResponseMapper().getClass().getName())
+        .startsWith(CseResponseConsumerResponseMapperFactory.class.getName());
+    Response scbResponse = (Response) operation.getResponseMapper().mapResponse(response);
+    Assert.assertEquals(result, scbResponse.getResult());
+  }
+
+  @Test
+  public void should_mapper_to_optional_string() {
+    SwaggerConsumerOperation operation = swaggerConsumer.findOperation("optional");
+    assertThat(operation.getResponseMapper()).isInstanceOf(OptionalConsumerResponseMapper.class);
+    @SuppressWarnings("unchecked")
+    Optional<String> optional = (Optional<String>) operation.getResponseMapper().mapResponse(response);
+    Assert.assertEquals(result, optional.get());
+  }
+}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestCseResponseConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestCseResponseConsumerResponseMapperFactory.java
deleted file mode 100644
index 4238628..0000000
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestCseResponseConsumerResponseMapperFactory.java
+++ /dev/null
@@ -1,43 +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.swagger.invocation.response.consumer;
-
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class TestCseResponseConsumerResponseMapperFactory {
-  CseResponseConsumerResponseMapperFactory factory = new CseResponseConsumerResponseMapperFactory();
-
-  @Test
-  public void isMatch_true() {
-    Assert.assertTrue(factory.isMatch(String.class, Response.class));
-  }
-
-  @Test
-  public void isMatch_false() {
-    Assert.assertFalse(factory.isMatch(String.class, String.class));
-  }
-
-  @Test
-  public void createResponseMapper() {
-    ConsumerResponseMapper mapper = factory.createResponseMapper(null, null, Response.class);
-    Response response = Response.ok(null);
-
-    Assert.assertSame(response, mapper.mapResponse(response));
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestDefaultConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestDefaultConsumerResponseMapper.java
deleted file mode 100644
index d88be49..0000000
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestDefaultConsumerResponseMapper.java
+++ /dev/null
@@ -1,37 +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.swagger.invocation.response.consumer;
-
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.Converter;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class TestDefaultConsumerResponseMapper {
-  ConverterMgr mgr = new ConverterMgr();
-
-  Converter converter = mgr.findConverter(Integer.class, String.class);
-
-  DefaultConsumerResponseMapper mapper = new DefaultConsumerResponseMapper(converter);
-
-  @Test
-  public void mapResponse() {
-    Object result = mapper.mapResponse(Response.ok(1));
-    Assert.assertEquals("1", result);
-  }
-}
diff --git a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestDefaultConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestDefaultConsumerResponseMapperFactory.java
deleted file mode 100644
index 18991d9..0000000
--- a/swagger/swagger-invocation/invocation-core/src/test/java/org/apache/servicecomb/swagger/invocation/response/consumer/TestDefaultConsumerResponseMapperFactory.java
+++ /dev/null
@@ -1,51 +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.swagger.invocation.response.consumer;
-
-import org.apache.servicecomb.swagger.invocation.Response;
-import org.apache.servicecomb.swagger.invocation.converter.ConverterMgr;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class TestDefaultConsumerResponseMapperFactory {
-  static ConverterMgr mgr = new ConverterMgr();
-
-  static DefaultConsumerResponseMapperFactory factory = new DefaultConsumerResponseMapperFactory();
-
-  @BeforeClass
-  public static void setup() {
-    factory.setConverterMgr(mgr);
-  }
-
-  @Test
-  public void getOrder() {
-    Assert.assertEquals(Integer.MAX_VALUE, factory.getOrder());
-  }
-
-  @Test
-  public void isMatch() {
-    Assert.assertTrue(factory.isMatch(null, null));
-  }
-
-  @Test
-  public void createResponseMapper() {
-    ConsumerResponseMapper mapper = factory.createResponseMapper(null, Integer.class, String.class);
-    Object result = mapper.mapResponse(Response.ok(1));
-    Assert.assertEquals("1", result);
-  }
-}