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 2018/01/20 06:01:45 UTC

[incubator-servicecomb-java-chassis] 06/10: SCB-266 optimize: if x-java-class have value but not exist, create dynamic class by x-java-class value, not use new generated name

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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit 112c7ade0619f9d119d3b7dc24901bae431e0c53
Author: wujimin <wu...@huawei.com>
AuthorDate: Sat Jan 20 03:05:58 2018 +0800

    SCB-266 optimize: if x-java-class have value but not exist, create dynamic class by x-java-class value, not use new generated name
---
 .../converter/model/ModelImplConverter.java        | 25 +++++++-
 .../swagger/generator/core/utils/ClassUtils.java   | 30 +++++++--
 .../converter/model/TestModelImplConverter.java    | 71 ++++++++++++++++++++++
 .../swagger/generator/core/TestClassUtils.java     | 60 ++++++++++++++++++
 4 files changed, 179 insertions(+), 7 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/ModelImplConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/ModelImplConverter.java
index 60f4234..d802005 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/ModelImplConverter.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/ModelImplConverter.java
@@ -19,7 +19,9 @@ package org.apache.servicecomb.swagger.converter.model;
 
 import org.apache.servicecomb.swagger.converter.ConverterMgr;
 import org.apache.servicecomb.swagger.converter.property.MapPropertyConverter;
+import org.apache.servicecomb.swagger.generator.core.SwaggerConst;
 import org.apache.servicecomb.swagger.generator.core.utils.ClassUtils;
+import org.springframework.util.StringUtils;
 
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
@@ -55,11 +57,28 @@ public class ModelImplConverter extends AbstractModelConverter {
       return TypeFactory.defaultInstance().constructType(Object.class);
     }
 
