X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fcore%2FRequestManager.java;h=b6da95be2e019403fef404ed808dd9cd843f582a;hb=c63257e8cc0ba1a5aca9364b22171abe7279d479;hp=a90207b4b78bf00e1839ba068fb2cf8ce91da0d5;hpb=818fddc5687bcb1dccada1814ea9a39112d8fcb4;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/core/RequestManager.java b/src/net/pterodactylus/jsite/core/RequestManager.java index a90207b..b6da95b 100644 --- a/src/net/pterodactylus/jsite/core/RequestManager.java +++ b/src/net/pterodactylus/jsite/core/RequestManager.java @@ -28,13 +28,18 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import net.pterodactylus.fcp.highlevel.GetRequestResult; import net.pterodactylus.fcp.highlevel.HighLevelCallback; import net.pterodactylus.fcp.highlevel.HighLevelCallbackListener; import net.pterodactylus.fcp.highlevel.HighLevelClient; +import net.pterodactylus.fcp.highlevel.HighLevelException; import net.pterodactylus.fcp.highlevel.HighLevelProgress; import net.pterodactylus.fcp.highlevel.HighLevelProgressListener; +import net.pterodactylus.fcp.highlevel.PutDirRequestResult; +import net.pterodactylus.fcp.highlevel.PutRequestResult; import net.pterodactylus.fcp.highlevel.RequestListResult; import net.pterodactylus.fcp.highlevel.RequestResult; +import net.pterodactylus.jsite.core.Request.Type; import net.pterodactylus.util.logging.Logging; /** @@ -42,9 +47,8 @@ import net.pterodactylus.util.logging.Logging; * The request manager is added to the {@link NodeManager} as a * {@link NodeListener} so that it can fire request-removed events in case a * node is disconnected. - * + * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> - * @version $Id$ */ public class RequestManager implements NodeListener, HighLevelProgressListener { @@ -67,7 +71,7 @@ public class RequestManager implements NodeListener, HighLevelProgressListener { /** * Adds a request listener. - * + * * @param requestListener * The request listener to add */ @@ -77,7 +81,7 @@ public class RequestManager implements NodeListener, HighLevelProgressListener { /** * Removes a request listener. - * + * * @param requestListener * The request listener to remove */ @@ -87,47 +91,75 @@ public class RequestManager implements NodeListener, HighLevelProgressListener { /** * Notifies all listeners that a request was added. - * + * * @param request * The request that was added */ private void fireRequestAdded(Request request) { - for (RequestListener requestListener: requestListeners) { + for (RequestListener requestListener : requestListeners) { requestListener.requestAdded(request); } } /** * Notifies all listeners that a request progressed. - * + * * @param request * The request */ private void fireRequestProgressed(Request request) { - for (RequestListener requestListener: requestListeners) { + for (RequestListener requestListener : requestListeners) { requestListener.requestProgressed(request); } } /** * Notifies all listeners that a request was removed. - * + * * @param request * The request that was removed */ private void fireRequestRemoved(Request request) { - for (RequestListener requestListener: requestListeners) { + for (RequestListener requestListener : requestListeners) { requestListener.requestRemoved(request); } } + /** + * Notifies all listeners that a request has finished. + * + * @see RequestListener#requestFinished(Request) + * @param request + * The request that has finished + */ + private void fireRequestFinished(Request request) { + for (RequestListener requestListener : requestListeners) { + requestListener.requestFinished(request); + } + } + + /** + * Notifies all listeners that a request has generated a URI. + * + * @see RequestListener#requestGeneratedURI(Request, String) + * @param request + * The request that has generated a URI + * @param uri + * The generated URI + */ + private void fireRequestGeneratedURI(Request request, String uri) { + for (RequestListener requestListener : requestListeners) { + requestListener.requestGeneratedURI(request, uri); + } + } + // // ACCESSORS // /** * Sets the node manager to use. - * + * * @param nodeManager * The node manager */ @@ -146,44 +178,63 @@ public class RequestManager implements NodeListener, HighLevelProgressListener { /** * Requests a list of all running requests from a node. This method will * block until the request has been sent! - * + * * @param node * The node to get all requests for * @throws IOException * if an I/O error occurs while communicating with the node + * @throws JSiteException + * if there is a problem with the node */ - private void getRequests(final Node node) throws IOException { + private void getRequests(final Node node) throws IOException, JSiteException { HighLevelClient highLevelClient = nodeManager.getHighLevelClient(node); if (highLevelClient == null) { logger.log(Level.WARNING, "no client for node: " + node); return; } - final Map identifierRequests = new HashMap(); + final Map identifierRequests = Collections.synchronizedMap(new HashMap()); nodeRequests.put(node, identifierRequests); - HighLevelCallback requestListCallback = highLevelClient.getRequests(); - requestListCallback.addHighLevelCallbackListener(new HighLevelCallbackListener() { + HighLevelCallback requestListCallback; + try { + requestListCallback = highLevelClient.getRequests(); + requestListCallback.addHighLevelCallbackListener(new HighLevelCallbackListener() { - @SuppressWarnings("synthetic-access") - public void gotResult(HighLevelCallback highLevelCallback) { - RequestListResult requestListResult; - try { - requestListResult = highLevelCallback.getResult(); - } catch (InterruptedException e) { - logger.log(Level.SEVERE, "getResult() blocked and was interrupted"); - return; - } - for (RequestResult requestResult: requestListResult) { - String identifier = requestResult.getIdentifier(); - if (identifierRequests.containsKey(identifier)) { - continue; + @SuppressWarnings("synthetic-access") + public void gotResult(HighLevelCallback highLevelCallback) { + RequestListResult requestListResult; + try { + requestListResult = highLevelCallback.getResult(); + } catch (InterruptedException e) { + logger.log(Level.SEVERE, "getResult() blocked and was interrupted"); + return; + } + for (RequestResult requestResult : requestListResult) { + String identifier = requestResult.getIdentifier(); + logger.log(Level.FINER, "got identifier: " + identifier); + Request request = identifierRequests.get(identifier); + if (request == null) { + request = new Request(node, identifier); + } + if (request.getType() == null) { + if (requestResult instanceof GetRequestResult) { + request.setType(Type.get); + } else if (requestResult instanceof PutRequestResult) { + request.setType(Type.put); + } else if (requestResult instanceof PutDirRequestResult) { + request.setType(Type.putDir); + } + } + if (identifierRequests.containsKey(identifier)) { + continue; + } + identifierRequests.put(requestResult.getIdentifier(), request); + fireRequestAdded(request); } - Request request = new Request(node, identifier); - identifierRequests.put(requestResult.getIdentifier(), request); - /* TODO - fill request */ - fireRequestAdded(request); } - } - }); + }); + } catch (HighLevelException hle1) { + throw new BackendException(hle1); + } } // @@ -226,6 +277,10 @@ public class RequestManager implements NodeListener, HighLevelProgressListener { try { highLevelClient.setWatchGlobal(true); getRequests(node); + } catch (HighLevelException hle1) { + logger.log(Level.WARNING, "error in backend", hle1); + } catch (JSiteException jse1) { + logger.log(Level.WARNING, "error in backend", jse1); } catch (IOException e) { /* ignore exception, disconnects are handled elsewhere. */ } @@ -247,7 +302,7 @@ public class RequestManager implements NodeListener, HighLevelProgressListener { logger.warning("got node without request map: " + node); return; } - for (Request request: identifierRequests.values()) { + for (Request request : identifierRequests.values()) { fireRequestRemoved(request); } identifierRequests.clear(); @@ -270,20 +325,34 @@ public class RequestManager implements NodeListener, HighLevelProgressListener { Map identifierRequests = nodeRequests.get(node); if (identifierRequests == null) { logger.warning("got node without request map: " + node); - return; + identifierRequests = Collections.synchronizedMap(new HashMap()); + nodeRequests.put(node, identifierRequests); } Request request = identifierRequests.get(identifier); if (request == null) { logger.warning("got progress for unknown request: " + identifier); - return; + request = new Request(node, identifier); + identifierRequests.put(identifier, request); + fireRequestAdded(request); + } + if (highLevelProgress.isFinished()) { + request.setFinished(true); + request.setSuccessful(!highLevelProgress.isFailed()); + fireRequestFinished(request); + } else if (highLevelProgress.isFetchable()) { + /* TODO - ignore? */ + } else if (highLevelProgress.getURI() != null) { + request.setURI(highLevelProgress.getURI()); + fireRequestGeneratedURI(request, highLevelProgress.getURI()); + } else { + request.setTotalBlocks(highLevelProgress.getTotalBlocks()); + request.setRequiredBlocks(highLevelProgress.getRequiredBlocks()); + request.setSuccessfulBlocks(highLevelProgress.getSuccessfulBlocks()); + request.setFailedBlocks(highLevelProgress.getFailedBlocks()); + request.setFatallyFailedBlocks(highLevelProgress.getFatallyFailedBlocks()); + request.setTotalFinalized(highLevelProgress.isTotalFinalized()); + fireRequestProgressed(request); } - request.setTotalBlocks(highLevelProgress.getTotalBlocks()); - request.setRequiredBlocks(highLevelProgress.getRequiredBlocks()); - request.setSuccessfulBlocks(highLevelProgress.getSuccessfulBlocks()); - request.setFailedBlocks(highLevelProgress.getFailedBlocks()); - request.setFatallyFailedBlocks(highLevelProgress.getFatallyFailedBlocks()); - request.setTotalFinalized(highLevelProgress.isTotalFinalized()); - fireRequestProgressed(request); } }