From 04e539ab0f0e40583754e349d23ee878cd688b4b Mon Sep 17 00:00:00 2001 From: redkale Date: Sat, 5 Oct 2024 15:30:16 +0800 Subject: [PATCH] ByteTreeNode --- .../org/redkale/convert/DeMemberInfo.java | 14 +++- .../org/redkale/convert/DeMemberNode.java | 67 ------------------- .../convert/json/JsonByteBufferReader.java | 3 +- .../org/redkale/convert/json/JsonReader.java | 3 +- .../java/org/redkale/util/ByteTreeNode.java | 66 ++++++++++++++++++ 5 files changed, 82 insertions(+), 71 deletions(-) delete mode 100644 src/main/java/org/redkale/convert/DeMemberNode.java create mode 100644 src/main/java/org/redkale/util/ByteTreeNode.java diff --git a/src/main/java/org/redkale/convert/DeMemberInfo.java b/src/main/java/org/redkale/convert/DeMemberInfo.java index 564a20b7f..3c138005b 100644 --- a/src/main/java/org/redkale/convert/DeMemberInfo.java +++ b/src/main/java/org/redkale/convert/DeMemberInfo.java @@ -6,6 +6,7 @@ package org.redkale.convert; import java.util.HashMap; import java.util.Map; +import org.redkale.util.ByteTreeNode; /** * 字段的反序列化集合操作类 @@ -29,11 +30,12 @@ public class DeMemberInfo { this.members = deMembers; this.memberFieldMap = new HashMap<>(deMembers.length); this.memberTagMap = new HashMap<>(deMembers.length); + this.memberNode = new DeMemberNode(); for (DeMember member : deMembers) { this.memberFieldMap.put(member.getFieldName(), member); this.memberTagMap.put(member.getTag(), member); + this.memberNode.put(member.getFieldName(), member); } - this.memberNode = DeMemberNode.create(deMembers); } public static DeMemberInfo create(DeMember... deMembers) { @@ -48,7 +50,7 @@ public class DeMemberInfo { return members; } - public DeMemberNode getMemberNode() { + public ByteTreeNode getMemberNode() { return memberNode; } @@ -59,4 +61,12 @@ public class DeMemberInfo { public DeMember getMemberByField(String field) { return memberFieldMap.get(field); } + + protected static class DeMemberNode extends ByteTreeNode { + + @Override + public void put(String key, DeMember value) { + super.put(key, value); + } + } } diff --git a/src/main/java/org/redkale/convert/DeMemberNode.java b/src/main/java/org/redkale/convert/DeMemberNode.java deleted file mode 100644 index 7a6518d7f..000000000 --- a/src/main/java/org/redkale/convert/DeMemberNode.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2016-2116 Redkale - * All rights reserved. - */ -package org.redkale.convert; - -/** - * 字段的反序列化操作类 - * - *

详情见: https://redkale.org - * - * @author zhangjx - * @since 2.8.0 - */ -public class DeMemberNode { - - protected static final int MIN_INDEX = 32; - - protected DeMember value; - - protected DeMemberNode[] nodes = new DeMemberNode[127 - MIN_INDEX]; - - public DeMemberNode getNode(char ch) { - if (ch <= MIN_INDEX || ch > 127) { - return null; - } - return nodes[ch - MIN_INDEX]; - } - - public DeMember getMember(String field) { - char[] chs = field.toCharArray(); - DeMemberNode n = this; - for (int i = 0; i < chs.length; i++) { - n = n.nodes[chs[i] - MIN_INDEX]; - if (n == null) { - break; - } - } - return n == null ? null : n.value; - } - - public DeMember getValue() { - return value; - } - - private void add(DeMember member) { - char[] chs = member.attribute.field().toCharArray(); - DeMemberNode n = this; - for (int i = 0; i < chs.length; i++) { - DeMemberNode s = n.nodes[chs[i] - MIN_INDEX]; - if (s == null) { - s = new DeMemberNode(); - n.nodes[chs[i] - MIN_INDEX] = s; - } - n = s; - } - n.value = member; - } - - public static DeMemberNode create(DeMember... members) { - DeMemberNode root = new DeMemberNode(); - for (DeMember member : members) { - root.add(member); - } - return root; - } -} diff --git a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java index 24a0b6d0b..425fee666 100644 --- a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java +++ b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java @@ -9,6 +9,7 @@ import java.nio.ByteBuffer; import java.nio.charset.UnmappableCharacterException; import org.redkale.convert.*; import static org.redkale.convert.Reader.*; +import org.redkale.util.ByteTreeNode; /** * 以ByteBuffer为数据载体的JsonReader
@@ -595,7 +596,7 @@ public class JsonByteBufferReader extends JsonReader { if (ch == 0) { return null; } - DeMemberNode node = memberInfo.getMemberNode(); + ByteTreeNode node = memberInfo.getMemberNode(); CharArray tmp = array(); if (ch == '"' || ch == '\'') { final char quote = ch; diff --git a/src/main/java/org/redkale/convert/json/JsonReader.java b/src/main/java/org/redkale/convert/json/JsonReader.java index 9b6e0d3a2..e34946e79 100644 --- a/src/main/java/org/redkale/convert/json/JsonReader.java +++ b/src/main/java/org/redkale/convert/json/JsonReader.java @@ -10,6 +10,7 @@ import java.util.*; import org.redkale.convert.*; import static org.redkale.convert.Reader.*; import org.redkale.convert.Reader.ValueType; +import org.redkale.util.ByteTreeNode; import org.redkale.util.Utility; /** @@ -672,7 +673,7 @@ public class JsonReader extends Reader { if (this.position == eof) { return null; } - DeMemberNode node = memberInfo.getMemberNode(); + ByteTreeNode node = memberInfo.getMemberNode(); char ch = nextGoodChar(true); // 需要跳过注释 final char[] text0 = this.text; int curr = this.position; diff --git a/src/main/java/org/redkale/util/ByteTreeNode.java b/src/main/java/org/redkale/util/ByteTreeNode.java new file mode 100644 index 000000000..2a01e0c6a --- /dev/null +++ b/src/main/java/org/redkale/util/ByteTreeNode.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2016-2116 Redkale + * All rights reserved. + */ +package org.redkale.util; + +/** + * byte树对象, key必须是latin1字符串 + * + *

详情见: https://redkale.org + * + * @author zhangjx + * @param T + * @since 2.8.0 + */ +public class ByteTreeNode { + + protected T value; + + protected ByteTreeNode[] nodes = new ByteTreeNode[127]; + + protected ByteTreeNode() {} + + public static ByteTreeNode create() { + return new ByteTreeNode(); + } + + public ByteTreeNode getNode(byte b) { + return b < 0 ? null : nodes[b]; + } + + public ByteTreeNode getNode(char ch) { + return ch >= nodes.length ? null : nodes[ch]; + } + + public T getValue() { + return value; + } + + public T getValue(String key) { + ByteTreeNode n = this; + for (char ch : key.toCharArray()) { + n = n.nodes[ch]; + if (n == null) { + return null; + } + } + return n.value; + } + + protected void put(String key, T value) { + ByteTreeNode n = this; + for (char ch : key.toCharArray()) { + if (ch >= nodes.length) { + throw new RedkaleException(key + " contains illegal char: " + ch); + } + ByteTreeNode s = n.nodes[ch]; + if (s == null) { + s = new ByteTreeNode(); + n.nodes[ch] = s; + } + n = s; + } + n.value = value; + } +}