-    // 根据name、property动态生成class
+    return getOrCreateType(classLoader, packageName, swagger, modelImpl);
+  }
+
+  protected String getOrCreateClassName(String packageName, ModelImpl modelImpl) throws Error {
+    // dynamic create class by name and property
+    // try to use x-java-class first
+    // if not defined then use new class name
+    String canonical = ClassUtils.getVendorExtension(findVendorExtensions(modelImpl), SwaggerConst.EXT_JAVA_CLASS);
+    if (!StringUtils.isEmpty(canonical)) {
+      return canonical;
+    }
+
     if (packageName == null) {
-      throw new Error("packageName should not be null");
+      throw new IllegalStateException("packageName should not be null");
     }
-    String clsName = packageName + "." + modelImpl.getName();
+    return packageName + "." + modelImpl.getName();
+  }
+
+  protected JavaType getOrCreateType(ClassLoader classLoader, String packageName, Swagger swagger, ModelImpl modelImpl)
+      throws Error {
+    String clsName = getOrCreateClassName(packageName, modelImpl);
+    clsName = ClassUtils.correctClassName(clsName);
     Class<?> cls =
         ClassUtils.getOrCreateClass(classLoader, packageName, swagger, modelImpl.getProperties(), clsName);
     return TypeFactory.defaultInstance().constructType(cls);
diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ClassUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ClassUtils.java
index a7bd83e..f9a33f3 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ClassUtils.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ClassUtils.java
@@ -144,16 +144,38 @@ public final class ClassUtils {
 
   public static Class<?> getClassByVendorExtensions(ClassLoader classLoader, Map<String, Object> vendorExtensions,
       String clsKey) {
-    if (vendorExtensions == null) {
+    String clsName = getVendorExtension(vendorExtensions, clsKey);
+    if (StringUtils.isEmpty(clsName)) {
       return null;
     }
 
-    String clsName = (String) vendorExtensions.get(clsKey);
-    if (StringUtils.isEmpty(clsName)) {
+    return getClassByName(classLoader, clsName);
+  }
+
+  public static String getRawClassName(String canonical) {
+    if (StringUtils.isEmpty(canonical)) {
       return null;
     }
 
-    return getClassByName(classLoader, clsName);
+    int idx = canonical.indexOf("<");
+    if (idx == 0) {
+      throw new IllegalStateException("Invalid class canonical: " + canonical);
+    }
+
+    if (idx < 0) {
+      return canonical;
+    }
+
+    return canonical.substring(0, idx);
+  }
+
+  @SuppressWarnings("unchecked")
+  public static <T> T getVendorExtension(Map<String, Object> vendorExtensions, String key) {
+    if (vendorExtensions == null) {
+      return null;
+    }
+
+    return (T) vendorExtensions.get(key);
   }
 
   public static Class<?> getOrCreateInterface(SwaggerGenerator generator) {
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/converter/model/TestModelImplConverter.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/converter/model/TestModelImplConverter.java
new file mode 100644
index 0000000..cc82bbe
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/converter/model/TestModelImplConverter.java
@@ -0,0 +1,71 @@
+/*
+ * 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.converter.model;
+
+import org.apache.servicecomb.swagger.generator.core.SwaggerConst;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import com.fasterxml.jackson.databind.JavaType;
+
+import io.swagger.models.ModelImpl;
+import io.swagger.models.Swagger;
+import mockit.Mocked;
+
+public class TestModelImplConverter {
+  ModelImplConverter converter = new ModelImplConverter();
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  @Test
+  public void getOrCreateClassName_get() {
+    String canonical = "name";
+    ModelImpl model = new ModelImpl();
+    model.getVendorExtensions().put(SwaggerConst.EXT_JAVA_CLASS, canonical);
+    Assert.assertEquals(canonical,
+        converter.getOrCreateClassName(null, model));
+  }
+
+  @Test
+  public void getOrCreateClassName_create_packageNull() {
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage(Matchers.is("packageName should not be null"));
+
+    converter.getOrCreateClassName(null, new ModelImpl());
+  }
+
+  @Test
+  public void getOrCreateClassName_create() {
+    Assert.assertEquals("pkg.name", converter.getOrCreateClassName("pkg", new ModelImpl().name("name")));;
+  }
+
+  @Test
+  public void getOrCreateType(@Mocked Swagger swagger) {
+    String canonical = "name-";
+    ModelImpl model = new ModelImpl();
+    model.getVendorExtensions().put(SwaggerConst.EXT_JAVA_CLASS, canonical);
+
+    JavaType type = converter.getOrCreateType(new ClassLoader() {
+    }, null, swagger, model);
+
+    Assert.assertEquals("name_", type.getRawClass().getName());
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestClassUtils.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestClassUtils.java
index 389ae66..a23702c 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestClassUtils.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestClassUtils.java
@@ -22,6 +22,7 @@ import static org.hamcrest.core.Is.is;
 
 import java.lang.reflect.Method;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -33,8 +34,11 @@ import org.apache.servicecomb.common.javassist.JavassistUtils;
 import org.apache.servicecomb.swagger.generator.core.schema.User;
 import org.apache.servicecomb.swagger.generator.core.unittest.UnitTestSwaggerUtils;
 import org.apache.servicecomb.swagger.generator.core.utils.ClassUtils;
+import org.hamcrest.Matchers;
 import org.junit.Assert;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 import org.mockito.Mockito;
 
 import io.swagger.annotations.SwaggerDefinition;
@@ -107,6 +111,12 @@ public class TestClassUtils {
         "while"));
   }
 
+  ClassLoader classLoader = new ClassLoader() {
+  };
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
   @Test
   public void testHasAnnotation() {
     Assert.assertEquals(true, ClassUtils.hasAnnotation(TestClassUtils.class, SwaggerDefinition.class));
@@ -210,4 +220,54 @@ public class TestClassUtils {
     Class<?> result = ClassUtils.getOrCreateClass(classLoader, "", new Swagger(), null, className);
     Assert.assertEquals(this.getClass(), result);
   }
+
+  @Test
+  public void getClassByVendorExtensions_noName() {
+    Map<String, Object> vendorExtensions = new HashMap<>();
+
+    Assert
+        .assertNull(ClassUtils.getClassByVendorExtensions(classLoader, vendorExtensions, SwaggerConst.EXT_JAVA_CLASS));
+  }
+
+  @Test
+  public void getClassByVendorExtensions_notExist() {
+    Map<String, Object> vendorExtensions = new HashMap<>();
+    vendorExtensions.put(SwaggerConst.EXT_JAVA_CLASS, "-" + String.class.getName());
+
+    Assert
+        .assertNull(ClassUtils.getClassByVendorExtensions(classLoader, vendorExtensions, SwaggerConst.EXT_JAVA_CLASS));
+  }
+
+  @Test
+  public void getClassByVendorExtensions_normal() {
+    Map<String, Object> vendorExtensions = new HashMap<>();
+    vendorExtensions.put(SwaggerConst.EXT_JAVA_CLASS, String.class.getName());
+
+    Assert.assertSame(String.class,
+        ClassUtils.getClassByVendorExtensions(classLoader, vendorExtensions, SwaggerConst.EXT_JAVA_CLASS));
+  }
+
+  @Test
+  public void getRawClassName_empty() {
+    Assert.assertNull(ClassUtils.getRawClassName(null));
+    Assert.assertNull(ClassUtils.getRawClassName(""));
+  }
+
+  @Test
+  public void getRawClassName_normal() {
+    Assert.assertEquals(String.class.getName(), ClassUtils.getRawClassName(String.class.getName()));
+  }
+
+  @Test
+  public void getRawClassName_generic() {
+    Assert.assertEquals("abc", ClassUtils.getRawClassName("abc<d>"));
+  }
+
+  @Test
+  public void getRawClassName_invalid() {
+    expectedException.expect(IllegalStateException.class);
+    expectedException.expectMessage(Matchers.is("Invalid class canonical: <abc>"));
+
+    ClassUtils.getRawClassName("<abc>");
+  }
 }

-- 
To stop receiving notification emails like this one, please contact
"commits@servicecomb.apache.org" <co...@servicecomb.apache.org>.