package com.dy.common.mw.protocol; 
 | 
  
 | 
import java.util.Collection; 
 | 
import java.util.HashMap; 
 | 
  
 | 
public class OnLineHandle { 
 | 
     
 | 
    /** 
 | 
     * 解析上线数据,得到RtuAddr 
 | 
     * @param bs 字节数组 
 | 
     * @return OnLine.OnLineResult 
 | 
     */ 
 | 
    public OnLine.OnLineResult parse(byte[] bs)throws Exception{ 
 | 
        OnLine.OnLineResult rs = null ; 
 | 
        HashMap<String, AnnotationOnLineVo> onLineMap = ProtocolCache.getOnLineMap() ; 
 | 
        Collection<AnnotationOnLineVo> set = onLineMap.values() ; 
 | 
        if(set.size() == 0){ 
 | 
            throw new Exception("处理上线时,得到的协议集合为空。") ; 
 | 
        } 
 | 
        int prority = ProtocolConstant.firstPriority ; 
 | 
        while(true){ 
 | 
            Object[] objs = this.getClassObjAndAnnotationVo(prority, set) ; 
 | 
            OnLine onLine = (OnLine)objs[0] ; 
 | 
            if(onLine == null && prority == ProtocolConstant.firstPriority){ 
 | 
                throw new Exception("处理上线时,未得到优先级为" + prority + "上线处理类!") ; 
 | 
            }else if(onLine == null){ 
 | 
                //说明上线处理集合已经遍历完了。 
 | 
                break ; 
 | 
            } 
 | 
            rs = onLine.parse(bs) ; 
 | 
            OnLinePool.freeInstance(((AnnotationOnLineVo)objs[1]).clazz, onLine); 
 | 
            if(rs != null){ 
 | 
                if(rs.result == OnLine.OnLineAction_success){ 
 | 
                    //成功, 停止循环,返回结果 
 | 
                    break ; 
 | 
                }else if(rs.result == OnLine.OnLineAction_success_noMe){ 
 | 
                    //不是本协议数据 , 循环继续 
 | 
                    prority++ ; 
 | 
                }else if(rs.result == OnLine.OnLineAction_success_response){ 
 | 
                    //解析上线数据,需要回写数据 
 | 
                    //停止循环,返回结果 
 | 
                    break ; 
 | 
                }else if(rs.result == OnLine.OnLineAction_fail){ 
 | 
                    //解析上线数据错误,一般是上行数据为空 
 | 
                    throw new Exception("处理上线时,解析ID出错(可能程序错误,上行数据为null)!") ; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if(rs == null){ 
 | 
            throw new Exception("处理上线时出错,未能成功分析出IMEI号!") ; 
 | 
        } 
 | 
        return rs ; 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 得到处理类对象 
 | 
     * @param priority 优先级 
 | 
     * @param set 集合 
 | 
     * @return Object[] 
 | 
     * @throws Exception 异常 
 | 
     */ 
 | 
    private Object[] getClassObjAndAnnotationVo(int priority, Collection<AnnotationOnLineVo> set) throws Exception{ 
 | 
        OnLine obj = null ; 
 | 
        AnnotationOnLineVo rVo = null ; 
 | 
        for(AnnotationOnLineVo vo : set){ 
 | 
            if(priority == vo.priority){ 
 | 
                obj = OnLinePool.getInstance(vo.clazz) ; 
 | 
                rVo = vo ; 
 | 
                break ; 
 | 
            } 
 | 
        } 
 | 
        return new Object[]{obj, rVo} ; 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |