/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.client; import freenet.client.async.ClientContext; import freenet.client.async.ClientGetCallback; import freenet.client.async.ClientGetter; import freenet.node.RequestClient; /** Provides a blocking wrapper for a fetch. Used for simple blocking APIs such as HighLevelSimpleClient. */ public class FetchWaiter implements ClientGetCallback { private FetchResult result; private FetchException error; private boolean finished; private final RequestClient client; public FetchWaiter(RequestClient client) { this.client = client; } @Override public synchronized void onSuccess(FetchResult result, ClientGetter state) { if(finished) return; this.result = result; finished = true; notifyAll(); } @Override public synchronized void onFailure(FetchException e, ClientGetter state) { if(finished) return; this.error = e; finished = true; notifyAll(); } /** Wait for the request to complete, return the results, throw if it failed. */ public synchronized FetchResult waitForCompletion() throws FetchException { while(!finished) { try { wait(); } catch (InterruptedException e) { // Ignore } } if(error != null) throw error; return result; } @Override public void onResume(ClientContext context) { throw new UnsupportedOperationException(); // Not persistent. } @Override public RequestClient getRequestClient() { return client; } }