1 package org
.argeo
.cms
.ui
.rcp
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStream
;
5 import java
.security
.PrivilegedAction
;
6 import java
.util
.HashMap
;
10 import javax
.security
.auth
.Subject
;
11 import javax
.security
.auth
.login
.LoginContext
;
12 import javax
.security
.auth
.login
.LoginException
;
14 import org
.apache
.commons
.logging
.Log
;
15 import org
.apache
.commons
.logging
.LogFactory
;
16 import org
.argeo
.api
.NodeConstants
;
17 import org
.argeo
.cms
.ui
.CmsApp
;
18 import org
.argeo
.cms
.ui
.CmsImageManager
;
19 import org
.argeo
.cms
.ui
.CmsTheme
;
20 import org
.argeo
.cms
.ui
.CmsView
;
21 import org
.argeo
.cms
.ui
.UxContext
;
22 import org
.argeo
.cms
.ui
.util
.CmsUiUtils
;
23 import org
.eclipse
.e4
.ui
.css
.core
.engine
.CSSEngine
;
24 import org
.eclipse
.e4
.ui
.css
.core
.engine
.CSSErrorHandler
;
25 import org
.eclipse
.e4
.ui
.css
.swt
.engine
.CSSSWTEngineImpl
;
26 import org
.eclipse
.swt
.layout
.GridLayout
;
27 import org
.eclipse
.swt
.widgets
.Composite
;
28 import org
.eclipse
.swt
.widgets
.Display
;
29 import org
.eclipse
.swt
.widgets
.Shell
;
30 import org
.osgi
.service
.event
.Event
;
31 import org
.osgi
.service
.event
.EventAdmin
;
33 /** Runs a {@link CmsApp} as an SWT desktop application. */
34 @SuppressWarnings("restriction")
35 public class CmsRcpApp
implements CmsView
{
36 private final static Log log
= LogFactory
.getLog(CmsRcpApp
.class);
38 private Display display
;
40 private CmsApp cmsApp
;
41 private CmsUiThread uiThread
;
45 private LoginContext loginContext
;
47 private EventAdmin eventAdmin
;
49 private CSSEngine cssEngine
;
52 uid
= UUID
.randomUUID().toString();
55 public void init(Map
<String
, String
> properties
) {
58 } catch (InterruptedException e
) {
61 uiThread
= new CmsUiThread();
66 public void destroy(Map
<String
, String
> properties
) {
67 if (!shell
.isDisposed())
71 } catch (InterruptedException e
) {
78 class CmsUiThread
extends Thread
{
80 public CmsUiThread() {
86 display
= new Display();
87 shell
= new Shell(display
);
88 shell
.setText("Argeo CMS");
89 Composite parent
= shell
;
90 parent
.setLayout(new GridLayout());
91 CmsView
.registerCmsView(shell
, CmsRcpApp
.this);
93 // Subject subject = new Subject();
94 // CmsLoginShell loginShell = new CmsLoginShell(CmsRcpApp.this);
95 // loginShell.setSubject(subject);
98 // loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject, loginShell);
99 loginContext
= new LoginContext(NodeConstants
.LOGIN_CONTEXT_SINGLE_USER
);
100 loginContext
.login();
101 } catch (LoginException e
) {
102 throw new IllegalStateException("Could not log in.", e
);
103 // loginShell.createUi();
104 // loginShell.open();
106 // while (!loginShell.getShell().isDisposed()) {
107 // if (!display.readAndDispatch())
112 Subject
.doAs(loginContext
.getSubject(), (PrivilegedAction
<Void
>) () -> {
113 Composite ui
= cmsApp
.initUi(parent
);
114 // ui.setData(CmsApp.UI_NAME_PROPERTY, uiName);
115 ui
.setLayoutData(CmsUiUtils
.fillAll());
118 CmsTheme theme
= CmsTheme
.getCmsTheme(ui
);
120 cssEngine
= new CSSSWTEngineImpl(display
);
121 for (String path
: theme
.getSwtCssPaths()) {
122 try (InputStream in
= theme
.loadPath(path
)) {
123 cssEngine
.parseStyleSheet(in
);
124 } catch (IOException e
) {
125 throw new IllegalStateException("Cannot load stylesheet " + path
, e
);
128 cssEngine
.setErrorHandler(new CSSErrorHandler() {
129 public void error(Exception e
) {
130 log
.error("SWT styling error: ", e
);
135 shell
.layout(true, true);
138 while (!shell
.isDisposed()) {
139 if (!display
.readAndDispatch())
154 public String
getUid() {
159 public UxContext
getUxContext() {
160 throw new UnsupportedOperationException();
164 public void navigateTo(String state
) {
165 throw new UnsupportedOperationException();
169 public void authChange(LoginContext loginContext
) {
173 public void logout() {
174 if (loginContext
!= null)
176 loginContext
.logout();
177 } catch (LoginException e
) {
178 log
.error("Cannot log out", e
);
183 public void exception(Throwable e
) {
184 log
.error("Unexpected exception in CMS RCP", e
);
188 public CmsImageManager
getImageManager() {
189 throw new UnsupportedOperationException();
193 public boolean isAnonymous() {
198 public void applyStyles(Object node
) {
199 if (cssEngine
!= null)
200 cssEngine
.applyStyles(node
, true);
204 public void sendEvent(String topic
, Map
<String
, Object
> properties
) {
205 if (properties
== null)
206 properties
= new HashMap
<>();
207 if (properties
.containsKey(CMS_VIEW_UID_PROPERTY
) && !properties
.get(CMS_VIEW_UID_PROPERTY
).equals(uid
))
208 throw new IllegalArgumentException("Property " + CMS_VIEW_UID_PROPERTY
+ " is set to another CMS view uid ("
209 + properties
.get(CMS_VIEW_UID_PROPERTY
) + ") then " + uid
);
210 properties
.put(CMS_VIEW_UID_PROPERTY
, uid
);
211 eventAdmin
.sendEvent(new Event(topic
, properties
));
214 public <T
> T
doAs(PrivilegedAction
<T
> action
) {
215 return Subject
.doAs(getSubject(), action
);
218 protected Subject
getSubject() {
219 return loginContext
.getSubject();
223 * DEPENDENCY INJECTION
225 public void setCmsApp(CmsApp cmsApp
) {
226 this.cmsApp
= cmsApp
;
229 public void setEventAdmin(EventAdmin eventAdmin
) {
230 this.eventAdmin
= eventAdmin
;