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 <[email protected]> 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 "[email protected]" <[email protected]>.
