| New file | 
 |  |  | 
 |  |  | 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} ; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |