Author: jflesch
Date: 2006-07-10 15:55:18 +0000 (Mon, 10 Jul 2006)
New Revision: 9548
Modified:
trunk/apps/Thaw/src/thaw/core/Core.java
trunk/apps/Thaw/src/thaw/core/Logger.java
trunk/apps/Thaw/src/thaw/core/QueueKeeper.java
trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java
trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java
trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java
trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
trunk/apps/Thaw/src/thaw/fcp/FCPWatchGlobal.java
trunk/apps/Thaw/src/thaw/i18n/thaw.properties
trunk/apps/Thaw/src/thaw/plugins/FetchPlugin.java
trunk/apps/Thaw/src/thaw/plugins/fetchPlugin/KeyFileFilter.java
trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueueTableModel.java
Log:
Fixing queue resume : Wait for being ready before sending NodeHello + Avoid
identifier collision
Modified: trunk/apps/Thaw/src/thaw/core/Core.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/Core.java 2006-07-10 14:15:57 UTC (rev
9547)
+++ trunk/apps/Thaw/src/thaw/core/Core.java 2006-07-10 15:55:18 UTC (rev
9548)
@@ -154,13 +154,16 @@
if(connection.isConnected()) {
queryManager.startListening();
-
- clientHello = new FCPClientHello(queryManager,
config.getValue("thawId"));
queueManager = new FCPQueueManager(queryManager,
config.getValue("thawId"),
(new
Integer(config.getValue("maxSimultaneousDownloads"))).intValue(),
(new
Integer(config.getValue("maxSimultaneousInsertions"))).intValue());
+
+ QueueKeeper.loadQueue(queueManager,
"thaw.queue.xml");
+
+
+ clientHello = new FCPClientHello(queryManager,
config.getValue("thawId"));
if(!clientHello.start(null)) {
new WarningWindow(this,
I18n.getMessage("thaw.error.idAlreadyUsed"));
@@ -195,7 +198,7 @@
public boolean restorePreviousState() {
if(connection.isConnected()) {
- QueueKeeper.loadQueue(queueManager, "thaw.queue.xml");
+ queueManager.restartNonPersistent();
FCPWatchGlobal watchGlobal = new FCPWatchGlobal(true);
watchGlobal.start(queueManager);
@@ -236,7 +239,7 @@
*/
private void initializeLookAndFeel() { /* non static, else I can't call
correctly Logger functions */
- JFrame.setDefaultLookAndFeelDecorated(false); /* Don't touch my
window decoration ! */
+ JFrame.setDefaultLookAndFeelDecorated(false); /* Don't touch my
window decorations ! */
JDialog.setDefaultLookAndFeelDecorated(false);
try {
Modified: trunk/apps/Thaw/src/thaw/core/Logger.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/Logger.java 2006-07-10 14:15:57 UTC (rev
9547)
+++ trunk/apps/Thaw/src/thaw/core/Logger.java 2006-07-10 15:55:18 UTC (rev
9548)
@@ -16,7 +16,7 @@
* 5 = [...] + horrible things that only God could understand easily.
* (or maybe someone having the FCPv2 doc :)
*
- * 3 or more is recommanded.
+ * 2 or more is recommanded.
* 5 is never logged in a file, only on stdout.
*/
private final static int LOG_LEVEL = 5;
Modified: trunk/apps/Thaw/src/thaw/core/QueueKeeper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/QueueKeeper.java 2006-07-10 14:15:57 UTC
(rev 9547)
+++ trunk/apps/Thaw/src/thaw/core/QueueKeeper.java 2006-07-10 15:55:18 UTC
(rev 9548)
@@ -53,8 +53,6 @@
if(param != null && param.getNodeType() ==
Node.ELEMENT_NODE) {
Element paramEl = (Element)param;
- Logger.verbose(new QueueKeeper(),
paramEl.getAttribute("name") + "=>" + paramEl.getAttribute("value"));
-
params.put(paramEl.getAttribute("name"),
paramEl.getAttribute("value"));
}
@@ -73,9 +71,6 @@
else
queueManager.addQueryToThePendingQueue(newQuery);
- if(runningQueue && !newQuery.isPersistent() &&
!newQuery.isFinished()) /* We restart */
- newQuery.start(queueManager);
-
}
@@ -181,9 +176,6 @@
}
- /**
- * TODO : Queries which are persistent should not be save. They should
be taken from the queue node.
- */
public static boolean saveQueue(FCPQueueManager queueManager, String
fileName) {
Vector runningQueue = queueManager.getRunningQueue();
Vector[] pendingQueue = queueManager.getPendingQueues();
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java 2006-07-10 14:15:57 UTC
(rev 9547)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java 2006-07-10 15:55:18 UTC
(rev 9548)
@@ -37,6 +37,7 @@
private boolean running = false;
private boolean successful = false;
+
/**
* See setParameters().
*/
@@ -44,14 +45,18 @@
this.queueManager = queueManager;
setParameters(parameters);
- if(progress != 100 && identifier != null &&
!identifier.equals("")) {
+ /* If isPersistent(), then start() won't be called, so must
relisten the
+ queryManager by ourself */
+ if(isPersistent() && identifier != null &&
!identifier.equals("")) {
this.queueManager.getQueryManager().deleteObserver(this);
this.queueManager.getQueryManager().addObserver(this);
}
+
}
/**
+ * Only for initial queries : To resume queries, use
FCPClientGet(FCPQueueManager, Hashmap).
* @param persistence 0 = Forever ; 1 = Until node reboot ; 2 = Until
the app disconnect
*/
public FCPClientGet(String key, int priority,
@@ -78,8 +83,6 @@
filename = cutcut[cutcut.length-1];
}
- /* TODO : Check if the file was not already downloaded */
-
Logger.debug(this, "Getting "+key);
status = "Waiting";
@@ -88,6 +91,7 @@
public boolean start(FCPQueueManager queueManager) {
running = true;
+ progress = 0;
this.queueManager = queueManager;
@@ -137,7 +141,6 @@
|| !message.getValue("Identifier").equals(identifier))
return;
-
if(message.getMessageName().equals("DataFound")) {
Logger.debug(this, "DataFound!");
@@ -184,6 +187,7 @@
status = "Protocol Error";
progress = 100;
running = false;
+ successful = false;
queueManager.getQueryManager().deleteObserver(this);
@@ -204,6 +208,7 @@
status = "Failed";
progress = 100;
running = false;
+ successful = false;
queueManager.getQueryManager().deleteObserver(this);
} else {
status = "Retrying";
@@ -229,7 +234,7 @@
status = "Fetching";
- progress = (int)((succeeded * 100) / required);
+ progress = (int)((succeeded * 98) / required);
setChanged();
notifyObservers();
@@ -239,9 +244,9 @@
}
if(message.getMessageName().equals("AllData")) {
- Logger.debug(this, "AllData !");
+ Logger.debug(this, "AllData ! : " + identifier);
- progress = 98;
+ progress = 99;
status = "Loading";
@@ -262,8 +267,8 @@
return;
}
- if(message.getMessageName().equals("PersistentGet")) {
- /* Should not bother us */
+ if(message.getMessageName().equals("PersistentGet")) {
+ status = "Fetching";
return;
}
@@ -359,7 +364,7 @@
}
public boolean isFinished() {
- if(progress >= 99)
+ if(progress >= 100)
return true;
return false;
@@ -396,7 +401,9 @@
result.put("globalQueue", ((new
Boolean(globalQueue)).toString()));
result.put("destinationDir", destinationDir);
result.put("attempt", ((new Integer(attempt)).toString()));
- result.put("status", status);
+
+ String[] cut = status.split(" ");
+ result.put("status", cut[0]);
result.put("identifier", identifier);
result.put("progress", ((new Integer(progress)).toString()));
result.put("fileSize", ((new Long(fileSize)).toString()));
@@ -428,10 +435,14 @@
running = ((new
Boolean((String)parameters.get("running"))).booleanValue());
successful = ((new
Boolean((String)parameters.get("successful"))).booleanValue());
- if(persistence == 2) {
+ if(persistence == 2 && !isFinished()) {
progress = 0;
status = "Waiting";
}
+
+ if(persistence < 2 && !isFinished() && identifier != null &&
!identifier.equals(""))
+ status = status + " (?)";
+
return true;
}
@@ -441,4 +452,11 @@
return (persistence < 2);
}
+
+ public String getIdentifier() {
+ if(identifier == null || identifier.equals(""))
+ return null;
+
+ return identifier;
+ }
}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java 2006-07-10 14:15:57 UTC
(rev 9547)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java 2006-07-10 15:55:18 UTC
(rev 9548)
@@ -201,5 +201,9 @@
public boolean isPersistent() {
return false;
}
+
+ public String getIdentifier() {
+ return null;
+ }
}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java 2006-07-10 14:15:57 UTC (rev
9547)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java 2006-07-10 15:55:18 UTC (rev
9548)
@@ -5,6 +5,7 @@
/**
* This interface was designed for file query (insertions / downloads)
* but it's used sometimes for other things.
+ * TODO : Simplify this interface and create an interface FCPTransferQuery
extending this one.
*/
public interface FCPQuery {
@@ -98,4 +99,9 @@
public boolean isPersistent();
+
+ /**
+ * @return can be null (if non active, or meaningless).
+ */
+ public String getIdentifier();
}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java 2006-07-10 14:15:57 UTC
(rev 9547)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java 2006-07-10 15:55:18 UTC
(rev 9548)
@@ -64,15 +64,12 @@
/**
- * Will purge the current known queue, and reload the queue according
to the node.
- * Assume you have already called FCPConnection.connect().
+ * Will purge the current known queue.
*/
public void resetQueue() {
runningQueries = new Vector();
for(int i = 0; i <= PRIORITY_MIN ; i++)
pendingQueries[i] = new Vector();
-
- /* TODO */
}
@@ -115,6 +112,20 @@
public void addQueryToTheRunningQueue(FCPQuery query, boolean
callStart) {
Logger.debug(this, "Adding query to the running queue ...");
+ if(!callStart) {
+ /* It's a resumed query => We to adapt the next Id
+ * to avoid collisions.
+ */
+
+ /* FIXME (not urgent) : Find a cleaner / safer way. */
+ String[] subId = query.getIdentifier().split("_");
+ int id = ((new
Integer(subId[subId.length-1])).intValue());
+
+ if(id > lastId) {
+ lastId = id;
+ }
+ }
+
runningQueries.add(query);
setChanged();
@@ -132,9 +143,29 @@
* *Doesn't* call stop() from the query.
*/
public void moveFromRunningToPendingQueue(FCPQuery query) {
- /* TODO */
+ remove(query);
+ addQueryToThePendingQueue(query);
}
+
+ /**
+ * Restart non-persistent and non-finished queries being in the
runninQueue.
+ * Usefull to restart these query when thaw just start.
+ */
+ public void restartNonPersistent() {
+ Logger.info(this, "Restarting non persistent query");
+
+ for(Iterator queryIt = getRunningQueue().iterator() ;
+ queryIt.hasNext();) {
+ FCPQuery query = (FCPQuery)queryIt.next();
+
+ if(!query.isPersistent() && !query.isFinished())
+ query.start(this);
+ }
+
+ Logger.info(this, "Restart done.");
+
+ }
public void remove(FCPQuery query) {
runningQueries.remove(query);
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPWatchGlobal.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPWatchGlobal.java 2006-07-10 14:15:57 UTC
(rev 9547)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPWatchGlobal.java 2006-07-10 15:55:18 UTC
(rev 9548)
@@ -88,5 +88,7 @@
return false;
}
-
+ public String getIdentifier() {
+ return null;
+ }
}
Modified: trunk/apps/Thaw/src/thaw/i18n/thaw.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2006-07-10 14:15:57 UTC
(rev 9547)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2006-07-10 15:55:18 UTC
(rev 9548)
@@ -86,7 +86,7 @@
thaw.plugin.priority.p5=Very low
thaw.plugin.priority.p6=Will never finish
-thaw.plugin.fetch.keyList=Key list
+thaw.plugin.fetch.keyList=Key list (one key per line)
thaw.plugin.fetch.loadKeyListFromFile=Load keys from file ...
thaw.plugin.fetch.destinationDirectory=Destination directory
thaw.plugin.fetch.chooseDestination=Choose destination ...
Modified: trunk/apps/Thaw/src/thaw/plugins/FetchPlugin.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/FetchPlugin.java 2006-07-10 14:15:57 UTC
(rev 9547)
+++ trunk/apps/Thaw/src/thaw/plugins/FetchPlugin.java 2006-07-10 15:55:18 UTC
(rev 9548)
@@ -50,7 +50,9 @@
String destination) {
for(int i = 0 ; i < keys.length ; i++) {
- core.getQueueManager().addQueryToThePendingQueue(new
FCPClientGet(keys[i],
+ String[] subKey = keys[i].split("\\?"); /* Because of
VolodyA :p */
+
+ core.getQueueManager().addQueryToThePendingQueue(new
FCPClientGet(subKey[0],
priority,
persistence,
globalQueue,
Modified: trunk/apps/Thaw/src/thaw/plugins/fetchPlugin/KeyFileFilter.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/fetchPlugin/KeyFileFilter.java
2006-07-10 14:15:57 UTC (rev 9547)
+++ trunk/apps/Thaw/src/thaw/plugins/fetchPlugin/KeyFileFilter.java
2006-07-10 15:55:18 UTC (rev 9548)
@@ -44,7 +44,7 @@
String line = null;
while((line = in.readLine()) != null) {
- String[] pieces =
line.split("[^-.a-zA-Z0-9,~%@/_]");
+ String[] pieces =
line.split("[^-\\?.a-zA-Z0-9,~%@/_]");
for(int i = 0 ; i < pieces.length ; i++) {
if(pieces[i].matches(".{3}@.*,.*"))
Modified: trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
2006-07-10 14:15:57 UTC (rev 9547)
+++ trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
2006-07-10 15:55:18 UTC (rev 9548)
@@ -9,6 +9,7 @@
import java.awt.BorderLayout;
import java.awt.Component;
import java.util.Vector;
+import java.util.Iterator;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.Color;
@@ -28,6 +29,7 @@
private JLabel label;
private JTable table = null;
+ private JScrollPane scrollPane = null;
private JPanel panel;
@@ -36,7 +38,12 @@
private int lastRowSelected = -1;
+ private boolean insertionQueue = false;
+
+
public QueuePanel(Core core, DetailPanel detailPanel, boolean
isForInsertionQueue) {
+ insertionQueue = isForInsertionQueue;
+
this.core = core;
this.detailPanel = detailPanel;
@@ -56,12 +63,21 @@
panel.setLayout(new BorderLayout());
panel.add(label, BorderLayout.NORTH);
- panel.add(new JScrollPane(table), BorderLayout.CENTER);
+ scrollPane = new JScrollPane(table);
+ panel.add(scrollPane, BorderLayout.CENTER);
table.setDefaultRenderer( table.getColumnClass(0), new
ProgressRenderer(table, tableModel) );
tableModel.addTableModelListener(table);
table.addMouseListener(this);
+
+ /* If a queue is already existing, we need to add it */
+ addToTable(core.getQueueManager().getRunningQueue());
+
+ Vector[] pendingQueues =
core.getQueueManager().getPendingQueues();
+ for(int i = 0 ; i < pendingQueues.length ; i++) {
+ addToTable(pendingQueues[i]);
+ }
}
@@ -115,10 +131,28 @@
tableModel.resetTable();
}
+
+
public void addToTable(FCPQuery query) {
- tableModel.addQuery(query);
+ if( (insertionQueue && query.getQueryType() == 2)
+ || (!insertionQueue && query.getQueryType() == 1))
+ tableModel.addQuery(query);
}
+ /**
+ * @param queries Vector of FCPQuery only
+ */
+ public void addToTable(Vector queries) {
+ for(Iterator queryIt = queries.iterator();
+ queryIt.hasNext();) {
+
+ FCPQuery query = (FCPQuery)queryIt.next();
+
+ addToTable(query);
+ }
+ }
+
+
public void refresh() {
int selected = table.getSelectedRow();
Modified: trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueueTableModel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueueTableModel.java
2006-07-10 14:15:57 UTC (rev 9547)
+++ trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueueTableModel.java
2006-07-10 15:55:18 UTC (rev 9548)
@@ -94,15 +94,8 @@
}
public void addQuery(FCPQuery query) {
- JProgressBar bar;
-
((Observable)query).addObserver(this);
- bar = new JProgressBar(0, 100);
- bar.setStringPainted(true);
- bar.setString((new
Integer(query.getProgression())).toString()+"%");
- bar.setValue(query.getProgression());
-
queries.add(query);
notifyObservers();