package org.yzh.protocol.commons; 
 | 
  
 | 
import io.github.yezhihao.protostar.annotation.Message; 
 | 
import io.github.yezhihao.protostar.util.ClassUtils; 
 | 
import org.yzh.protocol.basics.JTMessage; 
 | 
  
 | 
import java.lang.reflect.Field; 
 | 
import java.util.HashMap; 
 | 
import java.util.List; 
 | 
import java.util.Map; 
 | 
  
 | 
/** 
 | 
 * @author yezhihao 
 | 
 * https://gitee.com/yezhihao/jt808-server 
 | 
 */ 
 | 
public class MessageId { 
 | 
  
 | 
    private static final Map<Integer, String> messageId = new HashMap<>(256); 
 | 
    private static final Map<Integer, Class> messageClass = new HashMap<>(256); 
 | 
  
 | 
    static { 
 | 
        for (Class clazz : new Class[]{JT808.class, JT1078.class, JSATL12.class}) { 
 | 
            Field[] fields = clazz.getFields(); 
 | 
            for (Field field : fields) { 
 | 
                try { 
 | 
                    if (!Integer.TYPE.isAssignableFrom(field.getType())) 
 | 
                        continue; 
 | 
                    int id = field.getInt(null); 
 | 
                    String hexId = leftPad(Integer.toHexString(id), 4, '0'); 
 | 
                    String name = field.getName(); 
 | 
                    messageId.put(id, "[" + hexId + "]" + name); 
 | 
                } catch (Exception e) { 
 | 
                    e.printStackTrace(); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        List<Class> classList = ClassUtils.getClassList("org.yzh.protocol"); 
 | 
        for (Class<?> clazz : classList) { 
 | 
            Message annotation = clazz.getAnnotation(Message.class); 
 | 
            if (annotation != null) { 
 | 
                int[] value = annotation.value(); 
 | 
                for (int i : value) { 
 | 
                    messageClass.put(i, clazz); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public static Class<JTMessage> getClass(Integer id) { 
 | 
        return messageClass.get(id); 
 | 
    } 
 | 
  
 | 
    public static String getName(int id) { 
 | 
        String name = messageId.get(id); 
 | 
        if (name != null) { 
 | 
            return name; 
 | 
        } 
 | 
        return leftPad(Integer.toHexString(id), 4, '0'); 
 | 
    } 
 | 
  
 | 
    public static String leftPad(String str, int size, char ch) { 
 | 
        int length = str.length(); 
 | 
        int pads = size - length; 
 | 
        if (pads > 0) { 
 | 
            char[] result = new char[size]; 
 | 
            str.getChars(0, length, result, pads); 
 | 
            while (pads > 0) 
 | 
                result[--pads] = ch; 
 | 
            return new String(result); 
 | 
        } 
 | 
        return str; 
 | 
    } 
 | 
} 
 |