This is an automated email from the ASF dual-hosted git repository. wujimin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git
commit 1658ab17d6ae6a2d58d084dd2c64a31783657639 Author: wujimin <wuji...@huawei.com> AuthorDate: Fri May 4 16:39:03 2018 +0800 [SCB-538][WIP] swagger generator core switch to use SwaggerToClassGenerator --- .../swagger/converter/AbstractConverter.java | 17 +-- .../servicecomb/swagger/converter/Converter.java | 4 +- .../swagger/converter/ConverterMgr.java | 24 +--- .../converter/model/ArrayModelConverter.java | 10 +- .../converter/model/ModelImplConverter.java | 63 +++++----- .../swagger/converter/model/RefModelConverter.java | 9 +- .../AbstractSerializableParameterConverter.java | 12 +- .../parameter/BodyParameterConverter.java | 7 +- .../converter/property/ArrayPropertyConverter.java | 15 +-- .../converter/property/MapPropertyConverter.java | 17 ++- .../property/ObjectPropertyConverter.java | 6 +- .../converter/property/RefPropertyConverter.java | 9 +- .../property/StringPropertyConverter.java | 14 +-- .../core/unittest/UnitTestSwaggerUtils.java | 5 + .../swagger/generator/core/utils/ClassUtils.java | 131 +++----------------- .../parameter/PendingBodyParameterConverter.java | 8 +- .../swagger/converter/TestAbstractConverter.java | 13 +- .../converter/model/TestModelImplConverter.java | 98 +++++++++++---- .../swagger/generator/core/ClassUtilsForTest.java | 73 +++++++++++ .../generator/core/TestApiImplicitParams.java | 3 +- .../swagger/generator/core/TestApiResponse.java | 13 +- .../swagger/generator/core/TestArrayType.java | 3 +- .../swagger/generator/core/TestClassUtils.java | 133 +++++++++++---------- .../swagger/generator/core/TestProperty.java | 7 +- .../swagger/generator/core/TestSwaggerUtils.java | 42 +------ 25 files changed, 346 insertions(+), 390 deletions(-) diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/AbstractConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/AbstractConverter.java index aca0295..f23f8da 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/AbstractConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/AbstractConverter.java @@ -19,7 +19,6 @@ package org.apache.servicecomb.swagger.converter; import java.util.Map; -import org.apache.servicecomb.swagger.generator.core.SwaggerConst; import org.apache.servicecomb.swagger.generator.core.utils.ClassUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,25 +27,21 @@ import org.springframework.util.StringUtils; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; -import io.swagger.models.Swagger; - public abstract class AbstractConverter implements Converter { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractConverter.class); protected abstract Map<String, Object> findVendorExtensions(Object def); - protected abstract JavaType doConvert(ClassLoader classLoader, String packageName, Swagger swagger, Object def); + protected abstract JavaType doConvert(SwaggerToClassGenerator swaggerToClassGenerator, Object def); @Override - public JavaType convert(ClassLoader classLoader, String packageName, Swagger swagger, Object def) { - TypeFactory typeFactory = TypeFactory - .defaultInstance() - .withClassLoader(classLoader); + public JavaType convert(SwaggerToClassGenerator swaggerToClassGenerator, Object def) { + TypeFactory typeFactory = swaggerToClassGenerator.getTypeFactory(); Map<String, Object> vendorExtensions = findVendorExtensions(def); - String canonical = ClassUtils.getVendorExtension(vendorExtensions, SwaggerConst.EXT_JAVA_CLASS); + String canonical = ClassUtils.getClassName(vendorExtensions); if (!StringUtils.isEmpty(canonical)) { - Class<?> clsResult = ClassUtils.getClassByName(classLoader, canonical); + Class<?> clsResult = ClassUtils.getClassByName(swaggerToClassGenerator.getClassLoader(), canonical); if (clsResult != null) { return typeFactory.constructType(clsResult); } @@ -54,7 +49,7 @@ public abstract class AbstractConverter implements Converter { // ensure all depend model exist // maybe create dynamic class by canonical - JavaType result = doConvert(classLoader, packageName, swagger, def); + JavaType result = doConvert(swaggerToClassGenerator, def); String rawClassName = ClassUtils.getRawClassName(canonical); if (StringUtils.isEmpty(rawClassName)) { diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/Converter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/Converter.java index d2e5af9..8a07c56 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/Converter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/Converter.java @@ -19,10 +19,8 @@ package org.apache.servicecomb.swagger.converter; import com.fasterxml.jackson.databind.JavaType; -import io.swagger.models.Swagger; - public interface Converter { // def可能是property或model // def不可能为null - JavaType convert(ClassLoader classLoader, String packageName, Swagger swagger, Object def); + JavaType convert(SwaggerToClassGenerator swaggerToClassGenerator, Object def); } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/ConverterMgr.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/ConverterMgr.java index 672693a..a70907e 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/ConverterMgr.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/ConverterMgr.java @@ -38,17 +38,14 @@ import org.apache.servicecomb.swagger.converter.property.RefPropertyConverter; import org.apache.servicecomb.swagger.converter.property.StringPropertyConverter; import org.apache.servicecomb.swagger.extend.property.ByteProperty; import org.apache.servicecomb.swagger.extend.property.ShortProperty; -import org.apache.servicecomb.swagger.generator.core.SwaggerGenerator; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.SimpleType; import com.fasterxml.jackson.databind.type.TypeFactory; import io.swagger.models.ArrayModel; -import io.swagger.models.Model; import io.swagger.models.ModelImpl; import io.swagger.models.RefModel; -import io.swagger.models.Swagger; import io.swagger.models.parameters.BodyParameter; import io.swagger.models.parameters.CookieParameter; import io.swagger.models.parameters.FormParameter; @@ -167,7 +164,7 @@ public final class ConverterMgr { throw new Error("not support inner property class: " + propertyCls.getName()); } - converterMap.put(propertyCls, (classLoader, packageName, swagger, def) -> javaType); + converterMap.put(propertyCls, (context, def) -> javaType); } public static void addConverter(Class<?> cls, Converter converter) { @@ -179,16 +176,9 @@ public final class ConverterMgr { return TYPE_FORMAT_MAP.get(key); } - public static JavaType findJavaType(SwaggerGenerator generator, Object def) { - return findJavaType(generator.getClassLoader(), - generator.ensureGetPackageName(), - generator.getSwagger(), - def); - } - // def为null是void的场景 // def可能是model、property、parameter - public static JavaType findJavaType(ClassLoader classLoader, String packageName, Swagger swagger, Object def) { + public static JavaType findJavaType(SwaggerToClassGenerator swaggerToClassGenerator, Object def) { if (def == null) { return VOID_JAVA_TYPE; } @@ -197,14 +187,6 @@ public final class ConverterMgr { throw new Error("not support def type: " + def.getClass()); } - return converter.convert(classLoader, packageName, swagger, def); - } - - public static JavaType findByRef(ClassLoader classLoader, String packageName, Swagger swagger, String refName) { - Model ref = swagger.getDefinitions().get(refName); - if (ModelImpl.class.isInstance(ref) && ((ModelImpl) ref).getName() == null) { - ((ModelImpl) ref).setName(refName); - } - return findJavaType(classLoader, packageName, swagger, ref); + return converter.convert(swaggerToClassGenerator, def); } } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/ArrayModelConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/ArrayModelConverter.java index 38a0321..dca3ca8 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/ArrayModelConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/ArrayModelConverter.java @@ -17,24 +17,20 @@ package org.apache.servicecomb.swagger.converter.model; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import org.apache.servicecomb.swagger.converter.property.ArrayPropertyConverter; import com.fasterxml.jackson.databind.JavaType; import io.swagger.models.ArrayModel; -import io.swagger.models.Swagger; public class ArrayModelConverter extends AbstractModelConverter { @Override - public JavaType doConvert(ClassLoader classLoader, String packageName, Swagger swagger, Object model) { + public JavaType doConvert(SwaggerToClassGenerator swaggerToClassGenerator, Object model) { ArrayModel arrayModel = (ArrayModel) model; if (arrayModel.getItems() != null) { - return ArrayPropertyConverter.findJavaType(classLoader, - packageName, - swagger, - arrayModel.getItems(), - false); + return ArrayPropertyConverter.findJavaType(swaggerToClassGenerator, arrayModel.getItems(), false); } // don't know when will this happen. 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 d802005..827c07b 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 @@ -17,22 +17,26 @@ package org.apache.servicecomb.swagger.converter.model; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.servicecomb.common.javassist.ClassConfig; +import org.apache.servicecomb.common.javassist.JavassistUtils; import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; 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; import io.swagger.models.ModelImpl; -import io.swagger.models.Swagger; import io.swagger.models.properties.ObjectProperty; +import io.swagger.models.properties.Property; public class ModelImplConverter extends AbstractModelConverter { @Override - public JavaType doConvert(ClassLoader classLoader, String packageName, Swagger swagger, Object model) { + public JavaType doConvert(SwaggerToClassGenerator swaggerToClassGenerator, Object model) { ModelImpl modelImpl = (ModelImpl) model; JavaType javaType = ConverterMgr.findJavaType(modelImpl.getType(), modelImpl.getFormat()); @@ -41,14 +45,11 @@ public class ModelImplConverter extends AbstractModelConverter { } if (modelImpl.getReference() != null) { - return ConverterMgr.findByRef(classLoader, packageName, swagger, modelImpl.getReference()); + return swaggerToClassGenerator.convertRef(modelImpl.getReference()); } if (modelImpl.getAdditionalProperties() != null) { - return MapPropertyConverter.findJavaType(classLoader, - packageName, - swagger, - modelImpl.getAdditionalProperties()); + return MapPropertyConverter.findJavaType(swaggerToClassGenerator, modelImpl.getAdditionalProperties()); } if (ObjectProperty.TYPE.equals(modelImpl.getType()) @@ -57,30 +58,36 @@ public class ModelImplConverter extends AbstractModelConverter { return TypeFactory.defaultInstance().constructType(Object.class); } - return getOrCreateType(classLoader, packageName, swagger, modelImpl); + return getOrCreateType(swaggerToClassGenerator, modelImpl); + } + + protected JavaType getOrCreateType(SwaggerToClassGenerator swaggerToClassGenerator, ModelImpl modelImpl) { + String clsName = ClassUtils.getClassName(findVendorExtensions(modelImpl)); + clsName = ClassUtils.correctClassName(clsName); + + Class<?> cls = getOrCreateClass(swaggerToClassGenerator, modelImpl.getProperties(), clsName); + return TypeFactory.defaultInstance().constructType(cls); } - 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; + protected Class<?> getOrCreateClass(SwaggerToClassGenerator swaggerToClassGenerator, + Map<String, Property> properties, + String clsName) { + Class<?> cls = ClassUtils.getClassByName(swaggerToClassGenerator.getClassLoader(), clsName); + if (cls != null) { + return cls; } - if (packageName == null) { - throw new IllegalStateException("packageName should not be null"); + ClassConfig classConfig = new ClassConfig(); + classConfig.setClassName(clsName); + + if (null != properties) { + for (Entry<String, Property> entry : properties.entrySet()) { + JavaType propertyJavaType = swaggerToClassGenerator.convert(entry.getValue()); + classConfig.addField(entry.getKey(), propertyJavaType); + } } - 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); + cls = JavassistUtils.createClass(swaggerToClassGenerator.getClassLoader(), classConfig); + return cls; } } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/RefModelConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/RefModelConverter.java index fd38b44..f646cbc 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/RefModelConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/model/RefModelConverter.java @@ -17,18 +17,15 @@ package org.apache.servicecomb.swagger.converter.model; -import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import com.fasterxml.jackson.databind.JavaType; import io.swagger.models.RefModel; -import io.swagger.models.Swagger; public class RefModelConverter extends AbstractModelConverter { @Override - public JavaType doConvert(ClassLoader classLoader, String packageName, Swagger swagger, Object model) { - RefModel refModel = (RefModel) model; - - return ConverterMgr.findByRef(classLoader, packageName, swagger, refModel.getSimpleRef()); + public JavaType doConvert(SwaggerToClassGenerator swaggerToClassGenerator, Object refModel) { + return swaggerToClassGenerator.convertRef(((RefModel) refModel).getSimpleRef()); } } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/parameter/AbstractSerializableParameterConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/parameter/AbstractSerializableParameterConverter.java index a9bf303..7573e4a 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/parameter/AbstractSerializableParameterConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/parameter/AbstractSerializableParameterConverter.java @@ -19,12 +19,12 @@ package org.apache.servicecomb.swagger.converter.parameter; import org.apache.servicecomb.swagger.converter.Converter; import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import org.apache.servicecomb.swagger.converter.property.ArrayPropertyConverter; import org.apache.servicecomb.swagger.converter.property.StringPropertyConverter; import com.fasterxml.jackson.databind.JavaType; -import io.swagger.models.Swagger; import io.swagger.models.parameters.AbstractSerializableParameter; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.StringProperty; @@ -32,20 +32,16 @@ import io.swagger.models.properties.StringProperty; public class AbstractSerializableParameterConverter implements Converter { @Override - public JavaType convert(ClassLoader classLoader, String packageName, Swagger swagger, Object def) { + public JavaType convert(SwaggerToClassGenerator swaggerToClassGenerator, Object def) { AbstractSerializableParameter<?> param = (AbstractSerializableParameter<?>) def; switch (param.getType()) { case ArrayProperty.TYPE: - return ArrayPropertyConverter.findJavaType(classLoader, - packageName, - swagger, + return ArrayPropertyConverter.findJavaType(swaggerToClassGenerator, param.getItems(), param.isUniqueItems()); case StringProperty.TYPE: - return StringPropertyConverter.findJavaType(classLoader, - packageName, - swagger, + return StringPropertyConverter.findJavaType(swaggerToClassGenerator, param.getType(), param.getFormat(), param.getEnum()); diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/parameter/BodyParameterConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/parameter/BodyParameterConverter.java index ba16eeb..909ead8 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/parameter/BodyParameterConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/parameter/BodyParameterConverter.java @@ -18,18 +18,17 @@ package org.apache.servicecomb.swagger.converter.parameter; import org.apache.servicecomb.swagger.converter.Converter; -import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import com.fasterxml.jackson.databind.JavaType; -import io.swagger.models.Swagger; import io.swagger.models.parameters.BodyParameter; public class BodyParameterConverter implements Converter { @Override - public JavaType convert(ClassLoader classLoader, String packageName, Swagger swagger, Object def) { + public JavaType convert(SwaggerToClassGenerator swaggerToClassGenerator, Object def) { BodyParameter param = (BodyParameter) def; - return ConverterMgr.findJavaType(classLoader, packageName, swagger, param.getSchema()); + return swaggerToClassGenerator.convert(param.getSchema()); } } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/ArrayPropertyConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/ArrayPropertyConverter.java index ef29297..fb0631c 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/ArrayPropertyConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/ArrayPropertyConverter.java @@ -21,20 +21,19 @@ import java.util.Collection; import java.util.List; import java.util.Set; -import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; -import io.swagger.models.Swagger; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.Property; public class ArrayPropertyConverter extends AbstractPropertyConverter { - public static JavaType findJavaType(ClassLoader classLoader, String packageName, Swagger swagger, + public static JavaType findJavaType(SwaggerToClassGenerator swaggerToClassGenerator, Property itemProperty, Boolean uniqueItems) { - JavaType itemJavaType = ConverterMgr.findJavaType(classLoader, packageName, swagger, itemProperty); + JavaType itemJavaType = swaggerToClassGenerator.convert(itemProperty); @SuppressWarnings("rawtypes") Class<? extends Collection> collectionClass = List.class; @@ -45,13 +44,9 @@ public class ArrayPropertyConverter extends AbstractPropertyConverter { } @Override - public JavaType doConvert(ClassLoader classLoader, String packageName, Swagger swagger, Object property) { + public JavaType doConvert(SwaggerToClassGenerator swaggerToClassGenerator, Object property) { ArrayProperty arrayProperty = (ArrayProperty) property; - return findJavaType(classLoader, - packageName, - swagger, - arrayProperty.getItems(), - arrayProperty.getUniqueItems()); + return findJavaType(swaggerToClassGenerator, arrayProperty.getItems(), arrayProperty.getUniqueItems()); } } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/MapPropertyConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/MapPropertyConverter.java index f48cc0b..490fbb6 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/MapPropertyConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/MapPropertyConverter.java @@ -19,29 +19,26 @@ package org.apache.servicecomb.swagger.converter.property; import java.util.Map; -import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.type.TypeFactory; -import io.swagger.models.Swagger; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; public class MapPropertyConverter extends AbstractPropertyConverter { @Override - public JavaType doConvert(ClassLoader classLoader, String packageName, Swagger swagger, Object property) { + public JavaType doConvert(SwaggerToClassGenerator swaggerToClassGenerator, Object property) { MapProperty mapProperty = (MapProperty) property; Property valueProperty = mapProperty.getAdditionalProperties(); - return findJavaType(classLoader, packageName, swagger, valueProperty); + return findJavaType(swaggerToClassGenerator, valueProperty); } - public static JavaType findJavaType(ClassLoader classLoader, String packageName, Swagger swagger, - Property valueProperty) { - JavaType valueJavaType = ConverterMgr.findJavaType(classLoader, packageName, swagger, valueProperty); + public static JavaType findJavaType(SwaggerToClassGenerator swaggerToClassGenerator, Property valueProperty) { + JavaType valueJavaType = swaggerToClassGenerator.convert(valueProperty); - return TypeFactory.defaultInstance().constructMapType(Map.class, - TypeFactory.defaultInstance().constructType(String.class), + return swaggerToClassGenerator.getTypeFactory().constructMapType(Map.class, + swaggerToClassGenerator.getTypeFactory().constructType(String.class), valueJavaType); } } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/ObjectPropertyConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/ObjectPropertyConverter.java index c35e0f6..5de6695 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/ObjectPropertyConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/ObjectPropertyConverter.java @@ -17,16 +17,14 @@ package org.apache.servicecomb.swagger.converter.property; import org.apache.servicecomb.swagger.converter.Converter; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; -import io.swagger.models.Swagger; - public class ObjectPropertyConverter implements Converter { @Override - public JavaType convert(ClassLoader classLoader, String packageName, Swagger swagger, Object def) { + public JavaType convert(SwaggerToClassGenerator swaggerToClassGenerator, Object def) { return TypeFactory.defaultInstance().constructType(Object.class); } - } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/RefPropertyConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/RefPropertyConverter.java index 9fe7b0e..395bc03 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/RefPropertyConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/RefPropertyConverter.java @@ -17,18 +17,15 @@ package org.apache.servicecomb.swagger.converter.property; -import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import com.fasterxml.jackson.databind.JavaType; -import io.swagger.models.Swagger; import io.swagger.models.properties.RefProperty; public class RefPropertyConverter extends AbstractPropertyConverter { @Override - public JavaType doConvert(ClassLoader classLoader, String packageName, Swagger swagger, Object property) { - RefProperty refProperty = (RefProperty) property; - - return ConverterMgr.findByRef(classLoader, packageName, swagger, refProperty.getSimpleRef()); + public JavaType doConvert(SwaggerToClassGenerator swaggerToClassGenerator, Object refProperty) { + return swaggerToClassGenerator.convertRef(((RefProperty) refProperty).getSimpleRef()); } } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/StringPropertyConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/StringPropertyConverter.java index b34272c..895a28e 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/StringPropertyConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/converter/property/StringPropertyConverter.java @@ -21,22 +21,24 @@ import java.util.List; import org.apache.servicecomb.common.javassist.JavassistUtils; import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; -import io.swagger.models.Swagger; import io.swagger.models.properties.StringProperty; public class StringPropertyConverter extends AbstractPropertyConverter { - public static JavaType findJavaType(ClassLoader classLoader, String packageName, Swagger swagger, String type, + public static JavaType findJavaType(SwaggerToClassGenerator swaggerToClassGenerator, String type, String format, List<String> enums) { if (!isEnum(enums)) { return ConverterMgr.findJavaType(type, format); } // enum,且需要动态生成class - Class<?> enumCls = JavassistUtils.getOrCreateEnumWithPackageName(classLoader, packageName, enums); + Class<?> enumCls = JavassistUtils + .getOrCreateEnumWithPackageName(swaggerToClassGenerator.getClassLoader(), + swaggerToClassGenerator.getPackageName(), enums); return TypeFactory.defaultInstance().constructType(enumCls); } @@ -49,13 +51,11 @@ public class StringPropertyConverter extends AbstractPropertyConverter { } @Override - public JavaType doConvert(ClassLoader classLoader, String packageName, Swagger swagger, Object property) { + public JavaType doConvert(SwaggerToClassGenerator swaggerToClassGenerator, Object property) { StringProperty stringProperty = (StringProperty) property; List<String> enums = stringProperty.getEnum(); - return findJavaType(classLoader, - packageName, - swagger, + return findJavaType(swaggerToClassGenerator, stringProperty.getType(), stringProperty.getFormat(), enums); diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/unittest/UnitTestSwaggerUtils.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/unittest/UnitTestSwaggerUtils.java index e0eadfb..2829a64 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/unittest/UnitTestSwaggerUtils.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/unittest/UnitTestSwaggerUtils.java @@ -41,8 +41,13 @@ public final class UnitTestSwaggerUtils { } public static SwaggerGenerator generateSwagger(Class<?> cls) { + return generateSwagger(Thread.currentThread().getContextClassLoader(), cls); + } + + public static SwaggerGenerator generateSwagger(ClassLoader classLoader, Class<?> cls) { SwaggerGeneratorContext context = compositeContext.selectContext(cls); SwaggerGenerator generator = new SwaggerGenerator(context, cls); + generator.setClassLoader(classLoader); generator.generate(); return generator; 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 20da1ec..57fa030 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 @@ -21,14 +21,13 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import javax.lang.model.SourceVersion; import org.apache.servicecomb.common.javassist.ClassConfig; import org.apache.servicecomb.common.javassist.JavassistUtils; -import org.apache.servicecomb.common.javassist.MethodConfig; import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import org.apache.servicecomb.swagger.generator.core.OperationGenerator; import org.apache.servicecomb.swagger.generator.core.SwaggerConst; import org.apache.servicecomb.swagger.generator.core.SwaggerGenerator; @@ -36,13 +35,8 @@ import org.springframework.util.StringUtils; import com.fasterxml.jackson.databind.JavaType; -import io.swagger.models.Operation; -import io.swagger.models.Path; -import io.swagger.models.Response; -import io.swagger.models.Swagger; import io.swagger.models.parameters.BodyParameter; import io.swagger.models.parameters.Parameter; -import io.swagger.models.properties.Property; public final class ClassUtils { private ClassUtils() { @@ -59,33 +53,6 @@ public final class ClassUtils { } } - // 获取modelImpl对应的class - public static Class<?> getOrCreateClass(ClassLoader classLoader, String packageName, Swagger swagger, - Map<String, Property> properties, - String clsName) { - Class<?> cls = getClassByName(classLoader, clsName); - if (cls != null) { - return cls; - } - - ClassConfig classConfig = new ClassConfig(); - classConfig.setClassName(clsName); - - if (null != properties) { - for (Entry<String, Property> entry : properties.entrySet()) { - JavaType propertyJavaType = - ConverterMgr.findJavaType(classLoader, - packageName, - swagger, - entry.getValue()); - classConfig.addField(entry.getKey(), propertyJavaType); - } - } - - cls = JavassistUtils.createClass(classLoader, classConfig); - return cls; - } - // 将一系列body parameter包装成一个class public static Class<?> getOrCreateBodyClass(OperationGenerator operationGenerator, List<BodyParameter> bodyParameters) { @@ -102,11 +69,10 @@ public final class ClassUtils { // 1.全是预备body // 2.预备body与明确body混合 + SwaggerToClassGenerator classGenerator = new SwaggerToClassGenerator(swaggerGenerator.getClassLoader(), + swaggerGenerator.getSwagger(), swaggerGenerator.ensureGetPackageName()); for (BodyParameter bp : bodyParameters) { - JavaType javaType = ConverterMgr.findJavaType(swaggerGenerator.getClassLoader(), - swaggerGenerator.ensureGetPackageName(), - swaggerGenerator.getSwagger(), - bp); + JavaType javaType = ConverterMgr.findJavaType(classGenerator, bp); classConfig.addField(bp.getName(), javaType); } @@ -135,18 +101,12 @@ public final class ClassUtils { return false; } - public static Class<?> getJavaInterface(Swagger swagger) { - return getClassByVendorExtensions(null, swagger.getInfo().getVendorExtensions(), SwaggerConst.EXT_JAVA_INTF); + public static String getClassName(Map<String, Object> vendorExtensions) { + return getVendorExtension(vendorExtensions, SwaggerConst.EXT_JAVA_CLASS); } - public static Class<?> getClassByVendorExtensions(ClassLoader classLoader, Map<String, Object> vendorExtensions, - String clsKey) { - String clsName = getVendorExtension(vendorExtensions, clsKey); - if (StringUtils.isEmpty(clsName)) { - return null; - } - - return getClassByName(classLoader, clsName); + public static String getInterfaceName(Map<String, Object> vendorExtensions) { + return getVendorExtension(vendorExtensions, SwaggerConst.EXT_JAVA_INTF); } public static String getRawClassName(String canonical) { @@ -175,81 +135,20 @@ public final class ClassUtils { return (T) vendorExtensions.get(key); } - public static Class<?> getOrCreateInterface(SwaggerGenerator generator) { - return getOrCreateInterface(generator.getSwagger(), - generator.getClassLoader(), - generator.ensureGetPackageName()); - } - - public static Class<?> getOrCreateInterface(Swagger swagger, ClassLoader classLoader, String packageName) { - String intfName = - (String) swagger.getInfo().getVendorExtensions().get(SwaggerConst.EXT_JAVA_INTF); - Class<?> intf = getClassByName(classLoader, intfName); - if (intf != null) { - return intf; - } - - if (packageName == null) { - int idx = intfName.lastIndexOf("."); - if (idx == -1) { - packageName = ""; - } else { - packageName = intfName.substring(0, idx); - } - } - return createInterface(swagger, classLoader, packageName, intfName); - } - - private static Class<?> createInterface(Swagger swagger, ClassLoader classLoader, String packageName, - String intfName) { - ClassConfig classConfig = new ClassConfig(); - classConfig.setClassName(intfName); - classConfig.setIntf(true); - - for (Path path : swagger.getPaths().values()) { - for (Operation operation : path.getOperations()) { - // 参数可能重名,所以packageName必须跟operation相关才能隔离 - String opPackageName = packageName + "." + operation.getOperationId(); - - Response result = operation.getResponses().get(SwaggerConst.SUCCESS_KEY); - JavaType resultJavaType = ConverterMgr.findJavaType(classLoader, - opPackageName, - swagger, - result.getSchema()); - - MethodConfig methodConfig = new MethodConfig(); - methodConfig.setName(operation.getOperationId()); - methodConfig.setResult(resultJavaType); - - for (Parameter parameter : operation.getParameters()) { - String paramName = parameter.getName(); - paramName = correctMethodParameterName(paramName); - - JavaType paramJavaType = ConverterMgr.findJavaType(classLoader, - opPackageName, - swagger, - parameter); - methodConfig.addParameter(paramName, paramJavaType); - } - - classConfig.addMethod(methodConfig); - } - } - - return JavassistUtils.createClass(classLoader, classConfig); - } - public static String correctMethodParameterName(String paramName) { if (SourceVersion.isName(paramName)) { return paramName; } - StringBuffer newParam = new StringBuffer(); - char tempChar; + + StringBuilder newParam = new StringBuilder(); for (int index = 0; index < paramName.length(); index++) { - tempChar = paramName.charAt(index); + char tempChar = paramName.charAt(index); if (Character.isJavaIdentifierPart(tempChar)) { newParam.append(paramName.charAt(index)); - } else if (tempChar == '.' || tempChar == '-') { + continue; + } + + if (tempChar == '.' || tempChar == '-') { newParam.append('_'); } } diff --git a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/converter/parameter/PendingBodyParameterConverter.java b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/converter/parameter/PendingBodyParameterConverter.java index 0319736..6a594f8 100644 --- a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/converter/parameter/PendingBodyParameterConverter.java +++ b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/pojo/converter/parameter/PendingBodyParameterConverter.java @@ -18,18 +18,16 @@ package org.apache.servicecomb.swagger.generator.pojo.converter.parameter; import org.apache.servicecomb.swagger.converter.Converter; -import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import org.apache.servicecomb.swagger.generator.pojo.extend.parameter.PendingBodyParameter; import com.fasterxml.jackson.databind.JavaType; -import io.swagger.models.Swagger; - public class PendingBodyParameterConverter implements Converter { @Override - public JavaType convert(ClassLoader classLoader, String packageName, Swagger swagger, Object def) { + public JavaType convert(SwaggerToClassGenerator swaggerToClassGenerator, Object def) { PendingBodyParameter param = (PendingBodyParameter) def; - return ConverterMgr.findJavaType(classLoader, packageName, swagger, param.getProperty()); + return swaggerToClassGenerator.convert(param.getProperty()); } } diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/converter/TestAbstractConverter.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/converter/TestAbstractConverter.java index 98ac8eb..bd36393 100644 --- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/converter/TestAbstractConverter.java +++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/converter/TestAbstractConverter.java @@ -27,7 +27,6 @@ import org.junit.Test; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; -import io.swagger.models.Swagger; import mockit.Mocked; public class TestAbstractConverter { @@ -38,6 +37,8 @@ public class TestAbstractConverter { ClassLoader classLoader = new ClassLoader() { }; + SwaggerToClassGenerator swaggerToClassGenerator = new SwaggerToClassGenerator(classLoader, null, null); + AbstractConverter converter = new AbstractConverter() { @Override protected Map<String, Object> findVendorExtensions(Object def) { @@ -45,7 +46,7 @@ public class TestAbstractConverter { } @Override - protected JavaType doConvert(ClassLoader classLoader, String packageName, Swagger swagger, Object def) { + protected JavaType doConvert(SwaggerToClassGenerator swaggerToClassGenerator, Object def) { return doConvertResult; } }; @@ -55,14 +56,14 @@ public class TestAbstractConverter { doConvertResult = TypeFactory.defaultInstance().constructType(String.class); vendorExtensions.put(SwaggerConst.EXT_JAVA_CLASS, "java.lang.String"); - Assert.assertSame(doConvertResult, converter.convert(classLoader, null, null, null)); + Assert.assertSame(doConvertResult, converter.convert(swaggerToClassGenerator, null)); } @Test public void convert_noCanonical(@Mocked JavaType type) { doConvertResult = type; - Assert.assertSame(type, converter.convert(classLoader, null, null, null)); + Assert.assertSame(type, converter.convert(swaggerToClassGenerator, null)); } @Test @@ -70,7 +71,7 @@ public class TestAbstractConverter { doConvertResult = TypeFactory.defaultInstance().constructParametricType(Optional.class, String.class); vendorExtensions.put(SwaggerConst.EXT_JAVA_CLASS, "java.util.Optional<java.lang.String>"); - Assert.assertSame(doConvertResult, converter.convert(classLoader, null, null, null)); + Assert.assertSame(doConvertResult, converter.convert(swaggerToClassGenerator, null)); } @Test @@ -78,6 +79,6 @@ public class TestAbstractConverter { doConvertResult = TypeFactory.defaultInstance().constructType(String.class); vendorExtensions.put(SwaggerConst.EXT_JAVA_CLASS, "xxx<java.lang.String>"); - Assert.assertSame(doConvertResult, converter.convert(classLoader, null, null, null)); + Assert.assertSame(doConvertResult, converter.convert(swaggerToClassGenerator, null)); } } 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 index 115f83b..c0ced84 100644 --- 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 @@ -16,8 +16,11 @@ */ package org.apache.servicecomb.swagger.converter.model; +import java.util.Map; + +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import org.apache.servicecomb.swagger.generator.core.SwaggerConst; -import org.hamcrest.Matchers; +import org.apache.servicecomb.swagger.generator.core.utils.ParamUtils; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; @@ -25,47 +28,100 @@ import org.junit.rules.ExpectedException; import com.fasterxml.jackson.databind.JavaType; +import io.swagger.models.Model; import io.swagger.models.ModelImpl; import io.swagger.models.Swagger; -import mockit.Mocked; +import io.swagger.models.parameters.BodyParameter; +import io.swagger.models.properties.IntegerProperty; +import io.swagger.models.properties.StringProperty; public class TestModelImplConverter { - ModelImplConverter converter = new ModelImplConverter(); - @Rule public ExpectedException expectedException = ExpectedException.none(); + Swagger swagger = new Swagger(); + + ClassLoader classLoader = new ClassLoader() { + }; + + SwaggerToClassGenerator swaggerToClassGenerator = new SwaggerToClassGenerator(classLoader, swagger, "pkg"); + @Test - public void getOrCreateClassName_get() { - String canonical = "name"; + public void convert_simple() { ModelImpl model = new ModelImpl(); - model.getVendorExtensions().put(SwaggerConst.EXT_JAVA_CLASS, canonical); - Assert.assertEquals(canonical, - converter.getOrCreateClassName(null, model)); + model.setType(StringProperty.TYPE); + swagger.addDefinition("string", model); + + swaggerToClassGenerator.convert(); + + Assert.assertSame(String.class, swaggerToClassGenerator.convert(model).getRawClass()); } @Test - public void getOrCreateClassName_create_packageNull() { - expectedException.expect(IllegalStateException.class); - expectedException.expectMessage(Matchers.is("packageName should not be null")); + public void convert_ref() { + ModelImpl model = new ModelImpl(); + model.setType(StringProperty.TYPE); + swagger.addDefinition("string", model); + + ModelImpl refModel = new ModelImpl(); + refModel.setReference("string"); + swagger.addDefinition("ref", refModel); + + swaggerToClassGenerator.convert(); - converter.getOrCreateClassName(null, new ModelImpl()); + Assert.assertSame(String.class, swaggerToClassGenerator.convert(refModel).getRawClass()); } @Test - public void getOrCreateClassName_create() { - Assert.assertEquals("pkg.name", converter.getOrCreateClassName("pkg", new ModelImpl().name("name"))); + public void convert_map() { + ModelImpl mapModel = new ModelImpl(); + mapModel.setAdditionalProperties(new IntegerProperty()); + swagger.addDefinition("map", mapModel); + + swaggerToClassGenerator.convert(); + + JavaType javaType = swaggerToClassGenerator.convert(mapModel); + Assert.assertSame(Map.class, javaType.getRawClass()); + Assert.assertSame(String.class, javaType.getKeyType().getRawClass()); + Assert.assertSame(Integer.class, javaType.getContentType().getRawClass()); + } + + static class Empty { + } + + @Test + public void convert_empty() { + ParamUtils.createBodyParameter(swagger, "body", Empty.class); + Model model = swagger.getDefinitions().get(Empty.class.getSimpleName()); + model.getVendorExtensions().put(SwaggerConst.EXT_JAVA_CLASS, "pkg.Empty"); + + JavaType javaType = swaggerToClassGenerator.convert(model); + + Assert.assertEquals("pkg.Empty", javaType.getRawClass().getName()); } @Test - public void getOrCreateType(@Mocked Swagger swagger) { - String canonical = "name-"; + public void convert_object() { + BodyParameter bodyParameter = ParamUtils.createBodyParameter(swagger, "body", Object.class); + Model model = bodyParameter.getSchema(); + + JavaType javaType = swaggerToClassGenerator.convert(model); + + Assert.assertSame(Object.class, javaType.getRawClass()); + } + + @Test + public void convert_createClass() throws NoSuchFieldException { ModelImpl model = new ModelImpl(); - model.getVendorExtensions().put(SwaggerConst.EXT_JAVA_CLASS, canonical); + model.addProperty("f1", new StringProperty()); + model.setVendorExtension(SwaggerConst.EXT_JAVA_CLASS, "pkg.Model"); + + swagger.addDefinition("cls", model); - JavaType type = converter.getOrCreateType(new ClassLoader() { - }, null, swagger, model); + JavaType javaType = swaggerToClassGenerator.convert(model); - Assert.assertEquals("name_", type.getRawClass().getName()); + Class<?> cls = javaType.getRawClass(); + Assert.assertEquals("pkg.Model", cls.getName()); + Assert.assertSame(String.class, cls.getField("f1").getType()); } } diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/ClassUtilsForTest.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/ClassUtilsForTest.java new file mode 100644 index 0000000..f2330a9 --- /dev/null +++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/ClassUtilsForTest.java @@ -0,0 +1,73 @@ +/* + * 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.core; + +import java.util.Map; + +import org.apache.servicecomb.swagger.converter.ConverterMgr; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; +import org.apache.servicecomb.swagger.generator.core.utils.ClassUtils; +import org.springframework.util.StringUtils; + +import com.fasterxml.jackson.databind.JavaType; + +import io.swagger.models.Swagger; + +public class ClassUtilsForTest { + public static Class<?> getOrCreateInterface(SwaggerGenerator generator) { + return getOrCreateInterface(generator.getSwagger(), + generator.getClassLoader(), + generator.ensureGetPackageName()); + } + + public static Class<?> getOrCreateInterface(Swagger swagger, ClassLoader classLoader, + String packageName) { + String intfName = ClassUtils.getInterfaceName(swagger.getInfo().getVendorExtensions()); + Class<?> intf = ClassUtils.getClassByName(classLoader, intfName); + if (intf != null) { + return intf; + } + + if (packageName == null) { + int idx = intfName.lastIndexOf("."); + if (idx == -1) { + packageName = ""; + } else { + packageName = intfName.substring(0, idx); + } + } + + SwaggerToClassGenerator swaggerToClassGenerator = new SwaggerToClassGenerator(classLoader, swagger, packageName); + swaggerToClassGenerator.setInterfaceName(intfName); + return swaggerToClassGenerator.convert(); + } + + public static Class<?> getClassByVendorExtensions(ClassLoader classLoader, Map<String, Object> vendorExtensions, + String clsKey) { + String clsName = ClassUtils.getVendorExtension(vendorExtensions, clsKey); + if (StringUtils.isEmpty(clsName)) { + return null; + } + + return ClassUtils.getClassByName(classLoader, clsName); + } + + public static JavaType findJavaType(SwaggerGenerator generator, Object def) { + return ConverterMgr.findJavaType(new SwaggerToClassGenerator(generator.getClassLoader(), generator.getSwagger(), + generator.ensureGetPackageName()), def); + } +} diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiImplicitParams.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiImplicitParams.java index f8dddd5..e6125a3 100644 --- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiImplicitParams.java +++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiImplicitParams.java @@ -17,7 +17,6 @@ package org.apache.servicecomb.swagger.generator.core; -import org.apache.servicecomb.swagger.converter.ConverterMgr; import org.apache.servicecomb.swagger.generator.core.schema.User; import org.apache.servicecomb.swagger.generator.core.unittest.SwaggerGeneratorForTest; import org.apache.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext; @@ -56,7 +55,7 @@ public class TestApiImplicitParams { Operation operation = path.getOperations().get(0); Parameter parameter = operation.getParameters().get(0); - JavaType javaType = ConverterMgr.findJavaType(swaggerGenerator, parameter); + JavaType javaType = ClassUtilsForTest.findJavaType(swaggerGenerator, parameter); Assert.assertEquals(User.class, javaType.getRawClass()); } } diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiResponse.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiResponse.java index eaf0dd4..8f60345 100644 --- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiResponse.java +++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestApiResponse.java @@ -17,7 +17,6 @@ package org.apache.servicecomb.swagger.generator.core; -import org.apache.servicecomb.swagger.converter.ConverterMgr; import org.apache.servicecomb.swagger.generator.core.unittest.SwaggerGeneratorForTest; import org.apache.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext; import org.junit.Assert; @@ -79,7 +78,7 @@ public class TestApiResponse { Response response = operation.getResponses().get("200"); Property property = response.getHeaders().get("k1"); - Assert.assertEquals(Integer.class, ConverterMgr.findJavaType(generator, property).getRawClass()); + Assert.assertEquals(Integer.class, ClassUtilsForTest.findJavaType(generator, property).getRawClass()); } private void checkResponseDesc(SwaggerGenerator generator) { @@ -103,10 +102,10 @@ public class TestApiResponse { Response response = operation.getResponses().get("200"); Property property = response.getHeaders().get("k1"); - Assert.assertEquals(Integer.class, ConverterMgr.findJavaType(generator, property).getRawClass()); + Assert.assertEquals(Integer.class, ClassUtilsForTest.findJavaType(generator, property).getRawClass()); property = response.getHeaders().get("k2"); - Assert.assertEquals(String.class, ConverterMgr.findJavaType(generator, property).getRawClass()); + Assert.assertEquals(String.class, ClassUtilsForTest.findJavaType(generator, property).getRawClass()); } public void checkSingle(SwaggerGenerator generator) { @@ -117,7 +116,7 @@ public class TestApiResponse { Assert.assertEquals("testSingle", operation.getOperationId()); Response response = operation.getResponses().get("200"); - Assert.assertEquals(Integer.class, ConverterMgr.findJavaType(generator, response.getSchema()).getRawClass()); + Assert.assertEquals(Integer.class, ClassUtilsForTest.findJavaType(generator, response.getSchema()).getRawClass()); } public void checkMulti(SwaggerGenerator generator) { @@ -129,9 +128,9 @@ public class TestApiResponse { Assert.assertEquals("testMulti", operation.getOperationId()); Response response = operation.getResponses().get("200"); - Assert.assertEquals(Integer.class, ConverterMgr.findJavaType(generator, response.getSchema()).getRawClass()); + Assert.assertEquals(Integer.class, ClassUtilsForTest.findJavaType(generator, response.getSchema()).getRawClass()); response = operation.getResponses().get("301"); - Assert.assertEquals(String.class, ConverterMgr.findJavaType(generator, response.getSchema()).getRawClass()); + Assert.assertEquals(String.class, ClassUtilsForTest.findJavaType(generator, response.getSchema()).getRawClass()); } } diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestArrayType.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestArrayType.java index 2e7bf8f..da8a1aa 100644 --- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestArrayType.java +++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestArrayType.java @@ -21,7 +21,6 @@ import java.lang.reflect.Method; import org.apache.servicecomb.foundation.common.utils.ReflectUtils; import org.apache.servicecomb.swagger.generator.core.schema.ArrayType; import org.apache.servicecomb.swagger.generator.core.unittest.UnitTestSwaggerUtils; -import org.apache.servicecomb.swagger.generator.core.utils.ClassUtils; import org.junit.Assert; import org.junit.Test; @@ -32,7 +31,7 @@ public class TestArrayType { @Test public void test() throws Exception { SwaggerGenerator generator = UnitTestSwaggerUtils.generateSwagger(ArrayType.class); - Class<?> cls = ClassUtils.getOrCreateInterface(generator); + Class<?> cls = ClassUtilsForTest.getOrCreateInterface(generator); Method method = ReflectUtils.findMethod(cls, "testBytes"); Class<?> param = (Class<?>) method.getParameters()[0].getParameterizedType(); 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 e49aea2..369d33d 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 @@ -17,20 +17,17 @@ package org.apache.servicecomb.swagger.generator.core; -import static junit.framework.TestCase.fail; 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; import java.util.Set; +import javax.lang.model.SourceVersion; import javax.ws.rs.Path; -import org.apache.servicecomb.common.javassist.JavassistUtils; +import org.apache.commons.lang3.reflect.FieldUtils; 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; @@ -39,14 +36,9 @@ 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; -import io.swagger.models.Swagger; -import javassist.CannotCompileException; -import javassist.ClassPool; -import javassist.CtClass; -import mockit.Deencapsulation; +import io.swagger.models.parameters.PathParameter; @SwaggerDefinition public class TestClassUtils { @@ -57,33 +49,70 @@ public class TestClassUtils { public ExpectedException expectedException = ExpectedException.none(); @Test - public void testHasAnnotation() { - Assert.assertEquals(true, ClassUtils.hasAnnotation(TestClassUtils.class, SwaggerDefinition.class)); - Assert.assertEquals(true, ClassUtils.hasAnnotation(TestClassUtils.class, Test.class)); + public void getClassByName_exist() { + String clsName = String.class.getName(); - Assert.assertEquals(false, ClassUtils.hasAnnotation(TestClassUtils.class, Path.class)); + Assert.assertSame(String.class, ClassUtils.getClassByName(null, clsName)); + Assert.assertSame(String.class, ClassUtils.getClassByName(classLoader, clsName)); + } + + @Test + public void getClassByName_notExist() { + String clsName = "notExist"; + + Assert.assertNull(ClassUtils.getClassByName(null, clsName)); + Assert.assertNull(ClassUtils.getClassByName(classLoader, clsName)); } public static class Impl { - public List<User> getUser(List<String> names) { + public List<User> getUser(List<String> p1, List<User> p2) { return null; } } @Test - public void testCreateInterface() { + public void getOrCreateBodyClass() throws NoSuchFieldException { SwaggerGenerator generator = UnitTestSwaggerUtils.generateSwagger(Impl.class); - Class<?> intf = ClassUtils.getOrCreateInterface(generator); + OperationGenerator operationGenerator = generator.getOperationGeneratorMap().get("getUser"); - Assert.assertEquals("gen.swagger.ImplIntf", intf.getName()); - Assert.assertEquals(1, intf.getMethods().length); + Class<?> cls = ClassUtils.getOrCreateBodyClass(operationGenerator, null); + Assert.assertEquals("gen.swagger.getUserBody", cls.getName()); + Assert.assertEquals("java.util.List<java.lang.String>", cls.getField("p1").getGenericType().getTypeName()); + Assert.assertEquals("java.util.List<org.apache.servicecomb.swagger.generator.core.schema.User>", + cls.getField("p2").getGenericType().getTypeName()); + } - Method method = intf.getMethods()[0]; - Assert.assertEquals("getUser", method.getName()); + @Test + public void testHasAnnotation() { + Assert.assertEquals(true, ClassUtils.hasAnnotation(TestClassUtils.class, SwaggerDefinition.class)); + Assert.assertEquals(true, ClassUtils.hasAnnotation(TestClassUtils.class, Test.class)); - Assert.assertEquals("gen.swagger.getUser.names", method.getGenericParameterTypes()[0].getTypeName()); - Assert.assertEquals("java.util.List<org.apache.servicecomb.swagger.generator.core.schema.User>", - method.getGenericReturnType().getTypeName()); + Assert.assertEquals(false, ClassUtils.hasAnnotation(TestClassUtils.class, Path.class)); + } + + @Test + public void isRawJsonType() { + PathParameter param = new PathParameter(); + + Assert.assertFalse(ClassUtils.isRawJsonType(param)); + + param.setVendorExtension(SwaggerConst.EXT_RAW_JSON_TYPE, Boolean.FALSE); + Assert.assertFalse(ClassUtils.isRawJsonType(param)); + + param.setVendorExtension(SwaggerConst.EXT_RAW_JSON_TYPE, Boolean.TRUE); + Assert.assertTrue(ClassUtils.isRawJsonType(param)); + } + + @Test + public void correctMethodParameterName_normal() { + String name = "name"; + Assert.assertSame(name, ClassUtils.correctMethodParameterName(name)); + } + + @Test + public void correctMethodParameterName_update() { + String name = "name.-"; + Assert.assertEquals("name__", ClassUtils.correctMethodParameterName(name)); } @Test @@ -128,64 +157,40 @@ public class TestClassUtils { } @Test - public void testGetOrCreateClass() { - String className = this.getClass().getCanonicalName(); - - Class<?> result = ClassUtils.getOrCreateClass(null, "", new Swagger(), null, className); - - Assert.assertEquals(this.getClass(), result); + public void testCorrectClassNameNormal() { + String result = ClassUtils.correctClassName("String"); + Assert.assertThat(result, is("String")); } @Test - public void testGetOrCreateClassOnPropertyIsNull() { - ClassLoader classLoader = Mockito.mock(ClassLoader.class); - String className = this.getClass().getCanonicalName(); - ClassPool classPool = Mockito.mock(ClassPool.class); - CtClass ctClass = Mockito.mock(CtClass.class); - - Map<ClassLoader, ClassPool> classPoolMap = Deencapsulation.getField(JavassistUtils.class, "CLASSPOOLS"); - classPoolMap.put(classLoader, classPool); + public void getClassName_noName() { + Assert.assertNull(ClassUtils.getClassName(null)); - try { - Mockito.when(classLoader.loadClass(className)).thenReturn(null); - } catch (ClassNotFoundException e) { - fail("unexpected exception: " + e); - } - Mockito.when(classPool.getOrNull(className)).thenReturn(ctClass); - try { - Mockito.when(ctClass.toClass(classLoader, null)).thenReturn(this.getClass()); - } catch (CannotCompileException e) { - fail("unexpected exception: " + e); - } - - Class<?> result = ClassUtils.getOrCreateClass(classLoader, "", new Swagger(), null, className); - Assert.assertEquals(this.getClass(), result); + Map<String, Object> vendorExtensions = new HashMap<>(); + Assert.assertNull(ClassUtils.getClassName(vendorExtensions)); } @Test - public void getClassByVendorExtensions_noName() { + public void getClassName_normal() { 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)); + Assert.assertSame(String.class.getName(), ClassUtils.getClassName(vendorExtensions)); } @Test - public void getClassByVendorExtensions_notExist() { + public void getInterfaceName_noName() { 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)); + Assert.assertNull(ClassUtils.getInterfaceName(vendorExtensions)); } @Test - public void getClassByVendorExtensions_normal() { + public void getInterfaceName_normal() { Map<String, Object> vendorExtensions = new HashMap<>(); - vendorExtensions.put(SwaggerConst.EXT_JAVA_CLASS, String.class.getName()); + vendorExtensions.put(SwaggerConst.EXT_JAVA_INTF, String.class.getName()); - Assert.assertSame(String.class, - ClassUtils.getClassByVendorExtensions(classLoader, vendorExtensions, SwaggerConst.EXT_JAVA_CLASS)); + Assert.assertSame(String.class.getName(), ClassUtils.getInterfaceName(vendorExtensions)); } @Test diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestProperty.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestProperty.java index 93483a5..4921676 100644 --- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestProperty.java +++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestProperty.java @@ -20,6 +20,7 @@ package org.apache.servicecomb.swagger.generator.core; import java.util.Arrays; import java.util.List; +import org.apache.servicecomb.swagger.converter.SwaggerToClassGenerator; import org.apache.servicecomb.swagger.converter.property.StringPropertyConverter; import org.apache.servicecomb.swagger.generator.core.unittest.SwaggerGeneratorForTest; import org.apache.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext; @@ -44,8 +45,10 @@ public class TestProperty { sp._enum(enums); StringPropertyConverter spc = new StringPropertyConverter(); - JavaType jt = - spc.convert(generator.getClassLoader(), generator.ensureGetPackageName(), generator.getSwagger(), sp); + JavaType jt = spc.convert( + new SwaggerToClassGenerator(generator.getClassLoader(), generator.getSwagger(), + generator.ensureGetPackageName()), + sp); StringProperty spNew = (StringProperty) ModelConverters.getInstance().readAsProperty(jt); Assert.assertEquals(enums, spNew.getEnum()); diff --git a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestSwaggerUtils.java b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestSwaggerUtils.java index 3ac30f0..b2f76a7 100644 --- a/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestSwaggerUtils.java +++ b/swagger/swagger-generator/generator-core/src/test/java/org/apache/servicecomb/swagger/generator/core/TestSwaggerUtils.java @@ -23,56 +23,18 @@ import java.util.Date; import org.apache.servicecomb.common.javassist.JavassistUtils; import org.apache.servicecomb.foundation.common.utils.ReflectUtils; -import org.apache.servicecomb.swagger.converter.ConverterMgr; import org.apache.servicecomb.swagger.generator.core.schema.Color; import org.apache.servicecomb.swagger.generator.core.schema.InvalidResponseHeader; import org.apache.servicecomb.swagger.generator.core.schema.RepeatOperation; import org.apache.servicecomb.swagger.generator.core.schema.Schema; -import org.apache.servicecomb.swagger.generator.core.schema.User; -import org.apache.servicecomb.swagger.generator.core.unittest.SwaggerGeneratorForTest; import org.apache.servicecomb.swagger.generator.core.unittest.UnitTestSwaggerUtils; -import org.apache.servicecomb.swagger.generator.core.utils.ClassUtils; -import org.apache.servicecomb.swagger.generator.core.utils.ParamUtils; import org.apache.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext; import org.junit.Assert; import org.junit.Test; -import com.fasterxml.jackson.databind.JavaType; - -import io.swagger.models.Model; -import io.swagger.models.RefModel; -import io.swagger.models.Swagger; - public class TestSwaggerUtils { SwaggerGeneratorContext context = new PojoSwaggerGeneratorContext(); - @Test - public void testConverter() { - SwaggerGenerator generator = new SwaggerGeneratorForTest(context, null); - Swagger swagger = generator.getSwagger(); - ParamUtils.addDefinitions(swagger, User.class); - Model model = swagger.getDefinitions().get("User"); - model.getVendorExtensions().clear(); - - JavaType javaType = ConverterMgr.findJavaType(generator, model); - checkJavaType(swagger, javaType); - - RefModel refModel = new RefModel(); - refModel.setReference("User"); - javaType = ConverterMgr.findJavaType(generator, refModel); - checkJavaType(swagger, javaType); - } - - protected void checkJavaType(Swagger swagger, JavaType javaType) { - Class<?> cls = javaType.getRawClass(); - Field[] fields = cls.getFields(); - Assert.assertEquals("gen.cse.ms.ut.User", cls.getName()); - Assert.assertEquals("name", fields[0].getName()); - Assert.assertEquals(String.class, fields[0].getType()); - Assert.assertEquals("age", fields[1].getName()); - Assert.assertEquals(Integer.class, fields[1].getType()); - } - private SwaggerGenerator testSchemaMethod(String resultName, String... methodNames) { return UnitTestSwaggerUtils.testSwagger("schemas/" + resultName + ".yaml", context, @@ -126,7 +88,7 @@ public class TestSwaggerUtils { public void testEnum() { SwaggerGenerator generator = testSchemaMethod("enum", "testEnum"); JavassistUtils.detach("gen.cse.ms.ut.SchemaIntf"); - Class<?> intf = ClassUtils.getOrCreateInterface(generator); + Class<?> intf = ClassUtilsForTest.getOrCreateInterface(generator); Method method = ReflectUtils.findMethod(intf, "testEnum"); Class<?> bodyCls = method.getParameterTypes()[0]; @@ -221,7 +183,7 @@ public class TestSwaggerUtils { public void testDate() { SwaggerGenerator generator = testSchemaMethod("date", "testDate"); JavassistUtils.detach("gen.cse.ms.ut.SchemaIntf"); - Class<?> intf = ClassUtils.getOrCreateInterface(generator); + Class<?> intf = ClassUtilsForTest.getOrCreateInterface(generator); Method method = ReflectUtils.findMethod(intf, "testDate"); Assert.assertEquals(Date.class, method.getReturnType()); -- To stop receiving notification emails like this one, please contact wuji...@apache.org.