3 import java
.io
.PrintWriter
;
4 import java
.io
.StringWriter
;
5 import java
.util
.Arrays
;
6 import java
.util
.LinkedHashMap
;
10 import javax
.jcr
.Node
;
11 import javax
.jcr
.Repository
;
12 import javax
.jcr
.RepositoryException
;
13 import javax
.jcr
.Session
;
14 import javax
.jcr
.security
.Privilege
;
15 import javax
.jcr
.version
.VersionManager
;
17 import org
.apache
.commons
.io
.IOUtils
;
18 import org
.apache
.commons
.logging
.Log
;
19 import org
.apache
.commons
.logging
.LogFactory
;
20 import org
.argeo
.cms
.internal
.ImageManagerImpl
;
21 import org
.argeo
.jcr
.JcrUtils
;
22 import org
.eclipse
.rap
.rwt
.RWT
;
23 import org
.eclipse
.rap
.rwt
.application
.EntryPoint
;
24 import org
.eclipse
.rap
.rwt
.application
.EntryPointFactory
;
25 import org
.eclipse
.swt
.SWT
;
26 import org
.eclipse
.swt
.layout
.FillLayout
;
27 import org
.eclipse
.swt
.layout
.GridData
;
28 import org
.eclipse
.swt
.widgets
.Composite
;
29 import org
.eclipse
.swt
.widgets
.Control
;
30 import org
.eclipse
.swt
.widgets
.Label
;
31 import org
.eclipse
.swt
.widgets
.Text
;
33 /** Creates and registers an {@link EntryPoint} */
34 public class CmsEntryPointFactory
implements EntryPointFactory
{
35 private final static Log log
= LogFactory
36 .getLog(CmsEntryPointFactory
.class);
38 private Repository repository
;
39 private String workspace
= null;
40 private String basePath
= "/";
41 private List
<String
> roPrincipals
= Arrays
.asList("anonymous", "everyone");
42 private List
<String
> rwPrincipals
= Arrays
.asList("everyone");
44 private CmsLogin cmsLogin
;
46 private CmsUiProvider header
;
47 // private CmsUiProvider dynamicPages;
48 // private Map<String, CmsUiProvider> staticPages;
49 private Map
<String
, CmsUiProvider
> pages
= new LinkedHashMap
<String
, CmsUiProvider
>();
51 private Integer headerHeight
= 40;
54 private CmsImageManager imageManager
= new ImageManagerImpl();
57 public EntryPoint
create() {
58 CmsEntryPoint cmsEntryPoint
= new CmsEntryPoint(repository
, workspace
);
59 CmsSession
.current
.set(cmsEntryPoint
);
63 public void init() throws RepositoryException
{
64 if (workspace
== null)
65 throw new CmsException(
66 "Workspace must be set when calling initialization."
67 + " Please make sure that read-only and read-write roles"
68 + " have been properly configured:"
69 + " the defaults are open.");
71 Session session
= null;
73 session
= JcrUtils
.loginOrCreateWorkspace(repository
, workspace
);
74 VersionManager vm
= session
.getWorkspace().getVersionManager();
75 if (!vm
.isCheckedOut("/"))
77 // session = repository.login(workspace);
78 JcrUtils
.mkdirs(session
, basePath
);
79 for (String principal
: rwPrincipals
)
80 JcrUtils
.addPrivilege(session
, basePath
, principal
,
82 for (String principal
: roPrincipals
)
83 JcrUtils
.addPrivilege(session
, basePath
, principal
,
86 for (String pageName
: pages
.keySet()) {
88 initPage(session
, pages
.get(pageName
));
90 } catch (Exception e
) {
91 throw new CmsException(
92 "Cannot initialize page " + pageName
, e
);
97 JcrUtils
.logoutQuietly(session
);
101 protected void initPage(Session adminSession
, CmsUiProvider page
)
102 throws RepositoryException
{
103 if (page
instanceof LifeCycleUiProvider
)
104 ((LifeCycleUiProvider
) page
).init(adminSession
);
107 public void destroy() {
108 for (String pageName
: pages
.keySet()) {
110 CmsUiProvider page
= pages
.get(pageName
);
111 if (page
instanceof LifeCycleUiProvider
)
112 ((LifeCycleUiProvider
) page
).destroy();
113 } catch (Exception e
) {
114 log
.error("Cannot destroy page " + pageName
, e
);
119 public void setRepository(Repository repository
) {
120 this.repository
= repository
;
123 public void setWorkspace(String workspace
) {
124 this.workspace
= workspace
;
127 public void setCmsLogin(CmsLogin cmsLogin
) {
128 this.cmsLogin
= cmsLogin
;
131 public void setHeader(CmsUiProvider header
) {
132 this.header
= header
;
135 public void setPages(Map
<String
, CmsUiProvider
> pages
) {
140 public void setDynamicPages(CmsUiProvider dynamicPages
) {
141 log
.warn("'dynamicPages' is deprecated, use 'pages' instead, with \"\" as key");
142 pages
.put("", dynamicPages
);
146 public void setStaticPages(Map
<String
, CmsUiProvider
> staticPages
) {
147 log
.warn("'staticPages' is deprecated, use 'pages' instead");
148 pages
.putAll(staticPages
);
151 public void setBasePath(String basePath
) {
152 this.basePath
= basePath
;
155 public void setRoPrincipals(List
<String
> roPrincipals
) {
156 this.roPrincipals
= roPrincipals
;
159 public void setRwPrincipals(List
<String
> rwPrincipals
) {
160 this.rwPrincipals
= rwPrincipals
;
163 public void setHeaderHeight(Integer headerHeight
) {
164 this.headerHeight
= headerHeight
;
167 private class CmsEntryPoint
extends AbstractCmsEntryPoint
{
168 private Composite headerArea
;
169 private Composite bodyArea
;
171 public CmsEntryPoint(Repository repository
, String workspace
) {
172 super(repository
, workspace
);
176 protected void createContents(Composite parent
) {
178 getShell().getDisplay().setData(CmsSession
.KEY
, this);
180 parent
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true,
182 parent
.setLayout(CmsUtils
.noSpaceGridLayout());
184 headerArea
= new Composite(parent
, SWT
.NONE
);
185 headerArea
.setLayout(new FillLayout());
186 GridData headerData
= new GridData(SWT
.FILL
, SWT
.FILL
, false,
188 headerData
.heightHint
= headerHeight
;
189 headerArea
.setLayoutData(headerData
);
192 bodyArea
= new Composite(parent
, SWT
.NONE
);
193 bodyArea
.setData(RWT
.CUSTOM_VARIANT
, CmsStyles
.CMS_BODY
);
194 bodyArea
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true,
196 bodyArea
.setBackgroundMode(SWT
.INHERIT_DEFAULT
);
197 bodyArea
.setLayout(CmsUtils
.noSpaceGridLayout());
198 } catch (Exception e
) {
199 throw new CmsException("Cannot create entrypoint contents", e
);
204 protected void refreshHeader() {
205 if (headerArea
== null)
207 for (Control child
: headerArea
.getChildren())
210 header
.createUi(headerArea
, getNode());
211 } catch (RepositoryException e
) {
212 throw new CmsException("Cannot refresh header", e
);
214 headerArea
.layout(true, true);
218 protected void refreshBody() {
219 if (bodyArea
== null)
222 for (Control child
: bodyArea
.getChildren())
224 bodyArea
.setLayout(CmsUtils
.noSpaceGridLayout());
227 Throwable exception
= getException();
228 if (exception
!= null) {
229 new Label(bodyArea
, SWT
.NONE
).setText("Unreachable state : "
231 if (getNode() != null)
232 new Label(bodyArea
, SWT
.NONE
).setText("Context : "
235 Text errorText
= new Text(bodyArea
, SWT
.MULTI
| SWT
.H_SCROLL
237 errorText
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true,
239 StringWriter sw
= new StringWriter();
240 exception
.printStackTrace(new PrintWriter(sw
));
241 errorText
.setText(sw
.toString());
242 IOUtils
.closeQuietly(sw
);
246 String state
= getState();
247 String page
= getPage();
250 throw new CmsException("State cannot be null");
252 throw new CmsException("Page cannot be null");
253 // else if (state.length() == 0)
254 // log.debug("empty state");
255 else if (pages
.containsKey(page
))
256 pages
.get(page
).createUi(bodyArea
, getNode());
259 // RWT.getResponse().sendError(404);
260 // } catch (IOException e) {
261 // log.error("Cannot send 404 code", e);
263 throw new CmsException("Unsupported state " + state
);
265 } catch (RepositoryException e
) {
266 throw new CmsException("Cannot refresh body", e
);
269 bodyArea
.layout(true, true);
273 protected void logAsAnonymous() {
274 cmsLogin
.logInAsAnonymous();
278 protected Node
getDefaultNode(Session session
)
279 throws RepositoryException
{
280 if (!session
.hasPermission(basePath
, "read")) {
281 if (session
.getUserID().equals("anonymous"))
282 throw new CmsLoginRequiredException();
284 throw new CmsException("Unauthorized");
286 return session
.getNode(basePath
);
290 public CmsImageManager
getImageManager() {