UIBaseNodePresentation.java
/*
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.ecm.webui.presentation;
import com.google.common.collect.Lists;
import org.exoplatform.container.xml.PortalContainerInfo;
import org.exoplatform.download.DownloadService;
import org.exoplatform.download.InputStreamDownloadResource;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.portal.webui.container.UIContainer;
import org.exoplatform.services.cms.comments.CommentsService;
import org.exoplatform.services.cms.folksonomy.NewFolksonomyService;
import org.exoplatform.services.cms.i18n.MultiLanguageService;
import org.exoplatform.services.cms.taxonomy.TaxonomyService;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.cms.voting.VotingService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.common.SessionProvider;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.web.application.Parameter;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.core.UIPopupContainer;
import org.exoplatform.webui.core.lifecycle.WebuiBindingContext;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import javax.jcr.*;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/*
* Created by The eXo Platform SAS
* @author : Hoa.Pham
* hoa.pham@exoplatform.com
* Jun 23, 2008
*/
/**
* The Class UIBaseNodePresentation should implement some common method in
* NodePresentation like getIcons,getWebDavLink....
*/
public abstract class UIBaseNodePresentation extends UIContainer implements NodePresentation {
/** The language_. */
private String language_ ;
private boolean enableVote;
private boolean enableComment;
private String mediaState = MEDIA_STATE_NONE;
private static final Log LOG = ExoLogger.getLogger(UIBaseNodePresentation.class.getName());
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getNode()
*/
public abstract Node getNode() throws Exception ;
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getTemplatePath()
*/
public abstract String getTemplatePath() throws Exception ;
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getOriginalNode()
*/
public abstract Node getOriginalNode() throws Exception ;
/**
* Gets the repository name.
*
* @return the repository name
*
* @throws Exception the exception
*/
public String getRepositoryName() throws Exception {
return WCMCoreUtils.getRepository().getConfiguration().getName();
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#encodeHTML(java.lang.String)
*/
public String encodeHTML(String text) throws Exception { return Utils.encodeHTML(text) ; }
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getAttachments()
*/
public List<Node> getAttachments() throws Exception {
List<Node> attachments = new ArrayList<Node>() ;
NodeIterator childrenIterator = getNode().getNodes();;
TemplateService templateService = getApplicationComponent(TemplateService.class) ;
while (childrenIterator.hasNext()) {
Node childNode = childrenIterator.nextNode();
String nodeType = childNode.getPrimaryNodeType().getName();
List<String> listCanCreateNodeType =
Utils.getListAllowedFileType(getNode(), templateService) ;
if (listCanCreateNodeType.contains(nodeType)) attachments.add(childNode);
}
return attachments;
}
public String getViewableLink(Node attNode, Parameter[] params) throws Exception {
return "";
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getComments()
*/
public List<Node> getComments() throws Exception {
return getApplicationComponent(CommentsService.class).getComments(getOriginalNode(), getLanguage()) ;
}
public List<Node> getSortedComments() throws Exception {
return Lists.reverse(this.getComments());
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getComponentInstanceOfType(java.lang.String)
*/
public Object getComponentInstanceOfType(String className) {
Object service = null;
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class object = loader.loadClass(className);
service = getApplicationComponent(object);
} catch (ClassNotFoundException ex) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error", ex);
}
}
return service;
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getDownloadLink(javax.jcr.Node)
*/
public String getDownloadLink(Node node) throws Exception {
return org.exoplatform.wcm.webui.Utils.getDownloadLink(node);
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getIcons(javax.jcr.Node, java.lang.String)
*/
public String getIcons(Node node, String size) throws Exception { return Utils.getNodeTypeIcon(node, size) ; }
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getImage(javax.jcr.Node)
*/
public String getImage(Node node) throws Exception {
DownloadService dservice = getApplicationComponent(DownloadService.class) ;
InputStreamDownloadResource dresource ;
Node imageNode = node.getNode(Utils.EXO_IMAGE) ;
InputStream input = imageNode.getProperty(Utils.JCR_DATA).getStream() ;
dresource = new InputStreamDownloadResource(input, "image") ;
dresource.setDownloadName(node.getName()) ;
return dservice.getDownloadLink(dservice.addDownloadResource(dresource)) ;
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getLanguage()
*/
public String getLanguage() { return language_ ; }
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#setLanguage(java.lang.String)
*/
public void setLanguage(String language) { language_ = language ; }
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getPortalName()
*/
public String getPortalName() {
PortalContainerInfo containerInfo = WCMCoreUtils.getService(PortalContainerInfo.class);
return containerInfo.getContainerName();
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getRelations()
*/
public List<Node> getRelations() throws Exception {
List<Node> relations = new ArrayList<Node>() ;
if (getNode().hasProperty(Utils.EXO_RELATION)) {
Value[] vals = getNode().getProperty(Utils.EXO_RELATION).getValues();
for (int i = 0; i < vals.length; i++) {
String uuid = vals[i].getString();
Node node = getNodeByUUID(uuid);
relations.add(node);
}
}
return relations;
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getRepository()
*/
public String getRepository() throws Exception {
return ((ManageableRepository)getNode().getSession().getRepository()).getConfiguration().getName() ;
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getRssLink()
*/
public String getRssLink() { return null ; }
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#isRssLink()
*/
public boolean isRssLink() { return false ; }
/**
* Checks if allow render fast publish link for the inline editting
*
* @return true, if need to render fast publish link
*/
public boolean isFastPublishLink() { return false ; }
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getSupportedLocalise()
*/
public List getSupportedLocalise() throws Exception {
MultiLanguageService multiLanguageService = getApplicationComponent(MultiLanguageService.class) ;
return multiLanguageService.getSupportedLanguages(getNode()) ;
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getViewTemplate(java.lang.String, java.lang.String)
*/
public String getViewTemplate(String nodeTypeName, String templateName) throws Exception {
TemplateService tempServ = getApplicationComponent(TemplateService.class) ;
return tempServ.getTemplatePath(false, nodeTypeName, templateName) ;
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getWebDAVServerPrefix()
*/
public String getWebDAVServerPrefix() throws Exception {
PortletRequestContext portletRequestContext = PortletRequestContext.getCurrentInstance() ;
String prefixWebDAV = portletRequestContext.getRequest().getScheme() + "://" +
portletRequestContext.getRequest().getServerName() + ":" +
String.format("%s",portletRequestContext.getRequest().getServerPort()) ;
return prefixWebDAV ;
}
/* (non-Javadoc)
* @see org.exoplatform.ecm.webui.presentation.NodePresentation#getWorkspaceName()
*/
public String getWorkspaceName() throws Exception {
return getNode().getSession().getWorkspace().getName();
}
/**
* Gets the node by uuid.
*
* @param uuid the uuid
*
* @return the node by uuid
*/
public Node getNodeByUUID(String uuid) {
ManageableRepository manageRepo = WCMCoreUtils.getRepository();
String[] workspaces = manageRepo.getWorkspaceNames() ;
//TODO: SystemProvider or SessionProvider
SessionProvider provider = WCMCoreUtils.getSystemSessionProvider();
for(String ws : workspaces) {
try {
return provider.getSession(ws, manageRepo).getNodeByUUID(uuid) ;
} catch (ItemNotFoundException e) {
continue;
} catch (RepositoryException e) {
continue;
}
}
return null;
}
/**
* Retrieve all categories of a node.
*
* @param node the node
*
* @return the categories
*
* @throws Exception the exception
*/
public List<Node> getCategories(Node node) throws Exception {
TaxonomyService taxonomyService = getApplicationComponent(TaxonomyService.class);
return taxonomyService.getCategories(node,getRepositoryName());
}
/**
* Retrieve all tags of a node.
*
* @param node the node
*
* @return the tags
*
* @throws Exception the exception
*/
public List<Node> getTags(Node node) throws Exception {
NewFolksonomyService folksonomyService = getApplicationComponent(NewFolksonomyService.class);
return folksonomyService.getLinkedTagsOfDocumentByScope(NewFolksonomyService.PRIVATE,
getStrValue(Utils.PRIVATE, node),
node,
getWorkspaceName());
}
/**
* Retrieve the voting rate.
*
* @param node the node
*
* @return the votes
*
* @throws Exception the exception
*/
public long getVotingRate(Node node) throws Exception {
VotingService votingService = getApplicationComponent(VotingService.class);
return votingService.getVoteTotal(node);
}
/**
* Retrieve the image in property value.
*
* @param node the node
* @param propertyName the property name
*
* @return the image in property
*
* @throws Exception the exception
*/
public String getImageURIInProperty(Node node, String propertyName) throws Exception {
try {
InputStream input = node.getProperty(propertyName).getStream() ;
InputStreamDownloadResource dresource = new InputStreamDownloadResource(input, "image") ;
dresource.setDownloadName(node.getName()) ;
DownloadService dservice = getApplicationComponent(DownloadService.class) ;
return dservice.getDownloadLink(dservice.addDownloadResource(dresource)) ;
} catch (Exception e) {
return null;
}
}
/**
* Retrieve the portlet preference value.
*
* @param preferenceName the preference name
*
* @return the portlet preference value
*/
public String getPortletPreferenceValue(String preferenceName) {
WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance();
if(requestContext instanceof PortletRequestContext) {
PortletRequestContext context = PortletRequestContext.class.cast(requestContext);
return context.getRequest().getPreferences().getValue(preferenceName,null);
}
return null;
}
/**
* Retrieve the portlet preference values.
*
* @param preferenceName the preference name
*
* @return the portlet preference values
*/
public String[] getPortletPreferenceValues(String preferenceName) {
WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance();
if(requestContext instanceof PortletRequestContext) {
PortletRequestContext context = PortletRequestContext.class.cast(requestContext);
return context.getRequest().getPreferences().getValues(preferenceName,null);
}
return null;
}
public String getTemplateSkin(String nodeTypeName, String skinName) throws Exception {
TemplateService tempServ = getApplicationComponent(TemplateService.class) ;
return tempServ.getSkinPath(nodeTypeName, skinName, getLanguage()) ;
}
private String getStrValue(String scope, Node node) throws Exception {
StringBuilder ret = new StringBuilder();
if (Utils.PRIVATE.equals(scope))
ret.append(node.getSession().getUserID());
else if (Utils.GROUP.equals(scope)) {
for (String group : Utils.getGroups())
ret.append(group).append(';');
ret.deleteCharAt(ret.length() - 1);
}
return ret.toString();
}
public boolean isEnableComment() {
return enableComment;
}
public boolean isEnableVote() {
return enableVote;
}
public void setEnableComment(boolean value) {
enableComment = value;
}
public void setEnableVote(boolean value) {
enableVote = value;
}
/**
* @param orgNode Processed node
* @param propertyName which property used for editing
* @param inputType input type for editing: TEXT, TEXTAREA, WYSIWYG
* @param cssClass class name for CSS, should implement: cssClass, [cssClass]Title
* Edit[cssClass] as relative css
* Should create the function: InlineEditor.presentationRequestChange[cssClass]
* to request the rest-service
* @param isGenericProperty set as true to use generic javascript function, other wise, must create
* the correctspond function InlineEditor.presentationRequestChange[cssClass]
* @param arguments Extra parameter for Input component (toolbar, width, height,.. for CKEditor/TextArea)
* @return String that can be put on groovy template
* @throws Exception
*/
public String getInlineEditingField(Node orgNode, String propertyName, String defaultValue, String inputType,
String idGenerator, String cssClass, boolean isGenericProperty, String... arguments) throws Exception {
return org.exoplatform.ecm.webui.utils.Utils.getInlineEditingField(orgNode, propertyName, defaultValue,
inputType, idGenerator, cssClass, isGenericProperty, arguments);
}
public String getInlineEditingField(Node orgNode, String propertyName) throws Exception {
return org.exoplatform.ecm.webui.utils.Utils.getInlineEditingField(orgNode, propertyName);
}
public String getMediaState() { return mediaState; }
public void switchMediaState() {
mediaState = MEDIA_STATE_DISPLAY.equals(mediaState) ? MEDIA_STATE_NONE : MEDIA_STATE_DISPLAY;
}
public boolean isDisplayAlternativeText() {
return false;
}
@Override
public boolean playAudioDescription() {
return false;
}
@Override
public boolean switchBackAudioDescription() {
return false;
}
@Override
public String getActionOpenDocInDesktop() throws Exception {
return this.event("OpenDocInDesktop");
}
@Override
public UIPopupContainer getPopupContainer() throws Exception {
return null;
}
static public class OpenDocInDesktopActionListener extends EventListener<UIBaseNodePresentation> {
public void execute(Event<UIBaseNodePresentation> event) throws Exception {
UIBaseNodePresentation uicomp = event.getSource() ;
Node node = uicomp.getNode();
Utils.openDocumentInDesktop(node, uicomp.getPopupContainer(), event);
}
}
public String getPostedTimeString(WebuiBindingContext resourceBundle, Date postedTime) throws Exception {
long time = (new Date().getTime() - postedTime.getTime()) / 1000;
long value;
if (time < 60) {
return resourceBundle.appRes("Comment.view.label.Less_Than_A_Minute");
} else {
if (time < 120) {
return resourceBundle.appRes("Comment.view.label.About_A_Minute");
} else {
if (time < 3600) {
value = Math.round(time / 60);
return resourceBundle.appRes("Comment.view.label.About_x_Minutes").replaceFirst("\\{0\\}", String.valueOf(value));
} else {
if (time < 7200) {
return resourceBundle.appRes("Comment.view.label.About_An_Hour");
} else {
if (time < 86400) {
value = Math.round(time / 3600);
return resourceBundle.appRes("Comment.view.label.About_x_Hours").replaceFirst("\\{0\\}", String.valueOf(value));
} else {
if (time < 172800) {
return resourceBundle.appRes("Comment.view.label.About_A_Day");
} else {
if (time < 2592000) {
value = Math.round(time / 86400);
return resourceBundle.appRes("Comment.view.label.About_x_Days").replaceFirst("\\{0\\}", String.valueOf(value));
} else {
if (time < 5184000) {
return resourceBundle.appRes("Comment.view.label.About_A_Month");
} else {
value = Math.round(time / 2592000);
return resourceBundle.appRes("Comment.view.label.About_x_Months")
.replaceFirst("\\{0\\}", String.valueOf(value));
}
}
}
}
}
}
}
}
}
}