From 2b62cbe455e2ada8002aff04d8af143a45c937b4 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sun, 18 Jun 2017 21:51:20 +0800 Subject: [PATCH] --- src/org/redkale/convert/Convert.java | 14 +++++++++ src/org/redkale/convert/DeMember.java | 4 +-- src/org/redkale/convert/EnMember.java | 4 +-- src/org/redkale/convert/ObjectDecoder.java | 10 ++++-- src/org/redkale/convert/ObjectEncoder.java | 8 +++-- src/org/redkale/convert/bson/BsonConvert.java | 31 ++++++++++++------- src/org/redkale/convert/json/JsonConvert.java | 9 ++++++ src/org/redkale/net/http/WebSocket.java | 9 +++--- src/org/redkale/net/http/WebSocketPacket.java | 9 +++--- src/org/redkale/net/http/WebSocketRunner.java | 6 ++-- 10 files changed, 72 insertions(+), 32 deletions(-) diff --git a/src/org/redkale/convert/Convert.java b/src/org/redkale/convert/Convert.java index 21c737530..c4caa83c0 100644 --- a/src/org/redkale/convert/Convert.java +++ b/src/org/redkale/convert/Convert.java @@ -5,6 +5,10 @@ */ package org.redkale.convert; +import java.lang.reflect.Type; +import java.nio.ByteBuffer; +import java.util.function.Supplier; + /** * 序列化/反序列化操作类 * @@ -26,4 +30,14 @@ public abstract class Convert { public ConvertFactory getFactory() { return this.factory; } + + public abstract boolean isBinary(); + + public abstract T convertFrom(final Type type, final ByteBuffer... buffers); + + public abstract T convertFrom(final Type type, final ConvertMask mask, final ByteBuffer... buffers); + + public abstract ByteBuffer[] convertTo(final Supplier supplier, final Object value); + + public abstract ByteBuffer[] convertTo(final Supplier supplier, final Type type, final Object value); } diff --git a/src/org/redkale/convert/DeMember.java b/src/org/redkale/convert/DeMember.java index ee31e9ef8..53409f050 100644 --- a/src/org/redkale/convert/DeMember.java +++ b/src/org/redkale/convert/DeMember.java @@ -76,8 +76,8 @@ public final class DeMember implements Comparable o) { - if (o == null) return 1; - if (this.index != o.index) return this.index - o.index; + if (o == null) return -1; + if (this.index != o.index) return (this.index == 0 ? Integer.MAX_VALUE : this.index) - (o.index == 0 ? Integer.MAX_VALUE : o.index); return this.attribute.field().compareTo(o.attribute.field()); } diff --git a/src/org/redkale/convert/EnMember.java b/src/org/redkale/convert/EnMember.java index c3c5da6c5..5336d057c 100644 --- a/src/org/redkale/convert/EnMember.java +++ b/src/org/redkale/convert/EnMember.java @@ -69,8 +69,8 @@ public final class EnMember implements Comparable o) { - if (o == null) return 1; - if (this.index != o.index) return this.index - o.index; + if (o == null) return -1; + if (this.index != o.index) return (this.index == 0 ? Integer.MAX_VALUE : this.index) - (o.index == 0 ? Integer.MAX_VALUE : o.index); return this.attribute.field().compareTo(o.attribute.field()); } diff --git a/src/org/redkale/convert/ObjectDecoder.java b/src/org/redkale/convert/ObjectDecoder.java index 29fa37187..d882b7eb5 100644 --- a/src/org/redkale/convert/ObjectDecoder.java +++ b/src/org/redkale/convert/ObjectDecoder.java @@ -68,7 +68,7 @@ public final class ObjectDecoder implements Decodeable list = new HashSet(); final String[] cps = ObjectEncoder.findConstructorProperties(this.creator); try { @@ -78,7 +78,9 @@ public final class ObjectDecoder implements Decodeable implements Decodeable implements Encodeable implements Encodeable { return BsonFactory.root().getConvert(); } + @Override + public boolean isBinary() { + return true; + } + //------------------------------ reader ----------------------------------------------------------- public BsonReader pollBsonReader(final ByteBuffer... buffers) { return new BsonByteBufferReader((ConvertMask) null, buffers); @@ -114,11 +119,13 @@ public final class BsonConvert extends Convert { return (T) factory.loadDecoder(type).convertFrom(new BsonStreamReader(in)); } + @Override public T convertFrom(final Type type, final ByteBuffer... buffers) { if (type == null || buffers.length < 1) return null; return (T) factory.loadDecoder(type).convertFrom(new BsonByteBufferReader((ConvertMask) null, buffers)); } + @Override public T convertFrom(final Type type, final ConvertMask mask, final ByteBuffer... buffers) { if (type == null || buffers.length < 1) return null; return (T) factory.loadDecoder(type).convertFrom(new BsonByteBufferReader(mask, buffers)); @@ -169,17 +176,7 @@ public final class BsonConvert extends Convert { } } - public ByteBuffer[] convertTo(final Supplier supplier, final Type type, final Object value) { - if (supplier == null || type == null) return null; - BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier); - if (value == null) { - out.writeNull(); - } else { - factory.loadEncoder(type).convertTo(out, value); - } - return out.toBuffers(); - } - + @Override public ByteBuffer[] convertTo(final Supplier supplier, final Object value) { if (supplier == null) return null; BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier); @@ -191,6 +188,18 @@ public final class BsonConvert extends Convert { return out.toBuffers(); } + @Override + public ByteBuffer[] convertTo(final Supplier supplier, final Type type, final Object value) { + if (supplier == null || type == null) return null; + BsonByteBufferWriter out = new BsonByteBufferWriter(tiny, supplier); + if (value == null) { + out.writeNull(); + } else { + factory.loadEncoder(type).convertTo(out, value); + } + return out.toBuffers(); + } + public void convertTo(final BsonWriter writer, final Object value) { if (value == null) { writer.writeNull(); diff --git a/src/org/redkale/convert/json/JsonConvert.java b/src/org/redkale/convert/json/JsonConvert.java index ed3ccbce8..d577ede67 100644 --- a/src/org/redkale/convert/json/JsonConvert.java +++ b/src/org/redkale/convert/json/JsonConvert.java @@ -46,6 +46,11 @@ public final class JsonConvert extends Convert { return JsonFactory.root().getConvert(); } + @Override + public boolean isBinary() { + return false; + } + //------------------------------ reader ----------------------------------------------------------- public JsonReader pollJsonReader(final ByteBuffer... buffers) { return new JsonByteBufferReader((ConvertMask) null, buffers); @@ -109,11 +114,13 @@ public final class JsonConvert extends Convert { return (T) factory.loadDecoder(type).convertFrom(new JsonStreamReader(in)); } + @Override public T convertFrom(final Type type, final ByteBuffer... buffers) { if (type == null || buffers == null || buffers.length == 0) return null; return (T) factory.loadDecoder(type).convertFrom(new JsonByteBufferReader((ConvertMask) null, buffers)); } + @Override public T convertFrom(final Type type, final ConvertMask mask, final ByteBuffer... buffers) { if (type == null || buffers == null || buffers.length == 0) return null; return (T) factory.loadDecoder(type).convertFrom(new JsonByteBufferReader(mask, buffers)); @@ -159,6 +166,7 @@ public final class JsonConvert extends Convert { } } + @Override public ByteBuffer[] convertTo(final Supplier supplier, final Object value) { if (supplier == null) return null; JsonByteBufferWriter out = new JsonByteBufferWriter(tiny, null, supplier); @@ -170,6 +178,7 @@ public final class JsonConvert extends Convert { return out.toBuffers(); } + @Override public ByteBuffer[] convertTo(final Supplier supplier, final Type type, final Object value) { if (supplier == null || type == null) return null; JsonByteBufferWriter out = new JsonByteBufferWriter(tiny, null, supplier); diff --git a/src/org/redkale/net/http/WebSocket.java b/src/org/redkale/net/http/WebSocket.java index fb09e8098..175a9c640 100644 --- a/src/org/redkale/net/http/WebSocket.java +++ b/src/org/redkale/net/http/WebSocket.java @@ -13,6 +13,7 @@ import java.util.*; import java.util.concurrent.*; import java.util.function.Supplier; import java.util.stream.Stream; +import org.redkale.convert.Convert; import org.redkale.convert.json.JsonConvert; import org.redkale.net.*; import org.redkale.util.Comment; @@ -152,25 +153,25 @@ public abstract class WebSocket { /** * 给自身发送消息, 消息类型是JavaBean对象 * - * @param convert JsonConvert + * @param convert Convert * @param message 不可为空, 只能是JSON对象 * * @return 0表示成功, 非0表示错误码 */ - public final CompletableFuture send(JsonConvert convert, Object message) { + public final CompletableFuture send(Convert convert, Object message) { return send(convert, message, true); } /** * 给自身发送消息, 消息类型是JavaBean对象 * - * @param convert JsonConvert + * @param convert Convert * @param message 不可为空, 只能是JavaBean对象 * @param last 是否最后一条 * * @return 0表示成功, 非0表示错误码 */ - public final CompletableFuture send(JsonConvert convert, Object message, boolean last) { + public final CompletableFuture send(Convert convert, Object message, boolean last) { if (message instanceof CompletableFuture) { return ((CompletableFuture) message).thenCompose((json) -> sendPacket(new WebSocketPacket(convert == null ? _jsonConvert : convert, json, last))); } diff --git a/src/org/redkale/net/http/WebSocketPacket.java b/src/org/redkale/net/http/WebSocketPacket.java index cd7c12eaf..4192e5fb1 100644 --- a/src/org/redkale/net/http/WebSocketPacket.java +++ b/src/org/redkale/net/http/WebSocketPacket.java @@ -10,8 +10,7 @@ import java.io.*; import java.nio.ByteBuffer; import java.util.function.Supplier; import java.util.logging.*; -import org.redkale.convert.ConvertMask; -import org.redkale.convert.json.JsonConvert; +import org.redkale.convert.*; /** * @@ -60,7 +59,7 @@ public final class WebSocketPacket { protected Object sendJson; - JsonConvert sendConvert; + Convert sendConvert; ByteBuffer[] sendBuffers; @@ -93,8 +92,8 @@ public final class WebSocketPacket { this.last = fin; } - public WebSocketPacket(JsonConvert convert, Object json, boolean fin) { - this.type = FrameType.TEXT; + public WebSocketPacket(Convert convert, Object json, boolean fin) { + this.type = (convert == null || !convert.isBinary()) ? FrameType.TEXT : FrameType.BINARY; this.sendConvert = convert; this.sendJson = json; this.last = fin; diff --git a/src/org/redkale/net/http/WebSocketRunner.java b/src/org/redkale/net/http/WebSocketRunner.java index d8e7c4955..02d9ebe17 100644 --- a/src/org/redkale/net/http/WebSocketRunner.java +++ b/src/org/redkale/net/http/WebSocketRunner.java @@ -50,7 +50,7 @@ class WebSocketRunner implements Runnable { protected long lastSendTime; - protected final JsonConvert convert; + protected final JsonConvert textConvert; WebSocketRunner(Context context, WebSocket webSocket, BiConsumer messageConsumer, AsyncConnection channel, final boolean wsbinary) { this.context = context; @@ -60,7 +60,7 @@ class WebSocketRunner implements Runnable { this.channel = channel; this.wsbinary = wsbinary; this.readBuffer = context.pollBuffer(); - this.convert = context.getJsonConvert(); + this.textConvert = context.getJsonConvert(); } @Override @@ -118,7 +118,7 @@ class WebSocketRunner implements Runnable { } if (packet.type == FrameType.TEXT) { - Object message = convert.convertFrom(webSocket._messageTextType, packet.receiveMasker, packet.receiveBuffers); + Object message = textConvert.convertFrom(webSocket._messageTextType, packet.receiveMasker, packet.receiveBuffers); if (readBuffer != null) { readBuffer.clear(); channel.read(readBuffer, null, this);