From 7b6e4a9a94c1da859c5af2f8493224abb2184bf6 Mon Sep 17 00:00:00 2001 From: wentch <22250530@qq.com> Date: Mon, 14 Dec 2015 14:36:39 +0800 Subject: [PATCH] --- src/org/redkale/convert/HashedMap.java | 3 +- .../convert/ext/DLongSimpledCoder.java | 13 ++-- .../convert/json/DLongJsonSimpledCoder.java | 33 ++++++++++ src/org/redkale/convert/json/JsonFactory.java | 2 + src/org/redkale/net/sncp/Sncp.java | 2 +- src/org/redkale/net/sncp/SncpClient.java | 9 ++- src/org/redkale/net/sncp/SncpRequest.java | 4 +- src/org/redkale/net/sncp/SncpResponse.java | 3 +- src/org/redkale/util/DLong.java | 65 ++++++++++++------- src/org/redkale/util/Utility.java | 4 ++ 10 files changed, 100 insertions(+), 38 deletions(-) create mode 100644 src/org/redkale/convert/json/DLongJsonSimpledCoder.java diff --git a/src/org/redkale/convert/HashedMap.java b/src/org/redkale/convert/HashedMap.java index f30dd9385..b7a6be9e7 100644 --- a/src/org/redkale/convert/HashedMap.java +++ b/src/org/redkale/convert/HashedMap.java @@ -44,8 +44,9 @@ public final class HashedMap { Entry entry = data[index]; while (entry != null) { if (k == entry.key) { + V old = entry.value; entry.value = value; - return entry.value; + return old; } entry = entry.next; } diff --git a/src/org/redkale/convert/ext/DLongSimpledCoder.java b/src/org/redkale/convert/ext/DLongSimpledCoder.java index 9df4bb726..0f190c424 100644 --- a/src/org/redkale/convert/ext/DLongSimpledCoder.java +++ b/src/org/redkale/convert/ext/DLongSimpledCoder.java @@ -8,7 +8,7 @@ package org.redkale.convert.ext; import org.redkale.convert.Reader; import org.redkale.convert.Writer; import org.redkale.convert.SimpledCoder; -import org.redkale.util.DLong; +import org.redkale.util.*; /** * @@ -18,6 +18,8 @@ import org.redkale.util.DLong; */ public final class DLongSimpledCoder extends SimpledCoder { + private static final ByteArraySimpledCoder bsSimpledCoder = ByteArraySimpledCoder.instance; + public static final DLongSimpledCoder instance = new DLongSimpledCoder(); @Override @@ -25,16 +27,15 @@ public final class DLongSimpledCoder extends if (value == null) { out.writeNull(); } else { - out.writeSmallString(value.getFirst() + "_" + value.getSecond()); + bsSimpledCoder.convertTo(out, value.directBytes()); } } @Override public DLong convertFrom(R in) { - String str = in.readString(); - if (str == null) return null; - int pos = str.indexOf('_'); - return new DLong(Long.parseLong(str.substring(0, pos)), Long.parseLong(str.substring(pos + 1))); + byte[] bs = bsSimpledCoder.convertFrom(in); + if (bs == null) return null; + return new DLong(bs); } } diff --git a/src/org/redkale/convert/json/DLongJsonSimpledCoder.java b/src/org/redkale/convert/json/DLongJsonSimpledCoder.java new file mode 100644 index 000000000..70f107110 --- /dev/null +++ b/src/org/redkale/convert/json/DLongJsonSimpledCoder.java @@ -0,0 +1,33 @@ +/* + * 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.convert.json; + +import org.redkale.util.*; + +/** + * + * @author zhangjx + */ +public class DLongJsonSimpledCoder extends JsonSimpledCoder { + + public static final DLongJsonSimpledCoder instance = new DLongJsonSimpledCoder(); + + @Override + public void convertTo(final JsonWriter out, final DLong value) { + if (value == null) { + out.writeNull(); + } else { + out.writeSmallString(value.toString()); + } + } + + @Override + public DLong convertFrom(JsonReader in) { + final String str = in.readString(); + if (str == null) return null; + return new DLong(Utility.hexToBin(str)); + } +} diff --git a/src/org/redkale/convert/json/JsonFactory.java b/src/org/redkale/convert/json/JsonFactory.java index 435ab3496..4b3a38d1f 100644 --- a/src/org/redkale/convert/json/JsonFactory.java +++ b/src/org/redkale/convert/json/JsonFactory.java @@ -9,6 +9,7 @@ import org.redkale.convert.ConvertType; import org.redkale.convert.Factory; import java.io.Serializable; import java.net.*; +import org.redkale.util.*; /** * @@ -21,6 +22,7 @@ public final class JsonFactory extends Factory { static { instance.register(InetAddress.class, InetAddressJsonSimpledCoder.instance); instance.register(InetSocketAddress.class, InetAddressJsonSimpledCoder.InetSocketAddressJsonSimpledCoder.instance); + instance.register(DLong.class, DLongJsonSimpledCoder.instance); instance.register(Serializable.class, instance.loadEncoder(Object.class)); } diff --git a/src/org/redkale/net/sncp/Sncp.java b/src/org/redkale/net/sncp/Sncp.java index 915acbfda..54eb93e95 100644 --- a/src/org/redkale/net/sncp/Sncp.java +++ b/src/org/redkale/net/sncp/Sncp.java @@ -83,7 +83,7 @@ public abstract class Sncp { } public static DLong hash(final java.lang.reflect.Method method) { - if (method == null) return new DLong(-1L, -1L); + if (method == null) return new DLong(new byte[16]); String n = method.getName(); if (n.length() > 11) { StringBuilder sb = new StringBuilder(); diff --git a/src/org/redkale/net/sncp/SncpClient.java b/src/org/redkale/net/sncp/SncpClient.java index 5ce6ea535..a2970a50a 100644 --- a/src/org/redkale/net/sncp/SncpClient.java +++ b/src/org/redkale/net/sncp/SncpClient.java @@ -375,9 +375,9 @@ public final class SncpClient { if (rserviceid != serviceid) throw new RuntimeException("sncp(" + action.method + ") response.serviceid = " + serviceid + ", but request.serviceid =" + rserviceid); long rnameid = buffer.getLong(); if (rnameid != nameid) throw new RuntimeException("sncp(" + action.method + ") response.nameid = " + nameid + ", but receive nameid =" + rnameid); - long ractionid1 = buffer.getLong(); - long ractionid2 = buffer.getLong(); - if (!action.actionid.equals(ractionid1, ractionid2)) throw new RuntimeException("sncp(" + action.method + ") response.actionid = " + action.actionid + ", but request.actionid =(" + ractionid1 + "_" + ractionid2 + ")"); + byte[] bs = new byte[16]; + buffer.get(bs); + if (!action.actionid.equals(bs)) throw new RuntimeException("sncp(" + action.method + ") response.actionid = " + action.actionid + ", but request.actionid =(" + Utility.binToHexString(bs) + ")"); buffer.getInt(); //地址 buffer.getChar(); //端口 } @@ -390,8 +390,7 @@ public final class SncpClient { buffer.putChar((char) HEADER_SIZE); //header长度 buffer.putLong(this.serviceid); buffer.putLong(this.nameid); - buffer.putLong(actionid.getFirst()); - buffer.putLong(actionid.getSecond()); + actionid.putTo(buffer); buffer.put(addrBytes[0]); buffer.put(addrBytes[1]); buffer.put(addrBytes[2]); diff --git a/src/org/redkale/net/sncp/SncpRequest.java b/src/org/redkale/net/sncp/SncpRequest.java index 7fc9aad16..7ac244cc8 100644 --- a/src/org/redkale/net/sncp/SncpRequest.java +++ b/src/org/redkale/net/sncp/SncpRequest.java @@ -62,7 +62,9 @@ public final class SncpRequest extends Request { } this.serviceid = buffer.getLong(); this.nameid = buffer.getLong(); - this.actionid = new DLong(buffer.getLong(), buffer.getLong()); + byte[] bs = new byte[16]; + buffer.get(bs); + this.actionid = new DLong(bs); buffer.get(bufferbytes); this.bodylength = buffer.getInt(); this.bodyoffset = buffer.getInt(); diff --git a/src/org/redkale/net/sncp/SncpResponse.java b/src/org/redkale/net/sncp/SncpResponse.java index 48c1ffc4e..2e2bd4ee5 100644 --- a/src/org/redkale/net/sncp/SncpResponse.java +++ b/src/org/redkale/net/sncp/SncpResponse.java @@ -70,8 +70,7 @@ public final class SncpResponse extends Response { buffer.putLong(request.getServiceid()); buffer.putLong(request.getNameid()); DLong actionid = request.getActionid(); - buffer.putLong(actionid.getFirst()); - buffer.putLong(actionid.getSecond()); + actionid.putTo(buffer); buffer.put(addrBytes); buffer.putChar((char) this.addrPort); buffer.putInt(bodyLength); diff --git a/src/org/redkale/util/DLong.java b/src/org/redkale/util/DLong.java index dfb81e3bf..302a71d35 100644 --- a/src/org/redkale/util/DLong.java +++ b/src/org/redkale/util/DLong.java @@ -5,32 +5,45 @@ */ package org.redkale.util; +import java.nio.*; +import java.util.*; + /** - * 双long数据结构 + * 16bytes数据结构 + * 注意: 为了提高性能, DLong中的bytes是直接返回, 不得对bytes的内容进行修改。 * * @author zhangjx */ public final class DLong extends Number implements Comparable { - private final long first; + private final byte[] bytes; - private final long second; - - public DLong(long one, long two) { - this.first = one; - this.second = two; + public DLong(long v1, long v2) { + this.bytes = new byte[]{(byte) (v1 >> 56), (byte) (v1 >> 48), (byte) (v1 >> 40), (byte) (v1 >> 32), + (byte) (v1 >> 24), (byte) (v1 >> 16), (byte) (v1 >> 8), (byte) v1, (byte) (v2 >> 56), (byte) (v2 >> 48), (byte) (v2 >> 40), (byte) (v2 >> 32), + (byte) (v2 >> 24), (byte) (v2 >> 16), (byte) (v2 >> 8), (byte) v2}; } - public long getFirst() { - return first; + public DLong(byte[] bytes) { + if (bytes == null || bytes.length != 16) throw new NumberFormatException("Not 16 length bytes"); + this.bytes = bytes; } - public long getSecond() { - return second; + public byte[] getBytes() { + return Arrays.copyOf(bytes, bytes.length); } - public boolean equals(long one, long two) { - return this.first == one && this.second == two; + public byte[] directBytes() { + return bytes; + } + + public ByteBuffer putTo(ByteBuffer buffer) { + buffer.put(bytes); + return buffer; + } + + public boolean equals(byte[] bytes) { + return Arrays.equals(this.bytes, bytes); } @Override @@ -38,30 +51,34 @@ public final class DLong extends Number implements Comparable { if (obj == null) return false; if (getClass() != obj.getClass()) return false; final DLong other = (DLong) obj; - return (this.first == other.first && this.second == other.second); + return Arrays.equals(this.bytes, other.bytes); } @Override public int hashCode() { - int hash = 7; - hash = 89 * hash + (int) (this.first ^ (this.first >>> 32)); - hash = 89 * hash + (int) (this.second ^ (this.second >>> 32)); - return hash; + return Arrays.hashCode(bytes); } @Override public String toString() { - return this.first + "_" + this.second; + return new String(Utility.binToHex(bytes)); } @Override public int intValue() { - return (int) longValue(); + return ((bytes[12] & 0xff) << 24) | ((bytes[113] & 0xff) << 16) | ((bytes[14] & 0xff) << 8) | (bytes[15] & 0xff); } @Override public long longValue() { - return first ^ second; + return ((((long) bytes[8] & 0xff) << 56) + | (((long) bytes[9] & 0xff) << 48) + | (((long) bytes[10] & 0xff) << 40) + | (((long) bytes[11] & 0xff) << 32) + | (((long) bytes[12] & 0xff) << 24) + | (((long) bytes[13] & 0xff) << 16) + | (((long) bytes[14] & 0xff) << 8) + | (((long) bytes[15] & 0xff))); } @Override @@ -76,7 +93,11 @@ public final class DLong extends Number implements Comparable { @Override public int compareTo(DLong o) { - return (int) (first == o.first ? (second - o.second) : (first - o.first)); + if (o == null) return 1; + for (int i = 0; i < bytes.length; i++) { + if (this.bytes[i] != o.bytes[i]) return this.bytes[i] - o.bytes[i]; + } + return 0; } } diff --git a/src/org/redkale/util/Utility.java b/src/org/redkale/util/Utility.java index 6d93720f6..6b0626817 100644 --- a/src/org/redkale/util/Utility.java +++ b/src/org/redkale/util/Utility.java @@ -248,6 +248,10 @@ public final class Utility { return bytes; } + public static byte[] hexToBin(String str) { + return hexToBin(charArray(str)); + } + public static byte[] hexToBin(char[] src) { return hexToBin(src, 0, src.length); }