]> git.argeo.org Git - lgpl/argeo-commons.git/blob - SimpleApp.java
c43ddd7864c1cfa16b1f1459dfb86f70417f1a1b
[lgpl/argeo-commons.git] / SimpleApp.java
1 package org.argeo.cms.util;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.HashMap;
8 import java.util.LinkedHashMap;
9 import java.util.List;
10 import java.util.Map;
11
12 import javax.jcr.Repository;
13 import javax.jcr.RepositoryException;
14 import javax.jcr.Session;
15 import javax.jcr.security.Privilege;
16 import javax.jcr.version.VersionManager;
17
18 import org.apache.commons.logging.Log;
19 import org.apache.commons.logging.LogFactory;
20 import org.argeo.cms.CmsConstants;
21 import org.argeo.cms.CmsException;
22 import org.argeo.cms.CmsSession;
23 import org.argeo.cms.CmsUiProvider;
24 import org.argeo.cms.LifeCycleUiProvider;
25 import org.argeo.jcr.JcrUtils;
26 import org.eclipse.gemini.blueprint.context.BundleContextAware;
27 import org.eclipse.rap.rwt.application.Application;
28 import org.eclipse.rap.rwt.application.Application.OperationMode;
29 import org.eclipse.rap.rwt.application.ApplicationConfiguration;
30 import org.eclipse.rap.rwt.application.EntryPoint;
31 import org.eclipse.rap.rwt.application.EntryPointFactory;
32 import org.eclipse.rap.rwt.application.ExceptionHandler;
33 import org.eclipse.rap.rwt.client.WebClient;
34 import org.eclipse.rap.rwt.service.ResourceLoader;
35 import org.osgi.framework.BundleContext;
36
37 /** A basic generic app based on {@link SimpleErgonomics}. */
38 public class SimpleApp implements CmsConstants, ApplicationConfiguration,
39 BundleContextAware {
40 private final static Log log = LogFactory.getLog(SimpleApp.class);
41
42 private Map<String, Map<String, String>> branding = new HashMap<String, Map<String, String>>();
43 private Map<String, List<String>> styleSheets = new HashMap<String, List<String>>();
44
45 private List<String> resources = new ArrayList<String>();
46
47 private BundleContext bundleContext;
48
49 private Repository repository;
50 private String workspace = null;
51 private String basePath = "/";
52 private List<String> roPrincipals = Arrays.asList("anonymous", "everyone");
53 private List<String> rwPrincipals = Arrays.asList("everyone");
54
55 private CmsUiProvider header;
56 private Map<String, CmsUiProvider> pages = new LinkedHashMap<String, CmsUiProvider>();
57
58 private Integer headerHeight = 40;
59
60 public void configure(Application application) {
61 try {
62 application.setOperationMode(OperationMode.SWT_COMPATIBILITY);
63 application.setExceptionHandler(new CmsExceptionHandler());
64
65 // loading animated gif
66 application.addResource(LOADING_IMAGE,
67 createResourceLoader(LOADING_IMAGE));
68 // empty image
69 application.addResource(NO_IMAGE, createResourceLoader(NO_IMAGE));
70
71 for (String resource : resources) {
72 application.addResource(resource, new BundleResourceLoader(
73 bundleContext));
74 if (log.isDebugEnabled())
75 log.debug("Registered resource " + resource);
76 }
77
78 Map<String, String> defaultBranding = null;
79 if (branding.containsKey("*"))
80 defaultBranding = branding.get("*");
81
82 // entry points
83 for (String page : pages.keySet()) {
84 Map<String, String> properties = defaultBranding != null ? new HashMap<String, String>(
85 defaultBranding) : new HashMap<String, String>();
86 if (branding.containsKey(page)) {
87 properties.putAll(branding.get(page));
88 }
89 // favicon
90 if (properties.containsKey(WebClient.FAVICON)) {
91 String faviconRelPath = properties.get(WebClient.FAVICON);
92 application.addResource(faviconRelPath,
93 new BundleResourceLoader(bundleContext));
94 if (log.isTraceEnabled())
95 log.trace("Registered favicon " + faviconRelPath);
96
97 }
98
99 // page title
100 if (!properties.containsKey(WebClient.PAGE_TITLE)) {
101 if (page.length() > 0)
102 properties.put(
103 WebClient.PAGE_TITLE,
104 Character.toUpperCase(page.charAt(0))
105 + page.substring(1));
106 }
107
108 // default body HTML
109 if (!properties.containsKey(WebClient.BODY_HTML))
110 properties.put(WebClient.BODY_HTML, DEFAULT_LOADING_BODY);
111
112 //
113 // ADD ENTRY POINT
114 //
115 application.addEntryPoint("/" + page, new CmsEntryPointFactory(
116 pages.get(page), repository, workspace, properties),
117 properties);
118 log.info("Registered entry point /" + page);
119 }
120
121 // stylesheets
122 for (String themeId : styleSheets.keySet()) {
123 List<String> cssLst = styleSheets.get(themeId);
124 for (String css : cssLst) {
125 application.addStyleSheet(themeId, css,
126 new BundleResourceLoader(bundleContext));
127 }
128
129 }
130 } catch (RuntimeException e) {
131 // Easier access to initialisation errors
132 log.error("Unexpected exception when configuring RWT application.",
133 e);
134 throw e;
135 }
136 }
137
138 public void init() throws RepositoryException {
139 Session session = null;
140 try {
141 session = JcrUtils.loginOrCreateWorkspace(repository, workspace);
142 VersionManager vm = session.getWorkspace().getVersionManager();
143 if (!vm.isCheckedOut("/"))
144 vm.checkout("/");
145 JcrUtils.mkdirs(session, basePath);
146 for (String principal : rwPrincipals)
147 JcrUtils.addPrivilege(session, basePath, principal,
148 Privilege.JCR_WRITE);
149 for (String principal : roPrincipals)
150 JcrUtils.addPrivilege(session, basePath, principal,
151 Privilege.JCR_READ);
152
153 for (String pageName : pages.keySet()) {
154 try {
155 initPage(session, pages.get(pageName));
156 session.save();
157 } catch (Exception e) {
158 throw new CmsException(
159 "Cannot initialize page " + pageName, e);
160 }
161 }
162
163 } finally {
164 JcrUtils.logoutQuietly(session);
165 }
166 }
167
168 protected void initPage(Session adminSession, CmsUiProvider page)
169 throws RepositoryException {
170 if (page instanceof LifeCycleUiProvider)
171 ((LifeCycleUiProvider) page).init(adminSession);
172 }
173
174 public void destroy() {
175 for (String pageName : pages.keySet()) {
176 try {
177 CmsUiProvider page = pages.get(pageName);
178 if (page instanceof LifeCycleUiProvider)
179 ((LifeCycleUiProvider) page).destroy();
180 } catch (Exception e) {
181 log.error("Cannot destroy page " + pageName, e);
182 }
183 }
184 }
185
186 public void setRepository(Repository repository) {
187 this.repository = repository;
188 }
189
190 public void setWorkspace(String workspace) {
191 this.workspace = workspace;
192 }
193
194 public void setHeader(CmsUiProvider header) {
195 this.header = header;
196 }
197
198 public void setPages(Map<String, CmsUiProvider> pages) {
199 this.pages = pages;
200 }
201
202 public void setBasePath(String basePath) {
203 this.basePath = basePath;
204 }
205
206 public void setRoPrincipals(List<String> roPrincipals) {
207 this.roPrincipals = roPrincipals;
208 }
209
210 public void setRwPrincipals(List<String> rwPrincipals) {
211 this.rwPrincipals = rwPrincipals;
212 }
213
214 public void setHeaderHeight(Integer headerHeight) {
215 this.headerHeight = headerHeight;
216 }
217
218 public void setBranding(Map<String, Map<String, String>> branding) {
219 this.branding = branding;
220 }
221
222 public void setStyleSheets(Map<String, List<String>> styleSheets) {
223 this.styleSheets = styleSheets;
224 }
225
226 public void setBundleContext(BundleContext bundleContext) {
227 this.bundleContext = bundleContext;
228 }
229
230 public void setResources(List<String> resources) {
231 this.resources = resources;
232 }
233
234 class CmsExceptionHandler implements ExceptionHandler {
235
236 @Override
237 public void handleException(Throwable throwable) {
238 CmsSession.current.get().exception(throwable);
239 }
240
241 }
242
243 private class CmsEntryPointFactory implements EntryPointFactory {
244 private final CmsUiProvider page;
245 private final Repository repository;
246 private final String workspace;
247 private final Map<String, String> properties;
248
249 public CmsEntryPointFactory(CmsUiProvider page, Repository repository,
250 String workspace, Map<String, String> properties) {
251 this.page = page;
252 this.repository = repository;
253 this.workspace = workspace;
254 this.properties = properties;
255 }
256
257 @Override
258 public EntryPoint create() {
259 SimpleErgonomics entryPoint = new SimpleErgonomics(repository,
260 workspace, basePath, page, properties);
261 // entryPoint.setState("");
262 entryPoint.setHeader(header);
263 entryPoint.setHeaderHeight(headerHeight);
264 CmsSession.current.set(entryPoint);
265 return entryPoint;
266 }
267
268 }
269
270 private static ResourceLoader createResourceLoader(final String resourceName) {
271 return new ResourceLoader() {
272 public InputStream getResourceAsStream(String resourceName)
273 throws IOException {
274 return getClass().getClassLoader().getResourceAsStream(
275 resourceName);
276 }
277 };
278 }
279
280 // private static ResourceLoader createUrlResourceLoader(final URL url) {
281 // return new ResourceLoader() {
282 // public InputStream getResourceAsStream(String resourceName)
283 // throws IOException {
284 // return url.openStream();
285 // }
286 // };
287 // }
288
289 /*
290 * TEXTS
291 */
292 private static String DEFAULT_LOADING_BODY = "<div"
293 + " style=\"position: absolute; left: 50%; top: 50%; margin: -32px -32px; width: 64px; height:64px\">"
294 + "<img src=\"./rwt-resources/" + LOADING_IMAGE
295 + "\" width=\"32\" height=\"32\" style=\"margin: 16px 16px\"/>"
296 + "</div>";
297 }