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>.