From 5de52ed6e895711950223b19c8b714abdc5275a1 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sat, 21 Jul 2018 10:50:01 +0800 Subject: [PATCH] =?UTF-8?q?Convert=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/watch/ServiceWatchService.java | 75 +++++++++++++++---- src/org/redkale/convert/ArrayDecoder.java | 12 +-- src/org/redkale/convert/ArrayEncoder.java | 14 ++-- .../redkale/convert/CollectionDecoder.java | 10 +-- .../redkale/convert/CollectionEncoder.java | 10 +-- src/org/redkale/convert/ConvertFactory.java | 72 ++++++++++++++---- src/org/redkale/convert/MapDecoder.java | 12 +-- src/org/redkale/convert/MapEncoder.java | 12 +-- src/org/redkale/convert/ObjectDecoder.java | 10 +-- src/org/redkale/convert/ObjectEncoder.java | 10 +-- src/org/redkale/convert/SimpledCoder.java | 2 +- src/org/redkale/convert/StreamDecoder.java | 10 +-- src/org/redkale/convert/StreamEncoder.java | 10 +-- src/org/redkale/convert/bson/BsonFactory.java | 6 -- src/org/redkale/convert/json/JsonFactory.java | 5 -- 15 files changed, 174 insertions(+), 96 deletions(-) diff --git a/src/org/redkale/boot/watch/ServiceWatchService.java b/src/org/redkale/boot/watch/ServiceWatchService.java index 17e980d96..6953fac7c 100644 --- a/src/org/redkale/boot/watch/ServiceWatchService.java +++ b/src/org/redkale/boot/watch/ServiceWatchService.java @@ -30,8 +30,43 @@ public class ServiceWatchService extends AbstractWatchService { protected Application application; @RestConvert(type = void.class) - @RestMapping(name = "findfield", auth = false, comment = "查询Service中指定字段的内容") - public RetResult findfield(@RestParam(name = "name", comment = "Service的资源名") String name, + @RestMapping(name = "setfield", auth = false, comment = "设置Service中指定字段的内容") + public RetResult setfield(@RestParam(name = "name", comment = "Service的资源名") String name, + @RestParam(name = "type", comment = "Service的类名") String type, + @RestParam(name = "field", comment = "字段名") String field, + @RestParam(name = "value", comment = "字段值") String value) { + if (name == null) name = ""; + if (type == null) type = ""; + if (field == null) field = ""; + type = type.trim(); + field = field.trim(); + if (type.isEmpty()) return new RetResult(RET_WATCH_PARAMS_ILLEGAL, "not found param `type`"); + if (field.isEmpty()) return new RetResult(RET_WATCH_PARAMS_ILLEGAL, "not found param `field`"); + Object dest = findService(name, type); + Class clazz = dest.getClass(); + Throwable t = null; + try { + Field fieldObj = null; + do { + try { + fieldObj = clazz.getDeclaredField(field); + break; + } catch (Exception e) { + if (t == null) t = e; + } + } while ((clazz = clazz.getSuperclass()) != Object.class); + if (fieldObj == null) return new RetResult(RET_WATCH_RUN_EXCEPTION, "run exception (" + String.valueOf(t) + ")"); + fieldObj.setAccessible(true); + fieldObj.set(dest, JsonConvert.root().convertFrom(fieldObj.getGenericType(), value)); + return RetResult.success(); + } catch (Throwable t2) { + return new RetResult(RET_WATCH_RUN_EXCEPTION, "run exception (" + t2.toString() + ")"); + } + } + + @RestConvert(type = void.class) + @RestMapping(name = "getfield", auth = false, comment = "查询Service中指定字段的内容") + public RetResult getfield(@RestParam(name = "name", comment = "Service的资源名") String name, @RestParam(name = "type", comment = "Service的类名") String type, @RestParam(name = "field", comment = "字段名") String field) { if (name == null) name = ""; @@ -133,16 +168,28 @@ public class ServiceWatchService extends AbstractWatchService { if (dest == null) return new RetResult(RET_SERVICE_DEST_NOT_EXISTS, "not found servie (name=" + name + ", type=" + type + ")"); return dest; } -// -// @RestMapping(name = "load", auth = false, comment = "动态增加Service") -// public RetResult loadService(String type, @RestUploadFile(maxLength = 10 * 1024 * 1024, fileNameReg = "\\.jar$") byte[] jar) { -// //待开发 -// return RetResult.success(); -// } -// -// @RestMapping(name = "stop", auth = false, comment = "动态停止Service") -// public RetResult stopService(String name, String type) { -// //待开发 -// return RetResult.success(); -// } + + @RestMapping(name = "load", auth = false, comment = "动态增加Service") + public RetResult loadService(String type, @RestUploadFile(maxLength = 10 * 1024 * 1024, fileNameReg = "\\.jar$") byte[] jar) { + //待开发 + return RetResult.success(); + } + + @RestMapping(name = "reload", auth = false, comment = "重新加载Service") + public RetResult reloadService(String name, String type) { + //待开发 + return RetResult.success(); + } + + @RestMapping(name = "stop", auth = false, comment = "动态停止Service") + public RetResult stopService(String name, String type) { + //待开发 + return RetResult.success(); + } + + @RestMapping(name = "find", auth = false, comment = "查找Service") + public RetResult find(String name, String type) { + //待开发 + return RetResult.success(); + } } diff --git a/src/org/redkale/convert/ArrayDecoder.java b/src/org/redkale/convert/ArrayDecoder.java index ed320aed3..84136ba8f 100644 --- a/src/org/redkale/convert/ArrayDecoder.java +++ b/src/org/redkale/convert/ArrayDecoder.java @@ -20,19 +20,19 @@ import java.util.*; * @param 反解析的数组元素类型 */ @SuppressWarnings("unchecked") -public final class ArrayDecoder implements Decodeable { +public class ArrayDecoder implements Decodeable { - private final Type type; + protected final Type type; - private final Type componentType; + protected final Type componentType; - private final Class componentClass; + protected final Class componentClass; protected final Decodeable decoder; - private boolean inited = false; + protected boolean inited = false; - private final Object lock = new Object(); + protected final Object lock = new Object(); public ArrayDecoder(final ConvertFactory factory, final Type type) { this.type = type; diff --git a/src/org/redkale/convert/ArrayEncoder.java b/src/org/redkale/convert/ArrayEncoder.java index 0b742e3b2..7a25161d3 100644 --- a/src/org/redkale/convert/ArrayEncoder.java +++ b/src/org/redkale/convert/ArrayEncoder.java @@ -19,19 +19,19 @@ import java.lang.reflect.*; * @param 序列化的数组元素类型 */ @SuppressWarnings("unchecked") -public final class ArrayEncoder implements Encodeable { +public class ArrayEncoder implements Encodeable { - private final Type type; + protected final Type type; - private final Type componentType; + protected final Type componentType; - private final Encodeable anyEncoder; + protected final Encodeable anyEncoder; - private final Encodeable encoder; + protected final Encodeable encoder; - private boolean inited = false; + protected boolean inited = false; - private final Object lock = new Object(); + protected final Object lock = new Object(); public ArrayEncoder(final ConvertFactory factory, final Type type) { this.type = type; diff --git a/src/org/redkale/convert/CollectionDecoder.java b/src/org/redkale/convert/CollectionDecoder.java index a9d46d5cd..304c03c1f 100644 --- a/src/org/redkale/convert/CollectionDecoder.java +++ b/src/org/redkale/convert/CollectionDecoder.java @@ -21,19 +21,19 @@ import java.util.Collection; * @param 反解析的集合元素类型 */ @SuppressWarnings("unchecked") -public final class CollectionDecoder implements Decodeable> { +public class CollectionDecoder implements Decodeable> { - private final Type type; + protected final Type type; - private final Type componentType; + protected final Type componentType; protected Creator> creator; protected final Decodeable decoder; - private boolean inited = false; + protected boolean inited = false; - private final Object lock = new Object(); + protected final Object lock = new Object(); public CollectionDecoder(final ConvertFactory factory, final Type type) { this.type = type; diff --git a/src/org/redkale/convert/CollectionEncoder.java b/src/org/redkale/convert/CollectionEncoder.java index 65a6fc14c..46b32cfd4 100644 --- a/src/org/redkale/convert/CollectionEncoder.java +++ b/src/org/redkale/convert/CollectionEncoder.java @@ -19,15 +19,15 @@ import java.util.Collection; * @param 序列化的集合元素类型 */ @SuppressWarnings("unchecked") -public final class CollectionEncoder implements Encodeable> { +public class CollectionEncoder implements Encodeable> { - private final Type type; + protected final Type type; - private final Encodeable encoder; + protected final Encodeable encoder; - private boolean inited = false; + protected boolean inited = false; - private final Object lock = new Object(); + protected final Object lock = new Object(); public CollectionEncoder(final ConvertFactory factory, final Type type) { this.type = type; diff --git a/src/org/redkale/convert/ConvertFactory.java b/src/org/redkale/convert/ConvertFactory.java index f7995c2ac..73397a929 100644 --- a/src/org/redkale/convert/ConvertFactory.java +++ b/src/org/redkale/convert/ConvertFactory.java @@ -141,12 +141,54 @@ public abstract class ConvertFactory { public abstract boolean isFieldSort(); //当ConvertColumn.index相同时是否按字段名称排序 - public abstract SimpledCoder createEnumSimpledCoder(Class enumClass); - public abstract ConvertFactory createChild(); public abstract ConvertFactory createChild(boolean tiny); + protected SimpledCoder createEnumSimpledCoder(Class enumClass) { + return new EnumSimpledCoder(enumClass); + } + + protected ObjectDecoder createObjectDecoder(Type type) { + return new ObjectDecoder(type); + } + + protected ObjectEncoder createObjectEncoder(Type type) { + return new ObjectEncoder(type); + } + + protected Decodeable createMapDecoder(Type type) { + return new MapDecoder(this, type); + } + + protected Encodeable createMapEncoder(Type type) { + return new MapEncoder(this, type); + } + + protected Decodeable createArrayDecoder(Type type) { + return new ArrayDecoder(this, type); + } + + protected Encodeable createArrayEncoder(Type type) { + return new ArrayEncoder(this, type); + } + + protected Decodeable createCollectionDecoder(Type type) { + return new CollectionDecoder(this, type); + } + + protected Encodeable createCollectionEncoder(Type type) { + return new CollectionEncoder(this, type); + } + + protected Decodeable createStreamDecoder(Type type) { + return new StreamDecoder(this, type); + } + + protected Encodeable createStreamEncoder(Type type) { + return new StreamEncoder(this, type); + } + public Convert getConvert() { return convert; } @@ -468,7 +510,7 @@ public abstract class ConvertFactory { public final Decodeable loadDecoder(final Type type) { Decodeable decoder = findDecoder(type); if (decoder != null) return decoder; - if (type instanceof GenericArrayType) return new ArrayDecoder(this, type); + if (type instanceof GenericArrayType) return createArrayDecoder(type); Class clazz; if (type instanceof ParameterizedType) { final ParameterizedType pts = (ParameterizedType) type; @@ -523,17 +565,17 @@ public abstract class ConvertFactory { if (clazz.isEnum()) { decoder = createEnumSimpledCoder(clazz); } else if (clazz.isArray()) { - decoder = new ArrayDecoder(this, type); + decoder = createArrayDecoder(type); } else if (Collection.class.isAssignableFrom(clazz)) { - decoder = new CollectionDecoder(this, type); + decoder = createCollectionDecoder(type); } else if (Stream.class.isAssignableFrom(clazz)) { - decoder = new StreamDecoder(this, type); + decoder = createStreamDecoder(type); } else if (Map.class.isAssignableFrom(clazz)) { - decoder = new MapDecoder(this, type); + decoder = createMapDecoder(type); } else if (Optional.class == clazz) { decoder = new OptionalCoder(this, type); } else if (clazz == Object.class) { - od = new ObjectDecoder(type); + od = createObjectDecoder(type); decoder = od; } else if (!clazz.getName().startsWith("java.") || java.net.HttpCookie.class == clazz @@ -553,7 +595,7 @@ public abstract class ConvertFactory { } } if (simpleCoder == null) { - od = new ObjectDecoder(type); + od = createObjectDecoder(type); decoder = od; } else { decoder = simpleCoder; @@ -568,7 +610,7 @@ public abstract class ConvertFactory { public final Encodeable loadEncoder(final Type type) { Encodeable encoder = findEncoder(type); if (encoder != null) return encoder; - if (type instanceof GenericArrayType) return new ArrayEncoder(this, type); + if (type instanceof GenericArrayType) return createArrayEncoder(type); Class clazz; if (type instanceof ParameterizedType) { final ParameterizedType pts = (ParameterizedType) type; @@ -609,13 +651,13 @@ public abstract class ConvertFactory { if (clazz.isEnum()) { encoder = createEnumSimpledCoder(clazz); } else if (clazz.isArray()) { - encoder = new ArrayEncoder(this, type); + encoder = createArrayEncoder(type); } else if (Collection.class.isAssignableFrom(clazz)) { - encoder = new CollectionEncoder(this, type); + encoder = createCollectionEncoder(type); } else if (Stream.class.isAssignableFrom(clazz)) { - encoder = new StreamEncoder(this, type); + encoder = createStreamEncoder(type); } else if (Map.class.isAssignableFrom(clazz)) { - encoder = new MapEncoder(this, type); + encoder = createMapEncoder(type); } else if (Optional.class == clazz) { encoder = new OptionalCoder(this, type); } else if (clazz == Object.class) { @@ -636,7 +678,7 @@ public abstract class ConvertFactory { } } if (simpleCoder == null) { - oe = new ObjectEncoder(type); + oe = createObjectEncoder(type); encoder = oe; } else { encoder = simpleCoder; diff --git a/src/org/redkale/convert/MapDecoder.java b/src/org/redkale/convert/MapDecoder.java index 660c05d69..9271ff39a 100644 --- a/src/org/redkale/convert/MapDecoder.java +++ b/src/org/redkale/convert/MapDecoder.java @@ -21,13 +21,13 @@ import java.util.Map; * @param Map value的数据类型 */ @SuppressWarnings("unchecked") -public final class MapDecoder implements Decodeable> { +public class MapDecoder implements Decodeable> { - private final Type type; + protected final Type type; - private final Type keyType; + protected final Type keyType; - private final Type valueType; + protected final Type valueType; protected Creator> creator; @@ -35,9 +35,9 @@ public final class MapDecoder implements Decodeable> { protected final Decodeable valueDecoder; - private boolean inited = false; + protected boolean inited = false; - private final Object lock = new Object(); + protected final Object lock = new Object(); public MapDecoder(final ConvertFactory factory, final Type type) { this.type = type; diff --git a/src/org/redkale/convert/MapEncoder.java b/src/org/redkale/convert/MapEncoder.java index 2e045c041..97e9e47d7 100644 --- a/src/org/redkale/convert/MapEncoder.java +++ b/src/org/redkale/convert/MapEncoder.java @@ -20,17 +20,17 @@ import java.util.Map; * @param Map value的数据类型 */ @SuppressWarnings("unchecked") -public final class MapEncoder implements Encodeable> { +public class MapEncoder implements Encodeable> { - private final Type type; + protected final Type type; - private final Encodeable keyencoder; + protected final Encodeable keyencoder; - private final Encodeable valencoder; + protected final Encodeable valencoder; - private boolean inited = false; + protected boolean inited = false; - private final Object lock = new Object(); + protected final Object lock = new Object(); public MapEncoder(final ConvertFactory factory, final Type type) { this.type = type; diff --git a/src/org/redkale/convert/ObjectDecoder.java b/src/org/redkale/convert/ObjectDecoder.java index 84744eb47..b955ce3db 100644 --- a/src/org/redkale/convert/ObjectDecoder.java +++ b/src/org/redkale/convert/ObjectDecoder.java @@ -21,7 +21,7 @@ import org.redkale.util.*; * @param 反解析的数据类型 */ @SuppressWarnings("unchecked") -public final class ObjectDecoder implements Decodeable { +public class ObjectDecoder implements Decodeable { protected final Type type; @@ -35,9 +35,9 @@ public final class ObjectDecoder implements Decodeable implements Decodeable implements Decodeable 序列化的数据类型 */ @SuppressWarnings("unchecked") -public final class ObjectEncoder implements Encodeable { +public class ObjectEncoder implements Encodeable { static final Type[] TYPEZERO = new Type[0]; @@ -32,9 +32,9 @@ public final class ObjectEncoder implements Encodeable implements Encodeable implements Encodeable implements Decodeable, Encodeable { - private Type type; + protected Type type; @Override public abstract void convertTo(final W out, final T value); diff --git a/src/org/redkale/convert/StreamDecoder.java b/src/org/redkale/convert/StreamDecoder.java index f37543e66..1570477dc 100644 --- a/src/org/redkale/convert/StreamDecoder.java +++ b/src/org/redkale/convert/StreamDecoder.java @@ -22,19 +22,19 @@ import java.util.stream.Stream; * @param 反解析的集合元素类型 */ @SuppressWarnings("unchecked") -public final class StreamDecoder implements Decodeable> { +public class StreamDecoder implements Decodeable> { - private final Type type; + protected final Type type; - private final Type componentType; + protected final Type componentType; protected Creator> creator; protected final Decodeable decoder; - private boolean inited = false; + protected boolean inited = false; - private final Object lock = new Object(); + protected final Object lock = new Object(); public StreamDecoder(final ConvertFactory factory, final Type type) { this.type = type; diff --git a/src/org/redkale/convert/StreamEncoder.java b/src/org/redkale/convert/StreamEncoder.java index 4e1052820..2183431c7 100644 --- a/src/org/redkale/convert/StreamEncoder.java +++ b/src/org/redkale/convert/StreamEncoder.java @@ -19,15 +19,15 @@ import java.util.stream.Stream; * @param 序列化的集合元素类型 */ @SuppressWarnings("unchecked") -public final class StreamEncoder implements Encodeable> { +public class StreamEncoder implements Encodeable> { - private final Type type; + protected final Type type; - private final Encodeable encoder; + protected final Encodeable encoder; - private boolean inited = false; + protected boolean inited = false; - private final Object lock = new Object(); + protected final Object lock = new Object(); public StreamEncoder(final ConvertFactory factory, final Type type) { this.type = type; diff --git a/src/org/redkale/convert/bson/BsonFactory.java b/src/org/redkale/convert/bson/BsonFactory.java index ee1376c2c..6ecb253d2 100644 --- a/src/org/redkale/convert/bson/BsonFactory.java +++ b/src/org/redkale/convert/bson/BsonFactory.java @@ -7,7 +7,6 @@ package org.redkale.convert.bson; import java.io.Serializable; import org.redkale.convert.*; -import org.redkale.convert.ext.EnumSimpledCoder; import org.redkale.util.AnyValue; /** @@ -51,11 +50,6 @@ public final class BsonFactory extends ConvertFactory { return this; } - @Override - public SimpledCoder createEnumSimpledCoder(Class enumClass) { - return new EnumSimpledCoder(enumClass); - } - public static BsonFactory root() { return instance; } diff --git a/src/org/redkale/convert/json/JsonFactory.java b/src/org/redkale/convert/json/JsonFactory.java index cb2f8bbc2..43c1ddc98 100644 --- a/src/org/redkale/convert/json/JsonFactory.java +++ b/src/org/redkale/convert/json/JsonFactory.java @@ -52,11 +52,6 @@ public final class JsonFactory extends ConvertFactory { return this; } - @Override - public SimpledCoder createEnumSimpledCoder(Class enumClass) { - return new EnumSimpledCoder(enumClass); - } - public static JsonFactory root() { return instance; }