package com.alibaba.json.bvt.parser;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import com.alibaba.fastjson.parser.ParserConfig;
import org.junit.Assert;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.JavaBeanSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializeWriter;
import com.alibaba.fastjson.util.TypeUtils;
import junit.framework.TestCase;
public class TypeUtilsTest_castToJavaBean extends TestCase {
protected void setUp() throws Exception {
ParserConfig.global.addAccept("com.alibaba.json.bvt.parser.TypeUtilsTest_castToJavaBean.");
}
public void test_castToJavaBean_StackTraceElement() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("className", "java.lang.Object");
map.put("methodName", "hashCode");
StackTraceElement element = TypeUtils.castToJavaBean(map, StackTraceElement.class, null);
Assert.assertEquals("java.lang.Object", element.getClassName());
Assert.assertEquals("hashCode", element.getMethodName());
Assert.assertEquals(null, element.getFileName());
}
public void test_castToJavaBean_StackTraceElement_1() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("className", "java.lang.Object");
map.put("methodName", "hashCode");
map.put("lineNumber", 12);
StackTraceElement element = TypeUtils.castToJavaBean(map, StackTraceElement.class, null);
Assert.assertEquals("java.lang.Object", element.getClassName());
Assert.assertEquals("hashCode", element.getMethodName());
Assert.assertEquals(null, element.getFileName());
Assert.assertEquals(12, element.getLineNumber());
}
public void test_castToJavaBean_type() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("@type", "java.lang.StackTraceElement");
map.put("className", "java.lang.Object");
map.put("methodName", "hashCode");
map.put("lineNumber", 12);
StackTraceElement element = (StackTraceElement) TypeUtils.castToJavaBean(map, Object.class, null);
Assert.assertEquals("java.lang.Object", element.getClassName());
Assert.assertEquals("hashCode", element.getMethodName());
Assert.assertEquals(null, element.getFileName());
Assert.assertEquals(12, element.getLineNumber());
}
public void test_error() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("@type", "xxx");
Exception error = null;
try {
TypeUtils.castToJavaBean(map, Object.class, null);
} catch (Exception ex) {
error = ex;
}
Assert.assertNotNull(error);
}
public void test_error2() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("@type", "");
Exception error = null;
try {
TypeUtils.castToJavaBean(map, Object.class, null);
} catch (Exception ex) {
error = ex;
}
Assert.assertNotNull(error);
}
public void test_mapping() throws Exception {
addClassMapping("my_xxx", VO.class);
addClassMapping(null, VO.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("@type", "my_xxx");
map.put("id", 123);
VO vo = (VO) TypeUtils.castToJavaBean(map, Object.class);
Assert.assertEquals(123, vo.getId());
TypeUtils.clearClassMapping();
}
public static void addClassMapping(String className, Class<?> clazz) throws Exception {
Field field = TypeUtils.class.getDeclaredField("mappings");
field.setAccessible(true);
field.get(null);
ConcurrentMap<String, Class<?>> mappings = (ConcurrentMap<String, Class<?>>) field.get(null);
if (className == null) {
className = clazz.getName();
}
mappings.put(className, clazz);
}
public void test_interface() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 123);
VO vo = TypeUtils.castToJavaBean(map, VO.class);
Assert.assertEquals(123, vo.getId());
}
public void test_bean() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 123);
Entity vo = TypeUtils.castToJavaBean(map, Entity.class);
Assert.assertEquals(123, vo.getId());
Assert.assertEquals("{\"id\":123}", JSON.toJSONString(vo));
}
public void test_loadClass() throws Exception {
Assert.assertNull(TypeUtils.loadClass(null));
Assert.assertNull(TypeUtils.loadClass(""));
}
public void test_loadClass_1() throws Exception {
TypeUtils.clearClassMapping();
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(new TestLoader());
try {
Assert.assertEquals(VO.class,
TypeUtils.loadClass("com.alibaba.json.bvt.parser.TypeUtilsTest_castToJavaBean$VO"));
} finally {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
public void test_loadClass_2() throws Exception {
TypeUtils.clearClassMapping();
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(new TestLoader());
try {
Assert.assertNull(TypeUtils.loadClass("xxx_xx"));
} finally {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
public void test_bean_2() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 123);
PO vo = TypeUtils.castToJavaBean(map, PO.class);
Assert.assertEquals(123, vo.id);
SerializeWriter out = new SerializeWriter();
try {
SerializeConfig config = new SerializeConfig();
JSONSerializer serializer = new JSONSerializer(out, config);
config.put(PO.class, new JavaBeanSerializer(PO.class, Collections.singletonMap("id", "ID")));
serializer.write(vo);
Assert.assertEquals("{\"ID\":123}", out.toString());
} finally {
out.close();
}
}
public void test_bean_3() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 123);
PO vo = TypeUtils.castToJavaBean(map, PO.class);
Assert.assertEquals(123, vo.id);
SerializeWriter out = new SerializeWriter();
try {
SerializeConfig config = new SerializeConfig();
JSONSerializer serializer = new JSONSerializer(out, config);
config.put(PO.class, new JavaBeanSerializer(PO.class, Collections.singletonMap("id", (String) null)));
serializer.write(vo);
Assert.assertEquals("{}", out.toString());
} finally {
out.close();
}
}
public static interface VO {
void setId(int value);
int getId();
ClassLoader getClassLoader();
}
public static class Entity {
private int id;
protected String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
protected String getName() {
return name;
}
protected void setName(String name) {
this.name = name;
}
public ClassLoader getClassLoader() {
return Entity.class.getClassLoader();
}
}
private static class PO {
public int id;
}
public static class TestLoader extends ClassLoader {
public TestLoader(){
super(null);
}
public URL getResource(String name) {
return null;
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException();
}
}
}