This is an automated email from the ASF dual-hosted git repository. ningjiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 1abf76d61a15ffa65893109801d55780e1294c91 Author: wujimin <[email protected]> AuthorDate: Sun Dec 24 01:49:17 2017 +0800 JAV-591 [WIP] swagger invocation springmvc ConsumerResponseMapper switch to new mechanism --- .../response/SpringmvcConsumerResponseMapper.java | 12 ++-- ...=> SpringmvcConsumerResponseMapperFactory.java} | 42 +++++------ ...response.consumer.ConsumerResponseMapperFactory | 18 +++++ .../TestSpringmvcConsumerResponseMapper.java | 68 ++++++++++++++++++ ...TestSpringmvcConsumerResponseMapperFactory.java | 82 ++++++++++++++++++++++ 5 files changed, 190 insertions(+), 32 deletions(-) diff --git a/swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java index 2ece80a..f3c1f73 100644 --- a/swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java +++ b/swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java @@ -23,16 +23,15 @@ import java.util.Map.Entry; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; import io.servicecomb.swagger.invocation.Response; import io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapper; -@Component public class SpringmvcConsumerResponseMapper implements ConsumerResponseMapper { - @Override - public Class<?> getResponseClass() { - return ResponseEntity.class; + private ConsumerResponseMapper realMapper; + + public SpringmvcConsumerResponseMapper(ConsumerResponseMapper realMapper) { + this.realMapper = realMapper; } @Override @@ -50,6 +49,7 @@ public class SpringmvcConsumerResponseMapper implements ConsumerResponseMapper { } } - return new ResponseEntity<>(response.getResult(), httpHeaders, status); + Object realResult = realMapper.mapResponse(response); + return new ResponseEntity<>(realResult, httpHeaders, status); } } diff --git a/swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapperFactory.java similarity index 50% copy from swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java copy to swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapperFactory.java index 2ece80a..bdc3be0 100644 --- a/swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapper.java +++ b/swagger/swagger-invocation/invocation-springmvc/src/main/java/io/servicecomb/swagger/invocation/springmvc/response/SpringmvcConsumerResponseMapperFactory.java @@ -16,40 +16,30 @@ */ package io.servicecomb.swagger.invocation.springmvc.response; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; -import io.servicecomb.swagger.invocation.Response; +import io.servicecomb.swagger.invocation.response.ResponseMapperFactorys; import io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapper; +import io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapperFactory; -@Component -public class SpringmvcConsumerResponseMapper implements ConsumerResponseMapper { +public class SpringmvcConsumerResponseMapperFactory implements ConsumerResponseMapperFactory { @Override - public Class<?> getResponseClass() { - return ResponseEntity.class; + public boolean isMatch(Type swaggerType, Type consumerType) { + if (!ParameterizedType.class.isAssignableFrom(consumerType.getClass())) { + return false; + } + + return ((ParameterizedType) consumerType).getRawType().equals(ResponseEntity.class); } @Override - 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()) { - httpHeaders.add(entry.getKey(), String.valueOf(value)); - } - } - } - - return new ResponseEntity<>(response.getResult(), httpHeaders, status); + public ConsumerResponseMapper createResponseMapper(ResponseMapperFactorys<ConsumerResponseMapper> factorys, + Type swaggerType, Type consumerType) { + Type realConsumerType = ((ParameterizedType) consumerType).getActualTypeArguments()[0]; + ConsumerResponseMapper realMapper = factorys.createResponseMapper(swaggerType, realConsumerType); + return new SpringmvcConsumerResponseMapper(realMapper); } } diff --git a/swagger/swagger-invocation/invocation-springmvc/src/main/resources/META-INF/services/io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapperFactory b/swagger/swagger-invocation/invocation-springmvc/src/main/resources/META-INF/services/io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapperFactory new file mode 100644 index 0000000..f0bf886 --- /dev/null +++ b/swagger/swagger-invocation/invocation-springmvc/src/main/resources/META-INF/services/io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapperFactory @@ -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. +# + +io.servicecomb.swagger.invocation.springmvc.response.SpringmvcConsumerResponseMapperFactory \ No newline at end of file diff --git a/swagger/swagger-invocation/invocation-springmvc/src/test/java/io/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapper.java b/swagger/swagger-invocation/invocation-springmvc/src/test/java/io/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapper.java new file mode 100644 index 0000000..74f61e2 --- /dev/null +++ b/swagger/swagger-invocation/invocation-springmvc/src/test/java/io/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapper.java @@ -0,0 +1,68 @@ +/* + * 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 io.servicecomb.swagger.invocation.springmvc.response; + +import javax.ws.rs.core.Response.Status; + +import org.hamcrest.Matchers; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.springframework.http.ResponseEntity; + +import io.servicecomb.swagger.invocation.Response; +import io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapper; +import mockit.Expectations; +import mockit.Mocked; + +public class TestSpringmvcConsumerResponseMapper { + @Mocked + ConsumerResponseMapper realMapper; + + SpringmvcConsumerResponseMapper mapper; + + Response response = Response.ok("1"); + + @Before + public void setup() { + mapper = new SpringmvcConsumerResponseMapper(realMapper); + + new Expectations() { + { + realMapper.mapResponse(response); + result = 1; + } + }; + } + + @Test + public void mapResponse_withoutHeader() { + @SuppressWarnings("unchecked") + ResponseEntity<Integer> responseEntity = (ResponseEntity<Integer>) mapper.mapResponse(response); + Assert.assertEquals((Integer) 1, responseEntity.getBody()); + Assert.assertEquals(Status.OK.getStatusCode(), responseEntity.getStatusCodeValue()); + } + + @Test + public void mapResponse_withHeader() { + response.getHeaders().addHeader("h", "v"); + + @SuppressWarnings("unchecked") + ResponseEntity<Integer> responseEntity = (ResponseEntity<Integer>) mapper.mapResponse(response); + Assert.assertThat(responseEntity.getHeaders().get("h"), Matchers.contains("v")); + } +} diff --git a/swagger/swagger-invocation/invocation-springmvc/src/test/java/io/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapperFactory.java b/swagger/swagger-invocation/invocation-springmvc/src/test/java/io/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapperFactory.java new file mode 100644 index 0000000..224d37f --- /dev/null +++ b/swagger/swagger-invocation/invocation-springmvc/src/test/java/io/servicecomb/swagger/invocation/springmvc/response/TestSpringmvcConsumerResponseMapperFactory.java @@ -0,0 +1,82 @@ +/* + * 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 io.servicecomb.swagger.invocation.springmvc.response; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; + +import org.hamcrest.Matchers; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.http.ResponseEntity; + +import io.servicecomb.foundation.common.utils.ReflectUtils; +import io.servicecomb.swagger.invocation.Response; +import io.servicecomb.swagger.invocation.converter.ConverterMgr; +import io.servicecomb.swagger.invocation.response.ResponseMapperFactorys; +import io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapper; +import io.servicecomb.swagger.invocation.response.consumer.ConsumerResponseMapperFactory; + +public class TestSpringmvcConsumerResponseMapperFactory { + SpringmvcConsumerResponseMapperFactory factory = new SpringmvcConsumerResponseMapperFactory(); + + ConverterMgr converterMgr = new ConverterMgr(); + + ResponseMapperFactorys<ConsumerResponseMapper> factorys = + new ResponseMapperFactorys<>(ConsumerResponseMapperFactory.class, converterMgr); + + 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")); + } +} -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
