X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fcore%2FRequestManager.java;h=3b98dc2c97f911ba3f6d8ef25aafcda4229a7e4f;hb=e99f6d1dafdf8733125537e8ab36d0fedc325630;hp=f2aa23f6aa1d69bdcad39987a82e89592c1d6427;hpb=7ccb1fcb746198ee1417bb2f92c846132bf6bc96;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/core/RequestManager.java b/src/net/pterodactylus/jsite/core/RequestManager.java index f2aa23f..3b98dc2 100644 --- a/src/net/pterodactylus/jsite/core/RequestManager.java +++ b/src/net/pterodactylus/jsite/core/RequestManager.java @@ -22,13 +22,17 @@ package net.pterodactylus.jsite.core; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import net.pterodactylus.fcp.highlevel.HighLevelCallback; import net.pterodactylus.fcp.highlevel.HighLevelCallbackListener; import net.pterodactylus.fcp.highlevel.HighLevelClient; +import net.pterodactylus.fcp.highlevel.HighLevelProgress; +import net.pterodactylus.fcp.highlevel.HighLevelProgressListener; import net.pterodactylus.fcp.highlevel.RequestListResult; import net.pterodactylus.fcp.highlevel.RequestResult; import net.pterodactylus.util.logging.Logging; @@ -42,7 +46,7 @@ import net.pterodactylus.util.logging.Logging; * @author David ‘Bombe’ Roden <bombe@freenetproject.org> * @version $Id$ */ -public class RequestManager implements NodeListener { +public class RequestManager implements NodeListener, HighLevelProgressListener { /** Logger. */ private static final Logger logger = Logging.getLogger(RequestManager.class.getName()); @@ -53,6 +57,10 @@ public class RequestManager implements NodeListener { /** The node manager. */ private NodeManager nodeManager; + /** Request lists for all nodes. */ + @SuppressWarnings("unused") + private Map> nodeRequests = Collections.synchronizedMap(new HashMap>()); + // // EVENT MANAGEMENT // @@ -80,14 +88,36 @@ public class RequestManager implements NodeListener { /** * Notifies all listeners that a request was added. * - * @param node - * The node that added the request * @param request * The request that was added */ - private void fireRequestAdded(Node node, Request request) { + private void fireRequestAdded(Request request) { + 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) { + 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) { - requestListener.requestAdded(node, request); + requestListener.requestRemoved(request); } } @@ -109,6 +139,10 @@ public class RequestManager implements NodeListener { // ACTIONS // + // + // PRIVATE ACTIONS + // + /** * Requests a list of all running requests from a node. This method will * block until the request has been sent! @@ -118,35 +152,39 @@ public class RequestManager implements NodeListener { * @throws IOException * if an I/O error occurs while communicating with the node */ - public void getRequests(final Node node) throws IOException { - HighLevelClient highLevelClient = nodeManager.borrowHighLevelClient(node); + private void getRequests(final Node node) throws IOException { + HighLevelClient highLevelClient = nodeManager.getHighLevelClient(node); if (highLevelClient == null) { logger.log(Level.WARNING, "no client for node: " + node); return; } - try { - HighLevelCallback 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) { - Request request = new Request(requestResult.getIdentifier()); + final Map identifierRequests = Collections.synchronizedMap(new HashMap()); + nodeRequests.put(node, identifierRequests); + HighLevelCallback 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(); + logger.log(Level.FINER, "got identifier: " + identifier); + if (identifierRequests.containsKey(identifier)) { + continue; + } + Request request = new Request(node, identifier); + identifierRequests.put(requestResult.getIdentifier(), request); /* TODO - fill request */ - fireRequestAdded(node, request); - } + fireRequestAdded(request); } - }); - } finally { - nodeManager.returnHighLevelClient(highLevelClient); - } + } + }); } // @@ -156,15 +194,100 @@ public class RequestManager implements NodeListener { /** * {@inheritDoc} */ + public void nodeAdded(Node node) { + HighLevelClient highLevelClient = nodeManager.getHighLevelClient(node); + if (highLevelClient == null) { + logger.warning("got nodeAdded but no high-level client: " + node); + return; + } + highLevelClient.addHighLevelProgressListener(this); + } + + /** + * {@inheritDoc} + */ + public void nodeRemoved(Node node) { + HighLevelClient highLevelClient = nodeManager.getHighLevelClient(node); + if (highLevelClient == null) { + logger.warning("got nodeRemoved but no high-level client: " + node); + return; + } + highLevelClient.removeHighLevelProgressListener(this); + } + + /** + * {@inheritDoc} + */ public void nodeConnected(Node node) { - /* TODO - get all requests. */ + HighLevelClient highLevelClient = nodeManager.getHighLevelClient(node); + if (highLevelClient == null) { + logger.log(Level.WARNING, "got no high-level client for node " + node); + return; + } + try { + highLevelClient.setWatchGlobal(true); + getRequests(node); + } catch (IOException e) { + /* ignore exception, disconnects are handled elsewhere. */ + } + } + + /** + * {@inheritDoc} + */ + public void nodeConnectionFailed(Node node, Throwable cause) { + /* we don't care about this. */ } /** * {@inheritDoc} */ public void nodeDisconnected(Node node, Throwable throwable) { - /* TODO - remove all requests. */ + Map identifierRequests = nodeRequests.get(node); + if (identifierRequests == null) { + logger.warning("got node without request map: " + node); + return; + } + for (Request request: identifierRequests.values()) { + fireRequestRemoved(request); + } + identifierRequests.clear(); + } + + // + // INTERFACE HighLevelProgressListener + // + + /** + * @see net.pterodactylus.fcp.highlevel.HighLevelProgressListener#progressReceived(HighLevelClient, + * String, HighLevelProgress) + */ + public void progressReceived(HighLevelClient highLevelClient, String identifier, HighLevelProgress highLevelProgress) { + Node node = nodeManager.getNode(highLevelClient); + if (node == null) { + logger.warning("got high-level client without node: " + highLevelClient); + return; + } + Map identifierRequests = nodeRequests.get(node); + if (identifierRequests == null) { + logger.warning("got node without request map: " + node); + 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); + request = new Request(node, identifier); + identifierRequests.put(identifier, request); + fireRequestAdded(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); } }