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/05/16 02:15:07 UTC

[servicecomb-java-chassis] branch weak-contract-type updated: [SCB-1285][WIP][WEAK] enhance ResponseTypeProcessor to support extractResponseType

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


The following commit(s) were added to refs/heads/weak-contract-type by this push:
     new a86db3e  [SCB-1285][WIP][WEAK] enhance ResponseTypeProcessor to support extractResponseType
a86db3e is described below

commit a86db3e047825e7202474a7106bc0a631091dbab
Author: wujimin <wu...@huawei.com>
AuthorDate: Tue May 14 23:23:46 2019 +0800

    [SCB-1285][WIP][WEAK] enhance ResponseTypeProcessor to support extractResponseType
---
 .../swagger/generator/ResponseTypeProcessor.java   | 14 ++++++++
 .../response/CompletableFutureProcessor.java       | 18 +++-------
 .../response/DefaultResponseTypeProcessor.java     | 33 ++++++++++++------
 .../core/processor/response/OptionalProcessor.java | 14 +++-----
 .../processor/response/JaxrsResponseProcessor.java | 11 +++---
 .../generator-spring-data/pom.xml                  |  2 ++
 .../springdata/PageResponseTypeProcessor.java      | 39 ----------------------
 ...icecomb.swagger.generator.ResponseTypeProcessor | 18 ----------
 .../springdata/TestPageResponseTypeProcessor.java  |  2 +-
 .../src/test/resources/pageSchema.yaml             |  6 ----
 .../response/ResponseEntityProcessor.java          | 16 +++------
 .../swagger/generator/springmvc/TestSpringmvc.java |  5 ++-
 12 files changed, 60 insertions(+), 118 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ResponseTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ResponseTypeProcessor.java
index 4377335..6578cc1 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ResponseTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/ResponseTypeProcessor.java
@@ -23,5 +23,19 @@ import io.swagger.models.Model;
 public interface ResponseTypeProcessor {
   Type getProcessType();
 
+  /**
+   *
+   * @param swaggerGenerator
+   * @param operationGenerator
+   * @param genericResponseType
+   * @return if genericResponseType is CompletableFuture&lt;String&gt;, then return String
+   */
+  Type extractResponseType(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      Type genericResponseType);
+
+  default Type extractResponseType(Type genericResponseType) {
+    return extractResponseType(null, null, genericResponseType);
+  }
+
   Model process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator, Type genericResponseType);
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/CompletableFutureProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/CompletableFutureProcessor.java
index a0cfb60..09fc575 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/CompletableFutureProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/CompletableFutureProcessor.java
@@ -17,25 +17,15 @@
 
 package org.apache.servicecomb.swagger.generator.core.processor.response;
 
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
 import java.util.concurrent.CompletableFuture;
 
