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 <wuji...@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"));
   }
 }

Reply via email to