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:16 UTC

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

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