package lbms.plugins.mldht.kad; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import lbms.plugins.mldht.kad.messages.MessageBase; import lbms.plugins.mldht.kad.messages.MessageBase.Method; /** * @author Damokles * */ public class RPCCall implements RPCCallBase { private MessageBase msg; private RPCServerBase rpc; private boolean queued = true; private List<RPCCallListener> listener; private ScheduledFuture<?> timeoutTimer; public RPCCall (RPCServerBase rpc, MessageBase msg) { this.rpc = rpc; this.msg = msg; } /* (non-Javadoc) * @see lbms.plugins.mldht.kad.RPCCallBase#start() */ public void start () { queued = false; startTimeout(); } /* (non-Javadoc) * @see lbms.plugins.mldht.kad.RPCCallBase#response(lbms.plugins.mldht.kad.messages.MessageBase) */ public void response (MessageBase rsp) { if (timeoutTimer != null) { timeoutTimer.cancel(false); } onCallResponse(rsp); } /* (non-Javadoc) * @see lbms.plugins.mldht.kad.RPCCallBase#addListener(lbms.plugins.mldht.kad.RPCCallListener) */ public void addListener (RPCCallListener cl) { if (listener == null) { listener = new ArrayList<RPCCallListener>(1); } listener.add(cl); } /* (non-Javadoc) * @see lbms.plugins.mldht.kad.RPCCallBase#removeListener(lbms.plugins.mldht.kad.RPCCallListener) */ public void removeListener (RPCCallListener cl) { if (listener != null) { listener.remove(cl); } } /* (non-Javadoc) * @see lbms.plugins.mldht.kad.RPCCallBase#getMessageMethod() */ public Method getMessageMethod () { if (msg != null) { return msg.getMethod(); } else { return Method.NONE; } } /// Get the request sent /* (non-Javadoc) * @see lbms.plugins.mldht.kad.RPCCallBase#getRequest() */ public MessageBase getRequest () { return msg; } /* (non-Javadoc) * @see lbms.plugins.mldht.kad.RPCCallBase#isQueued() */ public boolean isQueued () { return queued; } private void startTimeout () { timeoutTimer = DHT.getScheduler().schedule(new Runnable() { /* (non-Javadoc) * @see java.lang.Runnable#run() */ public void run () { onCallTimeout(); } }, DHTConstants.RPC_CALL_TIMEOUT, TimeUnit.MILLISECONDS); } private void onCallResponse (MessageBase rsp) { if (listener != null) { for (int i = 0; i < listener.size(); i++) { listener.get(i).onResponse(this, rsp); } } } private void onCallTimeout () { if (msg != null) { DHT.logDebug("RPCCall timed out ID: " + new String(msg.getMTID())); try { rpc.timedOut(msg.getMTID()); } catch (Exception e) { e.printStackTrace(); } } if (listener != null) { for (int i = 0; i < listener.size(); i++) { try { listener.get(i).onTimeout(this); } catch (Exception e) { e.printStackTrace(); } } } } }