Implementing Login in RCP Applications

Recently, the eclipsepowered discussion mailing list has been talking about how to implement login in an Eclipse RCP application. In the discussion, I described two major use cases:

 1. RCP is a standard framework for deploying corporate applications.
    Logging into RCP implies logging into all of your corporate
    applications.
 2. RCP is a container for many applications, some of which require a
    login.

Olivier Crameri [olivier.crameri <at> netoxygen.ch] then proposed an elegant solution to use case #1: implement your login in your RCP application's IPlatformRunnable class, after initializing the SWT Display object, but before running PlatformUI.createAndRunWorkbench.

Here's his solution with a few modifications by myself:

The IPlatformRunnable class looks something like the following:

    public class Client implements IPlatformRunnable {
 
        private static RootRMIInterface serverConnection = null;
 
        public static getDefaultConnection() {
            return serverConnection;
        }
 
        public Object run(Object args) {
            WorkbenchAdvisor workbenchAdvisor = new ClientWorkbenchAdvisor();
            Display display = PlatformUI.createDisplay();
 
            if (authenticate(display)) {
                int returnCode = PlatformUI.createAndRunWorkbench(display,
                                            workbenchAdvisor); 
 
                if (returnCode == PlatformUI.RETURN_RESTART) {
                    return IPlatformRunnable.EXIT_RESTART;
                } else {
                    return IPlatformRunnable.EXIT_OK;
                } 
 
            } else
                return IPlatformRunnable.EXIT_OK;
        } 
 
        private boolean authenticate(Display display) {
            Shell shell = new Shell(display);
            LoginDialog loginDialog = new LoginDialog(shell);
            loginDialog.setBlockOnOpen(true);
            loginDialog.open();
    	Client.serverConnection = loginDialog.serverConnection;
            return loginDialog.isAuthenticated;
        } 
 
    }

The LoginDialog object performs the following functions:

After the login dialog authenticates the user, the main Clientclass then retrieves the RMI stub and makes it available to all other classes in the application via the Singleton pattern.

~~LINKBACK~~ ~~DISCUSSION:closed~~