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