1 package org
.argeo
.cms
.e4
.rcp
;
3 import java
.security
.PrivilegedExceptionAction
;
5 import javax
.security
.auth
.Subject
;
6 import javax
.security
.auth
.login
.LoginContext
;
7 import javax
.security
.auth
.login
.LoginException
;
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
;
25 public class CmsE4Application
implements IApplication
, CmsView
{
26 private LoginContext loginContext
;
27 private IApplication e4Application
;
28 private UxContext uxContext
;
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
);
39 loginContext
= new LoginContext(NodeConstants
.LOGIN_CONTEXT_USER
, subject
, loginShell
);
41 } catch (LoginException e
) {
43 loginShell
.createUi();
46 while (!loginShell
.getShell().isDisposed()) {
47 if (!display
.readAndDispatch())
51 if (CurrentUser
.getUsername(getSubject()) == null)
52 throw new CmsException("Cannot log in");
55 // CallbackHandler callbackHandler = new DefaultLoginDialog(
56 // display.getActiveShell());
57 // loginContext = new LoginContext(
58 // NodeConstants.LOGIN_CONTEXT_SINGLE_USER, subject,
60 // } catch (LoginException e1) {
61 // throw new CmsException("Cannot initialize login context", e1);
66 // loginContext.login();
67 // subject = loginContext.getSubject();
68 // } catch (LoginException e) {
69 // e.printStackTrace();
72 // Thread.sleep(2000);
73 // } catch (InterruptedException e1) {
79 uxContext
= new SimpleUxContext();
80 UiContext
.setData(CmsView
.KEY
, this);
81 e4Application
= getApplication(null);
82 Object res
= Subject
.doAs(subject
, new PrivilegedExceptionAction
<Object
>() {
85 public Object
run() throws Exception
{
86 return e4Application
.start(context
);
95 if (e4Application
!= null)
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");
103 IConfigurationElement
[] elements
= extension
.getConfigurationElements();
104 if (elements
.length
> 0) {
105 IConfigurationElement
[] runs
= elements
[0].getChildren("run");
106 if (runs
.length
> 0) {
108 runnable
= runs
[0].createExecutableExtension("class");
109 if (runnable
instanceof IApplication
)
110 return (IApplication
) runnable
;
113 } catch (Exception e
) {
114 throw new IllegalStateException("Cannot find e4 application", e
);
116 throw new IllegalStateException("Cannot find e4 application");
119 public static Display
createDisplay() {
120 Display
.setAppName("Argeo CMS RCP");
122 // create the display
123 Display newDisplay
= Display
.getCurrent();
124 if (newDisplay
== null) {
125 newDisplay
= new Display();
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));
138 public UxContext
getUxContext() {
143 public void navigateTo(String state
) {
144 // TODO Auto-generated method stub
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)
155 // this.loginContext.logout();
156 // } catch (LoginException e1) {
157 // System.err.println("Could not log out: " + e1);
159 this.loginContext
= loginContext
;
163 public void logout() {
164 if (loginContext
== null)
165 throw new CmsException("Login context should not bet null");
167 CurrentUser
.logoutCmsSession(loginContext
.getSubject());
168 loginContext
.logout();
169 } catch (LoginException e
) {
170 throw new CmsException("Cannot log out", e
);
175 public void exception(Throwable e
) {
176 // TODO Auto-generated method stub
181 public CmsImageManager
getImageManager() {
182 // TODO Auto-generated method stub
186 protected Subject
getSubject() {
187 return loginContext
.getSubject();
191 public boolean isAnonymous() {
192 return CurrentUser
.isAnonymous(getSubject());