Author: jflesch
Date: 2006-07-12 20:35:09 +0000 (Wed, 12 Jul 2006)
New Revision: 9585
Added:
trunk/apps/Thaw/src/thaw/fcp/FCPClientPut.java
trunk/apps/Thaw/src/thaw/fcp/FCPQueueLoader.java
Modified:
trunk/apps/Thaw/src/thaw/core/Config.java
trunk/apps/Thaw/src/thaw/core/Core.java
trunk/apps/Thaw/src/thaw/core/QueueKeeper.java
trunk/apps/Thaw/src/thaw/core/WarningWindow.java
trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java
trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java
trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
trunk/apps/Thaw/src/thaw/fcp/FCPTransferQuery.java
trunk/apps/Thaw/src/thaw/i18n/thaw.properties
trunk/apps/Thaw/src/thaw/plugins/InsertPlugin.java
trunk/apps/Thaw/src/thaw/plugins/fetchPlugin/FetchPanel.java
trunk/apps/Thaw/src/thaw/plugins/insertPlugin/InsertPanel.java
trunk/apps/Thaw/src/thaw/plugins/queueWatcher/DetailPanel.java
trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
Log:
Thaw is now stateless. Queue for pending queries is now, by default, deactivated
Modified: trunk/apps/Thaw/src/thaw/core/Config.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/Config.java 2006-07-12 20:07:34 UTC (rev
9584)
+++ trunk/apps/Thaw/src/thaw/core/Config.java 2006-07-12 20:35:09 UTC (rev
9585)
@@ -295,8 +295,8 @@
public void setDefaultValues() {
setValue("nodeAddress", "127.0.0.1");
setValue("nodePort", "9481");
- setValue("maxSimultaneousDownloads", "10");
- setValue("maxSimultaneousInsertions", "2");
+ setValue("maxSimultaneousDownloads", "-1");
+ setValue("maxSimultaneousInsertions", "-1");
setValue("thawId", "thaw_"+(new Integer((new
Random()).nextInt(1000))).toString());
}
Modified: trunk/apps/Thaw/src/thaw/core/Core.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/Core.java 2006-07-12 20:07:34 UTC (rev
9584)
+++ trunk/apps/Thaw/src/thaw/core/Core.java 2006-07-12 20:35:09 UTC (rev
9585)
@@ -89,9 +89,6 @@
if(!initPluginManager())
return false;
- if(!restorePreviousState())
- return false;
-
mainWindow.setStatus(I18n.getMessage("thaw.statusBar.ready"));
mainWindow.setVisible(true);
@@ -175,6 +172,14 @@
queueManager.startScheduler();
+ queueManager.restartNonPersistent();
+
+ FCPWatchGlobal watchGlobal = new
FCPWatchGlobal(true);
+ watchGlobal.start(queueManager);
+
+ FCPQueueLoader queueLoader = new
FCPQueueLoader();
+ queueLoader.start(queueManager,
config.getValue("thawId"));
+
}
}
@@ -195,20 +200,6 @@
}
- public boolean restorePreviousState() {
- if(connection.isConnected()) {
- queueManager.restartNonPersistent();
-
- FCPWatchGlobal watchGlobal = new FCPWatchGlobal(true);
- watchGlobal.start(queueManager);
-
- FCPListPersistentRequests listPersistent = new
FCPListPersistentRequests();
- listPersistent.start(queueManager);
- }
-
- return true;
- }
-
public FCPConnection getConnectionManager() {
return connection;
}
Modified: trunk/apps/Thaw/src/thaw/core/QueueKeeper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/QueueKeeper.java 2006-07-12 20:07:34 UTC
(rev 9584)
+++ trunk/apps/Thaw/src/thaw/core/QueueKeeper.java 2006-07-12 20:35:09 UTC
(rev 9585)
@@ -62,8 +62,7 @@
|| queryEl.getAttribute("type").equals("1")) {
newQuery = new FCPClientGet(queueManager, params);
} else {
- Logger.error(new QueueKeeper(), "Insert resuming TODO");
- /* TODO */ /* FCPClientPut */
+ newQuery = new FCPClientPut(queueManager, params);
}
if(runningQueue)
@@ -153,6 +152,9 @@
private static Element saveQuery(FCPTransferQuery query, Document
xmlDoc) {
+ if(query.isPersistent())
+ return null;
+
HashMap params = query.getParameters();
Element queryEl = xmlDoc.createElement("query");
@@ -222,18 +224,6 @@
- Element runningQueueEl = xmlDoc.createElement("runningQueue");
-
- for(Iterator runIt = runningQueue.iterator() ;
- runIt.hasNext(); ) {
- FCPTransferQuery query = (FCPTransferQuery)runIt.next();
-
- runningQueueEl.appendChild(saveQuery(query, xmlDoc));
-
- }
-
- rootEl.appendChild(runningQueueEl);
-
Element pendingQueueEl = xmlDoc.createElement("pendingQueue");
for(int i = 0 ; i <= MIN_PRIORITY ; i++) {
Modified: trunk/apps/Thaw/src/thaw/core/WarningWindow.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/WarningWindow.java 2006-07-12 20:07:34 UTC
(rev 9584)
+++ trunk/apps/Thaw/src/thaw/core/WarningWindow.java 2006-07-12 20:35:09 UTC
(rev 9585)
@@ -15,7 +15,7 @@
public WarningWindow(Core core,
String warning)
{
- if(core.getMainWindow() != null) {
+ if(core != null && core.getMainWindow() != null) {
JOptionPane.showMessageDialog(core.getMainWindow().getMainFrame(),
warning,
"Warning",
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java 2006-07-12 20:07:34 UTC
(rev 9584)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java 2006-07-12 20:35:09 UTC
(rev 9585)
@@ -13,7 +13,7 @@
* notify() only when progress has really changes.
*/
public class FCPClientGet extends Observable implements Observer,
FCPTransferQuery {
- private final static int MAX_RETRIES = 5;
+ private final static int MAX_RETRIES = -1;
private final static int PACKET_SIZE = 1024;
private final static int BLOCK_SIZE = 32768;
@@ -37,7 +37,9 @@
private boolean running = false;
private boolean successful = false;
+ private static boolean fetchLock = false;
+
/**
* See setParameters().
*/
@@ -56,13 +58,37 @@
/**
+ * Used to resume query from persistent queue of the node.
+ * Think of adding this FCPClientGet as a queryManager observer.
+ */
+ public FCPClientGet(String id, String key, int priority,
+ int persistence, boolean globalQueue,
+ String destinationDir, String status, int progress,
+ FCPQueueManager queueManager) {
+
+ this(key, priority, persistence, globalQueue, destinationDir);
+
+ this.queueManager = queueManager;
+
+ this.progress = progress;
+ this.status = status;
+ this.identifier = id;
+
+ successful = true;
+ running = true;
+ }
+
+
+ /**
* Only for initial queries : To resume queries, use
FCPClientGet(FCPQueueManager, Hashmap).
+ * @param destinationDir if null, won't be automatically saved
* @param persistence 0 = Forever ; 1 = Until node reboot ; 2 = Until
the app disconnect
*/
public FCPClientGet(String key, int priority,
int persistence, boolean globalQueue,
- String destinationDir) {
+ String destinationDir) {
+
if(globalQueue && persistence >= 2)
globalQueue = false; /* else protocol error */
@@ -83,7 +109,7 @@
filename = cutcut[cutcut.length-1];
}
- Logger.debug(this, "Getting "+key);
+ Logger.debug(this, "Query for getting "+key+" created");
status = "Waiting";
@@ -111,6 +137,9 @@
queryMessage.setValue("MaxRetries", "0");
queryMessage.setValue("PriorityClass", (new
Integer(priority)).toString());
+ if(destinationDir != null)
+ queryMessage.setValue("ClientToken", destinationDir);
+
if(persistence == 0)
queryMessage.setValue("Persistence", "forever");
if(persistence == 1)
@@ -144,29 +173,30 @@
if(message.getMessageName().equals("DataFound")) {
Logger.debug(this, "DataFound!");
- status = "Fetching";
- fileSize = (new
Long(message.getValue("DataLength"))).longValue();
-
-
- if(isPersistent() && !isFinished()) {
- FCPMessage getRequestStatus = new FCPMessage();
+ if(!isFinished()) {
+ status = "Fetching";
+ fileSize = (new
Long(message.getValue("DataLength"))).longValue();
-
getRequestStatus.setMessageName("GetRequestStatus");
- getRequestStatus.setValue("Identifier",
identifier);
- if(globalQueue)
- getRequestStatus.setValue("Global",
"true");
- else
- getRequestStatus.setValue("Global",
"false");
- getRequestStatus.setValue("OnlyData", "true");
+ progress = 100;
+ successful = true;
-
queueManager.getQueryManager().writeMessage(getRequestStatus);
+ if(isPersistent()) {
+ if(destinationDir != null) {
+ if(!fileExists(destinationDir))
+
saveFileTo(destinationDir);
+ else
+ Logger.info(this, "File
already existing. Not rewrited");
+
+ } else {
+ Logger.info(this, "Don't know
where to put file, so file not asked to the node");
+ }
+ }
+
+ setChanged();
+ notifyObservers();
}
-
- setChanged();
- notifyObservers();
-
return;
}
@@ -190,6 +220,12 @@
return;
}
+ if(message.getValue("Fatal").equals("False")) {
+ Logger.debug(this, "Non-fatal protocol error");
+ status = "Protocol warning
("+message.getValue("CodeDescription")+")";
+ return;
+ }
+
status = "Protocol Error
("+message.getValue("CodeDescription")+")";
progress = 100;
running = false;
@@ -211,14 +247,13 @@
return;
}
- if(isPersistent())
- removePersistent();
+ //removeRequest();
int code = ((new
Integer(message.getValue("Code"))).intValue());
attempt++;
- if(attempt >= MAX_RETRIES || code == 25) {
+ if(MAX_RETRIES == -1 || attempt >= MAX_RETRIES || code
== 25) {
status = "Failed
("+message.getValue("CodeDescription")+")";
progress = 100;
running = false;
@@ -248,7 +283,7 @@
status = "Fetching";
- progress = (int)((succeeded * 98) / required);
+ progress = (int)((succeeded * 99) / required);
setChanged();
notifyObservers();
@@ -260,8 +295,6 @@
if(message.getMessageName().equals("AllData")) {
Logger.debug(this, "AllData ! : " + identifier);
- progress = 99;
-
status = "Loading";
fileSize = message.getAmountOfDataWaiting();
@@ -271,13 +304,15 @@
//queueManager.getQueryManager().getConnection().lockWriting();
- if(fetchDirectly(fileSize, true)) {
+ if(fetchDirectly(getPath(), fileSize, true)) {
successful = true;
status = "Available";
} else {
Logger.warning(this, "Unable to fetch correctly
the file. This may create problems on socket");
}
+ fetchLock = false;
+
//queueManager.getQueryManager().getConnection().unlockWriting();
running = false;
@@ -285,9 +320,6 @@
queueManager.getQueryManager().deleteObserver(this);
- if(isPersistent())
- removePersistent();
-
setChanged();
notifyObservers();
@@ -307,10 +339,106 @@
}
- public boolean fetchDirectly(long size, boolean reallyWrite) {
+ private class UnlockWaiter implements Runnable {
+ FCPClientGet clientGet;
+ String dir;
+
+ public UnlockWaiter(FCPClientGet clientGet, String dir) {
+ this.clientGet = clientGet;
+ this.dir = dir;
+ }
+
+ public void run() {
+ if(dir == null) {
+ Logger.warning(this, "UnlockWaiter.run() : Wtf
?");
+ }
+
+ while(true) {
+ try {
+ Thread.sleep(200);
+ } catch(java.lang.InterruptedException e) {
+
+ }
+
+ if(!fetchLock)
+ break;
+ }
+
+ if(dir == null) {
+ Logger.warning(this, "UnlockWaiter.run() : Wtf
?");
+ }
+
+ saveFileTo(this.dir);
+ return;
+ }
+ }
+
+ public synchronized boolean saveFileTo(String dir) {
+
+ if(dir == null) {
+ Logger.warning(this, "saveFileTo() : Can't save to
null.");
+ return false;
+ }
+
+ destinationDir = dir;
+
+
+ if(!isFinished() || !isSuccessful()) {
+ Logger.warning(this, "Unable to fetch a file not
finished");
+ return false;
+ }
+
+ if(!isPersistent()) {
+ Logger.warning(this, "Not persistent, so unable to
ask");
+ return false;
+ }
+
+
+ if(fetchLock) {
+
+ Logger.info(this, "Another file is being downloaded ...
waiting ...");
+
+ Thread fork = new Thread(new UnlockWaiter(this, dir));
+
+ fork.start();
+
+ return true;
+ }
+
+ if(destinationDir == null) {
+ Logger.warning(this, "saveFileTo() : Wtf ?");
+ }
+
+ fetchLock = true;
+
+ FCPMessage getRequestStatus = new FCPMessage();
+
+ getRequestStatus.setMessageName("GetRequestStatus");
+ getRequestStatus.setValue("Identifier", identifier);
+ if(globalQueue)
+ getRequestStatus.setValue("Global", "true");
+ else
+ getRequestStatus.setValue("Global", "false");
+ getRequestStatus.setValue("OnlyData", "true");
+
+ queueManager.getQueryManager().writeMessage(getRequestStatus);
+
+ return true;
+ }
+
+
+ private boolean fileExists(String dir) {
+ destinationDir = dir;
+ File newFile = new File(getPath());
+ return newFile.exists();
+ }
+
+
+
+ private boolean fetchDirectly(String file, long size, boolean
reallyWrite) {
FCPConnection connection;
- File newFile = new File(getPath());
+ File newFile = new File(file);
FileOutputStream fileWriter = null;
@@ -377,9 +505,14 @@
}
- private void removePersistent() {
+ public boolean removeRequest() {
FCPMessage stopMessage = new FCPMessage();
+ if(!isPersistent()) {
+ Logger.info(this, "Can't remove non persistent
request.");
+ return false;
+ }
+
stopMessage.setMessageName("RemovePersistentRequest");
if(globalQueue)
@@ -388,32 +521,26 @@
stopMessage.setValue("Global", "false");
stopMessage.setValue("Identifier", identifier);
-
+
queueManager.getQueryManager().writeMessage(stopMessage);
+
+ running = false;
+
+ return true;
}
public boolean pause(FCPQueueManager queryManager) {
+ /* TODO ? : Reduce the priority
+ instead of stopping */
+
Logger.info(this, "Pausing fetching of the key :
"+getFileKey());
-
- if(!isRunning() || isFinished()) {
- Logger.info(this, "Can't stop (pause). Not running.");
- } else {
-
- if(isPersistent()) {
- removePersistent();
- } else {
- Logger.warning(this, "Can't stop a
non-persistent query, will continue in background ...");
- }
- }
+ removeRequest();
progress = 0;
successful = false;
- running = false;
status = "Delayed";
-
-
setChanged();
notifyObservers();
@@ -424,21 +551,8 @@
public boolean stop(FCPQueueManager queryManager) {
Logger.info(this, "Stop fetching of the key : "+getFileKey());
- if(!isRunning() || isFinished()) {
- Logger.info(this, "Can't stop. Not running ->
considered as failed");
-
- } else {
-
- if(isPersistent()) {
- removePersistent();
- } else {
- Logger.warning(this, "Can't stop a
non-persistent query, will continue in background ...");
- }
- }
-
progress = 100;
successful = false;
- running = false;
status = "Stopped";
setChanged();
@@ -479,7 +593,12 @@
}
public String getPath() {
- return destinationDir + File.separator + filename;
+ if(destinationDir != null)
+ return destinationDir + File.separator + filename;
+
+ Logger.warning(this, "getPath() : destinationDir == null");
+
+ return null;
}
@@ -511,13 +630,13 @@
public HashMap getParameters() {
HashMap result = new HashMap();
- result.put("key", key);
- result.put("filename", filename);
- result.put("priority", ((new Integer(priority)).toString()));
- result.put("persistence", ((new
Integer(persistence)).toString()));
- result.put("globalQueue", ((new
Boolean(globalQueue)).toString()));
- result.put("destinationDir", destinationDir);
- result.put("attempt", ((new Integer(attempt)).toString()));
+ result.put("URI", key);
+ result.put("Filename", filename);
+ result.put("Priority", ((new Integer(priority)).toString()));
+ result.put("Persistence", ((new
Integer(persistence)).toString()));
+ result.put("Global", ((new Boolean(globalQueue)).toString()));
+ result.put("ClientToken", destinationDir);
+ result.put("Attempt", ((new Integer(attempt)).toString()));
if(status.indexOf("(?)") > 0) {
String[] cut = status.split(" ");
@@ -526,36 +645,36 @@
result.put("status", status);
}
- result.put("identifier", identifier);
- result.put("progress", ((new Integer(progress)).toString()));
- result.put("fileSize", ((new Long(fileSize)).toString()));
- result.put("running", ((new Boolean(running)).toString()));
- result.put("successful", ((new
Boolean(successful)).toString()));
+ result.put("Identifier", identifier);
+ result.put("Progress", ((new Integer(progress)).toString()));
+ result.put("FileSize", ((new Long(fileSize)).toString()));
+ result.put("Running", ((new Boolean(running)).toString()));
+ result.put("Successful", ((new
Boolean(successful)).toString()));
return result;
}
public boolean setParameters(HashMap parameters) {
- key = (String)parameters.get("key");
+ key = (String)parameters.get("URI");
Logger.debug(this, "Resuming key : "+key);
- filename = (String)parameters.get("filename");
- priority = ((new
Integer((String)parameters.get("priority"))).intValue());
- persistence = ((new
Integer((String)parameters.get("persistence"))).intValue());
- globalQueue = ((new
Boolean((String)parameters.get("globalQueue"))).booleanValue());
- destinationDir = (String)parameters.get("destinationDir");
- attempt = ((new
Integer((String)parameters.get("attempt"))).intValue());
- status = (String)parameters.get("status");
- identifier = (String)parameters.get("identifier");
+ filename = (String)parameters.get("Filename");
+ priority = ((new
Integer((String)parameters.get("Priority"))).intValue());
+ persistence = ((new
Integer((String)parameters.get("Persistence"))).intValue());
+ globalQueue = ((new
Boolean((String)parameters.get("Global"))).booleanValue());
+ destinationDir = (String)parameters.get("ClientToken");
+ attempt = ((new
Integer((String)parameters.get("Attempt"))).intValue());
+ status = (String)parameters.get("Status");
+ identifier = (String)parameters.get("Identifier");
Logger.info(this, "Resuming id : "+identifier);
- progress = ((new
Integer((String)parameters.get("progress"))).intValue());
- fileSize = ((new
Long((String)parameters.get("fileSize"))).longValue());
- running = ((new
Boolean((String)parameters.get("running"))).booleanValue());
- successful = ((new
Boolean((String)parameters.get("successful"))).booleanValue());
+ progress = ((new
Integer((String)parameters.get("Progress"))).intValue());
+ fileSize = ((new
Long((String)parameters.get("FileSize"))).longValue());
+ running = ((new
Boolean((String)parameters.get("Running"))).booleanValue());
+ successful = ((new
Boolean((String)parameters.get("Successful"))).booleanValue());
if(persistence == 2 && !isFinished()) {
progress = 0;
Added: trunk/apps/Thaw/src/thaw/fcp/FCPClientPut.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPClientPut.java 2006-07-12 20:07:34 UTC
(rev 9584)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPClientPut.java 2006-07-12 20:35:09 UTC
(rev 9585)
@@ -0,0 +1,114 @@
+package thaw.fcp;
+
+import java.util.HashMap;
+
+/**
+ * TODO
+ */
+public class FCPClientPut implements FCPTransferQuery {
+
+ /**
+ * To resume query from file. (see core.QueueKeeper)
+ */
+ public FCPClientPut(FCPQueueManager queueManager, HashMap parameters) {
+
+ }
+
+
+ public boolean start(FCPQueueManager queueManager) {
+ return false;
+ }
+
+ public boolean stop(FCPQueueManager queueManager) {
+ return false;
+ }
+
+ public int getQueryType() {
+ return 2;
+ }
+
+ public boolean pause(FCPQueueManager queueManager) {
+ return false;
+ }
+
+
+ public boolean removeRequest() {
+ return false;
+ }
+
+ public int getThawPriority() {
+ return -1;
+ }
+
+ public String getStatus() {
+ return "Tulip";
+ }
+
+ public int getProgression() {
+ return 0;
+ }
+
+ public String getFileKey() {
+ return "Tulip";
+ }
+
+ public long getFileSize() {
+ return 0;
+ }
+
+ public String getPath() {
+ return "Tulip";
+ }
+
+ public int getAttempt() {
+ return 0;
+ }
+
+ public void setAttempt(int x) {
+ return;
+ }
+
+ public int getMaxAttempt() {
+ return 0;
+ }
+
+ public boolean isRunning() {
+ return false;
+ }
+
+ public boolean isFinished() {
+ return false;
+ }
+
+ public boolean isSuccessful() {
+ return false;
+ }
+
+ public HashMap getParameters() {
+ return null;
+ }
+
+ public boolean setParameters(HashMap parameters) {
+ return false;
+ }
+
+
+ public boolean isPersistent() {
+ return true;
+ }
+
+ public boolean isGlobal() {
+ return true;
+ }
+
+ public String getIdentifier() {
+ return "Tulip";
+ }
+
+ /**
+ * Copy simply the file ... a little bit useless ...
+ */
+ public boolean saveFileTo(String dir) {
+ return false;
+ }
+}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java 2006-07-12 20:07:34 UTC (rev
9584)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQuery.java 2006-07-12 20:35:09 UTC (rev
9585)
@@ -13,7 +13,7 @@
public boolean start(FCPQueueManager queueManager);
/**
- * Definitive stop.
+ * Definitive stop. Transfer is considered as failed.
* @param queueManger QueueManager gives access to QueryManager.
*/
public boolean stop(FCPQueueManager queueManager);
Added: trunk/apps/Thaw/src/thaw/fcp/FCPQueueLoader.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQueueLoader.java 2006-07-12 20:07:34 UTC
(rev 9584)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQueueLoader.java 2006-07-12 20:35:09 UTC
(rev 9585)
@@ -0,0 +1,91 @@
+package thaw.fcp;
+
+import java.util.Observer;
+import java.util.Observable;
+
+import thaw.core.Logger;
+
+/**
+ * Reload the queue from the queue node.
+ * Send himself the ListPersistentRequests.
+ */
+public class FCPQueueLoader implements Observer {
+ FCPQueueManager queueManager;
+ String thawId;
+
+ public FCPQueueLoader() {
+
+ }
+
+ public boolean start(FCPQueueManager queueManager, String thawId) {
+ this.queueManager = queueManager;
+ this.thawId = thawId;
+
+ queueManager.getQueryManager().addObserver(this);
+
+
+ FCPListPersistentRequests listPersistent = new
FCPListPersistentRequests();
+ return listPersistent.start(queueManager);
+ }
+
+
+ public boolean stop(FCPQueueManager queueManager) {
+ /* Ignored */
+ return false;
+ }
+
+ public int getQueryType() {
+ return 0;
+ }
+
+
+ public void update(Observable o, Object param) {
+ FCPMessage msg = (FCPMessage)param;
+
+ if(msg.getMessageName().equals("PersistentGet")) {
+ Logger.info(this, "Resuming from PersistentGet");
+
+ int persistence = 0;
+
+ if(msg.getValue("PersistenceType").equals("reboot"))
+ persistence = 1;
+ if(msg.getValue("PersistenceType").equals("connection"))
+ persistence = 2;
+
+ boolean global = true;
+
+ if(msg.getValue("Global").equals("false"))
+ global = false;
+
+ String destinationDir = null;
+
+ if(msg.getValue("Identifier").startsWith(thawId))
+ destinationDir = msg.getValue("ClientToken");
+
+
+
+ FCPClientGet clientGet = new
FCPClientGet(msg.getValue("Identifier"),
+
msg.getValue("URI"), // key
+ -1,
persistence, global,
+
destinationDir, "Fetching", 0,
+ queueManager);
+
+
+ if(queueManager.addQueryToTheRunningQueue(clientGet,
false))
+
queueManager.getQueryManager().addObserver(clientGet);
+ else
+ Logger.info(this, "Already in the running
queue");
+
+ }
+
+ if(msg.getMessageName().equals("PersistentPut")) {
+ Logger.warning(this, "Non implemented yet !");
+ return;
+ }
+
+ if(msg.getMessageName().equals("EndListPersistentRequests")) {
+ Logger.info(this, "End Of ListPersistentRequests. Self
removing");
+ queueManager.getQueryManager().deleteObserver(this);
+ }
+ }
+}
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java 2006-07-12 20:07:34 UTC
(rev 9584)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java 2006-07-12 20:35:09 UTC
(rev 9585)
@@ -84,15 +84,17 @@
return runningQueries;
}
- public void addQueryToThePendingQueue(FCPTransferQuery query) {
+ /**
+ * @return false if already added.
+ */
+ public boolean addQueryToThePendingQueue(FCPTransferQuery query) {
if(query.getThawPriority() < 0) {
- addQueryToTheRunningQueue(query);
- return;
+ return addQueryToTheRunningQueue(query);
}
if(isAlreadyPresent(query)) {
Logger.notice(this, "Key was already in one of the
queues");
- return;
+ return false;
}
Logger.debug(this, "Adding query to the pending queue ...");
@@ -103,19 +105,26 @@
notifyObservers(query);
Logger.debug(this, "Adding done");
+ return true;
}
/**
* will call start() function of the query.
+ * @return false if already added
*/
- public void addQueryToTheRunningQueue(FCPTransferQuery query) {
- addQueryToTheRunningQueue(query, true);
+ public boolean addQueryToTheRunningQueue(FCPTransferQuery query) {
+ return addQueryToTheRunningQueue(query, true);
}
- public void addQueryToTheRunningQueue(FCPTransferQuery query, boolean
callStart) {
+ public boolean addQueryToTheRunningQueue(FCPTransferQuery query,
boolean callStart) {
Logger.debug(this, "Adding query to the running queue ...");
- if(!callStart) {
+ if(isAlreadyPresent(query)) {
+ Logger.notice(this, "Key was already in one of the
queues");
+ return false;
+ }
+
+ if(!callStart && query.getIdentifier().startsWith(thawId)) {
/* It's a resumed query => We to adapt the next Id
* to avoid collisions.
*/
@@ -138,6 +147,8 @@
query.start(this);
Logger.debug(this, "Adding done");
+
+ return true;
}
@@ -245,22 +256,22 @@
/* We move queries from the pendingQueue to the
runningQueue until we got our quota */
for(int priority = 0;
priority <= PRIORITY_MIN
- && (runningInsertions < maxInsertions
- || runningDownloads < maxDownloads) ;
+ && ( (maxInsertions <= -1 ||
runningInsertions < maxInsertions)
+ || (maxDownloads <= -1 ||
runningDownloads < maxDownloads) ) ;
priority++) {
try {
for(Iterator it =
pendingQueries[priority].iterator();
it.hasNext()
- && (runningInsertions <
maxInsertions
- || runningDownloads <
maxDownloads); ) {
+ && ( (maxInsertions <= -1
|| runningInsertions < maxInsertions)
+ || (maxDownloads <= -1
|| runningDownloads < maxDownloads) ); ) {
FCPTransferQuery query =
(FCPTransferQuery)it.next();
if( (query.getQueryType() == 1
- && runningDownloads <
maxDownloads)
+ && (maxDownloads <= -1 ||
runningDownloads < maxDownloads) )
|| (query.getQueryType() ==
2
- && runningInsertions <
maxInsertions) ) {
+ && (maxInsertions <= -1
|| runningInsertions < maxInsertions)) ) {
Logger.debug(this,
"Scheduler : Moving a query from pendingQueue to the runningQueue");
pendingQueries[priority].remove(query);
Modified: trunk/apps/Thaw/src/thaw/fcp/FCPTransferQuery.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPTransferQuery.java 2006-07-12 20:07:34 UTC
(rev 9584)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPTransferQuery.java 2006-07-12 20:35:09 UTC
(rev 9585)
@@ -9,13 +9,18 @@
public interface FCPTransferQuery extends FCPQuery {
/**
- * Similar to stop(), but the query knows that it will be started again
later.
+ * Stop the transfer, but don't consider it as failed.
* @param queueManager QueueManager gives access to QueryManager;
*/
public boolean pause(FCPQueueManager queueManager);
/**
+ * Only if persistent. Remove it from the queue.
+ */
+ public boolean removeRequest();
+
+ /**
* Used by the QueueManager only.
* Currently these priority are the same
* as FCP priority, but it can change in the
@@ -33,7 +38,14 @@
*/
public String getStatus();
+
/**
+ * For persistent request only.
+ * @param dir Directory
+ */
+ public boolean saveFileTo(String dir);
+
+ /**
* Informal.
* In pourcents.
*/
@@ -41,6 +53,7 @@
/**
* Informal.
+ * Gives *public* final key only.
* @return can be null
*/
public String getFileKey();
Modified: trunk/apps/Thaw/src/thaw/i18n/thaw.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2006-07-12 20:07:34 UTC
(rev 9584)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw.properties 2006-07-12 20:35:09 UTC
(rev 9585)
@@ -47,7 +47,9 @@
thaw.common.delay=Delay
thaw.common.copyKeysToClipboard=Copy keys to clipboard
thaw.common.forceRestart=Force (re)start
+thaw.common.downloadLocally=Download locally
+
## Errors
thaw.error.idAlreadyUsed=Unable to connect. Our Id is already used by another
client connected to the node.
@@ -69,8 +71,8 @@
thaw.config.nodeAddress=Node address
thaw.config.nodePort=Node port (FCP)
-thaw.config.maxSimultaneousDownloads=Maximum simultaneous downloads
-thaw.config.maxSimultaneousInsertions=Maximum simultaneous insertions
+thaw.config.maxSimultaneousDownloads=Maximum simultaneous downloads (-1 =
unlimited)
+thaw.config.maxSimultaneousInsertions=Maximum simultaneous insertions (-1 =
unlimited)
thaw.config.thawId=Thaw ID
@@ -88,6 +90,8 @@
thaw.plugin.insert.publicKey=Public key
thaw.plugin.insert.privateKey=Private key
thaw.plugin.insert.insertAction=Insert
+thaw.plugin.insert.specifyNameAndRev=Please specify a name and a revision
+thaw.plugin.insert.specifyFile=Please specify a file
thaw.plugin.priority.p0=Emergency (*not* for normal use)
thaw.plugin.priority.p1=Very high
Modified: trunk/apps/Thaw/src/thaw/plugins/InsertPlugin.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/InsertPlugin.java 2006-07-12 20:07:34 UTC
(rev 9584)
+++ trunk/apps/Thaw/src/thaw/plugins/InsertPlugin.java 2006-07-12 20:35:09 UTC
(rev 9585)
@@ -10,10 +10,12 @@
import javax.swing.ButtonGroup;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
+import java.io.File;
import thaw.core.*;
import thaw.i18n.I18n;
import thaw.plugins.insertPlugin.*;
+import thaw.fcp.*;
public class InsertPlugin implements thaw.core.Plugin {
private Core core;
@@ -30,7 +32,7 @@
Logger.info(this, "Starting plugin \"InsertPlugin\" ...");
- insertPanel = new InsertPanel();
+ insertPanel = new InsertPanel(this);
core.getMainWindow().addTab(I18n.getMessage("thaw.common.insertion"),
insertPanel.getPanel());
@@ -50,4 +52,26 @@
public String getNameForUser() {
return I18n.getMessage("thaw.common.insertion");
}
+
+
+ /**
+ * Note: public key is found from private one.
+ * @param keyType : 0 = CHK ; 1 = KSK ; 2 = SSK
+ * @param rev : ignored if key == CHK
+ * @param name : ignored if key == CHK
+ * @param privateKey : ignored if key == CHK/KSK ; can be null if it
has to be generated
+ * @param persistence 0 = Forever ; 1 = Until node reboot ; 2 = Until
the app disconnect
+ */
+ public FCPClientPut insertFile(File file, int keyType,
+ int rev, String name,
+ String privateKey,
+ int priority, boolean global,
+ int persistence) {
+
+ /* TODO */
+ return null;
+ }
+
+
+
}
Modified: trunk/apps/Thaw/src/thaw/plugins/fetchPlugin/FetchPanel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/fetchPlugin/FetchPanel.java
2006-07-12 20:07:34 UTC (rev 9584)
+++ trunk/apps/Thaw/src/thaw/plugins/fetchPlugin/FetchPanel.java
2006-07-12 20:35:09 UTC (rev 9585)
@@ -42,10 +42,12 @@
private String[] priorities = null;
private JComboBox prioritySelecter = null;
+ /*
private JPanel persistencePanel = null;
private JLabel persistenceLabel = null;
private String[] persistences = null;
private JComboBox persistenceSelecter = null;
+ */
private JLabel destinationLabel = null;
private JPanel dstChoosePanel = null; /* 3 x 1 */
@@ -117,7 +119,8 @@
priorityPanel.add(priorityLabel);
priorityPanel.add(prioritySelecter);
- /* PERSISTENCE */
+ /* PERSISTENCE */ /* set always to "forever" */
+ /*
persistencePanel = new JPanel();
persistencePanel.setLayout(new GridLayout(2, 1, 5, 5));
@@ -131,6 +134,7 @@
persistencePanel.add(persistenceLabel);
persistencePanel.add(persistenceSelecter);
+ */
/* QUEUE */
queuePanel = new JPanel();
@@ -163,7 +167,7 @@
dstChoosePanel.add(destinationButton);
belowPanel.add(priorityPanel);
- belowPanel.add(persistencePanel);
+ //belowPanel.add(persistencePanel);
belowPanel.add(queuePanel);
belowPanel.add(dstChoosePanel);
@@ -184,20 +188,22 @@
public void actionPerformed(java.awt.event.ActionEvent e) {
if(e.getSource() == validationButton) {
int priority = 6;
- int persistence = 0;
+ //int persistence = 0;
boolean globalQueue = true;
+ /*
if(((String)persistenceSelecter.getSelectedItem()).equals(I18n.getMessage("thaw.common.persistenceForever")))
persistence = 0;
if(((String)persistenceSelecter.getSelectedItem()).equals(I18n.getMessage("thaw.common.persistenceReboot")))
persistence = 1;
if(((String)persistenceSelecter.getSelectedItem()).equals(I18n.getMessage("thaw.common.persistenceConnection")))
persistence = 2;
+ */
if(((String)queueSelecter.getSelectedItem()).equals(I18n.getMessage("thaw.common.false")))
globalQueue = false;
-
+
for(int i = 0; i < priorities.length ; i++) {
if(((String)prioritySelecter.getSelectedItem()).equals(I18n.getMessage("thaw.plugin.priority.p"+i)))
priority = i;
@@ -208,10 +214,16 @@
return;
}
+ /*
fetchPlugin.fetchFiles(fileList.getText().split("\n"),
priority, persistence,
globalQueue,
destinationField.getText());
+ */
+ fetchPlugin.fetchFiles(fileList.getText().split("\n"),
+ priority, 0, globalQueue,
+ destinationField.getText());
+
fileList.setText("");
}
Modified: trunk/apps/Thaw/src/thaw/plugins/insertPlugin/InsertPanel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/insertPlugin/InsertPanel.java
2006-07-12 20:07:34 UTC (rev 9584)
+++ trunk/apps/Thaw/src/thaw/plugins/insertPlugin/InsertPanel.java
2006-07-12 20:35:09 UTC (rev 9585)
@@ -20,9 +20,12 @@
import thaw.core.*;
import thaw.i18n.I18n;
+import thaw.plugins.InsertPlugin;
+import thaw.fcp.*;
+public class InsertPanel implements ActionListener, ItemListener {
+ private final static int MIN_PRIORITY = 6;
-public class InsertPanel implements ActionListener, ItemListener {
private JPanel globalPanel = null;
private JPanel mainPanel;
@@ -57,15 +60,22 @@
private JLabel globalLabel;
private JComboBox globalSelecter;
+ /*
private String[] persistences;
private JLabel persistenceLabel;
private JComboBox persistenceSelecter;
+ */
private JButton letsGoButton;
- public InsertPanel() {
+ private InsertPlugin insertPlugin;
+ private int keyType;
+ private FCPClientPut lastInsert = null;
+ public InsertPanel(InsertPlugin insertPlugin) {
+ this.insertPlugin = insertPlugin;
+
globalPanel = new JPanel();
mainPanel = new JPanel();
@@ -101,6 +111,7 @@
keyRadioButtons = new JRadioButton[3];
keyRadioButtons[0] = new
JRadioButton(I18n.getMessage("thaw.plugin.insert.CHK"));
keyRadioButtons[0].setSelected(true);
+ keyType = 0;
keyRadioButtons[1] = new
JRadioButton(I18n.getMessage("thaw.plugin.insert.KSK"));
keyRadioButtons[2] = new
JRadioButton(I18n.getMessage("thaw.plugin.insert.SSK"));
keyRadioGroup = new ButtonGroup();
@@ -113,22 +124,24 @@
subPanel.add(subSubPanel);
+ subSubPanel = new JPanel();
+ subSubPanel.setLayout(new GridLayout(4, 1));
+
+
// PERSISTENCE & GLOBAL
-
+ /*
persistences = new String[] {
I18n.getMessage("thaw.common.persistenceConnection"),
I18n.getMessage("thaw.common.persistenceReboot"),
I18n.getMessage("thaw.common.persistenceForever"),
};
- subSubPanel = new JPanel();
- subSubPanel.setLayout(new GridLayout(4, 1));
persistenceLabel = new
JLabel(I18n.getMessage("thaw.common.persistence"));
subSubPanel.add(persistenceLabel);
persistenceSelecter = new JComboBox(persistences);
persistenceSelecter.setSelectedItem(I18n.getMessage("thaw.common.persistenceReboot"));
subSubPanel.add(persistenceSelecter);
-
+ */
globalStr = new String[] {
I18n.getMessage("thaw.common.true"),
@@ -218,6 +231,8 @@
letsGoButton = new
JButton(I18n.getMessage("thaw.plugin.insert.insertAction"));
letsGoButton.setPreferredSize(new Dimension(200, 40));
+ letsGoButton.addActionListener(this);
+
mainPanel.add(letsGoButton, BorderLayout.SOUTH);
mainPanel.setSize(400, 400);
@@ -234,6 +249,70 @@
public void actionPerformed(ActionEvent e) {
+ if(e.getSource() == letsGoButton) {
+ int rev = -1;
+ String name = null;
+ String privateKey = null;
+ int priority = 6;
+ boolean global = true;
+ //int persistence = 0;
+
+ if(selectedFiles.getText() == null
+ || selectedFiles.getText().equals("")) {
+ new WarningWindow(null,
I18n.getMessage("thaw.plugin.insert.specifyFile"));
+ return;
+ }
+
+ if(keyType == 1 || keyType == 2) {
+ if(nameField.getText() == null
+ || nameField.getText().equals("")
+ || revField.getText() == null
+ || revField.getText().equals("")) {
+ new WarningWindow(null,
I18n.getMessage("thaw.plugin.insert.specifyNameAndRev"));
+ return;
+ }
+
+ rev = ((new
Integer(revField.getText())).intValue());
+ name = nameField.getText();
+ }
+
+ if(keyType == 2) {
+ if(privateKeyField.getText() != null
+ && !privateKeyField.getText().equals(""))
+ privateKey = privateKeyField.getText();
+ }
+
+ for(int i = 0 ; i <= MIN_PRIORITY ; i++) {
+
if(I18n.getMessage("thaw.plugin.priority.p"+(new
Integer(i)).toString()).equals((String)prioritySelecter.getSelectedItem())) {
+ priority = i;
+ }
+ }
+
+
if(((String)globalSelecter.getSelectedItem()).equals(I18n.getMessage("thaw.common.true")))
+ global = true;
+
if(((String)globalSelecter.getSelectedItem()).equals(I18n.getMessage("thaw.common.true")))
+ global = false;
+
+ /*
+
if(((String)persistenceSelecter.getSelectedItem()).equals(I18n.getMessage("thaw.common.persistenceForever")))
+ persistence = 0;
+
if(((String)persistenceSelecter.getSelectedItem()).equals(I18n.getMessage("thaw.common.persistenceReboot")))
+ persistence = 1;
+
if(((String)persistenceSelecter.getSelectedItem()).equals(I18n.getMessage("thaw.common.persistenceConnection")))
+ persistence = 2;
+
+ lastInsert = insertPlugin.insertFile(new
File(selectedFiles.getText()),
+ keyType, rev,
name, privateKey, priority,
+ global,
persistence);
+ */
+
+ lastInsert = insertPlugin.insertFile(new
File(selectedFiles.getText()),
+ keyType, rev,
name, privateKey, priority,
+ global, 0);
+
+ /* TODO : Listen lastInsert to fetch display the
private / public key */
+ }
+
if(e.getSource() == browseButton) {
FileChooser fileChooser = new FileChooser();
File files;
@@ -241,16 +320,28 @@
fileChooser.setTitle(I18n.getMessage("thaw.common.selectFile"));
fileChooser.setDirectoryOnly(false);
fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
- if( (files = fileChooser.askOneFile()) == null) { /*
TODO: One file -> Many files */
+ if( (files = fileChooser.askOneFile()) == null) { /*
TODO ? : One file -> Many files */
Logger.info(this, "Nothing selected");
return;
}
selectedFiles.setText(files.getPath());
+
+ if(keyType != 0)
+ nameField.setText(getFileNameFromPath());
}
}
+ public String getFileNameFromPath() {
+ if(selectedFiles.getText() == null)
+ return "";
+
+ String[] cutcut = selectedFiles.getText().split(File.separator);
+
+ return cutcut[cutcut.length - 1];
+ }
+
public void itemStateChanged(ItemEvent e) {
if(e.getItem() == keyRadioButtons[0]
&& e.getStateChange() == ItemEvent.SELECTED) { /* CHK */
@@ -258,6 +349,11 @@
publicKeyField.setEditable(false);
revField.setEditable(false);
nameField.setEditable(false);
+ revField.setText("");
+ nameField.setText("");
+ privateKeyField.setText("");
+ publicKeyField.setText("");
+ keyType = 0;
return;
}
@@ -267,6 +363,11 @@
publicKeyField.setEditable(false);
revField.setEditable(true);
nameField.setEditable(true);
+ revField.setText("0");
+ nameField.setText(getFileNameFromPath());
+ privateKeyField.setText("");
+ publicKeyField.setText("");
+ keyType = 1;
return;
}
@@ -276,6 +377,11 @@
publicKeyField.setEditable(true);
revField.setEditable(true);
nameField.setEditable(true);
+ revField.setText("0");
+ nameField.setText(getFileNameFromPath());
+ privateKeyField.setText("");
+ publicKeyField.setText("");
+ keyType = 2;
return;
}
}
Modified: trunk/apps/Thaw/src/thaw/plugins/queueWatcher/DetailPanel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/queueWatcher/DetailPanel.java
2006-07-12 20:07:34 UTC (rev 9584)
+++ trunk/apps/Thaw/src/thaw/plugins/queueWatcher/DetailPanel.java
2006-07-12 20:35:09 UTC (rev 9585)
@@ -38,7 +38,6 @@
private JTextField attempt = new JTextField();
private JTextField identifier = new JTextField();
private JTextField globalQueue= new JTextField();
- private JTextField persistence= new JTextField();
private FCPTransferQuery query = null;
@@ -61,8 +60,7 @@
I18n.getMessage("thaw.common.priority"),
I18n.getMessage("thaw.common.try")+" #",
I18n.getMessage("thaw.common.identifier"),
-
I18n.getMessage("thaw.common.globalQueue"),
-
I18n.getMessage("thaw.common.persistant")
+
I18n.getMessage("thaw.common.globalQueue")
};
subPanel.setLayout(new GridLayout(fieldNames.length*2, 1));
@@ -90,7 +88,6 @@
case(7): field = attempt;
attempt.setEditable(false); break;
case(8): field = identifier;
identifier.setEditable(false); break;
case(9): field = globalQueue;
globalQueue.setEditable(false); break;
- case(10): field = persistence;
persistence.setEditable(false); break;
default: Logger.error(this, "Gouli goula ? ...
is going to crash :p"); break;
}
@@ -135,6 +132,9 @@
progress.setString((new
Integer(query.getProgression())).toString() + "%");
else
progress.setString("FAILED");
+
+ size.setText((new
Long(query.getFileSize())).toString()+" B");
+
status.setText(query.getStatus());
if(query.getIdentifier() != null)
identifier.setText(query.getIdentifier());
@@ -142,6 +142,10 @@
identifier.setText("N/A");
attempt.setText((new
Integer(query.getAttempt())).toString());
+ if(query.getThawPriority() != -1)
+ priority.setText((new
Integer(query.getThawPriority())).toString());
+ else
+ priority.setText("Unknown");
} else {
progress.setValue(0);
@@ -149,6 +153,8 @@
status.setText("");
identifier.setText("");
attempt.setText("");
+ size.setText("");
+ priority.setText("");
}
}
@@ -161,15 +167,9 @@
String[] plop = query.getFileKey().split("/");
file.setText(plop[plop.length-1]);
- size.setText((new
Long(query.getFileSize())).toString()+" B");
key.setText(query.getFileKey());
path.setText(query.getPath());
- priority.setText((new
Integer(query.getThawPriority())).toString());
- if(query.isPersistent())
-
persistence.setText(I18n.getMessage("thaw.common.yes"));
- else
-
persistence.setText(I18n.getMessage("thaw.common.no"));
if(query.isGlobal())
globalQueue.setText(I18n.getMessage("thaw.common.yes"));
@@ -177,12 +177,9 @@
globalQueue.setText(I18n.getMessage("thaw.common.no"));
} else {
file.setText("");
- size.setText("");
key.setText("");
path.setText("");
- priority.setText("");
globalQueue.setText("");
- persistence.setText("");
}
}
Modified: trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
2006-07-12 20:07:34 UTC (rev 9584)
+++ trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
2006-07-12 20:35:09 UTC (rev 9585)
@@ -6,6 +6,7 @@
import javax.swing.JScrollPane;
import javax.swing.event.TableModelEvent;
import javax.swing.JProgressBar;
+import javax.swing.JFileChooser;
import java.awt.BorderLayout;
import java.awt.Component;
import java.util.Vector;
@@ -30,6 +31,8 @@
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.StringSelection;
+import java.io.File;
+
import thaw.core.*;
import thaw.i18n.I18n;
@@ -52,6 +55,7 @@
private JMenuItem removeItem;
private JMenuItem cancelItem;
private JMenuItem delayItem;
+ private JMenuItem downloadItem;
private JMenuItem forceRestartItem;
private JMenuItem copyKeysItem;
@@ -95,12 +99,16 @@
removeItem = new
JMenuItem(I18n.getMessage("thaw.common.removeFromTheList"));
cancelItem = new
JMenuItem(I18n.getMessage("thaw.common.cancel"));
delayItem = new JMenuItem(I18n.getMessage("thaw.common.delay"));
+ downloadItem = new
JMenuItem(I18n.getMessage("thaw.common.downloadLocally"));
forceRestartItem = new
JMenuItem(I18n.getMessage("thaw.common.forceRestart"));
copyKeysItem = new
JMenuItem(I18n.getMessage("thaw.common.copyKeysToClipboard"));
rightClickMenu.add(removeItem);
rightClickMenu.add(cancelItem);
- rightClickMenu.add(delayItem);
+ if((new
Integer(core.getConfig().getValue("maxSimultaneousDownloads"))).intValue() >= 0
+ || (new
Integer(core.getConfig().getValue("maxSimultaneousInsertions"))).intValue() >=
0)
+ rightClickMenu.add(delayItem);
+ rightClickMenu.add(downloadItem);
rightClickMenu.add(forceRestartItem);
rightClickMenu.add(copyKeysItem);
@@ -109,6 +117,7 @@
copyKeysItem.addActionListener(this);
forceRestartItem.addActionListener(this);
delayItem.addActionListener(this);
+ downloadItem.addActionListener(this);
table.addMouseListener(this);
table.addKeyListener(this);
@@ -177,8 +186,11 @@
public void addToTable(FCPTransferQuery query) {
if( (insertionQueue && query.getQueryType() == 2)
- || (!insertionQueue && query.getQueryType() == 1))
+ || (!insertionQueue && query.getQueryType() == 1)) {
+ Logger.verbose(this, "Adding a query to the display");
+
tableModel.addQuery(query);
+ }
}
/**
@@ -215,7 +227,17 @@
public void actionPerformed(ActionEvent e) {
Toolkit tk = Toolkit.getDefaultToolkit();
String keys = "";
+ File dir = null;
+ if(e.getSource() == downloadItem) {
+ FileChooser fileChooser = new FileChooser();
+
fileChooser.setTitle(I18n.getMessage("thaw.common.downloadLocally"));
+ fileChooser.setDirectoryOnly(true);
+ fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
+ dir = fileChooser.askOneFile();
+ }
+
+
for(int i = 0 ; i < selectedRows.length;i++) {
FCPTransferQuery query =
(FCPTransferQuery)queries.get(selectedRows[i]);
@@ -225,6 +247,9 @@
if(e.getSource() == removeItem) {
if(query.isRunning() &&
!query.isFinished())
query.stop(core.getQueueManager());
+ if(query.isFinished())
+ query.removeRequest();
+
core.getQueueManager().remove(query);
tableModel.removeQuery(query);
@@ -232,7 +257,8 @@
if(e.getSource() == cancelItem) {
query.stop(core.getQueueManager());
- core.getQueueManager().remove(query);
+ /*core.getQueueManager().remove(query);
+ */
}
if(e.getSource() == delayItem) {
@@ -254,6 +280,11 @@
keys = keys + query.getFileKey() + "\n";
}
+ if(e.getSource() == downloadItem
+ && dir != null) {
+ query.saveFileTo(dir.getPath());
+ }
+
} /* for i in selectedRows */