package ALBasicProtocolPack.BasicObj; import java.nio.ByteBuffer; import ALBasicCommon.ALBasicCommonFun; import ALServerLog.ALServerLog; @SuppressWarnings("rawtypes") public abstract class _AALBasicProtocolMainOrderDealer { private byte mainOrder; private _AALBasicProtocolSubOrderDealer[] dealArray = null; /***************** * 带入主协议号以及处理的协议最大的子协议号,进行协议处理队列的初始化 * * @author alzq.z * @time Feb 19, 2013 10:52:55 AM */ public _AALBasicProtocolMainOrderDealer(byte _mainOrder, int _protocolMaxTypeNum) { mainOrder = _mainOrder; dealArray = new _AALBasicProtocolSubOrderDealer[_protocolMaxTypeNum + 1]; } /************ * 获取主协议号 * * @author alzq.z * @time Feb 19, 2013 11:38:46 AM */ public byte getMainOrder() {return mainOrder;} /**************** * 设置处理对象,直接设置到数组中保证处理速度 * * @author alzq.z * @time Feb 19, 2013 10:52:50 AM */ public void regDealer(_AALBasicProtocolSubOrderDealer _dealer) { if(null == dealArray) return ; if(_dealer.getMainOrder() != mainOrder) { //主协议号不匹配,提示警告 ALServerLog.Fatal(mainOrder + " doesn't match the dealer's(" + _dealer.getClass().toString() + ") main order: " + _dealer.getMainOrder() + "!"); } int subOrder = ALBasicCommonFun.byte2int(_dealer.getSubOrder()); if(subOrder >= dealArray.length) { ALServerLog.Fatal(mainOrder + " Protocol dispather don't have " + subOrder + " size list to save the dealer obj!"); return ; } dealArray[subOrder] = _dealer; } /**************** * 强制设置指定对象为处理对象 * * @author alzq.z * @time Feb 19, 2013 10:52:50 AM */ public void setSubDealer(int _subOrderID, _AALBasicProtocolSubOrderDealer _dealer) { if(null == dealArray) return ; if(_subOrderID >= dealArray.length) { ALServerLog.Fatal(mainOrder + " Protocol dispather don't have " + _subOrderID + " size list to save the dealer obj!"); return ; } dealArray[_subOrderID] = _dealer; } /******************** * 获取子处理对象信息 * @company Isg @author alzq.zhf * 2014年11月15日 下午12:08:17 */ public _AALBasicProtocolSubOrderDealer getSubDealer(byte _subOrder) { int iIndex = ALBasicCommonFun.byte2int(_subOrder); //编号超出数组大小,直接返回失败 if(iIndex >= dealArray.length) return null; return dealArray[iIndex]; } /********************** * 根据协议编号分发协议并进行处理 * * @author alzq.z * @time Feb 19, 2013 10:52:46 AM */ public boolean dispathProtocol(_IALProtocolReceiver _receiver, ByteBuffer _msg) { if(null == _msg) return false; //获取子协议编号 byte subType = _msg.get(); //获取对应处理对象 _AALBasicProtocolSubOrderDealer dealer = getSubDealer(subType); //判断处理对象是否有效 if(null == dealer) return false; //处理对象 dealer.dealProtocol(_receiver, _msg); //返回处理成功 return true; } }