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