package com.mogujie.tt.packet.action;
import com.mogujie.tt.packet.base.Packet;
/**
* Action的基类,子类可以各自需要添加成员函数与变量
*
* @author dolphinWang
* @time 2014/04/30
*/
public class Action {
/**
* 默认的超时时间,15秒
*/
//todo eric
public static final int DEFAULT_TIME_OUT = 35000;
private Action(ActionCallback callback, Packet packet, int timeout,
long timeStamp, int repeatCount) {
mCallback = callback;
mPacket = packet;
mTimeout = timeout;
mTimeStamp = timeStamp;
mRepeatCountIfFaild = repeatCount;
}
protected ActionCallback mCallback;
protected Packet mPacket;
/**
* 这个Action的校验号
*/
private int mSequenceNo;
private int mTimeout;
private long mTimeStamp;
private int mRepeatCountIfFaild; // 发送失败或超时重试次数
/**
* 外部不要主动调用这个函数,在被提交到消息队列的时候,队列会分配sequence给每一个action
*
* @param squenceNo
*/
public void setSquenceNo(int squenceNo) {
mSequenceNo = squenceNo;
}
public int getSequenceNo() {
return mSequenceNo;
}
public ActionCallback getCallback() {
return mCallback;
}
public Packet getPacket() {
return mPacket;
}
public int getTimeout() {
return mTimeout;
}
public long getTimeStamp() {
return mTimeStamp;
}
public int getmRepeatCountIfFaild() {
return mRepeatCountIfFaild;
}
public int minusRepeatCountIfFaild() {
mRepeatCountIfFaild--;
return mRepeatCountIfFaild;
}
public void setmRepeatCountIfFaild(int mRepeatCountIfFaild) {
this.mRepeatCountIfFaild = mRepeatCountIfFaild;
}
/**
* 可以用这个类构造出一个Action。如果有子类继承了Action,可以在子类中继承Builder写一个Builder的子类,
* 也可以使用工厂模式在这个Builder类中构造出Action的子类
*
* @author dolphinWang
*/
public static class Builder {
private ActionCallback callback;
private Packet packet;
private int timeout = -1;
private int repeatcountIfFaild = 0;
public Builder setCallback(ActionCallback callback) {
this.callback = callback;
return this;
}
public Builder setPacket(Packet packet) {
if (packet == null) {
throw new IllegalArgumentException(
"An action must have a Packet!");
}
this.packet = packet;
return this;
}
public Builder setTimeout(int timeout) {
if (timeout <= 0) {
throw new IllegalArgumentException(
"Timeout must not less than 0!");
}
this.timeout = timeout;
return this;
}
public Builder setRepeatCountIfFaild(int count) {
if (count < 0)
count = 0;
this.repeatcountIfFaild = count;
return this;
}
public Action build() {
if (timeout == -1) {
timeout = DEFAULT_TIME_OUT;
}
if (repeatcountIfFaild < 0)
repeatcountIfFaild = 0;
return new Action(callback, packet, timeout,
System.currentTimeMillis(), repeatcountIfFaild);
}
}
}