package net.i2p.router.networkdb.kademlia;
import net.i2p.data.Hash;
import net.i2p.data.router.RouterInfo;
import net.i2p.data.i2np.DeliveryStatusMessage;
import net.i2p.data.i2np.I2NPMessage;
import net.i2p.router.MessageSelector;
import net.i2p.router.RouterContext;
import net.i2p.util.Log;
/**
* Check to see the message is a reply from the peer regarding the current
* store
*
*/
class StoreMessageSelector implements MessageSelector {
private final Log _log;
private final Hash _peer;
private final long _storeJobId;
private final long _waitingForId;
private final long _expiration;
private volatile boolean _found;
/**
* @param storeJobId just for logging
* @param peer just for logging
*/
public StoreMessageSelector(RouterContext ctx, long storeJobId, RouterInfo peer, long waitingForId,
long expiration) {
_log = ctx.logManager().getLog(StoreMessageSelector.class);
_peer = peer.getIdentity().getHash();
_storeJobId = storeJobId;
_waitingForId = waitingForId;
_expiration = expiration;
}
public boolean continueMatching() { return !_found; }
public long getExpiration() { return _expiration; }
public boolean isMatch(I2NPMessage message) {
if (_log.shouldLog(Log.DEBUG))
_log.debug(_storeJobId + ": isMatch("+message.getClass().getName() + ") [want deliveryStatusMessage from "
+ _peer + "]");
if (message instanceof DeliveryStatusMessage) {
DeliveryStatusMessage msg = (DeliveryStatusMessage)message;
if (msg.getMessageId() == _waitingForId) {
if (_log.shouldLog(Log.INFO))
_log.info(_storeJobId + ": Found match for the key we're waiting for: " + _waitingForId);
_found = true;
return true;
} else {
if (_log.shouldLog(Log.DEBUG))
_log.debug(_storeJobId + ": DeliveryStatusMessage of a key we're not looking for");
return false;
}
} else {
if (_log.shouldLog(Log.DEBUG))
_log.debug(_storeJobId + ": Not a DeliveryStatusMessage");
return false;
}
}
@Override
public String toString() {
StringBuilder rv = new StringBuilder(128);
rv.append("Waiting for netDb confirm from ").append(_peer).append(", found? ");
rv.append(_found).append(" waiting for ").append(_waitingForId);
return rv.toString();
}
}