Rename packages in order to make future stable documentation clearer.
[lgpl/argeo-commons.git] / org.argeo.cms.e4.rap / src / org / argeo / cms / e4 / rap / CmsLoginLifecycle.java
index 6872906260209d51588a0c4833e721ccb2795aa1..f7a1ed667c8aee878928f453d6ffe5da4fd84024 100644 (file)
@@ -6,26 +6,61 @@ import javax.security.auth.Subject;
 import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.api.NodeConstants;
 import org.argeo.cms.CmsException;
 import org.argeo.cms.auth.CurrentUser;
 import org.argeo.cms.ui.CmsImageManager;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.UxContext;
-import org.argeo.cms.util.SimpleUxContext;
-import org.argeo.cms.widgets.auth.CmsLoginShell;
-import org.argeo.node.NodeConstants;
+import org.argeo.cms.ui.dialogs.CmsFeedback;
+import org.argeo.cms.ui.util.SimpleImageManager;
+import org.argeo.cms.ui.util.SimpleUxContext;
+import org.argeo.cms.ui.widgets.auth.CmsLoginShell;
+import org.argeo.eclipse.ui.specific.UiContext;
+import org.eclipse.e4.core.services.events.IEventBroker;
+import org.eclipse.e4.ui.workbench.UIEvents;
 import org.eclipse.e4.ui.workbench.lifecycle.PostContextCreate;
+import org.eclipse.e4.ui.workbench.lifecycle.PreSave;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.client.service.BrowserNavigation;
+import org.eclipse.rap.rwt.client.service.BrowserNavigationEvent;
+import org.eclipse.rap.rwt.client.service.BrowserNavigationListener;
 import org.eclipse.swt.widgets.Display;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
 
 @SuppressWarnings("restriction")
 public class CmsLoginLifecycle implements CmsView {
+       private final static Log log = LogFactory.getLog(CmsLoginLifecycle.class);
+
        private UxContext uxContext;
+       private CmsImageManager imageManager;
+
        private LoginContext loginContext;
+       private BrowserNavigation browserNavigation;
+
+       private String state = null;
 
        @PostContextCreate
-       boolean login(Display d) {
+       boolean login(final IEventBroker eventBroker) {
+               browserNavigation = RWT.getClient().getService(BrowserNavigation.class);
+               if (browserNavigation != null)
+                       browserNavigation.addBrowserNavigationListener(new BrowserNavigationListener() {
+                               private static final long serialVersionUID = -3668136623771902865L;
+
+                               @Override
+                               public void navigated(BrowserNavigationEvent event) {
+                                       state = event.getState();
+                                       if (uxContext != null)// is logged in
+                                               stateChanged();
+                               }
+                       });
+
                Subject subject = Subject.getSubject(AccessController.getContext());
                Display display = Display.getCurrent();
+               UiContext.setData(CmsView.KEY, this);
                CmsLoginShell loginShell = new CmsLoginShell(this);
                loginShell.setSubject(subject);
                try {
@@ -44,9 +79,25 @@ public class CmsLoginLifecycle implements CmsView {
                if (CurrentUser.getUsername(getSubject()) == null)
                        return false;
                uxContext = new SimpleUxContext();
+               imageManager = new SimpleImageManager();
+
+               eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, new EventHandler() {
+                       @Override
+                       public void handleEvent(Event event) {
+                               startupComplete();
+                               eventBroker.unsubscribe(this);
+                       }
+               });
+
+               // lcs.changeApplicationLocale(Locale.FRENCH);
                return true;
        }
 
+       @PreSave
+       void destroy() {
+               // logout();
+       }
+
        @Override
        public UxContext getUxContext() {
                return uxContext;
@@ -54,8 +105,7 @@ public class CmsLoginLifecycle implements CmsView {
 
        @Override
        public void navigateTo(String state) {
-               // TODO Auto-generated method stub
-
+               browserNavigation.pushState(state, state);
        }
 
        @Override
@@ -63,19 +113,19 @@ public class CmsLoginLifecycle implements CmsView {
                if (loginContext == null)
                        throw new CmsException("Login context cannot be null");
                // logout previous login context
-//             if (this.loginContext != null)
-//                     try {
-//                             this.loginContext.logout();
-//                     } catch (LoginException e1) {
-//                             System.err.println("Could not log out: " + e1);
-//                     }
+               // if (this.loginContext != null)
+               // try {
+               // this.loginContext.logout();
+               // } catch (LoginException e1) {
+               // System.err.println("Could not log out: " + e1);
+               // }
                this.loginContext = loginContext;
        }
 
        @Override
        public void logout() {
                if (loginContext == null)
-                       throw new CmsException("Login context should not bet null");
+                       throw new CmsException("Login context should not be null");
                try {
                        CurrentUser.logoutCmsSession(loginContext.getSubject());
                        loginContext.logout();
@@ -86,14 +136,14 @@ public class CmsLoginLifecycle implements CmsView {
 
        @Override
        public void exception(Throwable e) {
-               // TODO Auto-generated method stub
-
+               String msg = "Unexpected exception in Eclipse 4 RAP";
+               log.error(msg, e);
+               CmsFeedback.show(msg, e);
        }
 
        @Override
        public CmsImageManager getImageManager() {
-               // TODO Auto-generated method stub
-               return null;
+               return imageManager;
        }
 
        protected Subject getSubject() {
@@ -105,4 +155,21 @@ public class CmsLoginLifecycle implements CmsView {
                return CurrentUser.isAnonymous(getSubject());
        }
 
+       // CALLBACKS
+       protected void startupComplete() {
+       }
+
+       protected void stateChanged() {
+
+       }
+
+       // GETTERS
+       protected BrowserNavigation getBrowserNavigation() {
+               return browserNavigation;
+       }
+
+       protected String getState() {
+               return state;
+       }
+
 }