From 51041af3ce6fb4d8f5f3c410681cf2599f2f7576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9C=B0=E5=B9=B3=E7=BA=BF?= <22250530@qq.com> Date: Sat, 27 Jun 2015 10:14:08 +0800 Subject: [PATCH] --- .../wentch/redkale/convert/AnyEncoder.java | 2 +- .../wentch/redkale/convert/ConvertEntity.java | 25 +++++++++++++++++++ src/com/wentch/redkale/convert/Factory.java | 18 +++++++++++++ .../wentch/redkale/convert/ObjectDecoder.java | 8 +----- .../wentch/redkale/convert/ObjectEncoder.java | 2 +- src/com/wentch/redkale/convert/Writer.java | 2 +- .../redkale/convert/bson/BsonConvert.java | 15 +++++++++++ .../redkale/convert/bson/BsonReader.java | 2 +- .../redkale/convert/bson/BsonWriter.java | 4 +-- .../redkale/convert/json/JsonWriter.java | 2 +- 10 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 src/com/wentch/redkale/convert/ConvertEntity.java diff --git a/src/com/wentch/redkale/convert/AnyEncoder.java b/src/com/wentch/redkale/convert/AnyEncoder.java index 6522a3b31..0a8f253aa 100644 --- a/src/com/wentch/redkale/convert/AnyEncoder.java +++ b/src/com/wentch/redkale/convert/AnyEncoder.java @@ -27,7 +27,7 @@ public final class AnyEncoder implements Encodeable { if (value == null) { out.writeNull(); } else { - out.wirteClassName(value.getClass()); + out.wirteClassName(factory.getEntity(value.getClass())); factory.loadEncoder(value.getClass()).convertTo(out, value); } } diff --git a/src/com/wentch/redkale/convert/ConvertEntity.java b/src/com/wentch/redkale/convert/ConvertEntity.java new file mode 100644 index 000000000..99bd4330c --- /dev/null +++ b/src/com/wentch/redkale/convert/ConvertEntity.java @@ -0,0 +1,25 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.wentch.redkale.convert; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 用于类名的别名, 类似javax.persistence.Table + * 该值必须是全局唯一 + * + * @author zhangjx + */ +@Inherited +@Documented +@Target({TYPE}) +@Retention(RUNTIME) +public @interface ConvertEntity { + + String value(); +} diff --git a/src/com/wentch/redkale/convert/Factory.java b/src/com/wentch/redkale/convert/Factory.java index bf480d674..e0407e30c 100644 --- a/src/com/wentch/redkale/convert/Factory.java +++ b/src/com/wentch/redkale/convert/Factory.java @@ -15,6 +15,7 @@ import java.math.BigInteger; import java.net.*; import static com.wentch.redkale.convert.ext.InetAddressSimpledCoder.*; import java.util.*; +import java.util.concurrent.*; /** * @@ -36,6 +37,8 @@ public abstract class Factory { //----------------------------------------------------------------------------------- private final HashedMap creators = new HashedMap(); + private final Map entitys = new ConcurrentHashMap<>(); + private final HashedMap> decoders = new HashedMap(); private final HashedMap> encoders = new HashedMap(); @@ -138,6 +141,21 @@ public abstract class Factory { return null; } + final String getEntity(Class clazz) { + ConvertEntity ce = (ConvertEntity) clazz.getAnnotation(ConvertEntity.class); + if (ce != null && entitys.get(ce.value()) == null) entitys.put(ce.value(), clazz); + return ce == null ? clazz.getName() : ce.value(); + } + + final Class getEntity(String name) { + Class clazz = entitys.get(name); + try { + return clazz == null ? Class.forName(name) : clazz; + } catch (Exception ex) { + throw new ConvertException("convert entity is " + name, ex); + } + } + /** * 使所有类的所有被声明为ConvertColumn.ignore = true 的字段或方法变为ConvertColumn.ignore = false *

diff --git a/src/com/wentch/redkale/convert/ObjectDecoder.java b/src/com/wentch/redkale/convert/ObjectDecoder.java index 6d41324fb..c2146dfc2 100644 --- a/src/com/wentch/redkale/convert/ObjectDecoder.java +++ b/src/com/wentch/redkale/convert/ObjectDecoder.java @@ -107,13 +107,7 @@ public final class ObjectDecoder implements Decodeable implements Encodeable