package freenet.node;
import freenet.client.async.ChosenBlock;
import freenet.client.async.ClientContext;
import freenet.keys.ClientKey;
import freenet.keys.Key;
import freenet.support.LogThresholdCallback;
import freenet.support.Logger;
import freenet.support.Logger.LogLevel;
public class SendableGetRequestSender implements SendableRequestSender {
private static volatile boolean logMINOR;
static {
Logger.registerLogThresholdCallback(new LogThresholdCallback() {
@Override
public void shouldUpdate() {
logMINOR = Logger.shouldLog(LogLevel.MINOR, this);
}
});
}
public boolean sendIsBlocking() {
return false;
}
/** Do the request, blocking. Called by RequestStarter.
* Also responsible for deleting it.
* @return True if a request was executed. False if caller should try to find another request, and remove
* this one from the queue. */
@Override
public boolean send(NodeClientCore core, final RequestScheduler sched, final ClientContext context, final ChosenBlock req) {
Object keyNum = req.token;
final ClientKey key = req.ckey;
if(key == null) {
Logger.error(SendableGet.class, "Key is null in send(): keyNum = "+keyNum+" for "+req);
return false;
}
if(logMINOR)
Logger.minor(SendableGet.class, "Sending get for key "+keyNum+" : "+key);
if(req.isCancelled()) {
if(logMINOR) Logger.minor(SendableGet.class, "Cancelled: "+req);
req.onFailure(new LowLevelGetException(LowLevelGetException.CANCELLED), context);
return false;
}
try {
try {
final Key k = key.getNodeKey();
core.asyncGet(k, false, new RequestCompletionListener() {
@Override
public void onSucceeded() {
req.onFetchSuccess(context);
}
@Override
public void onFailed(LowLevelGetException e) {
req.onFailure(e, context);
}
}, !req.ignoreStore, req.canWriteClientCache, req.realTimeFlag, req.localRequestOnly, req.ignoreStore);
} catch (Throwable t) {
Logger.error(this, "Caught "+t, t);
req.onFailure(new LowLevelGetException(LowLevelGetException.INTERNAL_ERROR), context);
return true;
}
} catch (Throwable t) {
Logger.error(this, "Caught "+t, t);
req.onFailure(new LowLevelGetException(LowLevelGetException.INTERNAL_ERROR), context);
return true;
}
return true;
}
}