13 Commits

Author SHA1 Message Date
Redkale
c37b0e8cb5 Redkale 2.0.0.beta5 结束 2019-10-10 09:21:48 +08:00
Redkale
a20570a6eb 2019-10-10 09:17:42 +08:00
Redkale
5e3edb7e1d 2019-10-09 13:43:11 +08:00
Redkale
ad8f1d2da6 增加util.ResourceInjectLoader功能 2019-10-09 13:42:29 +08:00
Redkale
24b23c894f 修复FileSimpledCoder的instance写错的bug 2019-10-09 13:41:39 +08:00
Redkale
c551d5fb81 2019-09-26 16:32:36 +08:00
Redkale
fba43894c1 2019-09-26 16:27:42 +08:00
Redkale
22cc7e086c RetResult增加Convert属性 2019-09-26 16:22:56 +08:00
Redkale
1791008729 2019-09-25 15:41:19 +08:00
Redkale
90e15dd253 2019-09-25 15:40:47 +08:00
Redkale
7db73c076c 2019-09-25 15:33:18 +08:00
Redkale
95ad6e99d9 2019-09-23 18:57:45 +08:00
Redkale
0b2a5d0f61 2019-09-23 08:59:03 +08:00
13 changed files with 161 additions and 19 deletions

View File

@@ -43,7 +43,7 @@ public class BsonWriter extends Writer {
}
protected BsonWriter(byte[] bs) {
this.content = bs;
this.content = bs == null ? new byte[0] : bs;
}
public BsonWriter() {
@@ -102,7 +102,7 @@ public class BsonWriter extends Writer {
super.recycle();
this.count = 0;
this.specify = null;
if (this.content.length > defaultSize) {
if (this.content != null && this.content.length > defaultSize) {
this.content = new byte[defaultSize];
}
return true;

View File

@@ -20,7 +20,7 @@ import org.redkale.convert.*;
*/
public class FileSimpledCoder<R extends Reader, W extends Writer> extends SimpledCoder<R, W, File> {
public static final PatternSimpledCoder instance = new PatternSimpledCoder();
public static final FileSimpledCoder instance = new FileSimpledCoder();
@Override
public void convertTo(W out, File value) {

View File

@@ -102,7 +102,7 @@ public class JsonWriter extends Writer {
super.recycle();
this.count = 0;
this.specify = null;
if (this.content.length > defaultSize) {
if (this.content != null && this.content.length > defaultSize) {
this.content = new char[defaultSize];
}
return true;

View File

@@ -390,7 +390,9 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
this.header.addValue("retcode", String.valueOf(ret.getRetcode()));
this.header.addValue("retinfo", ret.getRetinfo());
}
finish(request.getJsonConvert().convertTo(getBodyBufferSupplier(), ret));
Convert convert = ret == null ? null : ret.convert();
if (convert == null || !(convert instanceof TextConvert)) convert = request.getJsonConvert();
finish(convert.convertTo(getBodyBufferSupplier(), ret));
}
/**
@@ -497,6 +499,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
context.getLogger().log(Level.WARNING, "HttpServlet finish File occur, force to close channel. request = " + getRequest(), e);
finish(500, null);
}
} else if (obj instanceof org.redkale.service.RetResult) {
finishJson((org.redkale.service.RetResult) obj);
} else if (obj instanceof HttpResult) {
HttpResult result = (HttpResult) obj;
if (result.getContentType() != null) setContentType(result.getContentType());
@@ -506,7 +510,9 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
} else if (result.getResult() instanceof CharSequence) {
finish(result.getResult().toString());
} else {
finish(result.getConvert() == null ? convert : result.getConvert(), result.getResult());
Convert cc = result.convert();
if (cc == null || !(cc instanceof TextConvert)) cc = convert;
finish(cc, result.getResult());
}
} else {
if (hasRender) {

View File

@@ -90,12 +90,11 @@ public class HttpResult<T> {
return this;
}
@ConvertDisabled
public Convert getConvert() {
public Convert convert() {
return convert;
}
public void setConvert(Convert convert) {
public void convert(Convert convert) {
this.convert = convert;
}

View File

@@ -860,7 +860,7 @@ public final class Rest {
break;
}
}
if (defmodulename.isEmpty() || (!pound && entrys.size() <= 6)) {
if (defmodulename.isEmpty() || (!pound && entrys.size() <= 2)) {
for (MappingEntry entry : entrys) {
String suburl = (catalog.isEmpty() ? "/" : ("/" + catalog + "/")) + (defmodulename.isEmpty() ? "" : (defmodulename + "/")) + entry.name;
urlpath += "," + suburl;

View File

@@ -562,7 +562,7 @@ public abstract class WebSocketNode {
protected CompletableFuture<Integer> sendOneUserMessage(final Object message, final boolean last, final Serializable userid) {
if (message instanceof CompletableFuture) return ((CompletableFuture) message).thenApply(msg -> sendOneUserMessage(msg, last, userid));
if (logger.isLoggable(Level.FINEST)) {
logger.finest("websocket want send message {userid:" + userid + ", content:'" + (message instanceof WebSocketPacket ? ((WebSocketPacket) message).toSimpleString() : JsonConvert.root().convertTo(message)) + "'} from locale node to " + ((this.localEngine != null) ? "locale" : "remote") + " engine");
logger.finest("websocket want send message {userid:" + userid + ", content:" + (message instanceof WebSocketPacket ? ((WebSocketPacket) message).toSimpleString() : (message instanceof CharSequence ? message : JsonConvert.root().convertTo(message))) + "} from locale node to " + ((this.localEngine != null) ? "locale" : "remote") + " engine");
}
CompletableFuture<Integer> localFuture = null;
if (this.localEngine != null) localFuture = localEngine.sendLocalMessage(message, last, userid);
@@ -596,7 +596,7 @@ public abstract class WebSocketNode {
protected CompletableFuture<Integer> sendOneAddrMessage(final InetSocketAddress sncpAddr, final Object message, final boolean last, final Serializable... userids) {
if (message instanceof CompletableFuture) return ((CompletableFuture) message).thenApply(msg -> sendOneAddrMessage(sncpAddr, msg, last, userids));
if (logger.isLoggable(Level.FINEST)) {
logger.finest("websocket want send message {userids:" + JsonConvert.root().convertTo(userids) + ", sncpaddr:" + sncpAddr + ", content:'" + (message instanceof WebSocketPacket ? ((WebSocketPacket) message).toSimpleString() : JsonConvert.root().convertTo(message)) + "'} from locale node to " + ((this.localEngine != null) ? "locale" : "remote") + " engine");
logger.finest("websocket want send message {userids:" + JsonConvert.root().convertTo(userids) + ", sncpaddr:" + sncpAddr + ", content:" + (message instanceof WebSocketPacket ? ((WebSocketPacket) message).toSimpleString() : (message instanceof CharSequence ? message : JsonConvert.root().convertTo(message))) + "} from locale node to " + ((this.localEngine != null) ? "locale" : "remote") + " engine");
}
if (Objects.equals(sncpAddr, this.localSncpAddress)) {
return this.localEngine == null ? CompletableFuture.completedFuture(RETCODE_GROUP_EMPTY) : localEngine.sendLocalMessage(message, last, userids);

View File

@@ -349,7 +349,12 @@ public final class SncpClient {
final BsonWriter writer = bsonConvert.pollBsonWriter(transport.getBufferSupplier()); // 将head写入
writer.writeTo(DEFAULT_HEADER);
for (int i = 0; i < params.length; i++) { //params 可能包含: 3 个 boolean
bsonConvert.convertTo(writer, CompletionHandler.class.isAssignableFrom(myparamclass[i]) ? CompletionHandler.class : myparamtypes[i], params[i]);
BsonConvert bcc = bsonConvert;
if (params[i] instanceof org.redkale.service.RetResult) {
org.redkale.convert.Convert cc = ((org.redkale.service.RetResult) params[i]).convert();
if (cc instanceof BsonConvert) bcc = (BsonConvert) cc;
}
bcc.convertTo(writer, CompletionHandler.class.isAssignableFrom(myparamclass[i]) ? CompletionHandler.class : myparamtypes[i], params[i]);
}
final int reqBodyLength = writer.count() - HEADER_SIZE; //body总长度
final long seqid = System.nanoTime();

View File

@@ -7,6 +7,7 @@ package org.redkale.service;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import org.redkale.convert.Convert;
import org.redkale.convert.json.*;
import org.redkale.util.Utility;
@@ -33,6 +34,8 @@ public class RetResult<T> {
protected Map<String, String> attach;
protected Convert convert;
public RetResult() {
}
@@ -40,6 +43,11 @@ public class RetResult<T> {
this.result = result;
}
public RetResult(Convert convert, T result) {
this.convert = convert;
this.result = result;
}
public RetResult(int retcode) {
this.retcode = retcode;
}
@@ -55,6 +63,14 @@ public class RetResult<T> {
this.result = result;
}
public Convert convert() {
return convert;
}
public void convert(Convert convert) {
this.convert = convert;
}
public static RetResult success() {
return new RetResult();
}

View File

@@ -17,7 +17,7 @@ public final class Redkale {
}
public static String getDotedVersion() {
return "2.0.0-beta4";
return "2.0.0-beta5";
}
public static int getMajorVersion() {

View File

@@ -5,6 +5,7 @@
*/
package org.redkale.util;
import java.lang.annotation.Annotation;
import java.lang.ref.WeakReference;
import java.lang.reflect.*;
import java.util.*;
@@ -42,12 +43,22 @@ public final class ResourceFactory {
private final List<WeakReference<ResourceFactory>> chidren = new CopyOnWriteArrayList<>();
private final ConcurrentHashMap<Type, ResourceLoader> loadermap = new ConcurrentHashMap();
private final ConcurrentHashMap<Type, ResourceInjectLoader> injectLoaderMap = new ConcurrentHashMap();
private final ConcurrentHashMap<Type, ResourceLoader> resLoaderMap = new ConcurrentHashMap();
private final ConcurrentHashMap<Type, ConcurrentHashMap<String, ResourceEntry>> store = new ConcurrentHashMap();
private ResourceFactory(ResourceFactory parent) {
this.parent = parent;
if (parent == null) {
ServiceLoader<ResourceInjectLoader> loaders = ServiceLoader.load(ResourceInjectLoader.class);
Iterator<ResourceInjectLoader> it = loaders.iterator();
while (it.hasNext()) {
ResourceInjectLoader ril = it.next();
this.injectLoaderMap.put(ril.annotationType(), ril);
}
}
}
/**
@@ -565,6 +576,7 @@ public final class ResourceFactory {
try {
list.add(src);
Class clazz = src.getClass();
final boolean diyloaderflag = !instance.injectLoaderMap.isEmpty();
do {
if (java.lang.Enum.class.isAssignableFrom(clazz)) break;
final String cname = clazz.getName();
@@ -586,6 +598,13 @@ public final class ResourceFactory {
break;
}
}
if (flag && diyloaderflag) {
instance.injectLoaderMap.values().stream().forEach(iloader -> {
Annotation ann = field.getAnnotation(iloader.annotationType());
if (ann == null) return;
iloader.load(this, src, ann, field, attachment);
});
}
if (ns == null) continue;
final String nsname = ns.getClass().getName();
if (ns.getClass().isPrimitive() || ns.getClass().isArray()
@@ -685,16 +704,21 @@ public final class ResourceFactory {
}
}
public <T extends Annotation> void register(final ResourceInjectLoader<T> loader) {
if (loader == null) return;
instance.injectLoaderMap.put(loader.annotationType(), loader);
}
public void register(final ResourceLoader rs, final Type... clazzs) {
if (clazzs == null || rs == null) return;
for (Type clazz : clazzs) {
loadermap.put(clazz, rs);
resLoaderMap.put(clazz, rs);
}
}
private ResourceLoader findMatchLoader(Type ft, Field field) {
ResourceLoader it = this.loadermap.get(ft);
if (it == null && field != null) it = this.loadermap.get(field.getType());
ResourceLoader it = this.resLoaderMap.get(ft);
if (it == null && field != null) it = this.resLoaderMap.get(field.getType());
if (it != null) return it;
return parent == null ? null : parent.findMatchLoader(ft, field);
}
@@ -702,7 +726,7 @@ public final class ResourceFactory {
private ResourceLoader findRegxLoader(Type ft, Field field) {
if (field == null) return null;
Class c = field.getType();
for (Map.Entry<Type, ResourceLoader> en : this.loadermap.entrySet()) {
for (Map.Entry<Type, ResourceLoader> en : this.resLoaderMap.entrySet()) {
Type t = en.getKey();
if (t == ft) return en.getValue();
if (t instanceof Class && (((Class) t)).isAssignableFrom(c)) return en.getValue();

View File

@@ -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 org.redkale.util;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
/**
* 自定义注入加载器
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @param <T> Annotation
*/
public interface ResourceInjectLoader<T extends Annotation> {
public void load(ResourceFactory factory, Object src, T annotation, Field field, Object attachment);
public Class<T> annotationType();
}

View File

@@ -0,0 +1,67 @@
/*
* 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 org.redkale.test.util;
import java.io.File;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.reflect.Field;
import org.redkale.convert.json.JsonConvert;
import org.redkale.util.*;
/**
*
* @author zhangjx
*/
public class ResourceInjectMain {
public static void main(String[] args) throws Throwable {
ResourceFactory factory = ResourceFactory.root();
factory.register(new CustomConfLoader());
InjectBean bean = new InjectBean();
factory.inject(bean);
}
public static class CustomConfLoader implements ResourceInjectLoader<CustomConf> {
@Override
public void load(ResourceFactory factory, Object src, CustomConf annotation, Field field, Object attachment) {
try {
field.set(src, new File(annotation.path()));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("对象是 src =" + src + ", path=" + annotation.path());
}
@Override
public Class<CustomConf> annotationType() {
return CustomConf.class;
}
}
public static class InjectBean {
@CustomConf(path = "conf/test.xml")
public File conf;
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}
@Documented
@Target({FIELD})
@Retention(RUNTIME)
public static @interface CustomConf {
String path();
}
}