]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java
Prepare release.
[lgpl/argeo-commons.git] / org.argeo.cms.e4.rap / src / org / argeo / cms / e4 / rap / CmsLoginLifecycle.java
1 package org.argeo.cms.e4.rap;
2
3 import java.security.AccessController;
4
5 import javax.security.auth.Subject;
6 import javax.security.auth.login.LoginContext;
7 import javax.security.auth.login.LoginException;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11 import org.argeo.cms.CmsException;
12 import org.argeo.cms.auth.CurrentUser;
13 import org.argeo.cms.ui.CmsImageManager;
14 import org.argeo.cms.ui.CmsView;
15 import org.argeo.cms.ui.UxContext;
16 import org.argeo.cms.ui.dialogs.CmsFeedback;
17 import org.argeo.cms.util.SimpleImageManager;
18 import org.argeo.cms.util.SimpleUxContext;
19 import org.argeo.cms.widgets.auth.CmsLoginShell;
20 import org.argeo.eclipse.ui.specific.UiContext;
21 import org.argeo.node.NodeConstants;
22 import org.eclipse.e4.core.services.events.IEventBroker;
23 import org.eclipse.e4.ui.workbench.UIEvents;
24 import org.eclipse.e4.ui.workbench.lifecycle.PostContextCreate;
25 import org.eclipse.e4.ui.workbench.lifecycle.PreSave;
26 import org.eclipse.rap.rwt.RWT;
27 import org.eclipse.rap.rwt.client.service.BrowserNavigation;
28 import org.eclipse.rap.rwt.client.service.BrowserNavigationEvent;
29 import org.eclipse.rap.rwt.client.service.BrowserNavigationListener;
30 import org.eclipse.swt.widgets.Display;
31 import org.osgi.service.event.Event;
32 import org.osgi.service.event.EventHandler;
33
34 @SuppressWarnings("restriction")
35 public class CmsLoginLifecycle implements CmsView {
36 private final static Log log = LogFactory.getLog(CmsLoginLifecycle.class);
37
38 private UxContext uxContext;
39 private CmsImageManager imageManager;
40
41 private LoginContext loginContext;
42 private BrowserNavigation browserNavigation;
43
44 private String state = null;
45
46 @PostContextCreate
47 boolean login(final IEventBroker eventBroker) {
48 browserNavigation = RWT.getClient().getService(BrowserNavigation.class);
49 if (browserNavigation != null)
50 browserNavigation.addBrowserNavigationListener(new BrowserNavigationListener() {
51 private static final long serialVersionUID = -3668136623771902865L;
52
53 @Override
54 public void navigated(BrowserNavigationEvent event) {
55 state = event.getState();
56 if (uxContext != null)// is logged in
57 stateChanged();
58 }
59 });
60
61 Subject subject = Subject.getSubject(AccessController.getContext());
62 Display display = Display.getCurrent();
63 UiContext.setData(CmsView.KEY, this);
64 CmsLoginShell loginShell = new CmsLoginShell(this);
65 loginShell.setSubject(subject);
66 try {
67 // try pre-auth
68 loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject, loginShell);
69 loginContext.login();
70 } catch (LoginException e) {
71 loginShell.createUi();
72 loginShell.open();
73
74 while (!loginShell.getShell().isDisposed()) {
75 if (!display.readAndDispatch())
76 display.sleep();
77 }
78 }
79 if (CurrentUser.getUsername(getSubject()) == null)
80 return false;
81 uxContext = new SimpleUxContext();
82 imageManager = new SimpleImageManager();
83
84 eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, new EventHandler() {
85 @Override
86 public void handleEvent(Event event) {
87 startupComplete();
88 eventBroker.unsubscribe(this);
89 }
90 });
91
92 // lcs.changeApplicationLocale(Locale.FRENCH);
93 return true;
94 }
95
96 @PreSave
97 void destroy() {
98 // logout();
99 }
100
101 @Override
102 public UxContext getUxContext() {
103 return uxContext;
104 }
105
106 @Override
107 public void navigateTo(String state) {
108 browserNavigation.pushState(state, state);
109 }
110
111 @Override
112 public void authChange(LoginContext loginContext) {
113 if (loginContext == null)
114 throw new CmsException("Login context cannot be null");
115 // logout previous login context
116 // if (this.loginContext != null)
117 // try {
118 // this.loginContext.logout();
119 // } catch (LoginException e1) {
120 // System.err.println("Could not log out: " + e1);
121 // }
122 this.loginContext = loginContext;
123 }
124
125 @Override
126 public void logout() {
127 if (loginContext == null)
128 throw new CmsException("Login context should not be null");
129 try {
130 CurrentUser.logoutCmsSession(loginContext.getSubject());
131 loginContext.logout();
132 } catch (LoginException e) {
133 throw new CmsException("Cannot log out", e);
134 }
135 }
136
137 @Override
138 public void exception(Throwable e) {
139 String msg = "Unexpected exception in Eclipse 4 RAP";
140 log.error(msg, e);
141 CmsFeedback.show(msg, e);
142 }
143
144 @Override
145 public CmsImageManager getImageManager() {
146 return imageManager;
147 }
148
149 protected Subject getSubject() {
150 return loginContext.getSubject();
151 }
152
153 @Override
154 public boolean isAnonymous() {
155 return CurrentUser.isAnonymous(getSubject());
156 }
157
158 // CALLBACKS
159 protected void startupComplete() {
160 }
161
162 protected void stateChanged() {
163
164 }
165
166 // GETTERS
167 protected BrowserNavigation getBrowserNavigation() {
168 return browserNavigation;
169 }
170
171 protected String getState() {
172 return state;
173 }
174
175 }