Author: jflesch
Date: 2007-01-27 16:35:10 +0000 (Sat, 27 Jan 2007)
New Revision: 11624

Modified:
   trunk/apps/Thaw/src/thaw/core/ConfigWindow.java
   trunk/apps/Thaw/src/thaw/core/Core.java
   trunk/apps/Thaw/src/thaw/core/MainWindow.java
   trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java
   trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
   trunk/apps/Thaw/src/thaw/i18n/thaw.properties
   trunk/apps/Thaw/src/thaw/plugins/StatusBar.java
   trunk/apps/Thaw/src/thaw/plugins/index/AutoRefresh.java
Log:
Fix reconnection process

Modified: trunk/apps/Thaw/src/thaw/core/ConfigWindow.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/ConfigWindow.java     2007-01-26 22:47:54 UTC 
(rev 11623)
+++ trunk/apps/Thaw/src/thaw/core/ConfigWindow.java     2007-01-27 16:35:10 UTC 
(rev 11624)
@@ -206,7 +206,7 @@
 /* should reinit the whole connection correctly */
                        core.getPluginManager().stopPlugins();

-                       if (resetConnection && !core.initNodeConnection()) {
+                       if (resetConnection && !core.initConnection()) {
                                new WarningWindow(core, 
I18n.getMessage("thaw.warning.unableToConnectTo")+ " 
"+core.getConfig().getValue("nodeAddress")+":"+ 
core.getConfig().getValue("nodePort"));
                        }


Modified: trunk/apps/Thaw/src/thaw/core/Core.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/Core.java     2007-01-26 22:47:54 UTC (rev 
11623)
+++ trunk/apps/Thaw/src/thaw/core/Core.java     2007-01-27 16:35:10 UTC (rev 
11624)
@@ -47,7 +47,9 @@
        public final static int MAX_CONNECT_TRIES = 3;
        public final static int TIME_BETWEEN_EACH_TRY = 5000;

+       private ReconnectionManager reconnectionManager = null;

+
        /**
         * Creates a core, but do nothing else (no initialization).
         */
@@ -111,7 +113,7 @@

                splashScreen.setProgressionAndStatus(10, "Connecting ...");
                splashScreen.addIcon(IconBox.connectAction);
-               if(!initNodeConnection())
+               if(!initConnection())
                        new WarningWindow(this, 
I18n.getMessage("thaw.warning.unableToConnectTo")+
                                          " "+ config.getValue("nodeAddress")+
                                          ":"+ config.getValue("nodePort"));
@@ -159,16 +161,20 @@
         * if you called canDisconnect() before, then this function can be 
called safely.
         * @see #canDisconnect()
         */
-       public boolean initNodeConnection() {
-               if(getMainWindow() != null)
-                       
getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.connecting"));
+       public boolean initConnection() {
+               boolean ret = true;

+               if(getMainWindow() != null) {
+                       
getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.connecting"), 
java.awt.Color.RED);
+
+               }
+
                try {
                        if(queueManager != null)
                                queueManager.stopScheduler();

                        if((connection != null) && connection.isConnected()) {
-                               disconnect();
+                               subDisconnect();
                        }

                        if(connection == null) {
@@ -177,7 +183,8 @@
                                                               
Integer.parseInt(config.getValue("maxUploadSpeed")),
                                                               
Boolean.valueOf(config.getValue("multipleSockets")).booleanValue(),
                                                               
Boolean.valueOf(config.getValue("sameComputer")).booleanValue());
-                       } else { /* connection is not recreate to avoid 
troubles with observer etc */
+                       } else { /* connection is not recreate to avoid 
troubles with possible observers etc */
+                               connection.deleteObserver(this);
                                
connection.setNodeAddress(config.getValue("nodeAddress"));
                                
connection.setNodePort(Integer.parseInt(config.getValue("nodePort")));
                                
connection.setMaxUploadSpeed(Integer.parseInt(config.getValue("maxUploadSpeed")));
@@ -187,6 +194,7 @@

                        if(!connection.connect()) {
                                Logger.warning(this, "Unable to connect !");
+                               ret = false;
                        }

                        if(queryManager == null)
@@ -207,7 +215,7 @@



-                       if(connection.isConnected()) {
+                       if(ret && connection.isConnected()) {
                                queryManager.startListening();

                                QueueKeeper.loadQueue(queueManager, 
"thaw.queue.xml");
@@ -217,9 +225,8 @@

                                if(!clientHello.start(null)) {
                                        Logger.warning(this, "Id already used 
!");
-                                       connection.disconnect();
-                                       new WarningWindow(this, "Unable to 
connect to "+config.getValue("nodeAddress")+":"+config.getValue("nodePort"));
-                                       return false;
+                                       subDisconnect();
+                                       ret = false;
                                } else {
                                        Logger.debug(this, "Hello successful");
                                        Logger.debug(this, "Node name    : 
"+clientHello.getNodeName());
@@ -237,23 +244,25 @@
                                        queueLoader.start(queueManager);

                                }
+                       }

-                       } else
-                               return false;
-
                } catch(final Exception e) { /* A little bit not ... "nice" ... 
*/
                        Logger.warning(this, "Exception while connecting : 
"+e.toString()+" ; "+e.getMessage() + " ; "+e.getCause());
                        e.printStackTrace();
                        return false;
                }

-               if(connection.isConnected())
+               if(ret && connection.isConnected())
                        connection.addObserver(this);

-               if(getMainWindow() != null)
-                       
getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.ready"));
+               if(getMainWindow() != null) {
+                       if (ret)
+                               
getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.ready"));
+                       else
+                               
getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.disconnected"));
+               }

-               return true;
+               return ret;
        }


@@ -347,13 +356,30 @@
         * Makes things nicely ... :)
         */
        public void disconnect() {
+               if (reconnectionManager != null) {
+                       reconnectionManager.stop();
+                       reconnectionManager = null;
+               }
+
+               subDisconnect();
+       }
+
+
+       public void subDisconnect() {
                Logger.info(this, "Disconnecting");
-               connection.deleteObserver(this);
-               connection.disconnect();

-               Logger.info(this, "Saving queue state");
-               QueueKeeper.saveQueue(queueManager, "thaw.queue.xml");
+               if (mainWindow != null) {
+                       
mainWindow.setStatus(I18n.getMessage("thaw.statusBar.disconnected"), 
java.awt.Color.RED);
+               }

+               if (connection != null) {
+                       connection.deleteObserver(this);
+                       connection.disconnect();
+                       Logger.info(this, "Saving queue state");
+                       QueueKeeper.saveQueue(queueManager, "thaw.queue.xml");
+               } else {
+                       Logger.warning(this, "No connection ?!");
+               }
        }

        /**
@@ -365,7 +391,7 @@

        /**
         * End of the world.
-        * @param force if true, doesn't check if FCPConnection.isWritting().
+        * @param force if true, doesn't check if FCPConnection.isWriting().
         * @see #exit()
         */
        public void exit(boolean force) {
@@ -416,98 +442,78 @@
        }


-       protected class UnwantedDisconnectionManager implements Runnable, 
ActionListener {
-               private JDialog warningDialog = null;
+       protected class ReconnectionManager implements Runnable {
+               private boolean running = true;

+               public ReconnectionManager() {
+                       running = true;
+               }
+
                public void run() {
-                       disconnect();
+                       Logger.notice(this, "Starting reconnection process !");

-                       int nmbReconnect = 0;
+                       
getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.connecting"), 
java.awt.Color.RED);
+                       getPluginManager().stopPlugins(); /* don't forget there 
is the status bar plugin */
+                       
getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.connecting"), 
java.awt.Color.RED);

-                       if (getMainWindow() != null) /* disconnection can 
happen when starting */
-                               warningDialog = new 
JDialog(getMainWindow().getMainFrame());
-                       else
-                               warningDialog = new JDialog();
-                       warningDialog.setTitle("Thaw - reconnection");
-                       warningDialog.setModal(false);
-                       warningDialog.setSize(500, 100);
-                       
warningDialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+                       subDisconnect();

-                       final JPanel warningPanel = new JPanel(new 
BorderLayout(10, 10));
-                       final JLabel warningLabel = new 
JLabel(I18n.getMessage("thaw.warning.autoreconnecting"),
-                                                              
SwingConstants.CENTER);
-                       final JButton cancelButton = new 
JButton(I18n.getMessage("thaw.common.cancel"));
-                       cancelButton.addActionListener(this);
-
-                       warningPanel.add(warningLabel, BorderLayout.CENTER);
-                       warningPanel.add(cancelButton, BorderLayout.SOUTH);
-                       warningDialog.setContentPane(warningPanel);
-
-                       warningDialog.setVisible(true);
-
-                       for(nmbReconnect = 0;
-                           nmbReconnect < Core.MAX_CONNECT_TRIES && 
warningDialog != null ;
-                           nmbReconnect++) {
-
+                       while(running) {
                                try {
                                        
Thread.sleep(Core.TIME_BETWEEN_EACH_TRY);
                                } catch(final java.lang.InterruptedException e) 
{
                                        // brouzouf
                                }

-                               Logger.notice(this, "Trying to reconnect ... : 
"+ Integer.toString(nmbReconnect));
-                               if (warningDialog != null) {
-                                       if(initNodeConnection())
-                                               break;
-                               }
+                               Logger.notice(this, "Trying to reconnect ...");
+                               if(initConnection())
+                                       break;
                        }

-                       if (warningDialog != null) {
-                               warningDialog.setVisible(false);
-                               warningDialog.dispose();
+                       if (running) {
+                               
getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.ready"));
+                       } else {
+                               
getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.disconnected"), 
java.awt.Color.RED);
                        }

+                       getPluginManager().loadPlugins();
+                       getPluginManager().runPlugins();

-                       if(nmbReconnect == Core.MAX_CONNECT_TRIES) {
-                               while(!initNodeConnection()) {
-                                       final int ret = 
JOptionPane.showOptionDialog((java.awt.Component)null,
-                                                                               
     I18n.getMessage("thaw.warning.disconnected"),
-                                                                               
     "Thaw - "+I18n.getMessage("thaw.warning.title"),
-                                                                               
     JOptionPane.YES_NO_OPTION,
-                                                                               
     JOptionPane.WARNING_MESSAGE,
-                                                                               
     (javax.swing.Icon)null,
-                                                                               
     (java.lang.Object[])null,
-                                                                               
     (java.lang.Object)null);
-                               if((ret == JOptionPane.CLOSED_OPTION)
-                                  || (ret == JOptionPane.CANCEL_OPTION)
-                                  || (ret == JOptionPane.NO_OPTION))
-                                       break;
-                               }
+                       reconnectionManager = null;

-                       }
+                       getMainWindow().connectionHasChanged();
+               }

-                       getPluginManager().stopPlugins();
-                       getPluginManager().loadPlugins();
-                       getPluginManager().runPlugins();
+               public void stop() {
+                       Logger.warning(this, "Canceling reconnection ...");
+                       running = false;
                }
+       }

-               public void actionPerformed(ActionEvent e) {
-                       if (warningDialog == null)
-                               return;
-                       // we assume that the action comes from the button in 
the reconnection dialog
-                       warningDialog.setVisible(false);
-                       warningDialog.dispose();
-                       warningDialog = null;
+       /**
+        * use Thread => will also do all the work related to the plugins
+        */
+       public void reconnect() {
+               if (reconnectionManager == null) {
+                       reconnectionManager = new ReconnectionManager();
+                       Thread th = new Thread(reconnectionManager);
+                       th.start();
+               } else {
+                       Logger.warning(this, "Already trying to reconnect !");
                }
        }


+       public boolean isReconnecting() {
+               return (reconnectionManager != null);
+       }
+
+
        public void update(final Observable o, final Object target) {
                Logger.debug(this, "Move on the connection (?)");

                if((o == connection) && !connection.isConnected()) {
-                       Thread th = new Thread(new 
UnwantedDisconnectionManager());
-                       th.run();
+                       reconnect();
                }
        }


Modified: trunk/apps/Thaw/src/thaw/core/MainWindow.java
===================================================================
--- trunk/apps/Thaw/src/thaw/core/MainWindow.java       2007-01-26 22:47:54 UTC 
(rev 11623)
+++ trunk/apps/Thaw/src/thaw/core/MainWindow.java       2007-01-27 16:35:10 UTC 
(rev 11624)
@@ -201,6 +201,12 @@
        }


+       public void connectionHasChanged() {
+               core.getConnectionManager().addObserver(this);
+       }
+
+
+
        /**
         * Make the window visible or not.
         */
@@ -385,12 +391,7 @@
         */
        public void actionPerformed(final ActionEvent e) {
                if(e.getSource() == connectButton) {
-                       core.getPluginManager().stopPlugins();
-
-                       if(!core.initNodeConnection())
-                               unableToConnect();
-
-                       core.getPluginManager().runPlugins();
+                       core.reconnect();
                }

                if(e.getSource() == disconnectButton) {
@@ -400,9 +401,7 @@
                        }

                        core.getPluginManager().stopPlugins();
-
                        core.disconnect();
-
                        core.getPluginManager().runPlugins();
                }

@@ -421,14 +420,7 @@
                                        return;
                        }

-                       core.getPluginManager().stopPlugins();
-
-                       if(!core.initNodeConnection())
-                               unableToConnect();
-
-                       core.getPluginManager().loadPlugins();
-                       core.getPluginManager().runPlugins();
-
+                       core.reconnect();
                }

                if(e.getSource() == optionsFileMenuItem) {
@@ -490,15 +482,22 @@
        }


+       public void setStatus(final String status) {
+               setStatus(status, java.awt.Color.BLACK);
+       }
+
+
        /**
         * Change text in the status bar.
         * @param status Null is accepted.
         */
-       public void setStatus(final String status) {
+       public void setStatus(final String status, java.awt.Color color) {
                if(status != null)
                        statusBar.setText(status);
                else
                        statusBar.setText(" ");/* not empty else the status bar 
disappear */
+
+               statusBar.setForeground(color);
        }



Modified: trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java    2007-01-26 22:47:54 UTC 
(rev 11623)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPClientHello.java    2007-01-27 16:35:10 UTC 
(rev 11624)
@@ -12,7 +12,7 @@
  *       and start() returns false.
  */
 public class FCPClientHello implements FCPQuery, Observer {
-       public final static int NODEHELLO_TIMEOUT = 20; /* in seconds */
+       public final static int NODEHELLO_TIMEOUT = 30; /* in seconds */

        private final static String FCP_EXPECTED_VERSION = "2.0";
        private String id;
@@ -94,7 +94,6 @@
                        Logger.info(this, "Hello "+nodeName+", I'm Thaw :)");
                } else {
                        Logger.warning(this, "Unable to connect, ID is probably 
already taken or there was a timeout");
-                       queryManager.getConnection().disconnect();
                        return false;
                }


Modified: trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java
===================================================================
--- trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java   2007-01-26 22:47:54 UTC 
(rev 11623)
+++ trunk/apps/Thaw/src/thaw/fcp/FCPQueueManager.java   2007-01-27 16:35:10 UTC 
(rev 11624)
@@ -501,12 +501,12 @@
                   && !queryManager.getConnection().isConnected()) {

                        /* Only the running queue ...
-                        * pending query are specifics to Thaw
+                        * pending queries are specifics to Thaw
                         */
                        runningQueries = new Vector();

                        setChanged();
-                       this.notifyObservers();
+                       notifyObservers();
                }
        }
 }

Modified: trunk/apps/Thaw/src/thaw/i18n/thaw.properties
===================================================================
--- trunk/apps/Thaw/src/thaw/i18n/thaw.properties       2007-01-26 22:47:54 UTC 
(rev 11623)
+++ trunk/apps/Thaw/src/thaw/i18n/thaw.properties       2007-01-27 16:35:10 UTC 
(rev 11624)
@@ -87,6 +87,7 @@
 ## Status bar
 thaw.statusBar.initPlugins=Loading plugins ...
 thaw.statusBar.ready=Ready
+thaw.statusBar.disconnected=DISCONNECTED
 thaw.statusBar.connecting=Connecting ...

 ## Config

Modified: trunk/apps/Thaw/src/thaw/plugins/StatusBar.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/StatusBar.java     2007-01-26 22:47:54 UTC 
(rev 11623)
+++ trunk/apps/Thaw/src/thaw/plugins/StatusBar.java     2007-01-27 16:35:10 UTC 
(rev 11624)
@@ -49,6 +49,17 @@
        }

        public void updateStatusBar() {
+
+               if (core.isReconnecting()) {
+                       
core.getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.connecting"), 
java.awt.Color.RED);
+                       return;
+               }
+
+               if (!core.getConnectionManager().isConnected()) {
+                       
core.getMainWindow().setStatus(I18n.getMessage("thaw.statusBar.disconnected"), 
java.awt.Color.RED);
+                       return;
+               }
+
                int progressDone = 0;
                int progressTotal = 0;


Modified: trunk/apps/Thaw/src/thaw/plugins/index/AutoRefresh.java
===================================================================
--- trunk/apps/Thaw/src/thaw/plugins/index/AutoRefresh.java     2007-01-26 
22:47:54 UTC (rev 11623)
+++ trunk/apps/Thaw/src/thaw/plugins/index/AutoRefresh.java     2007-01-27 
16:35:10 UTC (rev 11624)
@@ -107,7 +107,12 @@
                        Index index;

                        index = new Index(browserPanel.getDb(),
-                                         results.getInt("id"));
+                                         results.getInt("id"),
+                                         null, results.getString("publicKey"),
+                                         results.getInt("revision"),
+                                         results.getString("privateKey"),
+                                         results.getString("displayName"),
+                                         false);

                        index.downloadFromFreenet(this, 
browserPanel.getIndexTree(), queueManager);



Reply via email to