-import org.apache.servicecomb.swagger.generator.OperationGenerator;
-import org.apache.servicecomb.swagger.generator.SwaggerGenerator;
-
-import io.swagger.models.Model;
-
 public class CompletableFutureProcessor extends DefaultResponseTypeProcessor {
-  @Override
-  public Class<?> getProcessType() {
-    return CompletableFuture.class;
+  public CompletableFutureProcessor() {
+    extractActualType = true;
   }
 
   @Override
-  protected Model doProcess(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
-      Type genericResponseType) {
-    return super.doProcess(swaggerGenerator, operationGenerator,
-        ((ParameterizedType) genericResponseType).getActualTypeArguments()[0]);
+  public Class<?> getProcessType() {
+    return CompletableFuture.class;
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/DefaultResponseTypeProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/DefaultResponseTypeProcessor.java
index 1a05dd9..7bc824d 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/DefaultResponseTypeProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/DefaultResponseTypeProcessor.java
@@ -33,6 +33,8 @@ import io.swagger.models.utils.PropertyModelConverter;
 import io.swagger.util.ReflectionUtils;
 
 public class DefaultResponseTypeProcessor implements ResponseTypeProcessor {
+  protected boolean extractActualType;
+
   @Override
   public Type getProcessType() {
     // not care for this.
@@ -40,33 +42,42 @@ public class DefaultResponseTypeProcessor implements ResponseTypeProcessor {
   }
 
   @Override
-  public Model process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+  public Type extractResponseType(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       Type genericResponseType) {
+    if (extractActualType) {
+      genericResponseType = ((ParameterizedType) genericResponseType).getActualTypeArguments()[0];
+    }
+
+    return doExtractResponseType(genericResponseType);
+  }
+
+  private Type doExtractResponseType(Type genericResponseType) {
     if (!(genericResponseType instanceof ParameterizedType)) {
-      return doProcess(swaggerGenerator, operationGenerator, genericResponseType);
+      return genericResponseType;
     }
 
     // eg:
     //   genericResponseType is CompletableFuture<ResponseEntity<String>>
     //   responseType is ResponseEntity<String>
     //   responseRawType is ResponseEntity
-    Type responseType = ((ParameterizedType) genericResponseType).getActualTypeArguments()[0];
-    Type responseRawType = responseType;
-    if (responseType instanceof ParameterizedType) {
-      responseRawType = ((ParameterizedType) responseType).getRawType();
+    Type responseRawType = genericResponseType;
+    if (genericResponseType instanceof ParameterizedType) {
+      responseRawType = ((ParameterizedType) genericResponseType).getRawType();
     }
 
     ResponseTypeProcessor processor = findResponseTypeProcessor(responseRawType);
     if (responseRawType.equals(processor.getProcessType())) {
-      return processor.process(swaggerGenerator, operationGenerator, responseType);
+      return processor.extractResponseType(genericResponseType);
     }
 
-    return doProcess(swaggerGenerator, operationGenerator, genericResponseType);
+    return genericResponseType;
   }
 
-  protected Model doProcess(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
-      Type responseType) {
-    if (ReflectionUtils.isVoid(responseType)) {
+  @Override
+  public Model process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+      Type genericResponseType) {
+    Type responseType = extractResponseType(swaggerGenerator, operationGenerator, genericResponseType);
+    if (responseType == null || ReflectionUtils.isVoid(responseType)) {
       return null;
     }
     SwaggerUtils.addDefinitions(swaggerGenerator.getSwagger(), responseType);
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/OptionalProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/OptionalProcessor.java
index 6469d1c..6d8b604 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/OptionalProcessor.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/response/OptionalProcessor.java
@@ -17,22 +17,16 @@
 
 package org.apache.servicecomb.swagger.generator.core.processor.response;
 
-import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.Optional;
 
-import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
-
-import io.swagger.models.Model;
-
 public class OptionalProcessor extends DefaultResponseTypeProcessor {
-  @Override
-  public Class<?> getResponseType() {
-    return Optional.class;
+  public OptionalProcessor() {
+    extractActualType = true;
   }
 
   @Override
-  protected Model doProcess(OperationGenerator operationGenerator, Type genericResponseType) {
-    return super.doProcess(operationGenerator, ((ParameterizedType) genericResponseType).getActualTypeArguments()[0]);
+  public Type getProcessType() {
+    return Optional.class;
   }
 }
diff --git a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/response/JaxrsResponseProcessor.java b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/response/JaxrsResponseProcessor.java
index 1d3f3fc..715464d 100644
--- a/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/response/JaxrsResponseProcessor.java
+++ b/swagger/swagger-generator/generator-jaxrs/src/main/java/org/apache/servicecomb/swagger/generator/jaxrs/processor/response/JaxrsResponseProcessor.java
@@ -26,8 +26,6 @@ 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 io.swagger.models.Model;
-
 public class JaxrsResponseProcessor extends DefaultResponseTypeProcessor {
   @Override
   public Class<?> getProcessType() {
@@ -35,7 +33,12 @@ public class JaxrsResponseProcessor extends DefaultResponseTypeProcessor {
   }
 
   @Override
-  public Model process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
+  public Type extractResponseType(Type genericResponseType) {
+    return null;
+  }
+
+  @Override
+  public Type extractResponseType(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
       Type genericResponseType) {
     // Response can not express respone type
     // if produces is text,then can assume to be string, otherwise can only throw exception
@@ -45,7 +48,7 @@ public class JaxrsResponseProcessor extends DefaultResponseTypeProcessor {
     }
     if (produces != null) {
       if (produces.contains(MediaType.TEXT_PLAIN)) {
-        return doProcess(swaggerGenerator, operationGenerator, String.class);
+        return String.class;
       }
     }
 
diff --git a/swagger/swagger-generator/generator-spring-data/pom.xml b/swagger/swagger-generator/generator-spring-data/pom.xml
index ccdfd45..d1e1845 100644
--- a/swagger/swagger-generator/generator-spring-data/pom.xml
+++ b/swagger/swagger-generator/generator-spring-data/pom.xml
@@ -27,6 +27,7 @@
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>swagger-generator-spring-data</artifactId>
+  <name>Java Chassis::Swagger::Generator::Spring data</name>
 
   <dependencies>
     <dependency>
@@ -38,6 +39,7 @@
       <artifactId>spring-data-commons</artifactId>
       <!-- based on business project dependency -->
       <optional>true</optional>
+      <scope>provided</scope>
     </dependency>
 
   </dependencies>
diff --git a/swagger/swagger-generator/generator-spring-data/src/main/java/org/apache/servicecomb/swagger/generator/springdata/PageResponseTypeProcessor.java b/swagger/swagger-generator/generator-spring-data/src/main/java/org/apache/servicecomb/swagger/generator/springdata/PageResponseTypeProcessor.java
deleted file mode 100644
index fcea188..0000000
--- a/swagger/swagger-generator/generator-spring-data/src/main/java/org/apache/servicecomb/swagger/generator/springdata/PageResponseTypeProcessor.java
+++ /dev/null
@@ -1,39 +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.generator.springdata;
-
-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.springframework.data.domain.Page;
-
-import io.swagger.models.Model;
-
-public class PageResponseTypeProcessor extends DefaultResponseTypeProcessor {
-  @Override
-  public Class<?> getProcessType() {
-    return Page.class;
-  }
-
-  @Override
-  public Model process(SwaggerGenerator swaggerGenerator, OperationGenerator operationGenerator,
-      Type genericResponseType) {
-    return doProcess(swaggerGenerator, operationGenerator, genericResponseType);
-  }
-}
diff --git a/swagger/swagger-generator/generator-spring-data/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ResponseTypeProcessor b/swagger/swagger-generator/generator-spring-data/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ResponseTypeProcessor
deleted file mode 100644
index 8d8a56a..0000000
--- a/swagger/swagger-generator/generator-spring-data/src/main/resources/META-INF/services/org.apache.servicecomb.swagger.generator.ResponseTypeProcessor
+++ /dev/null
@@ -1,18 +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.
-#
-
-org.apache.servicecomb.swagger.generator.springdata.PageResponseTypeProcessor
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-spring-data/src/test/java/org/apache/servicecomb/swagger/generator/springdata/TestPageResponseTypeProcessor.java b/swagger/swagger-generator/generator-spring-data/src/test/java/org/apache/servicecomb/swagger/generator/springdata/TestPageResponseTypeProcessor.java
index db517f5..98262af 100644
--- a/swagger/swagger-generator/generator-spring-data/src/test/java/org/apache/servicecomb/swagger/generator/springdata/TestPageResponseTypeProcessor.java
+++ b/swagger/swagger-generator/generator-spring-data/src/test/java/org/apache/servicecomb/swagger/generator/springdata/TestPageResponseTypeProcessor.java
@@ -43,7 +43,7 @@ public class TestPageResponseTypeProcessor {
     Page<?> page = Json.mapper().readValue(json, Page.class);
 
     Assert.assertEquals(
-        "{\"content\":[\"c1\",\"c2\"],\"pageable\":{\"offset\":2,\"pageNumber\":1,\"pageSize\":2,\"paged\":true,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"unpaged\":false},\"empty\":false,\"first\":false,\"last\":true,\"number\":1,\"numberOfElements\":2,\"size\":2,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"totalElements\":4,\"totalPages\":2}",
+        "{\"content\":[\"c1\",\"c2\"],\"pageable\":{\"offset\":2,\"pageNumber\":1,\"pageSize\":2,\"paged\":true,\"sort\":{\"sorted\":false,\"unsorted\":true},\"unpaged\":false},\"first\":false,\"last\":true,\"number\":1,\"numberOfElements\":2,\"size\":2,\"sort\":{\"sorted\":false,\"unsorted\":true},\"totalElements\":4,\"totalPages\":2}",
         Json.mapper().writeValueAsString(page));
   }
 }
diff --git a/swagger/swagger-generator/generator-spring-data/src/test/resources/pageSchema.yaml b/swagger/swagger-generator/generator-spring-data/src/test/resources/pageSchema.yaml
index bf5030e..5f93f3b 100644
--- a/swagger/swagger-generator/generator-spring-data/src/test/resources/pageSchema.yaml
+++ b/swagger/swagger-generator/generator-spring-data/src/test/resources/pageSchema.yaml
@@ -49,8 +49,6 @@ definitions:
         type: "array"
         items:
           type: "object"
-      empty:
-        type: "boolean"
       first:
         type: "boolean"
       last:
@@ -82,8 +80,6 @@ definitions:
         type: "array"
         items:
           type: "string"
-      empty:
-        type: "boolean"
       first:
         type: "boolean"
       last:
@@ -130,8 +126,6 @@ definitions:
   Sort:
     type: "object"
     properties:
-      empty:
-        type: "boolean"
       sorted:
         type: "boolean"
       unsorted:
diff --git a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/response/ResponseEntityProcessor.java b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/response/ResponseEntityProcessor.java
index 681a939..e6bed78 100644
--- a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/response/ResponseEntityProcessor.java
+++ b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/response/ResponseEntityProcessor.java
@@ -16,24 +16,16 @@
  */
 package org.apache.servicecomb.swagger.generator.springmvc.processor.response;
 
-import java.lang.reflect.ParameterizedType;
-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.springframework.http.ResponseEntity;
 
-import io.swagger.models.Model;
-
 public class ResponseEntityProcessor extends DefaultResponseTypeProcessor {
-  @Override
-  public Class<?> getProcessType() {
-    return ResponseEntity.class;
+  public ResponseEntityProcessor() {
+    extractActualType = true;
   }
 
   @Override
-  protected Model doProcess(OperationGenerator operationGenerator, Type genericResponseType) {
-    return super.doProcess(operationGenerator, ((ParameterizedType) genericResponseType).getActualTypeArguments()[0]);
+  public Class<?> getProcessType() {
+    return ResponseEntity.class;
   }
 }
diff --git a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java
index ad75189..2294f03 100644
--- a/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java
+++ b/swagger/swagger-generator/generator-springmvc/src/test/java/org/apache/servicecomb/swagger/generator/springmvc/TestSpringmvc.java
@@ -258,14 +258,13 @@ public class TestSpringmvc {
   @Test
   public void testResponseEntityOptional() {
     UnitTestSwaggerUtils
-        .testSwagger(classLoader, "schemas/testResponseEntityOptional.yaml", context, Echo.class,
-            "testResponseEntityOptional");
+        .testSwagger("schemas/testResponseEntityOptional.yaml", Echo.class, "testResponseEntityOptional");
   }
 
   @Test
   public void testCompletableFutureResponseEntityOptional() {
     UnitTestSwaggerUtils
-        .testSwagger(classLoader, "schemas/testCompletableFutureResponseEntityOptional.yaml", context, Echo.class,
+        .testSwagger("schemas/testCompletableFutureResponseEntityOptional.yaml", Echo.class,
             "testCompletableFutureResponseEntityOptional");
   }
 }