/**
* Notifies all listeners that a request was added to a node.
*
- * @param node
- * The node the request was added to
* @param request
* The request that was added
*/
- private void fireRequestAdded(Node node, Request request) {
+ private void fireRequestAdded(Request request) {
for (CoreListener coreListener: coreListeners) {
- coreListener.requestAdded(node, request);
+ coreListener.requestAdded(request);
}
}
/**
* Notifies all listeners that a request progressed.
*
- * @param node
- * The node that runs the request
* @param request
* The request
- * @param totalBlocks
- * The total number of blocks
- * @param requiredBlocks
- * The number of required blocks
- * @param successfulBlocks
- * The number of successful blocks
- * @param failedBlocks
- * The number of failed blocks
- * @param fatallyFailedBlocks
- * The number of fatally failed blocks
- * @param finalizedTotal
- * <code>true</code> if the total number of blocks in final,
- * <code>false</code> otherwise
- */
- private void fireRequestProgressed(Node node, Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) {
+ */
+ private void fireRequestProgressed(Request request) {
for (CoreListener coreListener: coreListeners) {
- coreListener.requestProgressed(request, totalBlocks, requiredBlocks, successfulBlocks, failedBlocks, fatallyFailedBlocks, finalizedTotal);
+ coreListener.requestProgressed(request);
}
}
/**
* {@inheritDoc}
*/
- public void requestAdded(Node node, Request request) {
- fireRequestAdded(node, request);
+ public void requestAdded(Request request) {
+ fireRequestAdded(request);
}
/**
- * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(net.pterodactylus.jsite.core.Node,
- * net.pterodactylus.jsite.core.Request, int, int, int, int, int,
- * boolean)
+ * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(Request)
*/
- public void requestProgressed(Node node, Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) {
- fireRequestProgressed(node, request, totalBlocks, requiredBlocks, successfulBlocks, failedBlocks, fatallyFailedBlocks, finalizedTotal);
+ public void requestProgressed(Request request) {
+ fireRequestProgressed(request);
}
+
+ /**
+ * @see net.pterodactylus.jsite.core.RequestListener#requestRemoved(net.pterodactylus.jsite.core.Request)
+ */
+ public void requestRemoved(Request request) {
+ /* TODO */
+ }
+
}
/**
* Notifies a listener that a request was added to a node.
*
- * @param node
- * The node the request was added to
* @param request
* The request that was added
*/
- public void requestAdded(Node node, Request request);
+ public void requestAdded(Request request);
/**
* Notifies a listener that a request made some progress.
*
* @param request
* The request that made the progress
- * @param totalBlocks
- * The total number of blocks
- * @param requiredBlocks
- * The number of required blocks
- * @param successfulBlocks
- * The number of successful blocks
- * @param failedBlocks
- * The number of failed blocks
- * @param fatallyFailedBlocks
- * The number of fatally failed blocks
- * @param finalizedTotal
- * <code>true</code> if the number of total blocks is
- * finalized, <code>false</code> if it is not
- */
- public void requestProgressed(Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal);
+ */
+ public void requestProgressed(Request request);
}
return nodeClients.get(node);
}
+ /**
+ * Returns the node for a high-level client.
+ *
+ * @param highLevelClient
+ * The high-level client to get the node for
+ * @return The node for the high-level client, or <code>null</code> if the
+ * high-level client is not known
+ */
+ public Node getNode(HighLevelClient highLevelClient) {
+ return clientNodes.get(highLevelClient);
+ }
+
//
// PRIVATE METHODS
//
package net.pterodactylus.jsite.core;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
/**
* A request is an ongoing download or upload reported by the freenet node.
*
*/
public class Request {
+ /** Name of the “client token” property. */
+ public static final String PROPERTY_CLIENT_TOKEN = "clientToken";
+
+ /** Name of the “total blocks” property. */
+ public static final String PROPERTY_TOTAL_BLOCKS = "totalBlocks";
+
+ /** Name of the “required blocks” property. */
+ public static final String PROPERTY_REQUIRED_BLOCKS = "requiredBlocks";
+
+ /** Name of the “successful blocks” property. */
+ public static final String PROPERTY_SUCCESSFUL_BLOCKS = "successfulBlocks";
+
+ /** Name of the “failed blocks” property. */
+ public static final String PROPERTY_FAILED_BLOCKS = "failedBlocks";
+
+ /** Name of the “fatally failed blocks” property. */
+ public static final String PROPERTY_FATALLY_FAILED_BLOCKS = "fatallyFailedBlocks";
+
+ /** Name of the “total finalized” property. */
+ public static final String PROPERTY_TOTAL_FINALIZED = "totalFinalized";
+
+ /** Property change listeners. */
+ private final List<PropertyChangeListener> propertyChangeListeners = Collections.synchronizedList(new ArrayList<PropertyChangeListener>());
+
+ /** The node the request belongs to. */
+ private final Node node;
+
/** The identifier of the request. */
private final String identifier;
+ /** The client token of the request. */
+ private String clientToken;
+
+ /** The total number of blocks. */
+ private int totalBlocks;
+
+ /** The required number of blocks. */
+ private int requiredBlocks;
+
+ /** The number of successful blocks. */
+ private int successfulBlocks;
+
+ /** The number of failedBlocks. */
+ private int failedBlocks;
+
+ /** The number of fatally failed blocks. */
+ private int fatallyFailedBlocks;
+
+ /** Whether the total number has been finalized. */
+ private boolean totalFinalized;
+
+ //
+ // EVENT MANAGEMENT
+ //
+
+ /**
+ * Adds a property change listener.
+ *
+ * @param propertyChangeListener
+ * The property change listener to add
+ */
+ public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener) {
+ propertyChangeListeners.add(propertyChangeListener);
+ }
+
+ /**
+ * Removes a property change listener.
+ *
+ * @param propertyChangeListener
+ * The property change listener to remove
+ */
+ public void removePropertyChangeListener(PropertyChangeListener propertyChangeListener) {
+ propertyChangeListeners.remove(propertyChangeListener);
+ }
+
+ /**
+ * Notifies all listeners that a property has changed.
+ *
+ * @param property
+ * The name of the property
+ * @param oldValue
+ * The old value of the property
+ * @param newValue
+ * The new value of the property
+ */
+ private void firePropertyChange(String property, Object oldValue, Object newValue) {
+ PropertyChangeEvent propertyChangeEvent = new PropertyChangeEvent(this, property, oldValue, newValue);
+ for (PropertyChangeListener propertyChangeListener: propertyChangeListeners) {
+ propertyChangeListener.propertyChange(propertyChangeEvent);
+ }
+
+ }
+
/**
* Creates a new request with the given identifier.
*
+ * @param node
+ * The node the request belongs to
* @param identifier
* The identifier of the request
*/
- Request(String identifier) {
+ Request(Node node, String identifier) {
+ this.node = node;
this.identifier = identifier;
}
/**
+ * Returns the node the request belongs to.
+ *
+ * @return The node the request belongs to
+ */
+ public Node getNode() {
+ return node;
+ }
+
+ /**
* Returns the identifier of the request. It is unique per node.
*
* @return The identifier of the request
return identifier;
}
+ /**
+ * Returns the client token of the request.
+ *
+ * @return The client token of the request
+ */
+ public String getClientToken() {
+ return clientToken;
+ }
+
+ /**
+ * Sets the client token of the request.
+ *
+ * @param clientToken
+ * The client token of the request
+ */
+ public void setClientToken(String clientToken) {
+ String oldClientToken = this.clientToken;
+ this.clientToken = clientToken;
+ if (((oldClientToken == null) && (clientToken != null)) || ((oldClientToken != null) && (clientToken == null)) || ((clientToken != null) && !clientToken.equals(oldClientToken))) {
+ firePropertyChange(PROPERTY_CLIENT_TOKEN, oldClientToken, clientToken);
+ }
+ }
+
+ /**
+ * Returns the total number of blocks of a request. Until
+ * {@link #isTotalFinalized()} returns <code>true</code> this value may
+ * change!
+ *
+ * @return The total number of blocks of a request
+ */
+ public int getTotalBlocks() {
+ return totalBlocks;
+ }
+
+ /**
+ * Sets the total number of blocks of a request.
+ *
+ * @param totalBlocks
+ * The total number of blocks
+ */
+ public void setTotalBlocks(int totalBlocks) {
+ int oldTotalBlocks = this.totalBlocks;
+ this.totalBlocks = totalBlocks;
+ if (oldTotalBlocks != totalBlocks) {
+ firePropertyChange(PROPERTY_TOTAL_BLOCKS, oldTotalBlocks, totalBlocks);
+ }
+ }
+
+ /**
+ * @return the requiredBlocks
+ */
+ public int getRequiredBlocks() {
+ return requiredBlocks;
+ }
+
+ /**
+ * @param requiredBlocks
+ * the requiredBlocks to set
+ */
+ public void setRequiredBlocks(int requiredBlocks) {
+ int oldRequiredBlocks = this.requiredBlocks;
+ this.requiredBlocks = requiredBlocks;
+ if (oldRequiredBlocks != requiredBlocks) {
+ firePropertyChange(PROPERTY_REQUIRED_BLOCKS, oldRequiredBlocks, requiredBlocks);
+ }
+ }
+
+ /**
+ * @return the successfulBlocks
+ */
+ public int getSuccessfulBlocks() {
+ return successfulBlocks;
+ }
+
+ /**
+ * @param successfulBlocks
+ * the successfulBlocks to set
+ */
+ public void setSuccessfulBlocks(int successfulBlocks) {
+ int oldSuccessfulBlocks = this.successfulBlocks;
+ this.successfulBlocks = successfulBlocks;
+ if (oldSuccessfulBlocks != successfulBlocks) {
+ firePropertyChange(PROPERTY_SUCCESSFUL_BLOCKS, oldSuccessfulBlocks, successfulBlocks);
+ }
+ }
+
+ /**
+ * @return the failedBlocks
+ */
+ public int getFailedBlocks() {
+ return failedBlocks;
+ }
+
+ /**
+ * @param failedBlocks
+ * the failedBlocks to set
+ */
+ public void setFailedBlocks(int failedBlocks) {
+ int oldFailedBlocks = this.failedBlocks;
+ this.failedBlocks = failedBlocks;
+ if (oldFailedBlocks != failedBlocks) {
+ firePropertyChange(PROPERTY_FAILED_BLOCKS, oldFailedBlocks, failedBlocks);
+ }
+ }
+
+ /**
+ * @return the fatallyFailedBlocks
+ */
+ public int getFatallyFailedBlocks() {
+ return fatallyFailedBlocks;
+ }
+
+ /**
+ * @param fatallyFailedBlocks
+ * the fatallyFailedBlocks to set
+ */
+ public void setFatallyFailedBlocks(int fatallyFailedBlocks) {
+ int oldFatallyFailedBlocks = this.fatallyFailedBlocks;
+ this.fatallyFailedBlocks = fatallyFailedBlocks;
+ if (oldFatallyFailedBlocks != fatallyFailedBlocks) {
+ firePropertyChange(PROPERTY_FATALLY_FAILED_BLOCKS, oldFatallyFailedBlocks, fatallyFailedBlocks);
+ }
+ }
+
+ /**
+ * @return the totalFinalized
+ */
+ public boolean isTotalFinalized() {
+ return totalFinalized;
+ }
+
+ /**
+ * @param totalFinalized
+ * the totalFinalized to set
+ */
+ public void setTotalFinalized(boolean totalFinalized) {
+ boolean oldTotalFinalized = this.totalFinalized;
+ this.totalFinalized = totalFinalized;
+ if (oldTotalFinalized != totalFinalized) {
+ firePropertyChange(PROPERTY_TOTAL_FINALIZED, oldTotalFinalized, totalFinalized);
+ }
+ }
+
}
/**
* Notifies a listener that a request was added to a node.
*
- * @param node
- * The node the request was added to
* @param request
* The request that was added
*/
- public void requestAdded(Node node, Request request);
+ public void requestAdded(Request request);
/**
* Notifies a listener that a request made progress.
*
- * @param node
- * The node that runs the request
* @param request
* The request
- * @param totalBlocks
- * The total number of blocks
- * @param requiredBlocks
- * The number of required blocks
- * @param successfulBlocks
- * The number of successful blocks
- * @param failedBlocks
- * The number of failed blocks
- * @param fatallyFailedBlocks
- * The number of fatally failed blocks
- * @param finalizedTotal
- * <code>true</code> if the total number of blocks in final,
- * <code>false</code> otherwise
*/
- public void requestProgressed(Node node, Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal);
+ public void requestProgressed(Request request);
+
+ /**
+ * Notifies a listener that a request was removed.
+ *
+ * @param request
+ * The request that was removed
+ */
+ public void requestRemoved(Request request);
}
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
/** Request lists for all nodes. */
@SuppressWarnings("unused")
- private Map<Node, Set<Request>> nodeRequests = Collections.synchronizedMap(new HashMap<Node, Set<Request>>());
+ private Map<Node, Map<String, Request>> nodeRequests = Collections.synchronizedMap(new HashMap<Node, Map<String, Request>>());
//
// EVENT MANAGEMENT
/**
* 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(node, request);
+ requestListener.requestAdded(request);
}
}
/**
* Notifies all listeners that a request progressed.
*
- * @param node
- * The node that runs the request
* @param request
* The request
- * @param totalBlocks
- * The total number of blocks
- * @param requiredBlocks
- * The number of required blocks
- * @param successfulBlocks
- * The number of successful blocks
- * @param failedBlocks
- * The number of failed blocks
- * @param fatallyFailedBlocks
- * The number of fatally failed blocks
- * @param finalizedTotal
- * <code>true</code> if the total number of blocks in final,
- * <code>false</code> otherwise
*/
- private void fireRequestProgressed(Node node, Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) {
+ private void fireRequestProgressed(Request request) {
for (RequestListener requestListener: requestListeners) {
- requestListener.requestProgressed(node, request, totalBlocks, requiredBlocks, successfulBlocks, failedBlocks, fatallyFailedBlocks, finalizedTotal);
+ requestListener.requestProgressed(request);
}
}
+ // TODO - fireRequestRemoved
+
//
// ACCESSORS
//
logger.log(Level.WARNING, "no client for node: " + node);
return;
}
+ final Map<String, Request> identifierRequests = new HashMap<String, Request>();
+ nodeRequests.put(node, identifierRequests);
HighLevelCallback<RequestListResult> requestListCallback = highLevelClient.getRequests();
requestListCallback.addHighLevelCallbackListener(new HighLevelCallbackListener<RequestListResult>() {
return;
}
for (RequestResult requestResult: requestListResult) {
- Request request = new Request(requestResult.getIdentifier());
+ Request request = new Request(node, requestResult.getIdentifier());
+ identifierRequests.put(requestResult.getIdentifier(), request);
/* TODO - fill request */
- fireRequestAdded(node, request);
+ fireRequestAdded(request);
}
}
});
//
/**
- * @see net.pterodactylus.fcp.highlevel.HighLevelProgressListener#progressReceived(java.lang.String,
- * net.pterodactylus.fcp.highlevel.HighLevelProgress)
+ * @see net.pterodactylus.fcp.highlevel.HighLevelProgressListener#progressReceived(HighLevelClient,
+ * String, HighLevelProgress)
*/
- public void progressReceived(String identifier, HighLevelProgress highLevelProgress) {
- fireRequestProgressed(null, new Request(identifier), highLevelProgress.getTotalBlocks(), highLevelProgress.getRequiredBlocks(), highLevelProgress.getSuccessfulBlocks(), highLevelProgress.getFailedBlocks(), highLevelProgress.getFatallyFailedBlocks(), highLevelProgress.isTotalFinalized());
+ 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<String, Request> identifierRequests = nodeRequests.get(node);
+ if (identifierRequests == null) {
+ logger.warning("got node without request map: " + node);
+ return;
+ }
+ Request request = identifierRequests.get(identifier);
+ if (request == null) {
+ logger.warning("got progress for unknown request: " + identifier);
+ return;
+ }
+ 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);
}
}
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
+import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
+import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
/** The project overview panel. */
private Box projectOverviewPanel;
+ /** The request table. */
+ private JTable requestTable;
+
/**
* Creates a new main window that redirects all actions to the given swing
* interface.
projectOverviewPanel.add(addProjectButton);
projectOverviewPanel.add(Box.createVerticalGlue());
+ requestTable = new JTable(swingInterface.getRequestTableModel());
+ getContentPane().add(new JScrollPane(requestTable), BorderLayout.CENTER);
+
// JPanel lowerPanel = new JPanel(new BorderLayout(12, 12));
// getContentPane().add(lowerPanel, BorderLayout.CENTER);
}
/** The list of all defined nodes. */
private List<Node> nodeList = Collections.synchronizedList(new ArrayList<Node>());
+ /** The request table model. */
+ private RequestTableModel requestTableModel = new RequestTableModel();
+
//
// CONFIGURATION
//
return deleteProjectAction;
}
+ /**
+ * Returns the request table model.
+ *
+ * @return The request table model
+ */
+ RequestTableModel getRequestTableModel() {
+ return requestTableModel;
+ }
+
//
// ACTIONS
//
JOptionPane.showMessageDialog(mainWindow, I18n.get("mainWindow.error.nodeConnectionFailed.message", node.getName(), node.getHostname(), node.getPort(), (cause != null) ? cause.getMessage() : "no reason given"), I18n.get("mainWindow.error.nodeConnectionFailed.title"), JOptionPane.ERROR_MESSAGE);
mainWindow.refreshNodeMenuItems();
}
-
+
/**
* {@inheritDoc}
*/
/**
* {@inheritDoc}
*/
- public void requestAdded(Node node, Request request) {
- logger.log(Level.INFO, "request added to node: " + request + ", " + node);
+ public void requestAdded(Request request) {
+ logger.log(Level.INFO, "request added to node: " + request + ", " + request.getNode());
/* TODO - implement */
+ requestTableModel.addRequest(request);
}
/**
* {@inheritDoc}
*/
- public void requestProgressed(Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) {
+ public void requestProgressed(Request request) {
/* TODO - update table model */
- mainWindow.setStatusBarText(request.getIdentifier() + " @ " + ((10000 * successfulBlocks / requiredBlocks) / 100.0) + "%");
}
//