1 package org
.argeo
.suite
.ui
;
3 import static org
.argeo
.cms
.ui
.CmsView
.CMS_VIEW_UID_PROPERTY
;
5 import java
.util
.Collections
;
6 import java
.util
.HashMap
;
7 import java
.util
.HashSet
;
10 import java
.util
.SortedMap
;
11 import java
.util
.TreeMap
;
13 import javax
.jcr
.Node
;
14 import javax
.jcr
.RepositoryException
;
15 import javax
.jcr
.Session
;
17 import org
.apache
.commons
.logging
.Log
;
18 import org
.apache
.commons
.logging
.LogFactory
;
19 import org
.argeo
.api
.RankingKey
;
20 import org
.argeo
.cms
.ui
.AbstractCmsApp
;
21 import org
.argeo
.cms
.ui
.CmsTheme
;
22 import org
.argeo
.cms
.ui
.CmsUiProvider
;
23 import org
.argeo
.cms
.ui
.CmsView
;
24 import org
.argeo
.cms
.ui
.dialogs
.CmsFeedback
;
25 import org
.argeo
.jcr
.JcrUtils
;
26 import org
.eclipse
.swt
.SWT
;
27 import org
.eclipse
.swt
.widgets
.Composite
;
28 import org
.eclipse
.swt
.widgets
.Control
;
29 import org
.osgi
.service
.event
.Event
;
30 import org
.osgi
.service
.event
.EventHandler
;
32 /** The Argeo Suite App. */
33 public class ArgeoSuiteApp
extends AbstractCmsApp
implements EventHandler
{
34 private final static Log log
= LogFactory
.getLog(ArgeoSuiteApp
.class);
36 public final static String PID_PREFIX
= "argeo.suite.ui.";
37 public final static String HEADER_PID
= PID_PREFIX
+ "header";
38 public final static String LEAD_PANE_PID
= PID_PREFIX
+ "leadPane";
39 public final static String LOGIN_SCREEN_PID
= PID_PREFIX
+ "loginScreen";
40 public final static String DASHBOARD_PID
= PID_PREFIX
+ "dashboard";
41 public final static String RECENT_ITEMS_PID
= PID_PREFIX
+ "recentItems";
43 private final static String DEFAULT_UI_NAME
= "work";
44 private final static String DEFAULT_THEME_ID
= "org.argeo.suite.theme.default";
46 private SortedMap
<RankingKey
, CmsUiProvider
> uiProviders
= Collections
.synchronizedSortedMap(new TreeMap
<>());
48 // TODO make more optimal or via CmsSession/CmsView
49 private Map
<String
, ArgeoSuiteUi
> managedUis
= new HashMap
<>();
51 // private CmsUiProvider headerPart = null;
53 public void init(Map
<String
, String
> properties
) {
54 if (log
.isDebugEnabled())
55 log
.info("Argeo Suite App started");
58 public void destroy(Map
<String
, String
> properties
) {
59 for (ArgeoSuiteUi ui
: managedUis
.values())
62 if (log
.isDebugEnabled())
63 log
.info("Argeo Suite App stopped");
68 public Set
<String
> getUiNames() {
69 HashSet
<String
> uiNames
= new HashSet
<>();
70 uiNames
.add(DEFAULT_UI_NAME
);
75 public Composite
initUi(Composite parent
) {
76 String uiName
= parent
.getData(UI_NAME_PROPERTY
) != null ? parent
.getData(UI_NAME_PROPERTY
).toString() : null;
77 CmsView cmsView
= CmsView
.getCmsView(parent
);
78 CmsTheme theme
= getTheme(uiName
);
80 CmsTheme
.registerCmsTheme(parent
.getShell(), theme
);
81 ArgeoSuiteUi argeoSuiteUi
= new ArgeoSuiteUi(parent
, SWT
.NONE
);
82 String uid
= cmsView
.getUid();
83 managedUis
.put(uid
, argeoSuiteUi
);
84 argeoSuiteUi
.addDisposeListener((e
) -> {
85 managedUis
.remove(uid
);
86 if (log
.isDebugEnabled())
87 log
.debug("Suite UI " + uid
+ " has been disposed.");
89 refreshUi(argeoSuiteUi
, null);
94 public String
getThemeId(String uiName
) {
95 // TODO make it configurable
96 return DEFAULT_THEME_ID
;
100 public void refreshUi(Composite parent
, String state
) {
103 ArgeoSuiteUi argeoSuiteUi
= (ArgeoSuiteUi
) parent
;
104 refreshPart(findUiProvider(HEADER_PID
, context
), argeoSuiteUi
.getHeader(), context
);
105 CmsView cmsView
= CmsView
.getCmsView(parent
);
106 if (cmsView
.isAnonymous()) {
107 refreshPart(findUiProvider(LOGIN_SCREEN_PID
, context
), argeoSuiteUi
.getDefaultBody(), context
);
110 if (argeoSuiteUi
.getSession() == null)
111 argeoSuiteUi
.setSession(getRepository().login());
112 context
= argeoSuiteUi
.getSession().getRootNode();
114 } catch (RepositoryException e
) {
117 refreshPart(findUiProvider(DASHBOARD_PID
, context
), argeoSuiteUi
.getDefaultBody(), context
);
119 refreshPart(findUiProvider(LEAD_PANE_PID
, context
), argeoSuiteUi
.getLeadPane(), context
);
120 refreshPart(findUiProvider(RECENT_ITEMS_PID
, context
), argeoSuiteUi
.getEntryArea(), context
);
121 argeoSuiteUi
.layout(true, true);
122 } catch (Exception e
) {
123 CmsFeedback
.show("Unexpected exception", e
);
127 private void refreshPart(CmsUiProvider uiProvider
, Composite part
, Node context
) {
128 for (Control child
: part
.getChildren())
130 uiProvider
.createUiPart(part
, context
);
133 private CmsUiProvider
findUiProvider(String pid
, Node context
) {
135 SortedMap
<RankingKey
, CmsUiProvider
> subMap
= uiProviders
.subMap(RankingKey
.minPid(pid
),
136 RankingKey
.maxPid(pid
));
137 CmsUiProvider found
= null;
138 providers
: for (RankingKey key
: subMap
.keySet()) {
139 if (key
.getPid() == null || !key
.getPid().equals(pid
))
141 found
= subMap
.get(key
);
144 // if (uiProviders.containsKey(pid))
145 // return uiProviders.get(pid);
151 return new CmsUiProvider() {
154 public Control
createUi(Composite parent
, Node context
) throws RepositoryException
{
161 public void setState(Composite parent
, String state
) {
162 CmsView cmsView
= CmsView
.getCmsView(parent
);
163 // for the time being we systematically open a session, in order to make sure
164 // that home is initialised
165 Session session
= null;
167 if (state
!= null && state
.startsWith("/")) {
168 String path
= state
.substring(1);
170 if (path
.equals("")) {
174 int index
= path
.indexOf('/');
176 log
.error("Cannot interpret // " + state
);
177 cmsView
.navigateTo("~");
179 } else if (index
> 0) {
180 workspace
= path
.substring(0, index
);
181 path
= path
.substring(index
);
182 } else {// index<0, assuming root node
187 session
= getRepository().login(workspace
);
189 Node node
= session
.getNode(path
);
190 refreshEntityUi(node
);
192 } catch (RepositoryException e
) {
193 log
.error("Cannot load state " + state
, e
);
194 cmsView
.navigateTo("~");
196 JcrUtils
.logoutQuietly(session
);
200 private void refreshEntityUi(Node node
) {
205 * Dependency injection.
208 public void addUiProvider(CmsUiProvider uiProvider
, Map
<String
, Object
> properties
) {
209 RankingKey partKey
= new RankingKey(properties
);
210 // String servicePid = properties.get(Constants.SERVICE_PID);
211 // if (servicePid == null) {
212 // log.error("No service pid found for " + uiProvider.getClass() + ", " + properties);
214 uiProviders
.put(partKey
, uiProvider
);
215 if (log
.isDebugEnabled())
216 log
.debug("Added UI provider " + partKey
+ " to CMS app.");
221 public void removeUiProvider(CmsUiProvider uiProvider
, Map
<String
, Object
> properties
) {
222 RankingKey partKey
= new RankingKey(properties
);
223 // String servicePid = properties.get(Constants.SERVICE_PID);
224 uiProviders
.remove(partKey
);
229 public void handleEvent(Event event
) {
230 if (event
.getTopic().equals(SuiteEvent
.switchLayer
.topic())) {
231 String layer
= get(event
, SuiteEvent
.LAYER_PARAM
);
232 managedUis
.get(get(event
, CMS_VIEW_UID_PROPERTY
)).switchToLayer(layer
);
237 private static String
get(Event event
, String key
) {
238 Object value
= event
.getProperty(key
);
240 throw new IllegalArgumentException("Property " + key
+ " must be set");
241 return value
.toString();
245 // public void setHeaderPart(CmsUiProvider headerPart) {
246 // this.headerPart = headerPart;
247 // if (log.isDebugEnabled())
248 // log.debug("Header set.");