Bug in JmeLoginUI

6 views
Skip to first unread message

Morris Ford

unread,
Sep 6, 2012, 11:15:57 AM9/6/12
to openwon...@googlegroups.com
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

jagwire

unread,
Sep 6, 2012, 11:18:46 AM9/6/12
to openwon...@googlegroups.com
Morris,

Please file a bug and submit a patch.

-jW
Reply all
Reply to author
Forward
0 new messages