This is an automated email from the ASF dual-hosted git repository.

chanjarster pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-toolkit.git

commit 41ac32ffb13afd81d368cc9d4eca275df8a8b3e2
Author: kakulisen <[email protected]>
AuthorDate: Fri Dec 27 15:03:06 2019 +0800

    [SCB-1676] optimizing the acquisition of bean properties
    
    Signed-off-by: kakulisen <[email protected]>
---
 .../generator/context/OperationContext.java        |  3 +-
 .../generator/context/ParameterContext.java        |  5 +-
 .../toolkit/generator/util/ModelConverter.java     | 79 ++++++++++++++++------
 .../toolkit/generator/util/RequestResponse.java    | 31 +++++++++
 .../servicecomb/toolkit/generator/UtilsTest.java   | 49 +++++++++++++-
 ...stractHttpMethodMappingAnnotationProcessor.java |  4 +-
 6 files changed, 143 insertions(+), 28 deletions(-)

diff --git 
a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OperationContext.java
 
b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OperationContext.java
index 3560b3b..6d36ccb 100644
--- 
a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OperationContext.java
+++ 
b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/OperationContext.java
@@ -28,6 +28,7 @@ import org.apache.servicecomb.toolkit.generator.HttpStatuses;
 import org.apache.servicecomb.toolkit.generator.MediaTypes;
 import 
org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
 import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
+import org.apache.servicecomb.toolkit.generator.util.RequestResponse;
 
 import io.swagger.v3.oas.models.Components;
 import io.swagger.v3.oas.models.OpenAPI;
