From b3b17b231e2f2840332ce6eb96f791865fdec6d5 Mon Sep 17 00:00:00 2001
From: zhubaomin <zhubaomin>
Date: 星期一, 14 四月 2025 16:38:16 +0800
Subject: [PATCH] 代码优化
---
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/AnnotationScan.java | 292 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 292 insertions(+), 0 deletions(-)
diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/AnnotationScan.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/AnnotationScan.java
new file mode 100644
index 0000000..f8cfc6e
--- /dev/null
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/AnnotationScan.java
@@ -0,0 +1,292 @@
+package com.dy.common.mw.protocol;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Set;
+
+import com.dy.common.util.NumUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.reflections.Reflections;
+
+/**
+ * 鎵弿锛�
+ * 鍗忚椹卞姩绫�
+ * 涓婅鏁版嵁瀹屾暣鎬ф鏌ョ被锛堟柇鍖呯矘鍖呮鏌ワ級
+ * 涓婄嚎鏁版嵁锛堣繛鎺ュ悗绗竴鍖呮暟鎹級澶勭悊绫伙紙璇嗗埆鍗忚鍙婄粓绔湴鍧�锛�
+ * @author Administrator
+ *
+ */
+@SuppressWarnings("unused")
+public class AnnotationScan {
+
+ private static final Logger log = LogManager.getLogger(AnnotationScan.class);
+
+ private static String scanRootPackage = "com.dy.common.mw.protocol" ;
+
+ private static AnnotationScan instance ;
+
+ private AnnotationScan(){
+ }
+
+ /**
+ * 寰楀埌鍞竴瀹炰緥锛�
+ * 骞跺湪鐢熸垚鍞竴瀹炰緥鏃讹紝鎵弿娉ㄨВ绫�
+ * @return AnnotationScan
+ * @throws Exception 寮傚父
+ */
+ public static AnnotationScan getIntance()throws Exception{
+ if(instance == null){
+ instance = new AnnotationScan() ;
+ instance.scanEndpointAnnotations();
+ }
+ return instance ;
+ }
+
+ /**
+ * 鎵弿鍑烘敞瑙g殑绫�
+ * @throws ClassNotFoundException 寮傚父
+ * @throws Exception 寮傚父
+ */
+ private void scanEndpointAnnotations() throws Exception {
+ Reflections reflections = new Reflections(scanRootPackage); // 鎸囧畾鍖呭悕
+ Set<Class<?>> driverClasses = reflections.getTypesAnnotatedWith(AnnotationDriver.class);
+ if (driverClasses != null && driverClasses.size() > 0) {
+ String protocolName;
+ short protocolVersion;
+ String key ;
+ int priority;
+ int onLineDataMinLength;
+ int headMinLength;
+
+ HashMap<String, AnnotationDriverVo> driverMap = ProtocolCache.getDriverMap();
+ HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap = ProtocolCache.getPrefixedDataAvailableMap();
+ HashMap<String, AnnotationOnLineVo> onLineMap = ProtocolCache.getOnLineMap();
+
+ for (Class<?> clazz : driverClasses) {
+ AnnotationDriver ann = clazz.getAnnotation(AnnotationDriver.class);
+ if (ann != null) {
+ if (ann.enable()) {
+ protocolName = ann.name();
+ protocolVersion = ann.version() ;
+ if(protocolName == null || protocolName.trim().equals("")){
+ throw new Exception("涓ラ噸閿欒锛屽崗璁┍鍔ㄥ悕绉版敞瑙e�间负绌哄瓧绗︿覆");
+ }
+ if(protocolVersion == -1){
+ throw new Exception("涓ラ噸閿欒锛屽崗璁┍鍔ㄧ増鏈彿鏈厤缃�");
+ }
+ key = protocolName + protocolVersion ;
+ if (driverMap.containsKey(key)) {
+ throw new Exception("涓ラ噸閿欒锛屽崗璁┍鍔�(鍚嶇О+鐗堟湰鍙�)" + key + "鍑虹幇浜嗛噸澶嶆敞瑙o紒");
+ }
+ driverMap.put(key, new AnnotationDriverVo(clazz));
+ }
+ }
+ }
+
+ Set<Class<?>> prefixedClass = reflections.getTypesAnnotatedWith(AnnotationPrefixedDataAvailable.class);
+ for (Class<?> clazz : prefixedClass) {
+ AnnotationPrefixedDataAvailable ann = clazz.getAnnotation(AnnotationPrefixedDataAvailable.class);
+ if (ann != null) {
+ if (ann.enable()) {
+ protocolName = ann.protocolName();
+ if (!(protocolName.trim().equals(""))) {
+ if (prefixedDataAvailableMap.containsKey(protocolName)) {
+ throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶅崗璁┍鍔�" + protocolName + "鍑虹幇浜嗛噸澶嶆敞瑙o紒");
+ }
+ } else {
+ throw new Exception("涓ラ噸閿欒锛屼笂琛屾暟鎹畬鏁存�ф鏌ユ墍閰嶅崗璁┍鍔ㄦ敞瑙e�间负绌哄瓧绗︿覆");
+ }
+
+ protocolVersion = ann.protocolVersion();
+ if (protocolVersion == -1) {
+ throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶅崗璁増鏈彿鏈厤缃�");
+ }
+
+ priority = ann.priority();
+ if (priority == 0) {
+ throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄紭鍏堢骇娉ㄨВ涓嶈兘涓�0");
+ }
+ if (isRepeatPrefixedDataAvailablePriority(priority, prefixedDataAvailableMap)) {
+ throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄紭鍏堢骇娉ㄨВ(priority)鏁板��" + priority + "閲嶅");
+ }
+
+ onLineDataMinLength = ann.onLineDataMinLength();
+ /*姘旇薄鍗忚涓�0
+ if(onLineDataMinLength == 0){
+ throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄笂绾挎暟鎹渶灏忛暱搴︽敞瑙d笉鑳戒负0") ;
+ }
+ */
+ headMinLength = ann.headMinLength();
+ /*姘旇薄鍗忚涓�0
+ if(headMinLength == 0){
+ throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄笂鎶ユ暟鎹殑澶撮儴鏈�灏忛暱搴︽敞瑙d笉鑳戒负0") ;
+ }
+ */
+ key = protocolName + protocolVersion ;
+ prefixedDataAvailableMap.put(key, new AnnotationPrefixedDataAvailableVo(clazz, protocolName, protocolVersion, priority, onLineDataMinLength, headMinLength, ProtocolConstant.errorMaxLength));
+ }
+ }
+ }
+
+ Set<Class<?>> onLineClass = reflections.getTypesAnnotatedWith(AnnotationOnLine.class);
+ for (Class<?> clazz : onLineClass) {
+ AnnotationOnLine ann = clazz.getAnnotation(AnnotationOnLine.class);
+ if (ann != null) {
+ if (ann.enable()) {
+ protocolName = ann.protocolName();
+ if (!(protocolName.trim().equals(""))) {
+ if (onLineMap.containsKey(protocolName)) {
+ throw new Exception("涓ラ噸閿欒锛� 涓婄嚎鏁版嵁鍒嗘瀽鎵�閰嶅崗璁┍鍔�" + protocolName + "鍑虹幇浜嗛噸澶嶆敞瑙o紒");
+ }
+ } else {
+ throw new Exception("涓ラ噸閿欒锛屼笂绾挎暟鎹垎鏋愭墍閰嶅崗璁┍鍔ㄦ敞瑙e�间负绌哄瓧绗︿覆");
+ }
+
+ protocolVersion = ann.protocolVersion();
+ if (protocolVersion == -1) {
+ throw new Exception("涓ラ噸閿欒锛� 涓婄嚎鏁版嵁鍒嗘瀽鎵�閰嶅崗璁増鏈彿鏈厤缃�");
+ }
+
+ priority = ann.priority();
+ if (priority == 0) {
+ throw new Exception("涓ラ噸閿欒锛� 涓婄嚎鏁版嵁鍒嗘瀽鎵�閰嶄紭鍏堢骇娉ㄨВ涓嶈兘涓�0");
+ }
+ if (isRepeatOnLinePriority(priority, onLineMap)) {
+ throw new Exception("涓ラ噸閿欒锛� 涓婄嚎鏁版嵁鍒嗘瀽鎵�閰嶄紭鍏堢骇娉ㄨВ(priority)鏁板��" + priority + "閲嶅");
+ }
+
+ key = protocolName + protocolVersion ;
+ onLineMap.put(key, new AnnotationOnLineVo(clazz, protocolName, protocolVersion, priority));
+ }
+ }
+ }
+
+ //杩涜楠岃瘉
+ String error = this.hasErrorInDriver(driverMap);
+ if (error != null) {
+ throw new Exception(error);
+ } else {
+ error = this.hasErrorInPrefixedDataAvailable(driverMap, prefixedDataAvailableMap);
+ if (error != null) {
+ throw new Exception(error);
+ } else {
+ error = this.hasErrorInOnLine(driverMap, onLineMap);
+ if (error != null) {
+ throw new Exception(error);
+ }
+ }
+ }
+ } else {
+ throw new Exception("涓ラ噸閿欒锛� 鎵弿鍗忚鐩稿叧娉ㄨВ鎵�寰楀埌绫诲瀷闆嗗悎涓虹┖锛屾壂鎻忔牴璺緞鏄�" + scanRootPackage);
+ }
+ }
+
+ /**
+ * 妫�鏌ヤ紭鍏堢骇閲嶅
+ * @param priority 浼樺厛绾�
+ * @return 缁撴灉
+ */
+ private boolean isRepeatPrefixedDataAvailablePriority(int priority, HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap){
+ Collection<AnnotationPrefixedDataAvailableVo> col = prefixedDataAvailableMap.values();
+ for(AnnotationPrefixedDataAvailableVo vo : col){
+ if(vo.priority == priority){
+ return true ;
+ }
+ }
+ return false ;
+ }
+ /**
+ * 妫�鏌ヤ紭鍏堢骇閲嶅
+ * @param priority 浼樺厛绾�
+ * @return 缁撴灉
+ */
+ private boolean isRepeatOnLinePriority(int priority, HashMap<String, AnnotationOnLineVo> onLineMap){
+ Collection<AnnotationOnLineVo> col = onLineMap.values();
+ for(AnnotationOnLineVo vo : col){
+ if(vo.priority == priority){
+ return true ;
+ }
+ }
+ return false ;
+ }
+
+ private String hasErrorInDriver(HashMap<String, AnnotationDriverVo> driverMap){
+ if(driverMap.size() == 0){
+ return "涓ラ噸閿欒锛屾湭娉ㄨВ浠讳綍鍗忚椹卞姩" ;
+ }
+ return null ;
+ }
+
+ private String hasErrorInPrefixedDataAvailable(HashMap<String, AnnotationDriverVo> driverMap,
+ HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap){
+ Collection<AnnotationPrefixedDataAvailableVo> col = prefixedDataAvailableMap.values();
+ for(AnnotationPrefixedDataAvailableVo vo : col){
+ if(!driverMap.containsKey(vo.protocolName + vo.protocolVersion)){
+ return "涓ラ噸閿欒锛屼笂琛屾暟鎹畬鏁存�ф鏌ユ墍閰嶉┍鍔ㄥ悕绉�(" + (vo.protocolName + vo.protocolVersion) + ")鍦ㄥ崗璁┍鍔ㄤ腑鏈厤缃�" ;
+ }
+ }
+
+ int[] prioritys = new int[prefixedDataAvailableMap.size()] ;
+ int count = 0 ;
+ col = prefixedDataAvailableMap.values();
+ for(AnnotationPrefixedDataAvailableVo vo : col){
+ prioritys[count++] = vo.priority ;
+ }
+ NumUtil.sort(prioritys, true) ;
+
+ int firstPriority = prioritys[0] ;
+ if(ProtocolConstant.firstPriority != firstPriority){
+ return "涓ラ噸閿欒锛屼笂琛屾暟鎹畬鏁存�ф鏌ユ墍閰嶄紭鍏堢骇蹇呴』浠� " + ProtocolConstant.firstPriority + " 寮�濮�" ;
+ }
+ int prePriority = prioritys[0] ;
+ int nextPriority;
+ if(prioritys.length > 1){
+ for(int i = 1 ; i < prioritys.length; i++){
+ nextPriority = prioritys[i] ;
+ if(nextPriority - prePriority != 1){
+ return "涓ラ噸閿欒锛屼笂琛屾暟鎹畬鏁存�ф鏌ユ墍閰嶅悇涓紭鍏堢骇蹇呴』鐩稿樊1" ;
+ }else{
+ prePriority = nextPriority ;
+ }
+ }
+ }
+ return null ;
+ }
+
+ private String hasErrorInOnLine(HashMap<String, AnnotationDriverVo> driverMap,
+ HashMap<String, AnnotationOnLineVo> onLineMap){
+ Collection<AnnotationOnLineVo> col = onLineMap.values();
+ for(AnnotationOnLineVo vo : col){
+ if(!driverMap.containsKey(vo.protocolName + vo.protocolVersion)){
+ return "涓ラ噸閿欒锛屼笂绾挎暟鎹垎鏋愭墍閰嶉┍鍔ㄥ悕绉�(" + (vo.protocolName + vo.protocolVersion) + ")鍦ㄥ崗璁┍鍔ㄤ腑鏈厤缃�" ;
+ }
+ }
+
+ int[] prioritys = new int[onLineMap.size()] ;
+ int count = 0 ;
+ col = onLineMap.values();
+ for(AnnotationOnLineVo vo : col){
+ prioritys[count++] = vo.priority ;
+ }
+ NumUtil.sort(prioritys, true) ;
+
+ int firstPriority = prioritys[0] ;
+ if(ProtocolConstant.firstPriority != firstPriority){
+ return "涓ラ噸閿欒锛屼笂绾挎暟鎹垎鏋愭墍閰嶄紭鍏堢骇蹇呴』浠� " + ProtocolConstant.firstPriority + " 寮�濮�" ;
+ }
+ int prePriority = prioritys[0] ;
+ int nextPriority;
+ if(prioritys.length > 1){
+ for(int i = 1 ; i < prioritys.length; i++){
+ nextPriority = prioritys[i] ;
+ if(nextPriority - prePriority != 1){
+ return "涓ラ噸閿欒锛屼笂绾挎暟鎹垎鏋愭墍閰嶅悇涓紭鍏堢骇蹇呴』鐩稿樊1" ;
+ }else{
+ prePriority = nextPriority ;
+ }
+ }
+ }
+ return null ;
+ }
+}
--
Gitblit v1.8.0