summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx
diff options
context:
space:
mode:
authorSimon Rettberg2015-09-05 22:01:01 +0200
committerSimon Rettberg2015-09-05 22:01:01 +0200
commit84f0c4e73dcbb99a171803d164344ae7cb6d0bb1 (patch)
tree0a300d4f20b8da26bf3f73d834f5822966162ae2 /dozentenmodul/src/main/java/org/openslx
parent[client] Changed some wording (diff)
downloadtutor-module-84f0c4e73dcbb99a171803d164344ae7cb6d0bb1.tar.gz
tutor-module-84f0c4e73dcbb99a171803d164344ae7cb6d0bb1.tar.xz
tutor-module-84f0c4e73dcbb99a171803d164344ae7cb6d0bb1.zip
[client] Fully async proxy detection (no more GUI freezes)
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/App.java4
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/MainWindow.java97
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/gui/window/LoginWindow.java11
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/thrift/ThriftActions.java24
4 files changed, 95 insertions, 41 deletions
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);
}