]> git.argeo.org Git - gpl/argeo-suite.git/blob - ArgeoSuiteApp.java
3f1a8cebbc8bbf4eb1b362e518b58918292854fe
[gpl/argeo-suite.git] / ArgeoSuiteApp.java
1 package org.argeo.suite.ui;
2
3 import static org.argeo.cms.ui.CmsView.CMS_VIEW_UID_PROPERTY;
4
5 import java.util.Collections;
6 import java.util.HashMap;
7 import java.util.HashSet;
8 import java.util.Map;
9 import java.util.Set;
10 import java.util.SortedMap;
11 import java.util.TreeMap;
12
13 import javax.jcr.Node;
14 import javax.jcr.RepositoryException;
15 import javax.jcr.Session;
16
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;
31
32 /** The Argeo Suite App. */
33 public class ArgeoSuiteApp extends AbstractCmsApp implements EventHandler {
34 private final static Log log = LogFactory.getLog(ArgeoSuiteApp.class);
35
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";
42
43 private final static String DEFAULT_UI_NAME = "work";
44 private final static String DEFAULT_THEME_ID = "org.argeo.suite.theme.default";
45
46 private SortedMap<RankingKey, CmsUiProvider> uiProviders = Collections.synchronizedSortedMap(new TreeMap<>());
47
48 // TODO make more optimal or via CmsSession/CmsView
49 private Map<String, ArgeoSuiteUi> managedUis = new HashMap<>();
50
51 // private CmsUiProvider headerPart = null;
52
53 public void init(Map<String, String> properties) {
54 if (log.isDebugEnabled())
55 log.info("Argeo Suite App started");
56 }
57
58 public void destroy(Map<String, String> properties) {
59 for (ArgeoSuiteUi ui : managedUis.values())
60 if (!ui.isDisposed())
61 ui.dispose();
62 if (log.isDebugEnabled())
63 log.info("Argeo Suite App stopped");
64
65 }
66
67 @Override
68 public Set<String> getUiNames() {
69 HashSet<String> uiNames = new HashSet<>();
70 uiNames.add(DEFAULT_UI_NAME);
71 return uiNames;
72 }
73
74 @Override
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);
79 if (theme != null)
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.");
88 });
89 refreshUi(argeoSuiteUi, null);
90 return argeoSuiteUi;
91 }
92
93 @Override
94 public String getThemeId(String uiName) {
95 // TODO make it configurable
96 return DEFAULT_THEME_ID;
97 }
98
99 @Override
100 public void refreshUi(Composite parent, String state) {
101 try {
102 Node context = null;
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);
108 } else {
109 try {
110 if (argeoSuiteUi.getSession() == null)
111 argeoSuiteUi.setSession(getRepository().login());
112 context = argeoSuiteUi.getSession().getRootNode();
113
114 } catch (RepositoryException e) {
115 e.printStackTrace();
116 }
117 refreshPart(findUiProvider(DASHBOARD_PID, context), argeoSuiteUi.getDefaultBody(), context);
118 }
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);
124 }
125 }
126
127 private void refreshPart(CmsUiProvider uiProvider, Composite part, Node context) {
128 for (Control child : part.getChildren())
129 child.dispose();
130 uiProvider.createUiPart(part, context);
131 }
132
133 private CmsUiProvider findUiProvider(String pid, Node context) {
134 if (pid != null) {
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))
140 break providers;
141 found = subMap.get(key);
142 log.debug(key);
143 }
144 // if (uiProviders.containsKey(pid))
145 // return uiProviders.get(pid);
146 if (found != null)
147 return found;
148 }
149
150 // nothing
151 return new CmsUiProvider() {
152
153 @Override
154 public Control createUi(Composite parent, Node context) throws RepositoryException {
155 return parent;
156 }
157 };
158 }
159
160 @Override
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;
166 try {
167 if (state != null && state.startsWith("/")) {
168 String path = state.substring(1);
169 String workspace;
170 if (path.equals("")) {
171 workspace = null;
172 path = "/";
173 } else {
174 int index = path.indexOf('/');
175 if (index == 0) {
176 log.error("Cannot interpret // " + state);
177 cmsView.navigateTo("~");
178 return;
179 } else if (index > 0) {
180 workspace = path.substring(0, index);
181 path = path.substring(index);
182 } else {// index<0, assuming root node
183 workspace = path;
184 path = "/";
185 }
186 }
187 session = getRepository().login(workspace);
188
189 Node node = session.getNode(path);
190 refreshEntityUi(node);
191 }
192 } catch (RepositoryException e) {
193 log.error("Cannot load state " + state, e);
194 cmsView.navigateTo("~");
195 } finally {
196 JcrUtils.logoutQuietly(session);
197 }
198 }
199
200 private void refreshEntityUi(Node node) {
201
202 }
203
204 /*
205 * Dependency injection.
206 */
207
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);
213 // } else {
214 uiProviders.put(partKey, uiProvider);
215 if (log.isDebugEnabled())
216 log.debug("Added UI provider " + partKey + " to CMS app.");
217 // }
218
219 }
220
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);
225
226 }
227
228 @Override
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);
233 }
234
235 }
236
237 private static String get(Event event, String key) {
238 Object value = event.getProperty(key);
239 if (value == null)
240 throw new IllegalArgumentException("Property " + key + " must be set");
241 return value.toString();
242
243 }
244
245 // public void setHeaderPart(CmsUiProvider headerPart) {
246 // this.headerPart = headerPart;
247 // if (log.isDebugEnabled())
248 // log.debug("Header set.");
249 // }
250
251 }