]> git.argeo.org Git - gpl/argeo-slc.git/blob - rcp/org.argeo.cms.e4.rcp/src/org/argeo/cms/e4/rcp/CmsE4Application.java
489c39492b22d19238db5461c868e608015656a9
[gpl/argeo-slc.git] / rcp / org.argeo.cms.e4.rcp / src / org / argeo / cms / e4 / rcp / CmsE4Application.java
1 package org.argeo.cms.e4.rcp;
2
3 import java.security.PrivilegedExceptionAction;
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.argeo.api.NodeConstants;
10 import org.argeo.cms.CmsException;
11 import org.argeo.cms.auth.CurrentUser;
12 import org.argeo.cms.ui.CmsImageManager;
13 import org.argeo.cms.ui.CmsView;
14 import org.argeo.cms.ui.UxContext;
15 import org.argeo.cms.ui.util.SimpleUxContext;
16 import org.argeo.cms.ui.widgets.auth.CmsLoginShell;
17 import org.argeo.eclipse.ui.specific.UiContext;
18 import org.eclipse.core.runtime.IConfigurationElement;
19 import org.eclipse.core.runtime.IExtension;
20 import org.eclipse.core.runtime.Platform;
21 import org.eclipse.equinox.app.IApplication;
22 import org.eclipse.equinox.app.IApplicationContext;
23 import org.eclipse.swt.widgets.Display;
24
25 public class CmsE4Application implements IApplication, CmsView {
26 private LoginContext loginContext;
27 private IApplication e4Application;
28 private UxContext uxContext;
29
30 @Override
31 public Object start(IApplicationContext context) throws Exception {
32 Subject subject = new Subject();
33 Display display = createDisplay();
34 CmsLoginShell loginShell = new CmsLoginShell(this);
35 // TODO customize CmsLoginShell to be smaller and centered
36 loginShell.setSubject(subject);
37 try {
38 // try pre-auth
39 loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject, loginShell);
40 loginContext.login();
41 } catch (LoginException e) {
42 e.printStackTrace();
43 loginShell.createUi();
44 loginShell.open();
45
46 while (!loginShell.getShell().isDisposed()) {
47 if (!display.readAndDispatch())
48 display.sleep();
49 }
50 }
51 if (CurrentUser.getUsername(getSubject()) == null)
52 throw new CmsException("Cannot log in");
53
54 // try {
55 // CallbackHandler callbackHandler = new DefaultLoginDialog(
56 // display.getActiveShell());
57 // loginContext = new LoginContext(
58 // NodeConstants.LOGIN_CONTEXT_SINGLE_USER, subject,
59 // callbackHandler);
60 // } catch (LoginException e1) {
61 // throw new CmsException("Cannot initialize login context", e1);
62 // }
63 //
64 // // login
65 // try {
66 // loginContext.login();
67 // subject = loginContext.getSubject();
68 // } catch (LoginException e) {
69 // e.printStackTrace();
70 // display.dispose();
71 // try {
72 // Thread.sleep(2000);
73 // } catch (InterruptedException e1) {
74 // // silent
75 // }
76 // return null;
77 // }
78
79 uxContext = new SimpleUxContext();
80 UiContext.setData(CmsView.KEY, this);
81 e4Application = getApplication(null);
82 Object res = Subject.doAs(subject, new PrivilegedExceptionAction<Object>() {
83
84 @Override
85 public Object run() throws Exception {
86 return e4Application.start(context);
87 }
88
89 });
90 return res;
91 }
92
93 @Override
94 public void stop() {
95 if (e4Application != null)
96 e4Application.stop();
97 }
98
99 static IApplication getApplication(String[] args) {
100 IExtension extension = Platform.getExtensionRegistry().getExtension(Platform.PI_RUNTIME,
101 Platform.PT_APPLICATIONS, "org.eclipse.e4.ui.workbench.swt.E4Application");
102 try {
103 IConfigurationElement[] elements = extension.getConfigurationElements();
104 if (elements.length > 0) {
105 IConfigurationElement[] runs = elements[0].getChildren("run");
106 if (runs.length > 0) {
107 Object runnable;
108 runnable = runs[0].createExecutableExtension("class");
109 if (runnable instanceof IApplication)
110 return (IApplication) runnable;
111 }
112 }
113 } catch (Exception e) {
114 throw new IllegalStateException("Cannot find e4 application", e);
115 }
116 throw new IllegalStateException("Cannot find e4 application");
117 }
118
119 public static Display createDisplay() {
120 Display.setAppName("Argeo CMS RCP");
121
122 // create the display
123 Display newDisplay = Display.getCurrent();
124 if (newDisplay == null) {
125 newDisplay = new Display();
126 }
127 // Set the priority higher than normal so as to be higher
128 // than the JobManager.
129 Thread.currentThread().setPriority(Math.min(Thread.MAX_PRIORITY, Thread.NORM_PRIORITY + 1));
130 return newDisplay;
131 }
132
133 //
134 // CMS VIEW
135 //
136
137 @Override
138 public UxContext getUxContext() {
139 return uxContext;
140 }
141
142 @Override
143 public void navigateTo(String state) {
144 // TODO Auto-generated method stub
145
146 }
147
148 @Override
149 public void authChange(LoginContext loginContext) {
150 if (loginContext == null)
151 throw new CmsException("Login context cannot be null");
152 // logout previous login context
153 // if (this.loginContext != null)
154 // try {
155 // this.loginContext.logout();
156 // } catch (LoginException e1) {
157 // System.err.println("Could not log out: " + e1);
158 // }
159 this.loginContext = loginContext;
160 }
161
162 @Override
163 public void logout() {
164 if (loginContext == null)
165 throw new CmsException("Login context should not bet null");
166 try {
167 CurrentUser.logoutCmsSession(loginContext.getSubject());
168 loginContext.logout();
169 } catch (LoginException e) {
170 throw new CmsException("Cannot log out", e);
171 }
172 }
173
174 @Override
175 public void exception(Throwable e) {
176 // TODO Auto-generated method stub
177
178 }
179
180 @Override
181 public CmsImageManager getImageManager() {
182 // TODO Auto-generated method stub
183 return null;
184 }
185
186 protected Subject getSubject() {
187 return loginContext.getSubject();
188 }
189
190 @Override
191 public boolean isAnonymous() {
192 return CurrentUser.isAnonymous(getSubject());
193 }
194
195 }