From 84f0c4e73dcbb99a171803d164344ae7cb6d0bb1 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Sat, 5 Sep 2015 22:01:01 +0200 Subject: [client] Fully async proxy detection (no more GUI freezes) --- .../src/main/java/org/openslx/dozmod/App.java | 4 + .../java/org/openslx/dozmod/gui/MainWindow.java | 97 +++++++++++++++++----- .../org/openslx/dozmod/gui/window/LoginWindow.java | 11 ++- .../org/openslx/dozmod/thrift/ThriftActions.java | 24 ++---- 4 files changed, 95 insertions(+), 41 deletions(-) (limited to 'dozentenmodul/src/main/java/org/openslx') diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/App.java b/dozentenmodul/src/main/java/org/openslx/dozmod/App.java index 36c507f2..7c127bea 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/App.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/App.java @@ -256,4 +256,8 @@ public class App { } proxyThread = null; } + + public static synchronized boolean isInitDone() { + return proxyThread == null; + } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java index 9733c4ad..c852b891 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java @@ -19,6 +19,7 @@ import java.util.concurrent.TimeUnit; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JFrame; +import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; @@ -28,6 +29,7 @@ import javax.swing.JSeparator; import org.apache.log4j.Logger; import org.apache.thrift.TException; import org.openslx.bwlp.thrift.iface.SatelliteStatus; +import org.openslx.dozmod.App; import org.openslx.dozmod.Config; import org.openslx.dozmod.filetransfer.DownloadTask; import org.openslx.dozmod.gui.Gui.GuiCallable; @@ -37,6 +39,7 @@ import org.openslx.dozmod.gui.activity.UploadPanel; import org.openslx.dozmod.gui.control.QLabel; import org.openslx.dozmod.gui.helper.CompositePage; import org.openslx.dozmod.gui.helper.DebugWindow; +import org.openslx.dozmod.gui.helper.GridManager; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.helper.UiFeedback; import org.openslx.dozmod.gui.window.ConfigWindow; @@ -186,11 +189,9 @@ public abstract class MainWindow { } }); - createMenu(); - // Set layout for the mainshell, items added to the shell should get a gridData mainContainer.setLayout(new BoxLayout(mainContainer, BoxLayout.PAGE_AXIS)); - + // Scale the ui with the font. int scale = Config.getFontScaling(); mainWindow.setMinimumSize(new Dimension(850 * scale / 100, 650 * scale / 100)); @@ -199,6 +200,7 @@ public abstract class MainWindow { registerPage(new MainMenuWindow()); registerPage(new ImageListWindow()); registerPage(new LectureListWindow()); + registerPage(new PleaseWait()); // Debug? if (System.getProperty("log") != null) { @@ -207,6 +209,7 @@ public abstract class MainWindow { win.setPreferredSize(win.getMinimumSize()); mainWindow.getContentPane().add(win, BorderLayout.PAGE_START); } + // Activity panel at the bottom (file transfer, ...) activityPanel.setLayout(new BoxLayout(activityPanel, BoxLayout.PAGE_AXIS)); activityPanel.setVisible(false); activityPanel.add(new JSeparator()); @@ -217,21 +220,54 @@ public abstract class MainWindow { mainWindow.setLocationRelativeTo(null); mainWindow.setVisible(true); - // now try to init the session with the saved configuration (by giving it null as 2nd param) - if (!ThriftActions.initSession(mainWindow, null)) { - // session resume failed, so do the normal login procedure + if (Config.getSavedSession() == null) { LoginWindow.open(mainWindow); + initWindow(); + } else { + if (!App.isInitDone()) { + showPage(PleaseWait.class); + } + QuickTimer.scheduleOnce(new Task() { + @Override + public void fire() { + App.waitForInit(); + // now try to init the session with the saved configuration (by giving it null) + if (ThriftActions.initSession(null)) { + initWindow(); + } else { + // session resume failed, so do the normal login procedure + Gui.asyncExec(new Runnable() { + @Override + public void run() { + LoginWindow.open(mainWindow); + initWindow(); + } + }); + } + } + }); } + } - if (DisclaimerWindow.shouldBeShown()) { - DisclaimerWindow.open(mainWindow); - } + private static boolean initOnce = false; - mainWindow.setTitle("bwSuite - " + Session.getFirstName() + " " + Session.getLastName() + " [" - + Session.getSatelliteAddress() + "]"); + private static void initWindow() { + if (initOnce || !App.isInitDone()) + return; + initOnce = true; + // Sanity check: This should only happen once the user is logged in, if we don't have + // a session, just bail out completely + if (Session.getSatelliteToken() == null) + System.exit(42); // Show main menu by default showPage(MainMenuWindow.class); + createMenu(); + mainWindow.setTitle("bwSuite - " + Session.getFirstName() + " " + Session.getLastName() + " [" + + Session.getSatelliteAddress() + "]"); + if (DisclaimerWindow.shouldBeShown()) { + DisclaimerWindow.open(mainWindow); + } } /** @@ -306,6 +342,16 @@ public abstract class MainWindow { JMenuBar menuBar = new JMenuBar(); mainWindow.setJMenuBar(menuBar); + JMenu cascadeSessionMenu = new JMenu("Sitzung"); + menuBar.add(cascadeSessionMenu); + JMenuItem configItem = new JMenuItem("Einstellungen"); + cascadeSessionMenu.add(configItem); + cascadeSessionMenu.addSeparator(); + JMenuItem logoutItem = new JMenuItem("Abmelden und beenden"); + cascadeSessionMenu.add(logoutItem); + JMenuItem exitItem = new JMenuItem("Beenden"); + cascadeSessionMenu.add(exitItem); + JMenu cascadeViewMenu = new JMenu("Ansicht"); menuBar.add(cascadeViewMenu); JMenuItem homeItem = new JMenuItem("Startseite"); @@ -314,15 +360,6 @@ public abstract class MainWindow { cascadeViewMenu.add(imagesItem); JMenuItem lecturesItem = new JMenuItem("Veranstaltungen"); cascadeViewMenu.add(lecturesItem); - - JMenu cascadeSessionMenu = new JMenu("Sitzung"); - menuBar.add(cascadeSessionMenu); - JMenuItem configItem = new JMenuItem("Einstellungen"); - cascadeSessionMenu.add(configItem); - JMenuItem logoutItem = new JMenuItem("Abmelden"); - cascadeSessionMenu.add(logoutItem); - JMenuItem exitItem = new JMenuItem("Beenden"); - cascadeSessionMenu.add(exitItem); // the About menu button JMenu cascadeAboutMenu = new JMenu("Über"); @@ -458,5 +495,25 @@ public abstract class MainWindow { } }, 10, 2001); } + + @SuppressWarnings("serial") + private static class PleaseWait extends CompositePage { + public PleaseWait() { + GridManager grid = new GridManager(this, 3); + grid.add(Box.createHorizontalGlue()).expand(true, true); + grid.add(new JLabel("Bitte warten, suche Proxy-Konfiguration...")).expand(false, true).fill(true, true); + grid.add(Box.createHorizontalGlue()).expand(true, true); + grid.finish(false); + } + + @Override + public boolean requestHide() { + return true; + } + + @Override + public void requestShow() { + } + } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java index 8351ab89..c0c68b55 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java @@ -15,7 +15,6 @@ import java.util.List; import javax.swing.DefaultComboBoxModel; import javax.swing.JFrame; -import javax.swing.JOptionPane; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.Organization; @@ -50,7 +49,6 @@ public class LoginWindow extends LoginWindowLayout { private final static Logger LOGGER = Logger.getLogger(LoginWindow.class); - // TODO This has nothing to to with the layout public static enum LoginType { ECP(0), TEST_ACCOUNT(1), @@ -161,7 +159,7 @@ public class LoginWindow extends LoginWindowLayout { public void keyReleased(KeyEvent e) { super.keyReleased(e); if (e.getKeyCode() == KeyEvent.VK_ENTER) { - doLogin(); + loginButton.doClick(); } } }; @@ -232,8 +230,8 @@ public class LoginWindow extends LoginWindowLayout { private void doLogin() { // sanity check on loginType. if (loginType == null) { - Gui.showMessageBox(this, "Bitte wählen Sie eine Authentifizierungsart.", - MessageType.ERROR, LOGGER, null); + Gui.showMessageBox(this, "Bitte wählen Sie eine Authentifizierungsart.", MessageType.ERROR, + LOGGER, null); return; } if (loginType == LoginType.ECP && idpCombo.getSelectedIndex() == -1) { @@ -313,6 +311,7 @@ public class LoginWindow extends LoginWindowLayout { } // Excute login + App.waitForInit(); try { authenticator.login(username, password, authenticatorCallback); } catch (Exception e) { @@ -329,7 +328,7 @@ public class LoginWindow extends LoginWindowLayout { private void postSuccessfulLogin(AuthenticationData data) { LOGGER.info(loginType.toString() + " succeeded, token " + data.satelliteToken); // now try to init the session with the data received - if (ThriftActions.initSession(JOptionPane.getFrameForComponent(this), data)) { + if (ThriftActions.initSession(data)) { if (saveUsernameCheck.isSelected()) { Config.saveCurrentSession(Session.getSatelliteAddress(), Session.getSatelliteToken(), Session.getMasterToken()); diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java b/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java index 29a977d4..7d38cf84 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java @@ -76,7 +76,7 @@ public class ThriftActions { * null if trying to resume a saved sessions * @return true if initializing the session worked, false otherwise */ - public static boolean initSession(final Frame frame, AuthenticationData data) { + public static boolean initSession(AuthenticationData data) { Client client = null; WhoamiInfo whoami = null; String address = null; @@ -85,15 +85,11 @@ public class ThriftActions { if (data == null) { // in session resume SavedSession session = Config.getSavedSession(); - if (session != null) { - address = session.address; - satToken = session.token; - masterToken = session.masterToken; - - } else { - // fail + if (session == null) return false; - } + address = session.address; + satToken = session.token; + masterToken = session.masterToken; } else { // after login // TODO sat adress selection popup!! @@ -117,7 +113,7 @@ public class ThriftActions { } if (remoteVersion != Version.VERSION) { if (data != null) { - Gui.showMessageBox(frame, + Gui.asyncMessageBox( "Das von Ihnen verwendete Dozentenmodul ist nicht mit dem Satelliten-Server kompatibel.\n" + "Ihre Version: " + Version.VERSION + "\n" + "Satelliten-Version: " + remoteVersion, MessageType.ERROR, LOGGER, null); @@ -129,7 +125,7 @@ public class ThriftActions { whoami = client.whoami(satToken); } catch (TAuthorizationException e) { if (data != null) { - Gui.showMessageBox(frame, + Gui.asyncMessageBox( "Authentifizierung erfolgreich, der Satellit verweigert jedoch die Verbindung.\n\n" + "Grund: " + e.number.toString() + " (" + e.message + ")", MessageType.ERROR, null, null); @@ -137,16 +133,14 @@ public class ThriftActions { return false; } catch (TInvocationException e) { if (data != null) { - Gui.showMessageBox( - frame, + Gui.asyncMessageBox( "Authentifizierung erfolgreich, bei der Kommunikation mit dem Satelliten trat jedoch ein interner Server-Fehler auf.", MessageType.ERROR, LOGGER, e); } return false; } catch (Exception e) { if (data != null) { - Gui.showMessageBox( - frame, + Gui.asyncMessageBox( "Authentifizierung erfolgreich, aber der Satellit akzeptiert das Sitzungstoken nicht.", MessageType.ERROR, LOGGER, e); } -- cgit v1.2.3-55-g7522