This commit is contained in:
kamhung
2015-12-07 17:03:18 +08:00
parent 10a0dd8406
commit ef8a137c37
12 changed files with 142 additions and 86 deletions

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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> T getJsonHeader(Class<T> 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> T getJsonParameter(Class<T> 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) {

View File

@@ -182,17 +182,17 @@ public class HttpResponse<R extends HttpRequest> extends Response<R> {
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) {

View File

@@ -120,7 +120,7 @@ public final class HttpServer extends Server {
ObjectPool<Response> 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;
}

View File

@@ -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<? extends Attribute> value();
}

View File

@@ -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<ByteBuffer> bufferPool,
ObjectPool<Response> 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<Response> getResponsePool() {
return responsePool;
}
protected JsonFactory getJsonFactory() {
return jsonFactory;
}
protected BsonFactory getBsonFactory() {
return bsonFactory;
}
}

View File

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

View File

@@ -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<Response> 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;
}

View File

@@ -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 <T> void insert(T... values) {
public <T> void insert(@SncpCall(EntityCallAttribute.class) T... values) {
source.insert(values);
}
@Override
public <T> void insert(DataConnection conn, T... values) {
public <T> void insert(DataConnection conn, @SncpCall(EntityCallAttribute.class) T... values) {
source.insert(conn, values);
}

View File

@@ -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 <T>
* @param <F>
*/
public final class EntityCallAttribute<T, F> implements Attribute<T[], F[]> {
public static final EntityCallAttribute instance = new EntityCallAttribute();
private static final ConcurrentHashMap<Class, Attribute> 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<? extends F[]> type() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public Class<T[]> 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<T, F> attr = (Attribute<T, F>) 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<T, F> attr = (Attribute<T, F>) load(objs[0].getClass());
for (int i = 0; i < objs.length; i++) {
attr.set(objs[i], (F) keys[i]);
}
}
}

View File

@@ -108,7 +108,7 @@ public final class EntityInfo<T> {
}
}
public static <T> EntityInfo<T> get(Class<T> clazz) {
static <T> EntityInfo<T> get(Class<T> clazz) {
return entityInfos.get(clazz);
}