1 package org
.argeo
.cms
.util
;
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
;
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
;
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
.eclipse
.swt
.widgets
.Composite
;
35 import org
.osgi
.framework
.BundleContext
;
37 /** A basic generic app based on {@link SimpleErgonomics}. */
38 public class SimpleApp
implements CmsConstants
, ApplicationConfiguration
,
40 private final static Log log
= LogFactory
.getLog(SimpleApp
.class);
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
>>();
45 private List
<String
> resources
= new ArrayList
<String
>();
47 private BundleContext bundleContext
;
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");
55 private CmsUiProvider header
;
56 private Map
<String
, CmsUiProvider
> pages
= new LinkedHashMap
<String
, CmsUiProvider
>();
58 private Integer headerHeight
= 40;
60 public void configure(Application application
) {
62 StyleSheetResourceLoader styleSheetRL
= new StyleSheetResourceLoader(
64 BundleResourceLoader bundleRL
= new BundleResourceLoader(
67 application
.setOperationMode(OperationMode
.SWT_COMPATIBILITY
);
68 // application.setOperationMode(OperationMode.JEE_COMPATIBILITY);
70 application
.setExceptionHandler(new CmsExceptionHandler());
72 // loading animated gif
73 application
.addResource(LOADING_IMAGE
,
74 createResourceLoader(LOADING_IMAGE
));
76 application
.addResource(NO_IMAGE
, createResourceLoader(NO_IMAGE
));
78 for (String resource
: resources
) {
79 application
.addResource(resource
, bundleRL
);
80 if (log
.isDebugEnabled())
81 log
.debug("Registered resource " + resource
);
84 Map
<String
, String
> defaultBranding
= null;
85 if (branding
.containsKey("*"))
86 defaultBranding
= branding
.get("*");
89 for (String page
: pages
.keySet()) {
90 Map
<String
, String
> properties
= defaultBranding
!= null ?
new HashMap
<String
, String
>(
91 defaultBranding
) : new HashMap
<String
, String
>();
92 if (branding
.containsKey(page
)) {
93 properties
.putAll(branding
.get(page
));
96 if (properties
.containsKey(WebClient
.FAVICON
)) {
97 String faviconRelPath
= properties
.get(WebClient
.FAVICON
);
98 application
.addResource(faviconRelPath
,
99 new BundleResourceLoader(bundleContext
));
100 if (log
.isTraceEnabled())
101 log
.trace("Registered favicon " + faviconRelPath
);
106 if (!properties
.containsKey(WebClient
.PAGE_TITLE
)) {
107 if (page
.length() > 0)
109 WebClient
.PAGE_TITLE
,
110 Character
.toUpperCase(page
.charAt(0))
111 + page
.substring(1));
115 if (!properties
.containsKey(WebClient
.BODY_HTML
))
116 properties
.put(WebClient
.BODY_HTML
, DEFAULT_LOADING_BODY
);
121 application
.addEntryPoint("/" + page
, new CmsEntryPointFactory(
122 pages
.get(page
), repository
, workspace
, properties
),
124 log
.info("Registered entry point /" + page
);
128 for (String themeId
: styleSheets
.keySet()) {
129 List
<String
> cssLst
= styleSheets
.get(themeId
);
130 for (String css
: cssLst
) {
131 application
.addStyleSheet(themeId
, css
, styleSheetRL
);
135 } catch (RuntimeException e
) {
136 // Easier access to initialisation errors
137 log
.error("Unexpected exception when configuring RWT application.",
143 public void init() throws RepositoryException
{
144 Session session
= null;
146 session
= JcrUtils
.loginOrCreateWorkspace(repository
, workspace
);
147 VersionManager vm
= session
.getWorkspace().getVersionManager();
148 if (!vm
.isCheckedOut("/"))
150 JcrUtils
.mkdirs(session
, basePath
);
151 for (String principal
: rwPrincipals
)
152 JcrUtils
.addPrivilege(session
, basePath
, principal
,
153 Privilege
.JCR_WRITE
);
154 for (String principal
: roPrincipals
)
155 JcrUtils
.addPrivilege(session
, basePath
, principal
,
158 for (String pageName
: pages
.keySet()) {
160 initPage(session
, pages
.get(pageName
));
162 } catch (Exception e
) {
163 throw new CmsException(
164 "Cannot initialize page " + pageName
, e
);
169 JcrUtils
.logoutQuietly(session
);
173 protected void initPage(Session adminSession
, CmsUiProvider page
)
174 throws RepositoryException
{
175 if (page
instanceof LifeCycleUiProvider
)
176 ((LifeCycleUiProvider
) page
).init(adminSession
);
179 public void destroy() {
180 for (String pageName
: pages
.keySet()) {
182 CmsUiProvider page
= pages
.get(pageName
);
183 if (page
instanceof LifeCycleUiProvider
)
184 ((LifeCycleUiProvider
) page
).destroy();
185 } catch (Exception e
) {
186 log
.error("Cannot destroy page " + pageName
, e
);
191 public void setRepository(Repository repository
) {
192 this.repository
= repository
;
195 public void setWorkspace(String workspace
) {
196 this.workspace
= workspace
;
199 public void setHeader(CmsUiProvider header
) {
200 this.header
= header
;
203 public void setPages(Map
<String
, CmsUiProvider
> pages
) {
207 public void setBasePath(String basePath
) {
208 this.basePath
= basePath
;
211 public void setRoPrincipals(List
<String
> roPrincipals
) {
212 this.roPrincipals
= roPrincipals
;
215 public void setRwPrincipals(List
<String
> rwPrincipals
) {
216 this.rwPrincipals
= rwPrincipals
;
219 public void setHeaderHeight(Integer headerHeight
) {
220 this.headerHeight
= headerHeight
;
223 public void setBranding(Map
<String
, Map
<String
, String
>> branding
) {
224 this.branding
= branding
;
227 public void setStyleSheets(Map
<String
, List
<String
>> styleSheets
) {
228 this.styleSheets
= styleSheets
;
231 public void setBundleContext(BundleContext bundleContext
) {
232 this.bundleContext
= bundleContext
;
235 public void setResources(List
<String
> resources
) {
236 this.resources
= resources
;
239 class CmsExceptionHandler
implements ExceptionHandler
{
242 public void handleException(Throwable throwable
) {
243 CmsUtils
.getCmsView().exception(throwable
);
248 private class CmsEntryPointFactory
implements EntryPointFactory
{
249 private final CmsUiProvider page
;
250 private final Repository repository
;
251 private final String workspace
;
252 private final Map
<String
, String
> properties
;
254 public CmsEntryPointFactory(CmsUiProvider page
, Repository repository
,
255 String workspace
, Map
<String
, String
> properties
) {
257 this.repository
= repository
;
258 this.workspace
= workspace
;
259 this.properties
= properties
;
263 public EntryPoint
create() {
264 SimpleErgonomics entryPoint
= new SimpleErgonomics(repository
,
265 workspace
, basePath
, page
, properties
) {
268 protected void initUi(Composite parent
) {
269 // TODO Auto-generated method stub
270 super.initUi(parent
);
273 // entryPoint.setState("");
274 entryPoint
.setHeader(header
);
275 entryPoint
.setHeaderHeight(headerHeight
);
276 // CmsSession.current.set(entryPoint);
282 private static ResourceLoader
createResourceLoader(final String resourceName
) {
283 return new ResourceLoader() {
284 public InputStream
getResourceAsStream(String resourceName
)
286 return getClass().getClassLoader().getResourceAsStream(
292 // private static ResourceLoader createUrlResourceLoader(final URL url) {
293 // return new ResourceLoader() {
294 // public InputStream getResourceAsStream(String resourceName)
295 // throws IOException {
296 // return url.openStream();
304 private static String DEFAULT_LOADING_BODY
= "<div"
305 + " style=\"position: absolute; left: 50%; top: 50%; margin: -32px -32px; width: 64px; height:64px\">"
306 + "<img src=\"./rwt-resources/" + LOADING_IMAGE
307 + "\" width=\"32\" height=\"32\" style=\"margin: 16px 16px\"/>"