package freenet.client.async; import freenet.keys.ClientKey; import freenet.keys.Key; import freenet.node.LowLevelGetException; import freenet.node.LowLevelPutException; import freenet.node.RequestScheduler; import freenet.node.SendableGet; import freenet.node.SendableInsert; import freenet.node.SendableRequest; import freenet.node.SendableRequestItem; import freenet.node.SendableRequestSender; import freenet.support.Logger; /** * @author Matthew Toseland <toad@amphibian.dyndns.org> (0xE43DA450) * */ public class ChosenBlockImpl extends ChosenBlock { private static volatile boolean logMINOR; private static volatile boolean logDEBUG; static { Logger.registerClass(ChosenBlockImpl.class); } public final SendableRequest request; public final RequestScheduler sched; public final boolean persistent; public ChosenBlockImpl(SendableRequest req, SendableRequestItem token, Key key, ClientKey ckey, boolean localRequestOnly, boolean ignoreStore, boolean canWriteClientCache, boolean forkOnCacheable, boolean realTimeFlag, RequestScheduler sched, boolean persistent) { super(token, key, ckey, localRequestOnly, ignoreStore, canWriteClientCache, forkOnCacheable, realTimeFlag, sched); this.request = req; this.sched = sched; this.persistent = persistent; if(logDEBUG) Logger.minor(this, "Created "+this+" for "+(persistent?"persistent":"transient")+" block "+token+" for key "+key, new Exception("debug")); } @Override public boolean isCancelled() { return request.isCancelled(); } @Override public boolean isPersistent() { return persistent; } @Override public void onFailure(final LowLevelPutException e, ClientContext context) { context.getJobRunner(persistent).queueNormalOrDrop(new PersistentJob() { @Override public boolean run(ClientContext context) { try { ((SendableInsert) request).onFailure(e, token, context); } finally { sched.removeRunningInsert((SendableInsert)(request), token.getKey()); // Something might be waiting for a request to complete (e.g. if we have two requests for the same key), // so wake the starter thread. } sched.wakeStarter(); return false; } }); } @Override public void onInsertSuccess(final ClientKey key, ClientContext context) { context.getJobRunner(persistent).queueNormalOrDrop(new PersistentJob() { @Override public boolean run(ClientContext context) { try { ((SendableInsert) request).onSuccess(token, key, context); } finally { sched.removeRunningInsert((SendableInsert)(request), token.getKey()); } // Something might be waiting for a request to complete (e.g. if we have two requests for the same key), // so wake the starter thread. sched.wakeStarter(); return false; } }); } @Override public void onFailure(final LowLevelGetException e, ClientContext context) { context.getJobRunner(persistent).queueNormalOrDrop(new PersistentJob() { @Override public boolean run(ClientContext context) { try { ((SendableGet) request).onFailure(e, token, context); } finally { sched.removeFetchingKey(key); } // Something might be waiting for a request to complete (e.g. if we have two requests for the same key), // so wake the starter thread. sched.wakeStarter(); return false; } }); } @Override public void onFetchSuccess(ClientContext context) { context.getJobRunner(persistent).queueNormalOrDrop(new PersistentJob() { @Override public boolean run(ClientContext context) { try { sched.succeeded((SendableGet)request, false); } finally { sched.removeFetchingKey(key); } // Something might be waiting for a request to complete (e.g. if we have two requests for the same key), // so wake the starter thread. sched.wakeStarter(); return false; } }); } @Override public short getPriority() { return request.getPriorityClass(); } @Override public SendableRequestSender getSender(ClientContext context) { return request.getSender(context); } }