I just found a bug in JmeLoginUI. I was doing client startups from core using ant and with user and client defined in the run properties file and connecting to a server with authentication turned on I got this exception:
Sep 6, 2012 9:52:02 AM org.jdesktop.wonderland.client.login.ServerSessionManager initPlugins
WARNING: Error initializing plugin org.jdesktop.wonderland.modules.appbase.client.AppClientPlugin
java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
at java.awt.EventQueue.invokeAndWait(EventQueue.java:1074)
at javax.swing.SwingUtilities.invokeAndWait(SwingUtilities.java:1326)
at org.jdesktop.wonderland.modules.appbase.client.cell.view.viewdefault.HeaderPanelAllocator.createHeader(HeaderPanelAllocator.java:100)
at org.jdesktop.wonderland.modules.appbase.client.cell.view.viewdefault.HeaderPanelAllocator.initialize(HeaderPanelAllocator.java:66)
at org.jdesktop.wonderland.modules.appbase.client.cell.view.viewdefault.HeaderPanelAllocator.<init>(HeaderPanelAllocator.java:58)
at org.jdesktop.wonderland.modules.appbase.client.cell.view.viewdefault.FrameHeaderSwing.staticInitialize(FrameHeaderSwing.java:127)
at org.jdesktop.wonderland.modules.appbase.client.cell.view.viewdefault.View2DCellFactoryDefault.initialize(View2DCellFactoryDefault.java:34)
at org.jdesktop.wonderland.modules.appbase.client.AppClientPlugin.initCellViewFactory(AppClientPlugin.java:88)
at org.jdesktop.wonderland.modules.appbase.client.AppClientPlugin.initAppBaseUserClient(AppClientPlugin.java:67)
at org.jdesktop.wonderland.modules.appbase.client.AppClientPlugin.initialize(AppClientPlugin.java:54)
at org.jdesktop.wonderland.client.login.ServerSessionManager.initPlugins(ServerSessionManager.java:702)
at org.jdesktop.wonderland.client.login.ServerSessionManager.access$400(ServerSessionManager.java:80)
at org.jdesktop.wonderland.client.login.ServerSessionManager$LoginControl.loginComplete(ServerSessionManager.java:850)
at org.jdesktop.wonderland.client.login.ServerSessionManager$WebServiceLoginControl.loginComplete(ServerSessionManager.java:957)
at org.jdesktop.wonderland.client.login.ServerSessionManager$WebServiceLoginControl.authenticate(ServerSessionManager.java:947)
at org.jdesktop.wonderland.client.login.ServerSessionManager$UserPasswordLoginControl.authenticate(ServerSessionManager.java:1003)
at org.jdesktop.wonderland.client.jme.login.JmeLoginUI$2.run(JmeLoginUI.java:107)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:682)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:643)
at java.awt.EventQueue$1.run(EventQueue.java:641)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:652)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
In the JmeLoginUI code two of the requestLogin methods look like this:
public void requestLogin(final NoAuthLoginControl control) {
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ enter requestLogin #1");
// see if we have properties for automatic login
String username = System.getProperty("auth.username");
String fullname = System.getProperty("auth.fullname");
if (username != null && fullname != null) {
try {
control.authenticate(username, fullname);
return;
} catch (LoginFailureException lfe) {
// error trying to login in. Fall back to
// showing a dialog
}
}
// start the login panel in the AWT event thread
SwingUtilities.invokeLater(new Runnable() {
public void run() {
LoginPanel lp = new NoAuthLoginPanel(control.getServerURL(),
control);
WonderlandLoginDialog dialog = new WonderlandLoginDialog(
parent.getFrame(), true, lp);
dialog.setLocationRelativeTo(parent.getFrame());
dialog.setVisible(true);
}
});
}
public void requestLogin(final UserPasswordLoginControl control) {
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ enter requestLogin #2");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// see if we have properties for automatic login
String username = System.getProperty("auth.username");
String password = System.getProperty("auth.password");
if (username != null && password != null) {
try {
control.authenticate(username, password);
return;
} catch (LoginFailureException lfe) {
// error trying to login in. Fall back to
// showing a dialog
}
}
LoginPanel lp = new WebServiceAuthLoginPanel(control.getServerURL(),
control);
WonderlandLoginDialog dialog = new WonderlandLoginDialog(
parent.getFrame(), true, lp);
dialog.setLocationRelativeTo(parent.getFrame());
dialog.setVisible(true);
}
});
}
Note the difference between the two methods in the location of the invokeLater code.
When changed to the following, it works as expected.
public void requestLogin(final NoAuthLoginControl control) {
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ enter requestLogin #1");
// see if we have properties for automatic login
String username = System.getProperty("auth.username");
String fullname = System.getProperty("auth.fullname");
if (username != null && fullname != null) {
try {
control.authenticate(username, fullname);
return;
} catch (LoginFailureException lfe) {
// error trying to login in. Fall back to
// showing a dialog
}
}
// start the login panel in the AWT event thread
SwingUtilities.invokeLater(new Runnable() {
public void run() {
LoginPanel lp = new NoAuthLoginPanel(control.getServerURL(),
control);
WonderlandLoginDialog dialog = new WonderlandLoginDialog(
parent.getFrame(), true, lp);
dialog.setLocationRelativeTo(parent.getFrame());
dialog.setVisible(true);
}
});
}
public void requestLogin(final UserPasswordLoginControl control) {
System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ enter requestLogin #2");
// see if we have properties for automatic login
String username = System.getProperty("auth.username");
String password = System.getProperty("auth.password");
if (username != null && password != null) {
try {
control.authenticate(username, password);
return;
} catch (LoginFailureException lfe) {
// error trying to login in. Fall back to
// showing a dialog
}
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
LoginPanel lp = new WebServiceAuthLoginPanel(control.getServerURL(),
control);
WonderlandLoginDialog dialog = new WonderlandLoginDialog(
parent.getFrame(), true, lp);
dialog.setLocationRelativeTo(parent.getFrame());
dialog.setVisible(true);
}
});
}
Morris