From c70b92da60c0d00625da5fc2369b475e69e0b88e Mon Sep 17 00:00:00 2001 From: liurunyu <lry9898@163.com> Date: 星期四, 22 八月 2024 11:36:41 +0800 Subject: [PATCH] 1、完善代码和application.yml配置文件,去掉不用的引入文件; 2、init-config.xml配置中增加属性 enable,相应解析类也增加了解析与判断; 3、凡是有Server的应用,加载资源方式改为用springboot的工具类加载; 4、通信协议相关的扫描注解功能实现改为采用reflections-0.10.2,以实现可以在jar包情况下能够扫描类(.class)注解。 --- pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/AnnotationScan.java | 253 ++++++++++++++++++++++++-------------------------- 1 files changed, 121 insertions(+), 132 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 index 3eea8c9..3cd4e32 100644 --- 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 @@ -1,13 +1,13 @@ package com.dy.common.mw.protocol; -import java.net.URI; -import java.net.URL; import java.util.Collection; import java.util.HashMap; -import java.util.List; +import java.util.Set; -import com.dy.common.util.ClassScan; import com.dy.common.util.NumUtil; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.reflections.Reflections; /** * 鎵弿锛� @@ -19,14 +19,16 @@ */ @SuppressWarnings("unused") public class AnnotationScan { - - private static String scanRootPackage = "com.dy.common.mw.protocol." ; + + private static final Logger log = LogManager.getLogger(AnnotationScan.class); + + private static String scanRootPackage = "com.dy.common.mw.protocol" ; private static AnnotationScan instance ; - + private AnnotationScan(){ } - + /** * 寰楀埌鍞竴瀹炰緥锛� * 骞跺湪鐢熸垚鍞竴瀹炰緥鏃讹紝鎵弿娉ㄨВ绫� @@ -40,148 +42,135 @@ } return instance ; } - + /** * 鎵弿鍑烘敞瑙g殑绫� * @throws ClassNotFoundException 寮傚父 * @throws Exception 寮傚父 */ - private void scanEndpointAnnotations() throws Exception{ - ClassLoader load = this.getClass().getClassLoader() ; - - if(!scanRootPackage.endsWith(".")){ - scanRootPackage += "." ; - } - URL url = AnnotationScan.class.getResource("/" + scanRootPackage.replace('.', '/')); - if(url != null){ - String urlStr = url.toString() ; - if(urlStr != null){ - URI uri = new URI(url.toString()); + 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; + int priority; + int onLineDataMinLength; + int headMinLength; - List<String> classNames = new ClassScan().searchClassFromUrl(new URI[]{uri}, scanRootPackage) ; - if(classNames != null && classNames.size() > 0){ - String protocolName ; - int priority; - int onLineDataMinLength; - int headMinLength ; + HashMap<String, AnnotationDriverVo> driverMap = ProtocolCache.getDriverMap(); + HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap = ProtocolCache.getPrefixedDataAvailableMap(); + HashMap<String, AnnotationOnLineVo> onLineMap = ProtocolCache.getOnLineMap(); - HashMap<String, AnnotationDriverVo> driverMap = ProtocolCache.getDriverMap() ; - HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap = ProtocolCache.getPrefixedDataAvailableMap() ; - HashMap<String, AnnotationOnLineVo> onLineMap = ProtocolCache.getOnLineMap() ; - - for(String cName : classNames){ - String className = cName.substring(0, cName.lastIndexOf('.')) ; - Class<?> clazz = load.loadClass(className) ; - if(clazz.isAnnotationPresent(AnnotationDriver.class)){ - AnnotationDriver ann = clazz.getAnnotation(AnnotationDriver.class) ; - if(ann != null){ - if(ann.enable()){ - protocolName = ann.name() ; - if(!(protocolName.trim().equals(""))){ - if(driverMap.containsKey(protocolName)){ - throw new Exception("涓ラ噸閿欒锛屽崗璁┍鍔ㄥ悕绉�" + protocolName + "鍑虹幇浜嗛噸澶嶆敞瑙o紒") ; - } - driverMap.put(protocolName, new AnnotationDriverVo(clazz)) ; - }else{ - throw new Exception("涓ラ噸閿欒锛屽崗璁┍鍔ㄥ悕绉版敞瑙e�间负绌哄瓧绗︿覆") ; - } - } + for (Class<?> clazz : driverClasses) { + AnnotationDriver ann = clazz.getAnnotation(AnnotationDriver.class); + if (ann != null) { + if (ann.enable()) { + protocolName = ann.name(); + if (!(protocolName.trim().equals(""))) { + if (driverMap.containsKey(protocolName)) { + throw new Exception("涓ラ噸閿欒锛屽崗璁┍鍔�(鍚嶇О)" + protocolName + "鍑虹幇浜嗛噸澶嶆敞瑙o紒"); } + driverMap.put(protocolName, new AnnotationDriverVo(clazz)); + } else { + throw new Exception("涓ラ噸閿欒锛屽崗璁┍鍔ㄥ悕绉版敞瑙e�间负绌哄瓧绗︿覆"); + } + } + } + } + + 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�间负绌哄瓧绗︿覆"); } + priority = ann.priority(); + if (priority == 0) { + throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄紭鍏堢骇娉ㄨВ涓嶈兘涓�0"); + } + if (isRepeatPrefixedDataAvailablePriority(priority, prefixedDataAvailableMap)) { + throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄紭鍏堢骇娉ㄨВ(priority)鏁板��" + priority + "閲嶅"); + } - if(clazz.isAnnotationPresent(AnnotationPrefixedDataAvailable.class)){ - 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�间负绌哄瓧绗︿覆") ; - } - - priority = ann.priority() ; - if(priority == 0){ - throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄紭鍏堢骇娉ㄨВ涓嶈兘涓�0") ; - } - if(isRepeatPrefixedDataAvailablePriority(priority, prefixedDataAvailableMap)){ - throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄紭鍏堢骇娉ㄨВ(priority)鏁板��" + priority + "閲嶅") ; - } - - onLineDataMinLength = ann.onLineDataMinLength() ; + onLineDataMinLength = ann.onLineDataMinLength(); /*姘旇薄鍗忚涓�0 if(onLineDataMinLength == 0){ throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄笂绾挎暟鎹渶灏忛暱搴︽敞瑙d笉鑳戒负0") ; } */ - headMinLength = ann.headMinLength() ; + headMinLength = ann.headMinLength(); /*姘旇薄鍗忚涓�0 if(headMinLength == 0){ throw new Exception("涓ラ噸閿欒锛� 涓婅鏁版嵁瀹屾暣鎬ф鏌ユ墍閰嶄笂鎶ユ暟鎹殑澶撮儴鏈�灏忛暱搴︽敞瑙d笉鑳戒负0") ; } */ - prefixedDataAvailableMap.put(protocolName, new AnnotationPrefixedDataAvailableVo(clazz, protocolName, priority, onLineDataMinLength, headMinLength, ProtocolConstant.errorMaxLength)) ; - } - } - } - - if(clazz.isAnnotationPresent(AnnotationOnLine.class)){ - 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�间负绌哄瓧绗︿覆") ; - } - - priority = ann.priority() ; - if(priority == 0){ - throw new Exception("涓ラ噸閿欒锛� 涓婄嚎鏁版嵁鍒嗘瀽鎵�閰嶄紭鍏堢骇娉ㄨВ涓嶈兘涓�0") ; - } - if(isRepeatOnLinePriority(priority, onLineMap)){ - throw new Exception("涓ラ噸閿欒锛� 涓婄嚎鏁版嵁鍒嗘瀽鎵�閰嶄紭鍏堢骇娉ㄨВ(priority)鏁板��" + priority + "閲嶅") ; - } - - onLineMap.put(protocolName, new AnnotationOnLineVo(clazz, protocolName, priority)) ; - } - } - } + prefixedDataAvailableMap.put(protocolName, new AnnotationPrefixedDataAvailableVo(clazz, protocolName, priority, onLineDataMinLength, headMinLength, ProtocolConstant.errorMaxLength)); } - - 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) ; } } + + 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�间负绌哄瓧绗︿覆"); + } + + priority = ann.priority(); + if (priority == 0) { + throw new Exception("涓ラ噸閿欒锛� 涓婄嚎鏁版嵁鍒嗘瀽鎵�閰嶄紭鍏堢骇娉ㄨВ涓嶈兘涓�0"); + } + if (isRepeatOnLinePriority(priority, onLineMap)) { + throw new Exception("涓ラ噸閿欒锛� 涓婄嚎鏁版嵁鍒嗘瀽鎵�閰嶄紭鍏堢骇娉ㄨВ(priority)鏁板��" + priority + "閲嶅"); + } + + onLineMap.put(protocolName, new AnnotationOnLineVo(clazz, protocolName, 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(); + Collection<AnnotationPrefixedDataAvailableVo> col = prefixedDataAvailableMap.values(); for(AnnotationPrefixedDataAvailableVo vo : col){ if(vo.priority == priority){ return true ; @@ -195,7 +184,7 @@ * @return 缁撴灉 */ private boolean isRepeatOnLinePriority(int priority, HashMap<String, AnnotationOnLineVo> onLineMap){ - Collection<AnnotationOnLineVo> col = onLineMap.values(); + Collection<AnnotationOnLineVo> col = onLineMap.values(); for(AnnotationOnLineVo vo : col){ if(vo.priority == priority){ return true ; @@ -203,7 +192,7 @@ } return false ; } - + private String hasErrorInDriver(HashMap<String, AnnotationDriverVo> driverMap){ if(driverMap.size() == 0){ return "涓ラ噸閿欒锛屾湭娉ㄨВ浠讳綍鍗忚椹卞姩" ; @@ -211,23 +200,23 @@ return null ; } - private String hasErrorInPrefixedDataAvailable(HashMap<String, AnnotationDriverVo> driverMap, - HashMap<String, AnnotationPrefixedDataAvailableVo> prefixedDataAvailableMap){ - Collection<AnnotationPrefixedDataAvailableVo> col = prefixedDataAvailableMap.values(); + 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)){ return "涓ラ噸閿欒锛屼笂琛屾暟鎹畬鏁存�ф鏌ユ墍閰嶉┍鍔ㄥ悕绉�(" + vo.protocolName + ")鍦ㄥ崗璁┍鍔ㄤ腑鏈厤缃�" ; } } - + int[] prioritys = new int[prefixedDataAvailableMap.size()] ; int count = 0 ; - col = prefixedDataAvailableMap.values(); + 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 + " 寮�濮�" ; @@ -246,24 +235,24 @@ } return null ; } - + private String hasErrorInOnLine(HashMap<String, AnnotationDriverVo> driverMap, - HashMap<String, AnnotationOnLineVo> onLineMap){ - Collection<AnnotationOnLineVo> col = onLineMap.values(); + HashMap<String, AnnotationOnLineVo> onLineMap){ + Collection<AnnotationOnLineVo> col = onLineMap.values(); for(AnnotationOnLineVo vo : col){ if(!driverMap.containsKey(vo.protocolName)){ return "涓ラ噸閿欒锛屼笂绾挎暟鎹垎鏋愭墍閰嶉┍鍔ㄥ悕绉�(" + vo.protocolName + ")鍦ㄥ崗璁┍鍔ㄤ腑鏈厤缃�" ; } } - + int[] prioritys = new int[onLineMap.size()] ; int count = 0 ; - col = onLineMap.values(); + 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 + " 寮�濮�" ; -- Gitblit v1.8.0