From ef8a137c372f4b8cfb4b4b583026b41509d29de1 Mon Sep 17 00:00:00 2001 From: kamhung <22250530@qq.com> Date: Mon, 7 Dec 2015 17:03:18 +0800 Subject: [PATCH] --- src/com/wentch/redkale/net/Request.java | 13 ++- .../wentch/redkale/net/http/HttpContext.java | 9 -- .../wentch/redkale/net/http/HttpRequest.java | 25 +++--- .../wentch/redkale/net/http/HttpResponse.java | 6 +- .../wentch/redkale/net/http/HttpServer.java | 2 +- src/com/wentch/redkale/net/sncp/SncpCall.java | 24 ++++++ .../wentch/redkale/net/sncp/SncpContext.java | 52 ------------ .../wentch/redkale/net/sncp/SncpRequest.java | 4 +- .../wentch/redkale/net/sncp/SncpServer.java | 4 +- .../redkale/service/DataSourceService.java | 5 +- .../redkale/source/EntityCallAttribute.java | 82 +++++++++++++++++++ src/com/wentch/redkale/source/EntityInfo.java | 2 +- 12 files changed, 142 insertions(+), 86 deletions(-) create mode 100644 src/com/wentch/redkale/net/sncp/SncpCall.java delete mode 100644 src/com/wentch/redkale/net/sncp/SncpContext.java create mode 100644 src/com/wentch/redkale/source/EntityCallAttribute.java diff --git a/src/com/wentch/redkale/net/Request.java b/src/com/wentch/redkale/net/Request.java index fb5459ab3..fa9c2d1b1 100644 --- a/src/com/wentch/redkale/net/Request.java +++ b/src/com/wentch/redkale/net/Request.java @@ -5,6 +5,8 @@ */ package com.wentch.redkale.net; +import com.wentch.redkale.convert.bson.*; +import com.wentch.redkale.convert.json.*; import java.nio.*; import java.util.*; @@ -16,6 +18,10 @@ public abstract class Request { protected final Context context; + protected final BsonConvert bsonConvert; + + protected final JsonConvert jsonConvert; + protected long createtime; protected boolean keepAlive; @@ -32,6 +38,8 @@ public abstract class Request { protected Request(Context context) { this.context = context; + this.bsonConvert = context.getBsonConvert(); + this.jsonConvert = context.getJsonConvert(); } /** @@ -44,8 +52,9 @@ public abstract class Request { /** * 读取buffer,并返回读取的有效数据长度 - @param buffer - @return + * + * @param buffer + * @return */ protected abstract int readBody(ByteBuffer buffer); diff --git a/src/com/wentch/redkale/net/http/HttpContext.java b/src/com/wentch/redkale/net/http/HttpContext.java index 6c7b26756..292daa440 100644 --- a/src/com/wentch/redkale/net/http/HttpContext.java +++ b/src/com/wentch/redkale/net/http/HttpContext.java @@ -5,8 +5,6 @@ */ package com.wentch.redkale.net.http; -import com.wentch.redkale.convert.bson.*; -import com.wentch.redkale.convert.json.*; import com.wentch.redkale.net.*; import com.wentch.redkale.util.*; import com.wentch.redkale.watch.*; @@ -58,11 +56,4 @@ public final class HttpContext extends Context { return responsePool; } - protected JsonFactory getJsonFactory() { - return jsonFactory; - } - - protected BsonFactory getBsonFactory() { - return bsonFactory; - } } diff --git a/src/com/wentch/redkale/net/http/HttpRequest.java b/src/com/wentch/redkale/net/http/HttpRequest.java index b911cbec7..a39740dc2 100644 --- a/src/com/wentch/redkale/net/http/HttpRequest.java +++ b/src/com/wentch/redkale/net/http/HttpRequest.java @@ -5,8 +5,8 @@ */ package com.wentch.redkale.net.http; -import com.wentch.redkale.util.ByteArray; import com.wentch.redkale.convert.json.*; +import com.wentch.redkale.util.ByteArray; import com.wentch.redkale.net.*; import com.wentch.redkale.util.AnyValue.DefaultAnyValue; import java.io.*; @@ -49,8 +49,6 @@ public class HttpRequest extends Request { protected String newsessionid; - protected final JsonConvert convert; - protected final DefaultAnyValue header = new DefaultAnyValue(); protected final DefaultAnyValue params = new DefaultAnyValue(); @@ -65,9 +63,8 @@ public class HttpRequest extends Request { private final String remoteAddrHeader; - public HttpRequest(Context context, JsonFactory factory, String remoteAddrHeader) { + public HttpRequest(Context context, String remoteAddrHeader) { super(context); - this.convert = factory.getConvert(); this.remoteAddrHeader = remoteAddrHeader; } @@ -82,6 +79,10 @@ public class HttpRequest extends Request { protected AsyncConnection getChannel() { return this.channel; } + + protected JsonConvert getJsonConvert(){ + return this.jsonConvert; + } @Override protected int readHeader(final ByteBuffer buffer) { @@ -270,11 +271,11 @@ public class HttpRequest extends Request { public final MultiContext getMultiContext() { return new MultiContext(context.getCharset(), this.getContentType(), new BufferedInputStream(Channels.newInputStream(this.channel), Math.max(array.count(), 8192)) { - { - array.write(this.buf); - this.count = array.count(); - } - }); + { + array.write(this.buf); + this.count = array.count(); + } + }); } @Override @@ -446,7 +447,7 @@ public class HttpRequest extends Request { public T getJsonHeader(Class clazz, String name) { String v = getHeader(name); - return v == null || v.isEmpty() ? null : convert.convertFrom(clazz, v); + return v == null || v.isEmpty() ? null : jsonConvert.convertFrom(clazz, v); } public boolean getBooleanHeader(String name, boolean defaultValue) { @@ -490,7 +491,7 @@ public class HttpRequest extends Request { public T getJsonParameter(Class clazz, String name) { String v = getParameter(name); - return v == null || v.isEmpty() ? null : convert.convertFrom(clazz, v); + return v == null || v.isEmpty() ? null : jsonConvert.convertFrom(clazz, v); } public boolean getBooleanParameter(String name, boolean defaultValue) { diff --git a/src/com/wentch/redkale/net/http/HttpResponse.java b/src/com/wentch/redkale/net/http/HttpResponse.java index 2e897dccf..3ef352570 100644 --- a/src/com/wentch/redkale/net/http/HttpResponse.java +++ b/src/com/wentch/redkale/net/http/HttpResponse.java @@ -182,17 +182,17 @@ public class HttpResponse extends Response { public void finishJson(Object obj) { this.contentType = "text/plain; charset=utf-8"; - finish(request.convert.convertTo(context.getCharset(), context.getBufferSupplier(), obj)); + finish(request.getJsonConvert().convertTo(context.getCharset(), context.getBufferSupplier(), obj)); } public void finishJson(Type type, Object obj) { this.contentType = "text/plain; charset=utf-8"; - finish(request.convert.convertTo(context.getCharset(), context.getBufferSupplier(), type, obj)); + finish(request.getJsonConvert().convertTo(context.getCharset(), context.getBufferSupplier(), type, obj)); } public void finishJson(Object... objs) { this.contentType = "text/plain; charset=utf-8"; - finish(request.convert.convertTo(context.getCharset(), context.getBufferSupplier(), objs)); + finish(request.getJsonConvert().convertTo(context.getCharset(), context.getBufferSupplier(), objs)); } public void finish(String obj) { diff --git a/src/com/wentch/redkale/net/http/HttpServer.java b/src/com/wentch/redkale/net/http/HttpServer.java index 612ef4cb2..375671a6a 100644 --- a/src/com/wentch/redkale/net/http/HttpServer.java +++ b/src/com/wentch/redkale/net/http/HttpServer.java @@ -120,7 +120,7 @@ public final class HttpServer extends Server { ObjectPool responsePool = HttpResponse.createPool(createResponseCounter, cycleResponseCounter, this.responsePoolSize, null); HttpContext httpcontext = new HttpContext(this.serverStartTime, this.logger, executor, rcapacity, bufferPool, responsePool, this.maxbody, this.charset, this.address, this.prepare, this.watch, this.readTimeoutSecond, this.writeTimeoutSecond, contextPath); - responsePool.setCreator((Object... params) -> new HttpResponse(httpcontext, new HttpRequest(httpcontext, httpcontext.getJsonFactory(), addrHeader), addHeaders, setHeaders, defCookie)); + responsePool.setCreator((Object... params) -> new HttpResponse(httpcontext, new HttpRequest(httpcontext, addrHeader), addHeaders, setHeaders, defCookie)); return httpcontext; } diff --git a/src/com/wentch/redkale/net/sncp/SncpCall.java b/src/com/wentch/redkale/net/sncp/SncpCall.java new file mode 100644 index 000000000..9dd31bb1e --- /dev/null +++ b/src/com/wentch/redkale/net/sncp/SncpCall.java @@ -0,0 +1,24 @@ +/* + * 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.net.sncp; + +import com.wentch.redkale.util.*; +import java.lang.annotation.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 参数回写 + * + * @author zhangjx + */ +@Inherited +@Documented +@Target({ElementType.PARAMETER}) +@Retention(RUNTIME) +public @interface SncpCall { + + Class value(); +} diff --git a/src/com/wentch/redkale/net/sncp/SncpContext.java b/src/com/wentch/redkale/net/sncp/SncpContext.java deleted file mode 100644 index ec78030b2..000000000 --- a/src/com/wentch/redkale/net/sncp/SncpContext.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.net.sncp; - -import com.wentch.redkale.convert.bson.*; -import com.wentch.redkale.convert.json.*; -import com.wentch.redkale.net.*; -import com.wentch.redkale.util.*; -import com.wentch.redkale.watch.*; -import java.net.*; -import java.nio.*; -import java.nio.charset.*; -import java.util.concurrent.*; -import java.util.logging.*; - -/** - * - * @author zhangjx - */ -public final class SncpContext extends Context { - - public SncpContext(long serverStartTime, Logger logger, ExecutorService executor, int bufferCapacity, ObjectPool bufferPool, - ObjectPool responsePool, int maxbody, Charset charset, InetSocketAddress address, PrepareServlet prepare, - WatchFactory watch, int readTimeoutSecond, int writeTimeoutSecond) { - super(serverStartTime, logger, executor, bufferCapacity, bufferPool, responsePool, maxbody, charset, - address, prepare, watch, readTimeoutSecond, writeTimeoutSecond); - - } - - protected WatchFactory getWatchFactory() { - return watch; - } - - protected ExecutorService getExecutor() { - return executor; - } - - protected ObjectPool getResponsePool() { - return responsePool; - } - - protected JsonFactory getJsonFactory() { - return jsonFactory; - } - - protected BsonFactory getBsonFactory() { - return bsonFactory; - } -} diff --git a/src/com/wentch/redkale/net/sncp/SncpRequest.java b/src/com/wentch/redkale/net/sncp/SncpRequest.java index 3aa3c7034..34a9342f1 100644 --- a/src/com/wentch/redkale/net/sncp/SncpRequest.java +++ b/src/com/wentch/redkale/net/sncp/SncpRequest.java @@ -43,9 +43,9 @@ public final class SncpRequest extends Request { private byte[] bufferbytes = new byte[6]; - protected SncpRequest(SncpContext context, BsonFactory factory) { + protected SncpRequest(Context context) { super(context); - this.convert = factory.getConvert(); + this.convert = context.getBsonConvert(); } @Override diff --git a/src/com/wentch/redkale/net/sncp/SncpServer.java b/src/com/wentch/redkale/net/sncp/SncpServer.java index d3f338cfe..4c464351f 100644 --- a/src/com/wentch/redkale/net/sncp/SncpServer.java +++ b/src/com/wentch/redkale/net/sncp/SncpServer.java @@ -57,9 +57,9 @@ public final class SncpServer extends Server { AtomicLong createResponseCounter = watch == null ? new AtomicLong() : watch.createWatchNumber("SNCP_" + port + ".Response.creatCounter"); AtomicLong cycleResponseCounter = watch == null ? new AtomicLong() : watch.createWatchNumber("SNCP_" + port + ".Response.cycleCounter"); ObjectPool responsePool = SncpResponse.createPool(createResponseCounter, cycleResponseCounter, this.responsePoolSize, null); - SncpContext sncpcontext = new SncpContext(this.serverStartTime, this.logger, executor, rcapacity, bufferPool, responsePool, + Context sncpcontext = new Context(this.serverStartTime, this.logger, executor, rcapacity, bufferPool, responsePool, this.maxbody, this.charset, this.address, this.prepare, this.watch, this.readTimeoutSecond, this.writeTimeoutSecond); - responsePool.setCreator((Object... params) -> new SncpResponse(sncpcontext, new SncpRequest(sncpcontext, sncpcontext.getBsonFactory()))); + responsePool.setCreator((Object... params) -> new SncpResponse(sncpcontext, new SncpRequest(sncpcontext))); return sncpcontext; } diff --git a/src/com/wentch/redkale/service/DataSourceService.java b/src/com/wentch/redkale/service/DataSourceService.java index 08af5ea97..50d16bb8e 100644 --- a/src/com/wentch/redkale/service/DataSourceService.java +++ b/src/com/wentch/redkale/service/DataSourceService.java @@ -5,6 +5,7 @@ */ package com.wentch.redkale.service; +import com.wentch.redkale.net.sncp.*; import com.wentch.redkale.source.*; import com.wentch.redkale.util.*; import java.io.*; @@ -32,12 +33,12 @@ public class DataSourceService implements DataSource, Service { } @Override - public void insert(T... values) { + public void insert(@SncpCall(EntityCallAttribute.class) T... values) { source.insert(values); } @Override - public void insert(DataConnection conn, T... values) { + public void insert(DataConnection conn, @SncpCall(EntityCallAttribute.class) T... values) { source.insert(conn, values); } diff --git a/src/com/wentch/redkale/source/EntityCallAttribute.java b/src/com/wentch/redkale/source/EntityCallAttribute.java new file mode 100644 index 000000000..f9ffd22f6 --- /dev/null +++ b/src/com/wentch/redkale/source/EntityCallAttribute.java @@ -0,0 +1,82 @@ +/* + * 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.source; + +import com.wentch.redkale.util.*; +import java.lang.reflect.*; +import java.util.concurrent.*; + +/** + * + * @author zhangjx + * @param + * @param + */ +public final class EntityCallAttribute implements Attribute { + + public static final EntityCallAttribute instance = new EntityCallAttribute(); + + private static final ConcurrentHashMap attributes = new ConcurrentHashMap<>(); + + private static Attribute load(final Class clazz) { + Attribute rs = attributes.get(clazz); + if (rs != null) return rs; + synchronized (attributes) { + rs = attributes.get(clazz); + if (rs == null) { + Class cltmp = clazz; + do { + for (Field field : cltmp.getDeclaredFields()) { + if (field.getAnnotation(javax.persistence.Id.class) == null) continue; + try { + rs = Attribute.create(cltmp, field); + attributes.put(clazz, rs); + return rs; + } catch (RuntimeException e) { + } + } + } while ((cltmp = cltmp.getSuperclass()) != Object.class); + } + return rs; + } + } + + @Override + public Class type() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public Class declaringClass() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public String field() { + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + @Override + public F[] get(final T[] objs) { + if (objs == null || objs.length == 0) return null; + final Attribute attr = (Attribute) load(objs[0].getClass()); + final F[] keys = (F[]) Array.newInstance(attr.type(), objs.length); + for (int i = 0; i < objs.length; i++) { + keys[i] = attr.get(objs[i]); + } + return keys; + } + + @Override + public void set(final T[] objs, final F[] keys) { + if (objs == null || objs.length == 0) return; + final Attribute attr = (Attribute) load(objs[0].getClass()); + for (int i = 0; i < objs.length; i++) { + attr.set(objs[i], (F) keys[i]); + } + } + +} diff --git a/src/com/wentch/redkale/source/EntityInfo.java b/src/com/wentch/redkale/source/EntityInfo.java index 5b6a8a82d..0af5ccf87 100644 --- a/src/com/wentch/redkale/source/EntityInfo.java +++ b/src/com/wentch/redkale/source/EntityInfo.java @@ -108,7 +108,7 @@ public final class EntityInfo { } } - public static EntityInfo get(Class clazz) { + static EntityInfo get(Class clazz) { return entityInfos.get(clazz); }