From 58b29e7565bfe482b71f1f537dd2fa6bcab5275b Mon Sep 17 00:00:00 2001 From: libin Date: Fri, 17 Nov 2023 16:41:20 +0800 Subject: [PATCH] Protocol auto List by order --- .../com/zfoo/protocol/ProtocolManager.java | 4 +-- .../registration/ProtocolAnalysis.java | 33 ++++++++++++++----- .../com/zfoo/protocol/BenchmarkTesting.java | 2 +- .../compatible/CompatibleTesting.java | 5 +-- .../protocol/field/FieldSpeedTesting.java | 2 +- .../protocol/generate/GenerateTesting.java | 3 +- .../storage/export/ExportBinaryTesting.java | 3 +- 7 files changed, 36 insertions(+), 16 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java b/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java index 8b0ec636..f7123fe0 100644 --- a/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java +++ b/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java @@ -139,8 +139,8 @@ public class ProtocolManager { * EN:Register protocol and automatically generates a protocol ID if the subprotocol does not specify a protocol ID * CN:子协议会自动注册协议号protocolId,如果子协议没有指定protocolId则自动生成protocolId */ - public static void initProtocolAuto(Set> protocolClassSet, GenerateOperation generateOperation) { - ProtocolAnalysis.analyzeAuto(protocolClassSet, generateOperation); + public static void initProtocolAuto(List> protocolClassList, GenerateOperation generateOperation) { + ProtocolAnalysis.analyzeAuto(protocolClassList, generateOperation); } } diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java index 42da7d82..4f85f652 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java @@ -17,6 +17,7 @@ import com.zfoo.protocol.anno.Compatible; import com.zfoo.protocol.anno.Protocol; import com.zfoo.protocol.collection.ArrayUtils; import com.zfoo.protocol.collection.CollectionUtils; +import com.zfoo.protocol.exception.AssertException; import com.zfoo.protocol.exception.RunException; import com.zfoo.protocol.exception.UnknownException; import com.zfoo.protocol.generate.GenerateOperation; @@ -126,17 +127,33 @@ public class ProtocolAnalysis { enhance(generateOperation, enhanceList); } - public static synchronized void analyzeAuto(Set> protocolClassSet, GenerateOperation generateOperation) { + public static synchronized void analyzeAuto(List> protocolClassList, GenerateOperation generateOperation) { AssertionUtils.notNull(subProtocolIdMap, "[{}] initialization has already been completed, please do not repeat the initialization", ProtocolManager.class.getSimpleName()); // 获取所有协议类 - var relevantClassSet = new HashSet<>(protocolClassSet); - for (var clazz : protocolClassSet) { - relevantClassSet.addAll(ClassUtils.relevantClass(clazz)); + LinkedHashSet tempProtocolClassSet = new LinkedHashSet<>(protocolClassList); + //去重 + protocolClassList = new ArrayList<>(); + for(Class clazz : tempProtocolClassSet){ + protocolClassList.add(clazz); } - - var relevantClassList = relevantClassSet.stream() + Set relevantClassList = new LinkedHashSet<>(protocolClassList); + for (var clazz : protocolClassList) { + Set> classSet = ClassUtils.relevantClass(clazz); + for(Class cls :classSet){ + if( !relevantClassList.contains(cls)){ + int protocolId = getProtocolIdAndCheckClass(cls); + if(protocolId >= 0){ + relevantClassList.add(cls); + }else{ + throw new AssertException("[class:{}]类型必须声明", cls.getCanonicalName()); + } + } + } + } + //var relevantClassList = relevantClassSet; + /* var relevantClassList = relevantClassSet.stream() .sorted((a, b) -> a.getCanonicalName().compareTo(b.getCanonicalName())) - .toList(); + .toList();*/ // 检查协议类是否合法 var noProtocolIds = new ArrayList>(); @@ -157,7 +174,7 @@ public class ProtocolAnalysis { } // 协议id和协议信息对应起来 - for (var protocolClass : relevantClassSet) { + for (Class protocolClass : relevantClassList) { var registration = parseProtocolRegistration(protocolClass, ProtocolModule.DEFAULT_PROTOCOL_MODULE); protocols[registration.protocolId()] = registration; } diff --git a/protocol/src/test/java/com/zfoo/protocol/BenchmarkTesting.java b/protocol/src/test/java/com/zfoo/protocol/BenchmarkTesting.java index b8ef2b66..af02f70c 100644 --- a/protocol/src/test/java/com/zfoo/protocol/BenchmarkTesting.java +++ b/protocol/src/test/java/com/zfoo/protocol/BenchmarkTesting.java @@ -357,7 +357,7 @@ public class BenchmarkTesting { static { // zfoo协议注册(其实就是:将Set里面的协议号和对应的类注册好,这样子就可以根据协议号知道是反序列化为哪个类) - ProtocolManager.initProtocolAuto(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION); + ProtocolManager.initProtocolAuto(List.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION); for (int i = 0; i < executors.length; i++) { executors[i] = Executors.newSingleThreadExecutor(); diff --git a/protocol/src/test/java/com/zfoo/protocol/compatible/CompatibleTesting.java b/protocol/src/test/java/com/zfoo/protocol/compatible/CompatibleTesting.java index 887ca296..36c8acce 100644 --- a/protocol/src/test/java/com/zfoo/protocol/compatible/CompatibleTesting.java +++ b/protocol/src/test/java/com/zfoo/protocol/compatible/CompatibleTesting.java @@ -25,6 +25,7 @@ import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.util.List; import java.util.Set; import static com.zfoo.protocol.BenchmarkTesting.complexObject; @@ -44,7 +45,7 @@ public class CompatibleTesting { */ @Test public void compatibleTest() throws IOException { - ProtocolManager.initProtocolAuto(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION); + ProtocolManager.initProtocolAuto(List.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION); var bytes = IOUtils.toByteArray(ClassUtils.getFileFromClassPath("ComplexObject.bytes")); var buffer = new UnpooledHeapByteBuf(ByteBufAllocator.DEFAULT, 100, 1_0000); @@ -128,7 +129,7 @@ public class CompatibleTesting { @Test public void normalReadTest() throws IOException { - ProtocolManager.initProtocolAuto(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION); + ProtocolManager.initProtocolAuto(List.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), GenerateOperation.NO_OPERATION); // var bytes = IOUtils.toByteArray(ClassUtils.getFileFromClassPath("compatible/normal-no-compatible.bytes")); // var bytes = IOUtils.toByteArray(ClassUtils.getFileFromClassPath("compatible/normal-out-compatible.bytes")); diff --git a/protocol/src/test/java/com/zfoo/protocol/field/FieldSpeedTesting.java b/protocol/src/test/java/com/zfoo/protocol/field/FieldSpeedTesting.java index e5f33c3c..8edec4b1 100644 --- a/protocol/src/test/java/com/zfoo/protocol/field/FieldSpeedTesting.java +++ b/protocol/src/test/java/com/zfoo/protocol/field/FieldSpeedTesting.java @@ -728,7 +728,7 @@ public class FieldSpeedTesting { System.setProperty("io.netty.buffer.checkAccessible", "false"); System.setProperty("io.netty.buffer.checkBounds", "false"); var op = GenerateOperation.NO_OPERATION; - ProtocolManager.initProtocolAuto(Set.of(IntObject.class, IntegerObject.class, FloatObject.class, BytesObject.class, StringObject.class, ListIntegerObject.class, SetObject.class, MapObject.class, InnerObjectObject.class), op); + ProtocolManager.initProtocolAuto(List.of(IntObject.class, IntegerObject.class, FloatObject.class, BytesObject.class, StringObject.class, ListIntegerObject.class, SetObject.class, MapObject.class, InnerObjectObject.class), op); } public static final ThreadLocal kryos = new ThreadLocal<>() { diff --git a/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java b/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java index c3a176c8..4129d321 100644 --- a/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java +++ b/protocol/src/test/java/com/zfoo/protocol/generate/GenerateTesting.java @@ -18,6 +18,7 @@ import com.zfoo.protocol.serializer.CodeLanguage; import org.junit.Ignore; import org.junit.Test; +import java.util.List; import java.util.Set; /** @@ -44,7 +45,7 @@ public class GenerateTesting { generateLanguages.add(CodeLanguage.Python); // Initialize and then generate the protocol - ProtocolManager.initProtocolAuto(Set.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), op); + ProtocolManager.initProtocolAuto(List.of(ComplexObject.class, NormalObject.class, SimpleObject.class, EmptyObject.class, VeryBigObject.class), op); } } diff --git a/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTesting.java b/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTesting.java index 69b300d7..f2f79c09 100644 --- a/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTesting.java +++ b/storage/src/test/java/com/zfoo/storage/export/ExportBinaryTesting.java @@ -33,6 +33,7 @@ import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.File; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -94,7 +95,7 @@ public class ExportBinaryTesting { storageManager.initAfter(); // 生成协议 - var protocols = new HashSet>(); + List protocols = new ArrayList<>(); protocols.add(ResourceData.class); protocols.addAll(storageManager.storageMap().keySet()); var operation = new GenerateOperation();