Author: jflesch
Date: 2007-09-22 21:10:05 +0000 (Sat, 22 Sep 2007)
New Revision: 15280

Added:
   trunk/apps/Thaw/src/thaw/core/ThawRunnable.java
Modified:
   trunk/apps/Thaw/src/thaw/core/ConfigWindow.java
   trunk/apps/Thaw/src/thaw/core/Core.java
   trunk/apps/Thaw/src/thaw/core/LibraryPlugin.java
   trunk/apps/Thaw/src/thaw/core/Plugin.java
   trunk/apps/Thaw/src/thaw/core/ThawThread.java
   trunk/apps/Thaw/src/thaw/fcp/FCPBufferedStream.java
   trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java
   trunk/apps/Thaw/src/thaw/fcp/FCPClientPut.java
   trunk/apps/Thaw/src/thaw/fcp/FCPQueryManager.java
   trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
   trunk/apps/Thaw/src/thaw/fcp/SHA256Computer.java
   trunk/apps/Thaw/src/thaw/gui/Table.java
   trunk/apps/Thaw/src/thaw/plugins/FetchPlugin.java
   trunk/apps/Thaw/src/thaw/plugins/Hsqldb.java
   trunk/apps/Thaw/src/thaw/plugins/IndexBrowser.java
   trunk/apps/Thaw/src/thaw/plugins/IndexExporter.java
   trunk/apps/Thaw/src/thaw/plugins/IndexWebGrapher.java
   trunk/apps/Thaw/src/thaw/plugins/InsertPlugin.java
   trunk/apps/Thaw/src/thaw/plugins/LogConsole.java
   trunk/apps/Thaw/src/thaw/plugins/MDns.java
   trunk/apps/Thaw/src/thaw/plugins/MiniFrost.java
   trunk/apps/Thaw/src/thaw/plugins/PeerMonitor.java
   trunk/apps/Thaw/src/thaw/plugins/QueueWatcher.java
   trunk/apps/Thaw/src/thaw/plugins/Restarter.java
   trunk/apps/Thaw/src/thaw/plugins/Signatures.java
   trunk/apps/Thaw/src/thaw/plugins/SqlConsole.java
   trunk/apps/Thaw/src/thaw/plugins/StatusBar.java
   trunk/apps/Thaw/src/thaw/plugins/ThemeSelector.java
   trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java
   trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java
   trunk/apps/Thaw/src/thaw/plugins/index/AutoRefresh.java
   trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java
   trunk/apps/Thaw/src/thaw/plugins/index/FileTable.java
   trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
   trunk/apps/Thaw/src/thaw/plugins/index/LinkManagementHelper.java
   trunk/apps/Thaw/src/thaw/plugins/index/UnknownIndexList.java
   trunk/apps/Thaw/src/thaw/plugins/indexWebGrapher/GraphBuilder.java
   trunk/apps/Thaw/src/thaw/plugins/mDns/MDNSDiscoveryPanel.java
   trunk/apps/Thaw/src/thaw/plugins/miniFrost/AutoRefresh.java
   trunk/apps/Thaw/src/thaw/plugins/miniFrost/BoardManagementHelper.java
   trunk/apps/Thaw/src/thaw/plugins/miniFrost/DraftPanel.java
   trunk/apps/Thaw/src/thaw/plugins/miniFrost/MessagePanel.java
   trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoard.java
   trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKFileAttachment.java
   trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
   trunk/apps/Thaw/src/thaw/plugins/signatures/SigConfigTab.java
Log:
Wait for all the threads to be stopped before calling System.exit(0)

Modified: trunk/apps/Thaw/src/thaw/core/ConfigWindow.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/ConfigWindow.java     2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/core/ConfigWindow.java     2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -226,11 +226,13 @@
        /**
         * We reload the change in another thread to avoid UI freeze
         */
