package com.walker.tcp.util;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.tcp.Message;
import com.walker.tcp.ProtocolResolver;
import com.walker.tcp.TcpRequest;
import com.walker.tcp.protocol.MessageProtocolResolver;
import org.reflections.Reflections;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ConvertorUtils {
/**
* 返回制定包下面的所有TcpRequest
注解类集合
* @param packageName
* @return
*/
public static Map scanTcpRequestAnnotation(String packageName){
Reflections reflections = new Reflections(packageName);
Set> classesList = reflections.getTypesAnnotatedWith(TcpRequest.class);
if(classesList != null){
Map map = new HashMap<>();
TcpRequest annotation = null;
for(Class> c : classesList){
annotation = c.getAnnotation(TcpRequest.class);
if(annotation == null){
continue;
}
if(StringUtils.isEmpty(annotation.value())){
throw new IllegalArgumentException("TcpRequest注解没有设置value,必须配置。class = " + c.getName());
}
map.put(annotation.value(), c.getName());
}
return map;
}
return null;
}
// /**
// * 根据报文内容,找到使用的协议解析器。
// * 目前系统根据后缀来查找
// * @param message
// * @return
// */
// @Deprecated
//// public static final ProtocolResolver> getProtocolResolver(String message, List> resolverList){
// public static final ProtocolResolver> getProtocolResolver(String message, List> resolverList){
//// if(cacheList == null){
//// throw new IllegalArgumentException(ProtocolResolver.ERR_NOFOUND);
//// }
//// for(ProtocolResolver> pr : resolverList){
// for(ProtocolResolver> pr : resolverList){
// if(pr instanceof MessageProtocolResolver){
// continue;
// }
// if(message.endsWith(pr.getDelimiter())){
// if(pr.isRequireFeatureResolve()){
// if(pr.getProtocolFeature() == null){
// throw new IllegalArgumentException(ProtocolResolver.ERR_NO_FEATURE + pr.getName());
// }
// if(message.startsWith(pr.getProtocolFeature().toString())){
// return pr;
// } else {
// continue;
// }
// } else {
// return pr;
// }
// }
// }
// return null;
// }
public static final ProtocolResolver> getProtocolResolver(Object msg, List> resolverList){
if(msg == null){
throw new IllegalArgumentException("msg(Object) is required!");
}
Object feature = null;
String msgStr = null;
for(ProtocolResolver> pr : resolverList){
if(msg instanceof Message){
// 如果不行可以用这个判断类型
// Message.class.isAssignableFrom(msg.getClass())
Message message = (Message)msg;
if(pr.isOnlyMatchFeature()){
if(pr instanceof MessageProtocolResolver){
feature = pr.getProtocolFeature();
if(feature != null){
if(Arrays.equals(message.getFeature(), (byte[])feature)){
return pr;
}
}
continue;
} else {
// 如果是其他 MessageProtocolResolver 自定义实现,再扩展
throw new UnsupportedOperationException("需要扩展报文解析类型:" + message.toString());
}
} else {
// 可能需要报文分隔符来进一步确定类型,可能是长报文类型,暂未实现
throw new UnsupportedOperationException("未实现的报文解析类型:" + message.toString());
}
} else {
// 这里其他情况目前只有字符串类型
if(pr instanceof MessageProtocolResolver){
continue;
}
msgStr = msg.toString();
if(msgStr.endsWith(pr.getDelimiter())){
if(pr.isRequireFeatureResolve()){
if(pr.getProtocolFeature() == null){
throw new IllegalArgumentException(ProtocolResolver.ERR_NO_FEATURE + pr.getName());
}
if(msgStr.startsWith(pr.getProtocolFeature().toString())){
return pr;
} else {
continue;
}
} else {
return pr;
}
}
}
// if(message.endsWith(pr.getDelimiter())){
// if(pr.isRequireFeatureResolve()){
// if(pr.getProtocolFeature() == null){
// throw new IllegalArgumentException(ProtocolResolver.ERR_NO_FEATURE + pr.getName());
// }
// if(message.startsWith(pr.getProtocolFeature())){
// return pr;
// } else {
// continue;
// }
// } else {
// return pr;
// }
// }
}
return null;
}
public static void main(String[] args){
Map map = scanTcpRequestAnnotation("com.walker.tcp");
if(map == null){
return;
}
for(Map.Entry entry : map.entrySet()){
System.out.println(entry.getKey() + ", " + entry.getValue());
}
}
}