/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/rwiki/trunk/rwiki-tool/tool/src/java/uk/ac/cam/caret/sakai/rwiki/tool/bean/RenderBean.java $ * $Id: RenderBean.java 123524 2013-05-02 17:55:46Z azeckoski@unicon.net $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006 The Sakai Foundation. * * Licensed under the Educational Community License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ecl1.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package uk.ac.cam.caret.sakai.rwiki.tool.bean; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.TreeMap; import org.apache.commons.lang.StringUtils; import org.sakaiproject.component.cover.ComponentManager; import org.sakaiproject.event.api.EventTrackingService; import uk.ac.cam.caret.sakai.rwiki.service.api.RWikiObjectService; import uk.ac.cam.caret.sakai.rwiki.service.api.dao.ObjectProxy; import uk.ac.cam.caret.sakai.rwiki.service.api.model.RWikiObject; import uk.ac.cam.caret.sakai.rwiki.service.exception.PermissionException; import uk.ac.cam.caret.sakai.rwiki.tool.api.ToolRenderService; import uk.ac.cam.caret.sakai.rwiki.tool.bean.helper.ResourceLoaderHelperBean; import uk.ac.cam.caret.sakai.rwiki.utils.NameHelper; import uk.ac.cam.caret.sakai.rwiki.utils.XmlEscaper; /** * Bean that renders the current rwikiObject using a set objectService and * toolRenderService. * * @author andrew */ public class RenderBean { private ToolRenderService toolRenderService; private RWikiObjectService objectService; private RWikiObject rwo; private boolean withBreadcrumbs = true; private boolean canEdit = false; private boolean canRead = false; private String previewContent = null; public static final String PERMISSION_PROBLEM = "You do not have permission to view this page"; /** * Create new RenderBean from given RWikiObject * * @param rwo * the current RWikiObject * @param user * the current user * @param toolRenderService * the ToolRenderService * @param objectService * the RWikiObjectService */ public RenderBean(RWikiObject rwo, ToolRenderService toolRenderService, RWikiObjectService objectService, boolean withBreadcrumbs) { this.rwo = rwo; this.toolRenderService = toolRenderService; this.objectService = objectService; this.withBreadcrumbs = withBreadcrumbs; this.canEdit = objectService.checkUpdate(rwo); this.canRead = objectService.checkRead(rwo); } /** * Create new RenderBean and get the chosen RWikiObject * * @param name * the name of the RWikiObject to render * @param user * the current user * @param defaultRealm * the defaultRealm to globalise the name with * @param toolRenderService * the ToolRenderService * @param objectService * the RWikiObjectService */ public RenderBean(String name, String defaultRealm, ToolRenderService toolRenderService, RWikiObjectService objectService, boolean withBreadcrumbs) { this.objectService = objectService; this.toolRenderService = toolRenderService; this.withBreadcrumbs = withBreadcrumbs; String pageName = NameHelper.globaliseName(name, defaultRealm); String pageRealm = defaultRealm; try { this.rwo = objectService.getRWikiObject(pageName, pageRealm); this.canEdit = objectService.checkUpdate(rwo); this.canRead = objectService.checkRead(rwo); } catch (PermissionException e) { this.rwo = objectService.createNewRWikiCurrentObject(); rwo.setName(pageName); ResourceLoaderBean rlb = ResourceLoaderHelperBean.getResourceLoaderBean(); rwo.setContent(rlb.getString("renderbean.permission_problem",PERMISSION_PROBLEM)); } } /** * Get the RWikiObjectService * * @return objectService */ public RWikiObjectService getObjectService() { return objectService; } /** * Set the RWikiObjectService for this bean. * * @param objectService * The RWikiObjectService to use. */ public void setObjectService(RWikiObjectService objectService) { this.objectService = objectService; } /** * Get the ToolRenderService * * @return toolRenderService */ public ToolRenderService getToolRenderService() { return toolRenderService; } /** * Set the ToolRenderService for this bean. * * @param toolRenderService * the ToolRenderService to use. */ public void setRenderService(ToolRenderService toolRenderService) { this.toolRenderService = toolRenderService; } public String getPreviewPage() { String oldcontent = rwo.getContent(); rwo.setContent(previewContent); String page = toolRenderService.renderPage(rwo, false); rwo.setContent(oldcontent); return page; } /** * Render the current RWikiObject * * @return XHTML as a String representing the content of the current * RWikiObject */ public String getRenderedPage() { // SAK-23566 capture the view wiki page events if (rwo != null && rwo.getName() != null) { // KNOWN ISSUE: getRenderedPage is also called when editing, there doesn't seem to be a way to tell the difference EventTrackingService ets = (EventTrackingService) ComponentManager.get(EventTrackingService.class); if (ets != null) { ets.post(ets.newEvent("wiki.read", StringUtils.abbreviate(rwo.getName(), 250), false)); } } return toolRenderService.renderPage(rwo); } /** * Render the current RWikiObject with public links * * @return XMTML as a String representing the content of the current * RWikiObject */ public String getPublicRenderedPage() { return toolRenderService.renderPublicPage(rwo, withBreadcrumbs); } /** * Render the current RWikiObject with print links * * @return XMTML as a String representing the content of the current * RWikiObject */ public String getPrintRenderedPage() { return toolRenderService.renderPrintPage(rwo, withBreadcrumbs); } /** * Render the current RWikiObject * * @return XHTML as a String representing the content of the current * RWikiObject */ public String renderPage() { return toolRenderService.renderPage(rwo); } /** * Render the current RWikiObject with public links * * @return XMTML as a String representing the content of the current * RWikiObject */ public String publicRenderedPage() { return toolRenderService.renderPublicPage(rwo, withBreadcrumbs); } /** * Render the current RWikiObject with print links * * @return XMTML as a String representing the content of the current * RWikiObject */ public String printRenderedPage() { return toolRenderService.renderPrintPage(rwo, withBreadcrumbs); } /** * Render the rwikiObject represented by the given name and realm * * @param name * a possible non-globalised name * @param defaultRealm * the default realm of that should be globalised against * @return XHTML as a String representing the content of the RWikiObject */ public String renderPage(String name, String defaultRealm) { String pageName = NameHelper.globaliseName(name, defaultRealm); String pageRealm = NameHelper.localizeSpace(pageName, defaultRealm); try { RWikiObject page = objectService .getRWikiObject(pageName, pageRealm); return toolRenderService.renderPage(page, defaultRealm); } catch (PermissionException e) { RWikiObject page = objectService.createNewRWikiCurrentObject(); page.setName(pageName); ResourceLoaderBean rlb = ResourceLoaderHelperBean.getResourceLoaderBean(); page.setContent(rlb.getString("renderbean.permission_problem",PERMISSION_PROBLEM)); return toolRenderService.renderPage(page, defaultRealm); } } /** * Render the rwikiObject as a public page represented by the given name and * realm * * @param name * a possible non-globalised name * @param defaultRealm * the default space of that should be globalised against * @return XHTML as a String representing the content of the RWikiObject */ public String publicRenderPage(String name, String defaultRealm, boolean withBreadcrumbs) { String pageName = NameHelper.globaliseName(name, defaultRealm); String pageSpace = NameHelper.localizeSpace(pageName, defaultRealm); try { RWikiObject page = objectService .getRWikiObject(pageName, pageSpace); return toolRenderService.renderPublicPage(page, defaultRealm, withBreadcrumbs); } catch (PermissionException e) { RWikiObject page = objectService.createNewRWikiCurrentObject(); page.setName(pageName); ResourceLoaderBean rlb = ResourceLoaderHelperBean.getResourceLoaderBean(); page.setContent(rlb.getString("renderbean.permission_problem",PERMISSION_PROBLEM)); return toolRenderService.renderPublicPage(page, defaultRealm, withBreadcrumbs); } } /** * Render the rwikiObject as a print page represented by the given name and * realm * * @param name * a possible non-globalised name * @param defaultRealm * the default space of that should be globalised against * @return XHTML as a String representing the content of the RWikiObject */ public String printRenderPage(String name, String defaultRealm, boolean withBreadcrumbs) { String pageName = NameHelper.globaliseName(name, defaultRealm); String pageSpace = NameHelper.localizeSpace(pageName, defaultRealm); try { RWikiObject page = objectService .getRWikiObject(pageName, pageSpace); return toolRenderService.renderPrintPage(page, defaultRealm, withBreadcrumbs); } catch (PermissionException e) { RWikiObject page = objectService.createNewRWikiCurrentObject(); page.setName(pageName); ResourceLoaderBean rlb = ResourceLoaderHelperBean.getResourceLoaderBean(); page.setContent(rlb.getString("renderbean.permission_problem",PERMISSION_PROBLEM)); return toolRenderService.renderPrintPage(page, defaultRealm, withBreadcrumbs); } } /** * The current RWikiObject * * @return rwikiObject */ public RWikiObject getRwikiObject() { return rwo; } /** * The localised name of the rwikiObject * * @return localised page name */ public String getLocalisedPageName() { return NameHelper.localizeName(rwo.getName(), rwo.getRealm()); } /** * The localised name of the rwikiObject * * @return length of the localised page name */ public Integer getLocalisedPageNameLength() { return NameHelper.localizeName(rwo.getName(), rwo.getRealm()).length(); } /** * Returns an url that generate a view string to the current rwikiObject * * @return url as String */ public String getEditUrl() { ViewBean vb = new ViewBean(rwo.getName(), rwo.getRealm()); return vb.getEditUrl(); } /** * Returns true if the underlying page exists. * * @return */ public boolean getExists() { return objectService.exists(rwo.getName(), rwo.getRealm()); } /** * Returns true if the page has content and it has length * * @return */ public boolean getHasContent() { if (!getExists()) return false; String content = rwo.getContent(); return (content != null && content.trim().length() > 0); } /** * returns a list of comments that are render beans * * @return */ public List getComments() { List commentsList = objectService .findRWikiSubPages(rwo.getName() + "."); ObjectProxy lop = new ObjectProxy() { public Object proxyObject(Object o) { if (o instanceof RWikiObject) { RenderBean rb = new RenderBean((RWikiObject) o, toolRenderService, objectService, withBreadcrumbs); return rb; } if (o instanceof RenderBean) { return o; } throw new RuntimeException( "Proxied list does not contain expected object type, found:" + o); } }; return objectService.createListProxy(commentsList, lop); } public String getCommentPageLink() { String pageName = rwo.getName(); String link=""; ViewBean vb = new ViewBean(rwo.getName(), NameHelper.localizeSpace(rwo .getName(), rwo.getRealm())); vb.setLocalSpace(vb.getPageSpace()); if (pageName != null && !"".equals(pageName)) { vb.setPageName(pageName); link = "<a href=\"" + XmlEscaper.xmlEscape(vb.getViewUrl()) + "\">" + XmlEscaper.xmlEscape(vb.getLocalName()) + "</a>"; } return link; } /** * @return Returns the canEdit. */ public boolean getCanEdit() { return canEdit; } /** * @param canEdit * The canEdit to set. */ public void setCanEdit(boolean canEdit) { this.canEdit = canEdit; } /** * @return Returns the canRead. */ public boolean getCanRead() { return canRead; } /** * @param canRead * The canRead to set. */ public void setCanRead(boolean canRead) { this.canRead = canRead; } public String getListCommentsURL() { ViewBean vb = new ViewBean(rwo.getName(), NameHelper.localizeSpace(rwo .getName(), rwo.getRealm())); return vb.getListCommentsURL(); } public String getNewCommentURL() { ViewBean vb = new ViewBean(rwo.getName(), NameHelper.localizeSpace(rwo .getName(), rwo.getRealm())); return vb.getNewCommentURL(); } public String getEditCommentURL() { ViewBean vb = new ViewBean(rwo.getName(), NameHelper.localizeSpace(rwo .getName(), rwo.getRealm())); return vb.getEditCommentURL(); } public String getCommentLevel() { String localName = NameHelper.localizeName(rwo.getName(), NameHelper .localizeSpace(rwo.getName(), rwo.getRealm())); int p = localName.indexOf(".", 0); int i = 1; while (p > 0 && i <= 5) { i++; p = localName.indexOf(".", p + 1); } return String.valueOf(i); } public String getListPresenceURL() { ViewBean vb = new ViewBean(rwo.getName(), NameHelper.localizeSpace(rwo .getName(), rwo.getRealm())); return vb.getListPresenceURL(); } public String getOpenPageChatURL() { ViewBean vb = new ViewBean(rwo.getName(), NameHelper.localizeSpace(rwo .getName(), rwo.getRealm())); return vb.getOpenPageChatURL(); } public String getOpenSpaceChatURL() { ViewBean vb = new ViewBean(rwo.getName(), NameHelper.localizeSpace(rwo .getName(), rwo.getRealm())); return vb.getOpenSpaceChatURL(); } public String getListPageChatURL() { ViewBean vb = new ViewBean(rwo.getName(), NameHelper.localizeSpace(rwo .getName(), rwo.getRealm())); return vb.getListPageChatURL(); } public String getListSpaceChatURL() { ViewBean vb = new ViewBean(rwo.getName(), NameHelper.localizeSpace(rwo .getName(), rwo.getRealm())); return vb.getListSpaceChatURL(); } /** * @param previewContent the previewContent to set */ public void setPreviewContent(String previewContent) { this.previewContent = previewContent; } }