@@ -177,7 +178,7 @@ public class OperationContext implements IExtensionsContext 
{
 
       MediaType mediaType = new MediaType();
 
-      Schema refSchema = ModelConverter.getSchema(returnType, getComponents());
+      Schema refSchema = ModelConverter.getSchema(returnType, getComponents(), 
RequestResponse.RESPONSE);
       mediaType.schema(refSchema);
 
       Content content = new Content();
diff --git 
a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ParameterContext.java
 
b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ParameterContext.java
index 57d66b1..ca9046a 100644
--- 
a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ParameterContext.java
+++ 
b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/context/ParameterContext.java
@@ -28,6 +28,7 @@ import org.apache.commons.lang3.StringUtils;
 import 
org.apache.servicecomb.toolkit.generator.parser.api.OpenApiAnnotationParser;
 import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
 import org.apache.servicecomb.toolkit.generator.util.ParamUtils;
+import org.apache.servicecomb.toolkit.generator.util.RequestResponse;
 
 import io.swagger.v3.core.util.ParameterProcessor;
 import io.swagger.v3.core.util.ReflectionUtils;
@@ -96,7 +97,7 @@ public class ParameterContext implements ISchemaContext, 
IExtensionsContext {
     }
     ensureName();
     if (schema == null || nullSchema.equals(schema)) {
-      schema = ModelConverter.getSchema(parameter.getType(), getComponents());
+      schema = ModelConverter.getSchema(parameter.getType(), getComponents(), 
RequestResponse.REQUEST);
       oasParameter.schema(schema);
     }
 
@@ -236,7 +237,7 @@ public class ParameterContext implements ISchemaContext, 
IExtensionsContext {
 
     Schema refSchema = oasParameter.getSchema();
     if (refSchema == null || nullSchema.equals(refSchema)) {
-      refSchema = ModelConverter.getSchema(parameter.getType(), 
getComponents());
+      refSchema = ModelConverter.getSchema(parameter.getType(), 
getComponents(), RequestResponse.REQUEST);
       oasParameter.schema(refSchema);
     }
 
diff --git 
a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
 
b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
index ae3f9e4..9ce26c9 100644
--- 
a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
+++ 
b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/ModelConverter.java
@@ -18,14 +18,13 @@
 package org.apache.servicecomb.toolkit.generator.util;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import java.util.ServiceLoader;
 
@@ -72,10 +71,10 @@ public class ModelConverter {
   }
 
   public static Schema getSchema(Type cls) {
-    return getSchema(cls, null);
+    return getSchema(cls, null, null);
   }
 
-  public static Schema getSchema(Type cls, Components components) {
+  public static Schema getSchema(Type cls, Components components, 
RequestResponse requestResponse) {
 
     for (ModelInterceptor interceptor : interceptorMgr) {
       Schema schema = interceptor.process(cls, components);
@@ -84,19 +83,29 @@ public class ModelConverter {
       }
     }
 
-    if (cls instanceof Class) {
-      Map<String, Type> beanProperties = getBeanProperties((Class) cls);
+    if (cls instanceof Class && requestResponse != null) {
+
+      List<Type> beanProperties = null;
+      switch (requestResponse) {
+        case REQUEST:
+          beanProperties = getRequestBeanTypes((Class) cls);
+          break;
+        case RESPONSE:
+          beanProperties = getResponseBeanTypes((Class) cls);
+          break;
+        default:
+      }
 
       Optional.ofNullable(beanProperties)
-          .ifPresent(properties -> properties.forEach((name, type) ->
+          .ifPresent(properties -> properties.forEach(type ->
               {
                 if (type instanceof ParameterizedType) {
                   Type[] actualTypeArguments = ((ParameterizedType) 
type).getActualTypeArguments();
-                  Arrays.stream(actualTypeArguments).forEach(arg -> 
getSchema(arg, components));
+                  Arrays.stream(actualTypeArguments).forEach(arg -> 
getSchema(arg, components, requestResponse));
                 }
 
                 if (type instanceof Class) {
-                  getSchema(type, components);
+                  getSchema(type, components, requestResponse);
                 }
               })
           );
@@ -177,26 +186,54 @@ public class ModelConverter {
     return mapper;
   }
 
-  public static Map<String, Type> getBeanProperties(Class cls) {
+  public static List<Type> getRequestBeanTypes(Class cls) {
     if (cls.isPrimitive()) {
       return null;
     }
     Method[] declaredMethods = cls.getDeclaredMethods();
-    Map<String, Type> beanProperties = new HashMap<>();
+    List<Type> beanProperties = new ArrayList<>();
 
     for (Method method : declaredMethods) {
-      if (method.getName().startsWith("get")) {
-        if (method.getReturnType() != null && method.getReturnType() != 
void.class) {
-          String propName = method.getName().substring(3);
-          try {
-            cls.getDeclaredMethod("set" + propName, method.getReturnType());
-            beanProperties.put(method.getName(), 
method.getGenericReturnType());
-          } catch (NoSuchMethodException e) {
-            continue;
-          }
-        }
+
+      /**
+       * Meet the following requirements, can be considered a request bean 
property
+       * 1. method modifiers is public and non-static
+       * 2. method name should be setAbc or setABC, setabc is not a setter 
method
+       * 3. return value of method is void
+       * 4. method has only one parameter
+       */
+      if (Modifier.isPublic(method.getModifiers()) && 
!Modifier.isStatic(method.getModifiers()) && method.getName()
+          .startsWith("set") && method.getName().length() > 3 && 
Character.isUpperCase(method.getName().charAt(3))
+          && method.getReturnType()
+          .equals(Void.TYPE) && method.getParameterCount() == 1) {
+        beanProperties.add(method.getGenericParameterTypes()[0]);
       }
     }
     return beanProperties;
   }
+
+  public static List<Type> getResponseBeanTypes(Class cls) {
+    if (cls.isPrimitive()) {
+      return null;
+    }
+    Method[] declaredMethods = cls.getDeclaredMethods();
+    List<Type> beanPropertyTypes = new ArrayList<>();
+
+    for (Method method : declaredMethods) {
+      /**
+       * Meet the following requirements, can be considered a response bean 
property
+       * 1. method modifiers is public and non-static
+       * 2. method name should be getAbc or getABC, getabc is not a getter 
method
+       * 3. return value of method is not void
+       * 4. method has no parameters
+       */
+      if (Modifier.isPublic(method.getModifiers()) && 
!Modifier.isStatic(method.getModifiers()) && method.getName()
+          .startsWith("get") && method.getName().length() > 3 && 
Character.isUpperCase(method.getName().charAt(3))
+          && !method.getReturnType()
+          .equals(Void.TYPE) && method.getParameterCount() == 0) {
+        beanPropertyTypes.add(method.getGenericReturnType());
+      }
+    }
+    return beanPropertyTypes;
+  }
 }
diff --git 
a/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/RequestResponse.java
 
b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/RequestResponse.java
new file mode 100644
index 0000000..26da697
--- /dev/null
+++ 
b/oas-generator/oas-generator-core/src/main/java/org/apache/servicecomb/toolkit/generator/util/RequestResponse.java
@@ -0,0 +1,31 @@
+/*
+ * 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.toolkit.generator.util;
+
+public enum RequestResponse {
+
+  /**
+   * Mark a request
+   */
+  REQUEST,
+
+  /**
+   * Mark a response
+   */
+  RESPONSE
+}
diff --git 
a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
 
b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
index 6aab6b9..494703e 100644
--- 
a/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
+++ 
b/oas-generator/oas-generator-core/src/test/java/org/apache/servicecomb/toolkit/generator/UtilsTest.java
@@ -27,6 +27,7 @@ import java.util.List;
 import org.apache.servicecomb.toolkit.generator.annotation.ModelInterceptor;
 import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
 import org.apache.servicecomb.toolkit.generator.util.ParamUtils;
+import org.apache.servicecomb.toolkit.generator.util.RequestResponse;
 import org.apache.servicecomb.toolkit.generator.util.SwaggerAnnotationUtils;
 import org.junit.Assert;
 import org.junit.Test;
@@ -62,10 +63,10 @@ public class UtilsTest {
     Assert.assertEquals(ArraySchema.class, schema.getClass());
 
     Components components = new Components();
-    schema = ModelConverter.getSchema(ParameterClass[].class, components);
+    schema = ModelConverter.getSchema(ParameterClass[].class, components, 
null);
     Assert.assertEquals(ArraySchema.class, schema.getClass());
 
-    schema = ModelConverter.getSchema(ParameterClass.class, components);
+    schema = ModelConverter.getSchema(ParameterClass.class, components, null);
     Assert.assertNotNull(schema.get$ref());
 
     ModelInterceptor mockModelInterceptor = new ModelInterceptor() {
@@ -86,7 +87,7 @@ public class UtilsTest {
     ModelConverter.unRegisterInterceptor(mockModelInterceptor);
 
     Components component = new Components();
-    ModelConverter.getSchema(BeanClass.class, component);
+    ModelConverter.getSchema(BeanClass.class, component, 
RequestResponse.REQUEST);
     Assert.assertNotNull(component.getSchemas().get("Value"));
 
     Schema beanClass = component.getSchemas().get("BeanClass");
@@ -136,6 +137,21 @@ public class UtilsTest {
   }
 
   @Test
+  public void getRequestOrResponseBean() {
+
+    List<Type> requestBeanTypes = 
ModelConverter.getRequestBeanTypes(RequestBeanClass.class);
+    List<Type> responseBeanTypes = 
ModelConverter.getResponseBeanTypes(ResponseBeanClass.class);
+
+    Assert.assertNotNull(requestBeanTypes);
+    Assert.assertNotNull(responseBeanTypes);
+
+    Assert.assertEquals(1, requestBeanTypes.size());
+    Assert.assertEquals("Value", ((Class) 
requestBeanTypes.get(0)).getSimpleName());
+    Assert.assertEquals(1, responseBeanTypes.size());
+    Assert.assertEquals("Value", ((Class) 
responseBeanTypes.get(0)).getSimpleName());
+  }
+
+  @Test
   public void getContentFromAnnotation() {
     Content contents = Mockito.mock(Content.class);
     when(contents.encoding()).thenReturn(new Encoding[] 
{Mockito.mock(Encoding.class)});
@@ -145,6 +161,33 @@ public class UtilsTest {
     Assert.assertEquals(1, contentFromAnnotation.size());
   }
 
+  class RequestBeanClass {
+
+    public void setValue(Value value) {
+    }
+
+    public void setName(String name, String alias) {
+    }
+
+    public Integer getSomething() {
+      return 0;
+    }
+  }
+
+  class ResponseBeanClass {
+
+    public Value getValue() {
+      return new Value();
+    }
+
+    public String getName(String name) {
+      return name;
+    }
+
+    public void setSomething(Integer something) {
+    }
+  }
+
   class ParameterClass {
     public void method(String param) {
     }
diff --git 
a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
 
b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
index 753f84e..526b3c6 100644
--- 
a/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
+++ 
b/oas-generator/oas-generator-spring/src/main/java/org/apache/servicecomb/toolkit/generator/annotation/AbstractHttpMethodMappingAnnotationProcessor.java
@@ -24,6 +24,7 @@ import java.util.stream.Collectors;
 import org.apache.servicecomb.toolkit.generator.HttpStatuses;
 import org.apache.servicecomb.toolkit.generator.context.OperationContext;
 import org.apache.servicecomb.toolkit.generator.util.ModelConverter;
+import org.apache.servicecomb.toolkit.generator.util.RequestResponse;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMethod;
 
@@ -72,7 +73,8 @@ public abstract class 
AbstractHttpMethodMappingAnnotationProcessor<Annotation, C
       Content content = new Content();
       MediaType mediaType = new MediaType();
       Schema schema = ModelConverter
-          .getSchema(operationContext.getMethod().getReturnType(), 
operationContext.getComponents());
+          .getSchema(operationContext.getMethod().getReturnType(), 
operationContext.getComponents(),
+              RequestResponse.RESPONSE);
       mediaType.schema(schema);
       for (String produce : produceList) {
         content.addMediaType(produce, mediaType);

Reply via email to