-       public class Reloader implements Runnable {
+       public class Reloader implements ThawRunnable {
                private boolean resetConnection;
+               private boolean running;

                public Reloader(boolean resetConnection) {
                        this.resetConnection = resetConnection;
+                       this.running = true;
                }

                public void run() {
@@ -238,7 +240,7 @@

                        if (resetConnection) {
                                dialog = new 
JDialog(core.getMainWindow().getMainFrame(),
-                                                            " 
"+I18n.getMessage("thaw.common.pleaseWait"));
+                                                    " 
"+I18n.getMessage("thaw.common.pleaseWait"));

                                dialog.getContentPane().setLayout(new 
GridLayout(1, 1));
                                dialog.getContentPane().add(new 
JLabel(I18n.getMessage("thaw.common.pleaseWait"),
@@ -270,10 +272,11 @@
                        if (resetConnection) {
                                core.getConfig().cancelChanges();

-                               core.getPluginManager().stopPlugins();
+                               if (running)
+                                       core.getPluginManager().stopPlugins();

                                /* should reinit the whole connection correctly 
*/
-                               if (resetConnection && !core.initConnection()) {
+                               if (running && resetConnection && 
!core.initConnection()) {
                                        if (dialog == null)
                                                new 
thaw.gui.WarningWindow(core.getMainWindow().getMainFrame(),
                                                                           
I18n.getMessage("thaw.warning.unableToConnectTo")+
@@ -289,17 +292,24 @@
                                needConnectionReset = false;

                                /* put back the config tab */
-                               addTabs();
+                               if (running)
+                                       addTabs();

-                               core.getPluginManager().loadAndRunPlugins();
+                               if (running)
+                                       
core.getPluginManager().loadAndRunPlugins();

                        } else { /* !resetConnection */
-                               core.getConfig().applyChanges();
+                               if (running)
+                                       core.getConfig().applyChanges();
                        }

                        if (resetConnection)
                                dialog.setVisible(false);
                }
+
+               public void stop() {
+                       running = false;
+               }
        }

        /* not for later : the cancelbutton just call this */

Modified: trunk/apps/Thaw/src/thaw/core/Core.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/Core.java     2007-09-22 20:07:17 UTC (rev 
15279)
+++ trunk/apps/Thaw/src/thaw/core/Core.java     2007-09-22 21:10:05 UTC (rev 
15280)
@@ -163,6 +163,9 @@

                config.setDefaultValues();

+               if (config.getValue("logLevel") != null)
+                       
Logger.setLogLevel(Integer.parseInt(config.getValue("logLevel")));
+
                if (config.getValue("tmpDir") != null)
                        System.setProperty("java.io.tmpdir", 
config.getValue("tmpDir"));

@@ -177,11 +180,13 @@
        /**
         * My node takes too much time to answer. So now the connection process 
is partially threaded.
         */
-       protected class ConnectionProcess implements Runnable {
+       protected class ConnectionProcess implements ThawRunnable {
                private Core c;
+               private boolean running;

                public ConnectionProcess(Core c) {
                        this.c = c;
+                       this.running = true;
                }

                public void run() {
@@ -189,6 +194,10 @@
                        connectionProcess = null;
                }

+               public void stop() {
+                       running = false;
+               }
+
                public boolean process() {
                        boolean ret = true;

@@ -204,22 +213,35 @@
                                Logger.debug(this, "FCP  version : 
"+clientHello.getNodeFCPVersion());
                                Logger.debug(this, "Node version : 
"+clientHello.getNodeVersion());

-                               queueManager.startScheduler();
+                               if (ret)
+                                       queueManager.startScheduler();

-                               queueManager.restartNonPersistent();
+                               if (!running) ret = false;

-                               final FCPWatchGlobal watchGlobal = new 
FCPWatchGlobal(true);
-                               watchGlobal.start(queueManager);
+                               if (ret)
+                                       queueManager.restartNonPersistent();

-                               final FCPQueueLoader queueLoader = new 
FCPQueueLoader(config.getValue("thawId"));
-                               queueLoader.start(queueManager);
+                               if (!running) ret = false;

+                               if (ret) {
+                                       final FCPWatchGlobal watchGlobal = new 
FCPWatchGlobal(true);
+                                       watchGlobal.start(queueManager);
+                               }
+
+                               if (!running) ret = false;
+
+                               if (ret) {
+                                       final FCPQueueLoader queueLoader = new 
FCPQueueLoader(config.getValue("thawId"));
+                                       queueLoader.start(queueManager);
+                               }
+
+                               if (!running) ret = false;
                        }

                        if(ret && connection.isConnected())
                                connection.addObserver(c);

-                       if(getMainWindow() != null) {
+                       if(getMainWindow() != null && running) {
                                if (ret)
                                        
getMainWindow().setStatus(IconBox.minConnectAction,
                                                                  
I18n.getMessage("thaw.statusBar.ready"));
@@ -552,8 +574,13 @@
                        Logger.error(this, "Config was not saved correctly !");
                }

-               Logger.info(this, "Exiting");
-               System.exit(0);
+               ThawThread.setAllowFullStop(true);
+
+               Logger.info(this, "Threads remaining:");
+               ThawThread.listThreads();
+
+               Logger.info(this, "Stopping all the remaining threads ...");
+               ThawThread.stopAll();
        }


@@ -575,7 +602,7 @@
        }


-       protected class ReconnectionManager implements Runnable {
+       protected class ReconnectionManager implements ThawRunnable {
                private boolean running = true;

                public ReconnectionManager() {

Modified: trunk/apps/Thaw/src/thaw/core/LibraryPlugin.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/LibraryPlugin.java    2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/core/LibraryPlugin.java    2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -16,7 +16,7 @@
        private Vector registered = null;

        public abstract boolean run(Core core);
-       public abstract boolean stop();
+       public abstract void stop();


        public void registerChild(final Plugin child) {

Modified: trunk/apps/Thaw/src/thaw/core/Plugin.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/Plugin.java   2007-09-22 20:07:17 UTC (rev 
15279)
+++ trunk/apps/Thaw/src/thaw/core/Plugin.java   2007-09-22 21:10:05 UTC (rev 
15280)
@@ -16,9 +16,8 @@

        /**
         * Called when the plugin is stopped (often at the end of the program).
-        * @return false means that plugin has troubles and should not be 
unload.
         */
-       public boolean stop();
+       public void stop();


        /**

Added: trunk/apps/Thaw/src/thaw/core/ThawRunnable.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/ThawRunnable.java                             
(rev 0)
+++ trunk/apps/Thaw/src/thaw/core/ThawRunnable.java     2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -0,0 +1,10 @@
+package thaw.core;
+
+public interface ThawRunnable extends Runnable {
+
+       /**
+        * Called only when the user wants to halt Thaw
+        */
+       public void stop();
+
+}

Modified: trunk/apps/Thaw/src/thaw/core/ThawThread.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/ThawThread.java       2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/core/ThawThread.java       2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -1,14 +1,102 @@
 package thaw.core;

+import java.util.Vector;
+import java.util.Iterator;
+
+
 public class ThawThread extends Thread {
        private static ThreadGroup threadGroup = new ThreadGroup("Thaw");
+       private static Vector threads = new Vector();
+       private static boolean allowFullStop = false;

-       public ThawThread(Runnable target, String name) {
+       private Object parent;
+       private ThawRunnable target;
+       private String name;
+
+
+       public ThawThread(ThawRunnable target, String name) {
                this(target, name, null);
        }

-       public ThawThread(Runnable target, String name, Object parent) {
-               super(threadGroup, target, name);
+       public ThawThread(ThawRunnable target, String name, Object parent) {
+               super(threadGroup, name);
+
+               this.target = target;
+               this.name = name;
+               this.parent = parent;
        }

+       public void run() {
+               Logger.info(this, "Starting thread '"+name+"' ...");
+
+               synchronized(threads) {
+                       threads.add(this);
+               }
+
+               target.run();
+
+               synchronized(threads) {
+                       threads.remove(this);
+               }
+
+               Logger.info(this, "Thread '"+name+"' finished");
+
+               if (threads.size() == 0) {
+                       Logger.notice(this, "All threads are stopped");
+
+                       if (allowFullStop) {
+                               Logger.notice(this, "Halting Thaw");
+                               System.exit(0);
+                       }
+               }
+       }
+
+       public ThawRunnable getTarget() {
+               return target;
+       }
+
+       public Object getParent() {
+               return parent;
+       }
+
+
+       public static void setAllowFullStop(boolean a) {
+               allowFullStop = a;
+
+               synchronized(threads) {
+                       if (allowFullStop) {
+                               if (threads.size() == 0) {
+                                       Logger.notice(null, "All threads are 
stopped => Halting Thaw");
+                                       System.exit(0);
+                               }
+                       }
+               }
+       }
+
+
+       public static void listThreads() {
+               synchronized(threads) {
+                       Logger.info(null,
+                                   
Integer.toString(threadGroup.activeCount())+" threads "+
+                                   "("+Integer.toString(threads.size())+" 
known)");
+
+                       for (Iterator it = threads.iterator();
+                            it.hasNext();) {
+                               ThawThread th = (ThawThread)it.next();
+                               Logger.info(null,
+                                           "'"+th.getName()+"' "+
+                                           "(parent: 
'"+th.getParent().getClass().getName()+"')");
+                       }
+               }
+       }
+
+       public static void stopAll() {
+               synchronized(threads) {
+                       for (Iterator it = threads.iterator();
+                            it.hasNext();) {
+                               ThawThread th = (ThawThread)it.next();
+                               th.getTarget().stop();
+                       }
+               }
+       }
 }

Modified: trunk/apps/Thaw/src/thaw/fcp/FCPBufferedStream.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPBufferedStream.java 2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPBufferedStream.java 2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -2,14 +2,14 @@

 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

-
 /**
  * Only used by FCPConnection. Except special situation, you shouldn't have to 
use it directly.
  * Currently only used for output. (shouldn't be really usefull for input).
  * Some data are sent each 'INTERVAL' (in ms).
  */
-public class FCPBufferedStream implements Runnable {
+public class FCPBufferedStream implements ThawRunnable {
        private FCPConnection connection;
        private int maxUploadSpeed;

@@ -126,6 +126,11 @@
                }
        }

+       public void stop() {
+               running = false;
+       }
+
+
        /**
         * Start the thread sending data from the buffer to the OutputStream 
(socket).
         */

Modified: trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java      2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPClientGet.java      2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -9,6 +9,7 @@

 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;


 public class FCPClientGet extends Observable
@@ -622,7 +623,7 @@
        }


-       private class UnlockWaiter implements Runnable {
+       private class UnlockWaiter implements ThawRunnable {
                FCPClientGet clientGet;
                FCPConnection c;
                String dir;
@@ -633,8 +634,25 @@
                        this.c = c;
                }

+               private Thread th;
+               private boolean waiting = false;
+
                public void run() {
+                       synchronized(this) {
+                               waiting = true;
+                       }
+
                        c.addToWriterQueue();
+
+                       synchronized(this) {
+                               waiting = false;
+
+                               if (th.interrupted()) {
+                                       c.removeFromWriterQueue();
+                                       return;
+                               }
+                       }
+
                        isLockOwner = true;

                        Logger.debug(this, "I take the lock !");
@@ -646,6 +664,21 @@
                        clientGet.continueSaveFileTo(dir);
                        return;
                }
+
+
+               public void setThread(Thread th) {
+                       synchronized(this) {
+                               this.th = th;
+                       }
+               }
+
+               /* race-conditions may happen but "shits happen" */
+               public void stop() {
+                       synchronized(this) {
+                               if (waiting)
+                                       th.interrupt();
+                       }
+               }
        }

        public boolean saveFileTo(final String dir) {
@@ -692,10 +725,13 @@
                setChanged();
                this.notifyObservers();

+               UnlockWaiter uw = new UnlockWaiter(this, 
duplicatedQueryManager.getConnection(), dir);

-               final Thread fork = new ThawThread(new UnlockWaiter(this, 
duplicatedQueryManager.getConnection(), dir),
+               final Thread fork = new ThawThread(uw,
                                                   "Unlock waiter",
                                                   this);
+               uw.setThread(fork);
+
                fork.start();

                return true;

Modified: trunk/apps/Thaw/src/thaw/fcp/FCPClientPut.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPClientPut.java      2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPClientPut.java      2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -10,6 +10,7 @@

 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;


 /**
@@ -271,7 +272,7 @@



-       private class UnlockWaiter implements Runnable {
+       private class UnlockWaiter implements ThawRunnable {
                FCPClientPut clientPut;
                FCPConnection c;

@@ -280,14 +281,44 @@
                        this.c = c;
                }

+               private Thread th;
+               private boolean waiting = false;
+
                public void run() {
+                       synchronized(this) {
+                               waiting = true;
+                       }
+
                        c.addToWriterQueue();

+                       synchronized(this) {
+                               waiting = false;
+
+                               if (th.interrupted()) {
+                                       c.removeFromWriterQueue();
+                                       return;
+                               }
+                       }
+
                        lockOwner = true;

                        clientPut.continueInsert();
                        return;
                }
+
+               public void setThread(Thread th) {
+                       synchronized(this) {
+                               this.th = th;
+                       }
+               }
+
+               /* race-conditions may happen but "shits happen" */
+               public void stop() {
+                       synchronized(this) {
+                               if (waiting)
+                                       th.interrupt();
+                       }
+               }
        }


@@ -301,10 +332,12 @@

                Logger.info(this, "Waiting for socket availability ...");

-               final Thread fork = new ThawThread(new UnlockWaiter(this, 
connection),
+               UnlockWaiter uw = new UnlockWaiter(this, connection);
+
+               final Thread fork = new ThawThread(uw,
                                                   "Unlock waiter",
                                                   this);
-
+               uw.setThread(fork);
                fork.start();

                return true;

Modified: trunk/apps/Thaw/src/thaw/fcp/FCPQueryManager.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQueryManager.java   2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQueryManager.java   2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -4,21 +4,24 @@

 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

+
 /**
  * Manage all fcp messages (see corresponding object of each kind of query).
  * Call observers each type a new message is received. The given object is
  * the message.
  */
-public class FCPQueryManager extends Observable implements Runnable {
+public class FCPQueryManager extends Observable implements ThawRunnable {
        private Thread me;

        private FCPConnection connection;
+       private boolean running;

-
        public FCPQueryManager(final FCPConnection connection) {
                me = null;
                setConnection(connection);
+               running = true;
        }

        /**
@@ -93,7 +96,7 @@
        }


-       public class Notifier implements Runnable {
+       public class Notifier implements ThawRunnable {
                FCPMessage msg;

                public Notifier(FCPMessage msg) {
@@ -111,16 +114,20 @@
                                e.printStackTrace();
                        }
                }
+
+               public void stop() {
+                       /* can't stop */
+               }
        }



-       public class WatchDog implements Runnable {
+       public class WatchDog implements ThawRunnable {
                public final static int TIMEOUT = 10000;

-               Runnable runnable;
+               ThawRunnable runnable;

-               public WatchDog(Runnable runnable) {
+               public WatchDog(ThawRunnable runnable) {
                        this.runnable = runnable;
                }

@@ -146,6 +153,10 @@
                        }
                }

+               public void stop() {
+                       /* will stop by itself when the child thread will stop 
*/
+               }
+
        }

        /**
@@ -158,7 +169,7 @@
         * Will listen in loop for new incoming messages.
         */
        public void run() {
-               while(true) {
+               while(running) {
                        FCPMessage latestMessage;

                        /* note : if multithreaded, stop reading when a thread 
is writing,
@@ -197,13 +208,19 @@
                                }
                        } else {
                                Logger.info(this, "Stopping listening");
-                               return;
+                               running = false;
                        }
                }

        }


+       public void stop() {
+               Logger.info(this, "stop() : Stopping listening");
+               running = false;
+       }
+
+
        /**
         * Create the thread listening for incoming message.
         */

Modified: trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java   2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java   2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -8,13 +8,14 @@

 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 /**
  * Manage a running and a pending queue of FCPTransferQuery.
  * Please notice that runningQueue contains too finished queries.
  * Notify when: a query is added and when a query change to one queue to 
another.
  */
-public class FCPQueueManager extends java.util.Observable implements Runnable, 
java.util.Observer {
+public class FCPQueueManager extends java.util.Observable implements 
ThawRunnable, java.util.Observer {

        private final static int PRIORITY_MIN = 6; /* So 0 to 6 */

@@ -455,34 +456,39 @@
                try {
                        Thread.sleep(5000);
                } catch(final java.lang.InterruptedException e) {
-                       // I'm stupid. I'm stupid. I'm stupid. (r9654)
+                       /* \_o< */
                }

-               while(true) {
+               while(!stopThread) {
                        try {
                                Thread.sleep(500);
                        } catch(final java.lang.InterruptedException e) {
                                /* We don't care */
                        }

-                       if(stopThread)
-                               return;
+                       if(!stopThread) {

-                       try {
+                               try {

-                               if(queryManager.getConnection().isConnected()
-                                  && !queryManager.getConnection().isWriting()
-                                  && queueCompleted)
-                                       schedule();
+                                       
if(queryManager.getConnection().isConnected()
+                                          && 
!queryManager.getConnection().isWriting()
+                                          && queueCompleted)
+                                               schedule();

-                       } catch(final Exception e) {
-                               Logger.error(this, "EXCEPTION FROM ORDONNANCOR 
: "+e.toString()+ " ; "+e.getMessage());
-                               e.printStackTrace();
+                               } catch(final Exception e) {
+                                       Logger.error(this, "EXCEPTION FROM FCP 
SCHEDULER : "+e.toString()+ " ; "+e.getMessage());
+                                       e.printStackTrace();
+                               }
+
                        }
                }

        }

+       public void stop() {
+               stopThread = true;
+       }
+
        public void startScheduler() {
                scheduler = new ThawThread(this, "FCP queue scheduler", this);
                stopThread = false;

Modified: trunk/apps/Thaw/src/thaw/fcp/SHA256Computer.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/SHA256Computer.java    2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/fcp/SHA256Computer.java    2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -12,13 +12,14 @@
 import freenet.support.Base64;

 import thaw.core.Logger;
+import thaw.core.ThawRunnable;


 /**
  * Automatically used by FCPClientPut.
  * You shouldn't have to bother about it
  */
-public class SHA256Computer extends Observable implements Runnable {
+public class SHA256Computer extends Observable implements ThawRunnable {
        private MessageDigest md;

        private String hash;
@@ -30,26 +31,29 @@

        public final static int BLOCK_SIZE = 32768; /* 32 Ko */

+       public boolean running = true;
+
        public SHA256Computer(String header, String fileToHash) {
                this.file = fileToHash;
                this.headers = header;
+               this.running = true;
        }


        public void run() {
                File realFile = new File(file);
                long realFileSize = realFile.length();
-               
+
                try {
                        FileInputStream in = new FileInputStream(realFile);
                        BufferedInputStream bis = new BufferedInputStream(in);
                        md = SHA256.getMessageDigest();
                        md.reset();
                        md.update(headers.getBytes("UTF-8"));
-                       
+
                        byte[] buf = new byte[4096];
                        int readBytes = bis.read(buf);
-                       while(readBytes > -1) {
+                       while(readBytes > -1 && running) {
                                md.update(buf, 0, readBytes);
                                readBytes = bis.read(buf);
                                progress = (short) Math.round(readBytes * 100 / 
realFileSize);
@@ -60,6 +64,12 @@
                        bis.close();
                        in.close();

+                       if (!running) {
+                               setChanged();
+                               notifyObservers();
+                               return;
+                       }
+
                        synchronized (hashLock) {
                                hash = Base64.encode(md.digest());
                        }
@@ -76,7 +86,11 @@
                notifyObservers();
        }

+       public void stop() {
+               running = false;
+       }

+
        /**
         * In %
         */
@@ -85,7 +99,7 @@
                        return 100;
                else if(progress > 99)
                        return 99;
-               else 
+               else
                        return progress;
        }

@@ -94,10 +108,10 @@
         */
        public String getHash() {
                synchronized (hashLock) {
-                       return hash;    
+                       return hash;
                }
        }
-       
+
        public boolean isFinished() {
                return isFinished;
        }

Modified: trunk/apps/Thaw/src/thaw/gui/Table.java
===================================================================
--- trunk/apps/Thaw/src/thaw/gui/Table.java     2007-09-22 20:07:17 UTC (rev 
15279)
+++ trunk/apps/Thaw/src/thaw/gui/Table.java     2007-09-22 21:10:05 UTC (rev 
15280)
@@ -26,6 +26,7 @@
 import thaw.core.Config;
 import thaw.core.I18n;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 import thaw.fcp.FreenetURIHelper;
 import thaw.fcp.FCPTransferQuery;
@@ -38,7 +39,7 @@
  *  Just add to usual JTable the capacity to store the columns sizes
  * in the thaw configuration
  */
-public class Table extends JTable implements TableColumnModelListener, 
Runnable {
+public class Table extends JTable implements TableColumnModelListener, 
ThawRunnable {

        public final static Color COLOR_ONE = Color.WHITE;
        public final static Color COLOR_TWO = new Color(240, 240, 240);
@@ -344,7 +345,11 @@

        }

+       public void stop() {
+               /* can't stop */
+       }

+
        public void reallySaveColumnSize() {
                TableColumnModel m = super.getColumnModel();


Modified: trunk/apps/Thaw/src/thaw/plugins/FetchPlugin.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/FetchPlugin.java   2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/FetchPlugin.java   2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -79,13 +79,12 @@
        }


-       public boolean stop() {
+       public void stop() {
                Logger.info(this, "Stopping plugin \"FetchPlugin\" ...");

                if (queueWatcher != null)
                        
queueWatcher.removeButtonFromTheToolbar(buttonInToolBar);

-               return true;
        }

        public String getNameForUser() {

Modified: trunk/apps/Thaw/src/thaw/plugins/Hsqldb.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/Hsqldb.java        2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/Hsqldb.java        2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -77,8 +77,8 @@
        }


-       public boolean stop() {
-               return true;
+       public void stop() {
+               /* \_o< */
        }

        public void realStop() {

Modified: trunk/apps/Thaw/src/thaw/plugins/IndexBrowser.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/IndexBrowser.java  2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/IndexBrowser.java  2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -144,14 +144,16 @@
                return browserPanel;
        }

-       public boolean stop() {
+       public void stop() {
                if (autoRefresh != null)
                        autoRefresh.stop();

-               browserPanel.getCommentTab().hideTab();
-               browserPanel.getBlackList().hidePanel();
+               if (browserPanel != null) {
+                       browserPanel.getCommentTab().hideTab();
+                       browserPanel.getBlackList().hidePanel();

-               browserPanel.stopAllThreads();
+                       browserPanel.stopAllThreads();
+               }

                core.getMainWindow().getTabbedPane().removeChangeListener(this);

@@ -160,13 +162,13 @@
                        browserPanel.saveState();
                }

-               hsqldb.unregisterChild(this);
-               signatures.unregisterChild(this);
+               if (hsqldb != null)
+                       hsqldb.unregisterChild(this);
+               if (signatures != null)
+                       signatures.unregisterChild(this);

                if (configPanel != null)
                        configPanel.removeTab();
-
-               return true;
        }

        public String getNameForUser() {

Modified: trunk/apps/Thaw/src/thaw/plugins/IndexExporter.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/IndexExporter.java 2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/IndexExporter.java 2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -14,6 +14,7 @@
 import thaw.core.Logger;
 import thaw.core.Plugin;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.plugins.index.DatabaseManager;

 public class IndexExporter implements Plugin, ActionListener {
@@ -72,10 +73,8 @@
        }


-       public boolean stop() {
+       public void stop() {
                core.getMainWindow().removeFromFileMenu(menu);
-
-               return true;
        }

        public String getNameForUser() {
@@ -126,7 +125,7 @@

        }

-       private class Worker implements Runnable {
+       private class Worker implements ThawRunnable {
                private boolean impor;
                private boolean content;
                private java.io.File file;
@@ -150,5 +149,8 @@
                        }
                }

+               public void stop() {
+                       /* \_o< */
+               }
        }
 }

Modified: trunk/apps/Thaw/src/thaw/plugins/IndexWebGrapher.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/IndexWebGrapher.java       2007-09-22 
20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/IndexWebGrapher.java       2007-09-22 
21:10:05 UTC (rev 15280)
@@ -19,6 +19,7 @@
 import thaw.core.I18n;
 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 import thaw.plugins.indexWebGrapher.*;

@@ -130,11 +131,9 @@
        }


-       public boolean stop() {
+       public void stop() {
                core.getMainWindow().removeTab(tabPanel);
                db.unregisterChild(this);
-
-               return true;
        }

        public String getNameForUser() {

Modified: trunk/apps/Thaw/src/thaw/plugins/InsertPlugin.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/InsertPlugin.java  2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/InsertPlugin.java  2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -90,13 +90,11 @@
        }


-       public boolean stop() {
+       public void stop() {
                Logger.info(this, "Stopping plugin \"InsertPlugin\" ...");

                if (queueWatcher != null)
                        
queueWatcher.removeButtonFromTheToolbar(buttonInToolBar);
-
-               return true;
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/LogConsole.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/LogConsole.java    2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/LogConsole.java    2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -14,20 +14,23 @@
 import javax.swing.JComboBox;

 import thaw.core.Core;
+import thaw.core.Config;
 import thaw.gui.FileChooser;
 import thaw.core.I18n;
 import thaw.core.LogListener;
 import thaw.core.Logger;
 import thaw.core.Plugin;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 /**
  * Quick and dirty console showing Thaw logs, and allowing to save them.
  */
-public class LogConsole implements Plugin, LogListener, ActionListener, 
Runnable {
+public class LogConsole implements Plugin, LogListener, ActionListener, 
ThawRunnable {
        public final static int MAX_LINE = 512;

        private Core core;
+       private Config config;

        private String[] buffer;
        private int readOffset;
@@ -60,6 +63,8 @@

        public boolean run(final Core core) {
                this.core = core;
+               this.config = core.getConfig();
+
                threadRunning = true;
                hasChanged = false;

@@ -105,15 +110,12 @@

        }

-
-       public boolean stop() {
+       public void stop() {
                threadRunning = false;

                Logger.removeLogListener(this);

                core.getMainWindow().removeTab(consolePanel);
-
-               return true;
        }


@@ -125,8 +127,10 @@
        public void actionPerformed(final ActionEvent e) {
                if (e.getSource() == logLevel) {

-                       if (Logger.getLogLevel() != 
logLevel.getSelectedIndex()) /* to avoid loops */
+                       if (Logger.getLogLevel() != 
logLevel.getSelectedIndex()) {/* to avoid loops */
                                Logger.setLogLevel(logLevel.getSelectedIndex());
+                               config.setValue("logLevel", 
Integer.toString(logLevel.getSelectedIndex()));
+                       }

                } else if(e.getSource() == saveToFile) {
                        final FileChooser fileChooser = new FileChooser();

Modified: trunk/apps/Thaw/src/thaw/plugins/MDns.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/MDns.java  2007-09-22 20:07:17 UTC (rev 
15279)
+++ trunk/apps/Thaw/src/thaw/plugins/MDns.java  2007-09-22 21:10:05 UTC (rev 
15280)
@@ -53,13 +53,11 @@
                return core.getConfig();
        }

-       public boolean stop() {
+       public void stop() {
                discovery.stop();

                
core.getConfigWindow().getNodeConfigPanel().getAutodetectButton().removeActionListener(this);
                
core.getConfigWindow().getNodeConfigPanel().getAutodetectButton().setEnabled(false);
-
-               return false;
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/MiniFrost.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/MiniFrost.java     2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/MiniFrost.java     2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -144,7 +144,7 @@
                return true;
        }

-       public boolean stop() {
+       public void stop() {
                if (autoRefresh != null)
                        autoRefresh.stop();

@@ -158,8 +158,6 @@

                if (hsqldb != null)
                        hsqldb.unregisterChild(this);
-
-               return true;
        }

        public BoardFactory[] getFactories() {

Modified: trunk/apps/Thaw/src/thaw/plugins/PeerMonitor.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/PeerMonitor.java   2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/PeerMonitor.java   2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -15,8 +15,8 @@
 import thaw.core.Core;
 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

-
 import thaw.plugins.peerMonitor.*;
 import thaw.fcp.*;

@@ -42,7 +42,7 @@
        }


-       protected class DisplayRefresher implements Observer, Runnable{
+       protected class DisplayRefresher implements Observer, ThawRunnable{
                private FCPGetNode getNode = null;
                private FCPListPeers listPeers = null;

@@ -99,6 +99,10 @@
                                peerPanel.setPeerList(lP.getPeers());
                        }
                }
+
+               public void stop() {
+                       running = false;
+               }
        }


@@ -137,7 +141,7 @@
        }


-       public boolean stop() {
+       public void stop() {
                hideTab();
                if (!folded)
                        
core.getMainWindow().removeComponent(peerPanel.getPeerListPanel());
@@ -147,7 +151,6 @@
                core.getConfig().setValue("peerMonitorFolded", 
Boolean.toString(folded));

                running = false;
-               return false;
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/QueueWatcher.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/QueueWatcher.java  2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/QueueWatcher.java  2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -139,7 +139,7 @@
        }


-       public boolean stop() {
+       public void stop() {
                Logger.info(this, "Stopping plugin \"QueueWatcher\" ...");

                int splitLocation;
@@ -156,8 +156,6 @@
                core.getMainWindow().removeTab(panelAdded);

                purgeButtonList();
-
-               return true;
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/Restarter.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/Restarter.java     2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/Restarter.java     2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -17,6 +17,7 @@
 import thaw.core.Logger;
 import thaw.core.Plugin;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.fcp.FCPTransferQuery;

 /**
@@ -24,7 +25,7 @@
  * A not too bad example to show how to make plugins.
  * @deprecated When this plugin was created, MaxRetries was stupidly set to 0 
instead of -1 => now this plugin is useless.
  */
-public class Restarter implements Observer, Runnable, Plugin {
+public class Restarter implements Observer, ThawRunnable, Plugin {

        private int interval = 180; /* in s */
        private boolean restartFatals = false;
@@ -88,12 +89,10 @@
        }


-       public boolean stop() {
+       public void stop() {
                core.getConfigWindow().removeTab(configPanel);
                core.getConfigWindow().deleteObserver(this);
                running = false;
-
-               return true;
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/Signatures.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/Signatures.java    2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/Signatures.java    2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -111,7 +111,7 @@
        }


-       public boolean stop() {
+       public void stop() {
                configTab.destroy();
                core.getConfigWindow().removeTab(configTab.getPanel());

@@ -119,8 +119,6 @@

                if (used == 0)
                        db.unregisterChild(this);
-
-               return true;
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/SqlConsole.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/SqlConsole.java    2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/SqlConsole.java    2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -71,12 +71,11 @@
        }


-       public boolean stop() {
+       public void stop() {
                core.getMainWindow().removeTab(panel);

-               hsqldb.unregisterChild(this);
-
-               return true;
+               if (hsqldb != null)
+                       hsqldb.unregisterChild(this);
        }

        public String getNameForUser() {

Modified: trunk/apps/Thaw/src/thaw/plugins/StatusBar.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/StatusBar.java     2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/StatusBar.java     2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -13,11 +13,12 @@
 import thaw.core.Plugin;
 import thaw.core.LogListener;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 import thaw.gui.IconBox;
 import thaw.fcp.FCPTransferQuery;

-public class StatusBar implements Runnable, Plugin, LogListener {
+public class StatusBar implements ThawRunnable, Plugin, LogListener {
        public final static int INTERVAL = 3000; /* in ms */
        public final static String SEPARATOR = "     ";

@@ -171,12 +172,10 @@
        }


-       public boolean stop() {
+       public void stop() {
                running = false;

                core.getMainWindow().setStatus(IconBox.blueBunny, "Thaw 
"+Main.VERSION);
-
-               return true;
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/ThemeSelector.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/ThemeSelector.java 2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/ThemeSelector.java 2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -21,6 +21,7 @@
 import thaw.core.Logger;
 import thaw.core.Core;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;


 public class ThemeSelector implements thaw.core.Plugin, Observer, 
ListSelectionListener {
@@ -90,11 +91,9 @@
        }


-       public boolean stop() {
+       public void stop() {
                core.getConfigWindow().deleteObserver(this);
                core.getConfigWindow().removeTab(panel);
-
-               return false;
        }

        public String getNameForUser() {
@@ -145,7 +144,7 @@
        }


-       private class ThemeSetter implements Runnable {
+       private class ThemeSetter implements ThawRunnable {
                private String theme;

                public ThemeSetter(String t) {
@@ -155,6 +154,8 @@
                public void run() {
                        core.setTheme(theme);
                }
+
+               public void stop() { /* \_o< */ }
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java  2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/TransferLogs.java  2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -41,6 +41,7 @@
 import thaw.core.I18n;
 import thaw.core.Plugin;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 import thaw.fcp.FCPQueueManager;
 import thaw.fcp.FCPTransferQuery;
@@ -145,7 +146,7 @@
        }


-       public boolean stop() {
+       public void stop() {
                core.getMainWindow().removeTab(tab);
                core.getQueueManager().deleteObserver(this);

@@ -154,8 +155,6 @@
                /* Others observers will just keep data sync ? */

                db.unregisterChild(this);
-
-               return false;
        }


@@ -291,7 +290,7 @@
        }


-       private class KeyImporter implements Runnable {
+       private class KeyImporter implements ThawRunnable {
                public KeyImporter() { }

                public void run() {
@@ -356,10 +355,12 @@

                        table.refresh();
                }
+
+               public void stop() { /* \_o< */ }
        }


-       private class KeyExporter implements Runnable {
+       private class KeyExporter implements ThawRunnable {
                public KeyExporter() { }

                public void run() {
@@ -397,6 +398,8 @@
                        }

                }
+
+               public void stop() { /* \_o< */ }
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java      2007-09-22 20:07:17 UTC 
(rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/TrayIcon.java      2007-09-22 21:10:05 UTC 
(rev 15280)
@@ -29,6 +29,7 @@
 import thaw.core.Logger;
 import thaw.core.I18n;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 import thaw.fcp.FCPTransferQuery;

@@ -88,9 +89,9 @@
        }


-       public boolean stop() {
+       public void stop() {
                if (icon == null)
-                       return false;
+                       return;

                Logger.removeLogListener(this);

@@ -105,8 +106,6 @@
                }

                Logger.addLogListener(this);
-
-               return true;
        }


@@ -358,7 +357,7 @@
        }


-       private class ProgressBarRefresher implements Runnable {
+       private class ProgressBarRefresher implements ThawRunnable {
                private Vector bars;
                private boolean stop;


Modified: trunk/apps/Thaw/src/thaw/plugins/index/AutoRefresh.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/AutoRefresh.java     2007-09-22 
20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/index/AutoRefresh.java     2007-09-22 
21:10:05 UTC (rev 15280)
@@ -7,10 +7,11 @@
 import thaw.core.Config;
 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.fcp.FCPQueueManager;
 import thaw.plugins.Hsqldb;

-public class AutoRefresh implements Runnable, java.util.Observer {
+public class AutoRefresh implements ThawRunnable, java.util.Observer {

        public final static boolean DEFAULT_ACTIVATED = true;
        public final static int DEFAULT_INTERVAL = 150;

Modified: trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java    
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/index/FileManagementHelper.java    
2007-09-22 21:10:05 UTC (rev 15280)
@@ -16,6 +16,7 @@
 import thaw.core.I18n;
 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.fcp.FCPQueueManager;
 import thaw.fcp.FCPTransferQuery;

@@ -35,7 +36,7 @@



-       public static abstract class BasicFileAction implements FileAction, 
Runnable {
+       public static abstract class BasicFileAction implements FileAction, 
ThawRunnable {
                private AbstractButton src;

                public BasicFileAction(AbstractButton src) {
@@ -53,6 +54,10 @@
                        apply();
                }

+               public void stop() {
+                       /* \_o< */
+               }
+
                public abstract void setTarget(Vector files);
                public abstract void apply();
        }

Modified: trunk/apps/Thaw/src/thaw/plugins/index/FileTable.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/FileTable.java       2007-09-22 
20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/index/FileTable.java       2007-09-22 
21:10:05 UTC (rev 15280)
@@ -29,6 +29,7 @@

 import thaw.core.Config;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.fcp.FreenetURIHelper;
 import thaw.core.I18n;
 import thaw.gui.IconBox;
@@ -421,7 +422,7 @@
        }


-       private class TransferRefresher implements Runnable {
+       private class TransferRefresher implements ThawRunnable {
                private boolean running;

                public TransferRefresher() {

Modified: trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java   
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/index/IndexManagementHelper.java   
2007-09-22 21:10:05 UTC (rev 15280)
@@ -49,6 +49,7 @@

 import thaw.core.Config;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.gui.FileChooser;
 import thaw.core.MainWindow;
 import thaw.fcp.FreenetURIHelper;
@@ -85,7 +86,7 @@


        public static abstract class BasicIndexAction
-               implements IndexAction, Runnable {
+               implements IndexAction, ThawRunnable {

                private FCPQueueManager queueManager;
                private AbstractButton actionSource;
@@ -146,6 +147,10 @@
                        apply();
                }

+               public void stop() {
+                       /* \_o< */
+               }
+
                public abstract void apply();
        }

@@ -286,7 +291,7 @@



-       public static class IndexModifier extends BasicIndexAction implements 
Runnable {
+       public static class IndexModifier extends BasicIndexAction implements 
ThawRunnable {

                public IndexModifier(final FCPQueueManager queueManager, final 
IndexBrowserPanel indexBrowser, final AbstractButton actionSource) {
                        super(queueManager, indexBrowser, actionSource);
@@ -320,7 +325,7 @@
        }


-       public static class IndexReuser extends BasicIndexAction implements 
Runnable {
+       public static class IndexReuser extends BasicIndexAction implements 
ThawRunnable {
                public IndexReuser(final FCPQueueManager queueManager, final 
IndexBrowserPanel indexBrowser, final AbstractButton actionSource) {
                        super(queueManager, indexBrowser, actionSource);
                }
@@ -574,7 +579,7 @@
        }


-       public static class IndexHasChangedFlagReseter extends BasicIndexAction 
implements Runnable {
+       public static class IndexHasChangedFlagReseter extends BasicIndexAction 
implements ThawRunnable {
                public IndexHasChangedFlagReseter(IndexBrowserPanel 
indexBrowser, final AbstractButton actionSource) {
                        super(null, indexBrowser, actionSource);
                }
@@ -591,7 +596,7 @@
        }


-       public static class IndexDownloader extends BasicIndexAction implements 
Runnable, Observer {
+       public static class IndexDownloader extends BasicIndexAction implements 
ThawRunnable, Observer {
                private boolean autoSort = false;

                public IndexDownloader(FCPQueueManager queueManager,
@@ -787,7 +792,7 @@



-       public static class IndexSorter extends BasicIndexAction implements 
Runnable {
+       public static class IndexSorter extends BasicIndexAction implements 
ThawRunnable {
                public IndexSorter(IndexBrowserPanel indexBrowser,
                                   final AbstractButton actionSource) {

@@ -815,7 +820,7 @@
        }


-       public static class IndexUploader extends BasicIndexAction implements 
Runnable, Observer {
+       public static class IndexUploader extends BasicIndexAction implements 
ThawRunnable, Observer {
                public IndexUploader(FCPQueueManager queueManager,
                                     IndexBrowserPanel indexBrowser,
                                     final AbstractButton actionSource) {
@@ -1297,7 +1302,7 @@



-       public static class KeyAdder extends BasicIndexAction implements 
Runnable, MouseListener {
+       public static class KeyAdder extends BasicIndexAction implements 
ThawRunnable, MouseListener {
                private JButton cancelButton = null;
                private JButton okButton = null;
                private JTextArea textArea = null;
@@ -1483,7 +1488,7 @@



-       public static class LinkAdder extends BasicIndexAction implements 
Runnable {
+       public static class LinkAdder extends BasicIndexAction implements 
ThawRunnable {
                public LinkAdder(IndexBrowserPanel indexBrowser, final 
AbstractButton actionSource) {
                        super(null, indexBrowser, actionSource);
                }
@@ -1538,7 +1543,7 @@



-       public static class IndexFolderReorderer extends BasicIndexAction 
implements Runnable {
+       public static class IndexFolderReorderer extends BasicIndexAction 
implements ThawRunnable {
                public IndexFolderReorderer(IndexBrowserPanel indexBrowser, 
final AbstractButton actionSource) {
                        super(null, indexBrowser, actionSource);
                }
@@ -1562,7 +1567,7 @@



-       public static class IndexCommentAdder extends BasicIndexAction 
implements Runnable, ActionListener {
+       public static class IndexCommentAdder extends BasicIndexAction 
implements ThawRunnable, ActionListener {
                private JDialog dialog;

                private JComboBox author;
@@ -1691,7 +1696,7 @@
        }


-       public static class IndexCommentViewer extends BasicIndexAction 
implements Runnable {
+       public static class IndexCommentViewer extends BasicIndexAction 
implements ThawRunnable {
                public IndexCommentViewer(IndexBrowserPanel indexBrowser, final 
AbstractButton actionSource) {
                        super(null, indexBrowser, actionSource);

@@ -1715,7 +1720,7 @@
        }


-       public static class IndexDetailsViewer extends BasicIndexAction 
implements Runnable, ActionListener {
+       public static class IndexDetailsViewer extends BasicIndexAction 
implements ThawRunnable, ActionListener {
                private DateFormat dateFormat;

                public IndexDetailsViewer(IndexBrowserPanel indexBrowser, final 
AbstractButton actionSource) {

Modified: trunk/apps/Thaw/src/thaw/plugins/index/LinkManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/LinkManagementHelper.java    
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/index/LinkManagementHelper.java    
2007-09-22 21:10:05 UTC (rev 15280)
@@ -12,6 +12,7 @@

 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.plugins.Hsqldb;
 import thaw.fcp.FCPQueueManager;

@@ -27,7 +28,7 @@
        }


-       public static abstract class BasicLinkAction implements LinkAction, 
Runnable {
+       public static abstract class BasicLinkAction implements LinkAction, 
ThawRunnable {
                private AbstractButton src;

                public BasicLinkAction(AbstractButton src) {
@@ -45,6 +46,10 @@
                        apply();
                }

+               public void stop() {
+                       /* \_o< */
+               }
+
                public abstract void setTarget(Vector files);
                public abstract void apply();
        }

Modified: trunk/apps/Thaw/src/thaw/plugins/index/UnknownIndexList.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/UnknownIndexList.java        
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/index/UnknownIndexList.java        
2007-09-22 21:10:05 UTC (rev 15280)
@@ -28,6 +28,7 @@
 import thaw.core.I18n;
 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.gui.IconBox;
 import thaw.fcp.FCPQueueManager;
 import thaw.fcp.FreenetURIHelper;
@@ -163,7 +164,7 @@
                return true;
        }

-       private class LinkAdder implements Runnable {
+       private class LinkAdder implements ThawRunnable {
                private LinkList index;
                private boolean running;


Modified: trunk/apps/Thaw/src/thaw/plugins/indexWebGrapher/GraphBuilder.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/indexWebGrapher/GraphBuilder.java  
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/indexWebGrapher/GraphBuilder.java  
2007-09-22 21:10:05 UTC (rev 15280)
@@ -12,9 +12,10 @@
 import thaw.fcp.FreenetURIHelper;
 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;


-public class GraphBuilder implements Runnable {
+public class GraphBuilder implements ThawRunnable {

        private IndexWebGrapher plugin;
        private GraphPanel graphPanel;
@@ -35,7 +36,7 @@
                this.stop = false;
        }

-       private class Refresher implements Runnable {
+       private class Refresher implements ThawRunnable {
                public Refresher() {

                }
@@ -59,6 +60,9 @@
                        } while (loop && !stop && !finish);
                }

+               public void stop() {
+                       /* \_o< */
+               }
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/mDns/MDNSDiscoveryPanel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/mDns/MDNSDiscoveryPanel.java       
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/mDns/MDNSDiscoveryPanel.java       
2007-09-22 21:10:05 UTC (rev 15280)
@@ -26,6 +26,7 @@

 import thaw.core.Logger;
 import thaw.core.I18n;
+import thaw.core.ThawRunnable;
 import thaw.plugins.MDns;


@@ -45,7 +46,9 @@
  * TODO: implement the "Manual" mode
  * TODO: maybe we should have a small progressbar shown in a new popup to 
introduce a "delay" at startup
  */
-public class MDNSDiscoveryPanel extends JDialog implements ActionListener, 
Runnable {
+public class MDNSDiscoveryPanel extends JDialog
+       implements ActionListener, ThawRunnable {
+
        public interface MDNSDiscoveryPanelCallback {
                /**
                 * Called upon exit from MDNSDiscoveryPanelCallback
@@ -220,4 +223,7 @@
        }


+       public void stop() {
+               cancelledByUser = true;
+       }
 }

Modified: trunk/apps/Thaw/src/thaw/plugins/miniFrost/AutoRefresh.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/AutoRefresh.java 2007-09-22 
20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/AutoRefresh.java 2007-09-22 
21:10:05 UTC (rev 15280)
@@ -9,8 +9,9 @@
 import thaw.core.Logger;
 import thaw.core.Config;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

-public class AutoRefresh implements Runnable {
+public class AutoRefresh implements ThawRunnable {

        public static final int DEFAULT_MAX_BOARDS_REFRESHING = 7;
        public static final int DEFAULT_INTERVAL = 10; /* s */

Modified: trunk/apps/Thaw/src/thaw/plugins/miniFrost/BoardManagementHelper.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/BoardManagementHelper.java       
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/BoardManagementHelper.java       
2007-09-22 21:10:05 UTC (rev 15280)
@@ -23,6 +23,7 @@
 import thaw.core.I18n;
 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.plugins.miniFrost.interfaces.Board;
 import thaw.plugins.miniFrost.interfaces.BoardFactory;
 import thaw.plugins.miniFrost.interfaces.Message;
@@ -35,7 +36,7 @@
                public void setTarget(Board board);
        }

-       public static abstract class BasicBoardAction implements BoardAction, 
Runnable {
+       public static abstract class BasicBoardAction implements BoardAction, 
ThawRunnable {

                public BasicBoardAction() {

@@ -45,6 +46,10 @@
                        apply();
                }

+               public void stop() {
+                       /* \_o< */
+               }
+
                public void actionPerformed(ActionEvent e) {
                        Thread th = new ThawThread(this, "Action replier", 
this);
                        th.start();

Modified: trunk/apps/Thaw/src/thaw/plugins/miniFrost/DraftPanel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/DraftPanel.java  2007-09-22 
20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/DraftPanel.java  2007-09-22 
21:10:05 UTC (rev 15280)
@@ -35,6 +35,7 @@
 import thaw.core.I18n;
 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 import thaw.gui.IconBox;
 import thaw.gui.FileChooser;
@@ -307,7 +308,7 @@
        private JMenuItem addFile = null;


-       private class BoardAdder implements Runnable {
+       private class BoardAdder implements ThawRunnable {
                public BoardAdder() {

                }
@@ -330,9 +331,11 @@

                        refreshAttachmentList();
                }
+
+               public void stop() { /* \_o< */ }
        }

-       private class FileAdder implements Runnable {
+       private class FileAdder implements ThawRunnable {
                public FileAdder() {

                }
@@ -366,6 +369,8 @@

                        refreshAttachmentList();
                }
+
+               public void stop() { /* \_o< */ }
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/miniFrost/MessagePanel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/MessagePanel.java        
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/MessagePanel.java        
2007-09-22 21:10:05 UTC (rev 15280)
@@ -40,6 +40,7 @@
 import thaw.plugins.IndexBrowser;
 import thaw.plugins.index.IndexManagementHelper;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 public class MessagePanel
        implements ActionListener {
@@ -365,7 +366,7 @@
        }


-       private class ScrollBarSetter implements Runnable {
+       private class ScrollBarSetter implements ThawRunnable {
                public ScrollBarSetter() { }

                public void run() {
@@ -391,6 +392,10 @@

                        scrollPane.getVerticalScrollBar().setValue(max);
                }
+
+               public void stop() {
+                       /* \_o< */
+               }
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoard.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoard.java   
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKBoard.java   
2007-09-22 21:10:05 UTC (rev 15280)
@@ -13,6 +13,7 @@
 import thaw.core.Logger;
 import thaw.core.I18n;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.plugins.Hsqldb;

 import thaw.plugins.signatures.Identity;
@@ -24,7 +25,7 @@

 public class KSKBoard
        extends Observable
-       implements Board, Runnable, Observer {
+       implements Board, ThawRunnable, Observer {

        public final static int MAX_DOWNLOADS_AT_THE_SAME_TIME = 5;
        public final static int MAX_FAILURES_IN_A_ROW          = 5;
@@ -782,7 +783,14 @@

        }

+       public void stop() {
+               /* startNewMessageDownload() won't start any new message 
download
+                * if this variable is set to false
+                */
+               refreshing = false;
+       }

+
        public boolean isRefreshing() {
                return refreshing;
        }

Modified: 
trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKFileAttachment.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKFileAttachment.java  
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/miniFrost/frostKSK/KSKFileAttachment.java  
2007-09-22 21:10:05 UTC (rev 15280)
@@ -8,6 +8,7 @@
 import thaw.core.I18n;
 import thaw.core.Config;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.plugins.Hsqldb;
 import thaw.core.Logger;
 import thaw.gui.FileChooser;
@@ -15,7 +16,7 @@


 public class KSKFileAttachment
-       extends KSKAttachment implements Runnable, java.util.Observer {
+       extends KSKAttachment implements ThawRunnable, java.util.Observer {

        private String filename;
        private long size;
@@ -269,7 +270,10 @@
                }
        }

+       public void stop() {

+       }
+
        public void insert(Hsqldb db, int messageId) {
                if (filename == null
                    || size == 0

Modified: trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java       
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/queueWatcher/QueuePanel.java       
2007-09-22 21:10:05 UTC (rev 15280)
@@ -36,6 +36,7 @@

 import thaw.core.Core;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;
 import thaw.gui.FileChooser;
 import thaw.core.I18n;
 import thaw.gui.IconBox;
@@ -325,7 +326,7 @@
        }


-       public class ActionReplier implements Runnable {
+       public class ActionReplier implements ThawRunnable {
                private int action;
                private int new_priority;
                private Vector queries;
@@ -445,6 +446,10 @@

                }

+
+               public void stop() {
+                       /* \_o< */
+               }
        }



Modified: trunk/apps/Thaw/src/thaw/plugins/signatures/SigConfigTab.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/signatures/SigConfigTab.java       
2007-09-22 20:07:17 UTC (rev 15279)
+++ trunk/apps/Thaw/src/thaw/plugins/signatures/SigConfigTab.java       
2007-09-22 21:10:05 UTC (rev 15280)
@@ -35,6 +35,7 @@
 import thaw.core.Config;
 import thaw.core.Logger;
 import thaw.core.ThawThread;
+import thaw.core.ThawRunnable;

 import thaw.gui.IconBox;
 import thaw.gui.FileChooser;
@@ -238,7 +239,7 @@
                }


-               private class IdentityAdder implements Runnable {
+               private class IdentityAdder implements ThawRunnable {


                        public void run() {
@@ -255,10 +256,14 @@
                                        updateList();
                                }
                        }
+
+                       public void stop() {
+                               /* \_o< */
+                       }
                }


-               private class IdentityImporter implements Runnable {
+               private class IdentityImporter implements ThawRunnable {
                        public IdentityImporter() { }

                        public void run() {
@@ -274,10 +279,14 @@
                                        updateList();
                                }
                        }
+
+                       public void stop() {
+                               /* \_o< */
+                       }
                }


-               private class IdentityExporter implements Runnable {
+               private class IdentityExporter implements ThawRunnable {
                        private Identity i;

                        public IdentityExporter(Identity i) {
@@ -297,10 +306,14 @@
                                        updateList();
                                }
                        }
+
+                       public void stop() {
+                               /* \_o< */
+                       }
                }


-               private class IdentityDeleter implements Runnable {
+               private class IdentityDeleter implements ThawRunnable {
                        private Identity i;

                        public IdentityDeleter(Identity i) {
@@ -320,6 +333,10 @@
                                i.delete();
                                updateList();
                        }
+
+                       public void stop() {
+                               /* \_o< */
+                       }
                }




Reply via email to