UIViewVersion.java
/*
* Copyright (C) 2003-2007 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.component.explorer.versions;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import org.exoplatform.container.xml.PortalContainerInfo;
import org.exoplatform.download.DownloadService;
import org.exoplatform.download.InputStreamDownloadResource;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.ecm.webui.component.explorer.control.UIActionBar;
import org.exoplatform.ecm.webui.presentation.AbstractActionComponent;
import org.exoplatform.ecm.webui.presentation.UIBaseNodePresentation;
import org.exoplatform.ecm.webui.presentation.removeattach.RemoveAttachmentComponent;
import org.exoplatform.ecm.webui.presentation.removecomment.RemoveCommentComponent;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.resolver.ResourceResolver;
import org.exoplatform.services.cms.comments.CommentsService;
import org.exoplatform.services.cms.i18n.MultiLanguageService;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.web.application.Parameter;
import org.exoplatform.web.application.RequireJS;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
/**
* Created by The eXo Platform SARL
* Author : lxchiati
* lebienthuy@gmail.com
* Oct 19, 2006
* 10:07:15 AM
*/
@ComponentConfig(
type = UIViewVersion.class,
template = "system:/groovy/webui/core/UITabPane.gtmpl",
events = {
@EventConfig(listeners = UIViewVersion.ChangeLanguageActionListener.class),
@EventConfig(listeners = UIViewVersion.ChangeNodeActionListener.class),
@EventConfig(listeners = UIViewVersion.DownloadActionListener.class)
}
)
public class UIViewVersion extends UIBaseNodePresentation {
private NodeLocation node_ ;
protected NodeLocation originalNode_ ;
private String language_ ;
private static final Log LOG = ExoLogger.getLogger(UIViewVersion.class.getName());
final private static String COMMENT_COMPONENT = "Comment";
public UIViewVersion() throws Exception {
addChild(UINodeInfo.class, null, null) ;
addChild(UINodeProperty.class, null, null).setRendered(false) ;
}
public String getTemplate() {
TemplateService templateService = getApplicationComponent(TemplateService.class);
String userName = Util.getPortalRequestContext().getRemoteUser() ;
try {
Node node = getAncestorOfType(UIJCRExplorer.class).getCurrentNode() ;
originalNode_ = NodeLocation.getNodeLocationByNode(node);
String nodeType = node.getPrimaryNodeType().getName();
if(isNodeTypeSupported(node)) return templateService.getTemplatePathByUser(false, nodeType, userName) ;
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
return null ;
}
public UIComponent getCommentComponent() {
UIJCRExplorer uiExplorer = getAncestorOfType(UIJCRExplorer.class);
UIActionBar uiActionBar = uiExplorer.findFirstComponentOfType(UIActionBar.class);
UIComponent uicomponent = uiActionBar.getUIAction(COMMENT_COMPONENT);
return (uicomponent != null ? uicomponent : this);
}
public UIComponent getRemoveAttach() throws Exception {
removeChild(RemoveAttachmentComponent.class);
UIComponent uicomponent = addChild(RemoveAttachmentComponent.class, null, "UIViewVersionRemoveAttach");
((AbstractActionComponent) uicomponent).setLstComponentupdate(Arrays.asList(new Class[] {UIPopupWindow.class}));
return uicomponent;
}
public UIComponent getRemoveComment() throws Exception {
removeChild(RemoveCommentComponent.class);
UIComponent uicomponent = addChild(RemoveCommentComponent.class, null, "UIViewVersionRemoveComment");
((AbstractActionComponent) uicomponent).setLstComponentupdate(Arrays.asList(new Class[] {UIPopupWindow.class}));
return uicomponent;
}
public ResourceResolver getTemplateResourceResolver(WebuiRequestContext context, String template) {
return getAncestorOfType(UIJCRExplorer.class).getJCRTemplateResourceResolver() ;
}
public boolean isNodeTypeSupported(Node node) {
try {
TemplateService templateService = getApplicationComponent(TemplateService.class) ;
String nodeTypeName = node.getPrimaryNodeType().getName();
return templateService.isManagedNodeType(nodeTypeName);
} catch (Exception e) {
return false;
}
}
public Node getNode() throws RepositoryException {
return NodeLocation.getNodeByLocation(node_);
}
public Node getOriginalNode() throws Exception {
return NodeLocation.getNodeByLocation(originalNode_);
}
public void setNode(Node node) {
node_ = NodeLocation.getNodeLocationByNode(node);
}
public Node getNodeByUUID(String uuid) {
ManageableRepository manageRepo = WCMCoreUtils.getRepository();
String[] workspaces = manageRepo.getWorkspaceNames() ;
for(String ws : workspaces) {
try{
return WCMCoreUtils.getSystemSessionProvider().getSession(ws, manageRepo).getNodeByUUID(uuid) ;
} catch(Exception e) {
continue;
}
}
return null;
}
public List<Node> getRelations() throws Exception {
List<Node> relations = new ArrayList<Node>() ;
Node node = getNode();
if (node.hasProperty(Utils.EXO_RELATION)) {
Value[] vals = node.getProperty(Utils.EXO_RELATION).getValues();
for (int i = 0; i < vals.length; i++) {
String uuid = vals[i].getString();
Node nodeToAdd = getNodeByUUID(uuid);
relations.add(nodeToAdd);
}
}
return relations;
}
public List<Node> getAttachments() throws Exception {
List<Node> attachments = new ArrayList<Node>() ;
Node node = getNode();
NodeIterator childrenIterator = node.getNodes();
TemplateService templateService = getApplicationComponent(TemplateService.class) ;
int attachData = 0 ;
while(childrenIterator.hasNext()) {
Node childNode = childrenIterator.nextNode();
String nodeType = childNode.getPrimaryNodeType().getName();
List<String> listCanCreateNodeType =
Utils.getListAllowedFileType(node, templateService) ;
if(listCanCreateNodeType.contains(nodeType)) {
// Case of childNode has jcr:data property
if (childNode.hasProperty(Utils.JCR_DATA)) {
attachData = childNode.getProperty(Utils.JCR_DATA).getStream().available();
// Case of jcr:data has content
if (attachData > 0)
attachments.add(childNode);
} else {
attachments.add(childNode);
}
}
}
return attachments;
}
public String getViewableLink(Node attNode, Parameter[] params)
throws Exception {
return this.event("ChangeNode", Utils.formatNodeName(attNode.getPath()), params);
}
public String getIcons(Node node, String type) throws Exception {
return Utils.getNodeTypeIcon(node, type) ;
}
public boolean hasPropertyContent(Node node, String property){
try {
String value = node.getProperty(property).getString() ;
if(value.length() > 0) return true ;
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error", e);
}
}
return false ;
}
public boolean isRssLink() { return false ; }
public String getRssLink() { return null ; }
public void update() throws Exception {
getChild(UINodeInfo.class).update();
}
public List<Node> getComments() throws Exception {
return getApplicationComponent(CommentsService.class).getComments(getNode(), getLanguage()) ;
}
@SuppressWarnings("unchecked")
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;
}
public String getDownloadLink(Node node) throws Exception {
DownloadService dservice = getApplicationComponent(DownloadService.class) ;
InputStreamDownloadResource dresource ;
if(!node.getPrimaryNodeType().getName().equals(Utils.NT_FILE)) {
node = NodeLocation.getNodeByLocation(originalNode_);
}
Node jcrContentNode = node.getNode(Utils.JCR_CONTENT) ;
InputStream input = jcrContentNode.getProperty(Utils.JCR_DATA).getStream() ;
dresource = new InputStreamDownloadResource(input, "image") ;
dresource.setDownloadName(node.getName()) ;
return dservice.getDownloadLink(dservice.addDownloadResource(dresource)) ;
}
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)) ;
}
public void setLanguage(String language) { language_ = language ; }
public String getLanguage() { return language_ ; }
public String getNodeType() throws Exception {
return getNode().getPrimaryNodeType().getName() ;
}
public String getPortalName() {
PortalContainerInfo containerInfo = WCMCoreUtils.getService(PortalContainerInfo.class);
return containerInfo.getContainerName();
}
public List<String> getSupportedLocalise() throws Exception {
MultiLanguageService multiLanguageService = getApplicationComponent(MultiLanguageService.class) ;
return multiLanguageService.getSupportedLanguages(getNode()) ;
}
public String getTemplatePath() throws Exception {
return null;
}
public String getViewTemplate(String nodeTypeName, String templateName) throws Exception {
TemplateService tempServ = getApplicationComponent(TemplateService.class) ;
return tempServ.getTemplatePath(false, nodeTypeName, templateName) ;
}
public String getTemplateSkin(String nodeTypeName, String skinName) throws Exception {
TemplateService tempServ = getApplicationComponent(TemplateService.class) ;
return tempServ.getSkinPath(nodeTypeName, skinName, getLanguage()) ;
}
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 ;
}
public String getWorkspaceName() throws Exception {
return getNode().getSession().getWorkspace().getName();
}
public boolean isNodeTypeSupported() {
try {
TemplateService templateService = getApplicationComponent(TemplateService.class);
return templateService.isManagedNodeType(getNodeType());
} catch (Exception e) {
return false;
}
}
public String getRepository() throws Exception{
return getAncestorOfType(UIJCRExplorer.class).getRepositoryName() ;
}
public String encodeHTML(String text) throws Exception {
return Utils.encodeHTML(text) ;
}
static public class ChangeLanguageActionListener extends EventListener<UIViewVersion>{
public void execute(Event<UIViewVersion> event) throws Exception {
UIViewVersion uiViewVersion = event.getSource() ;
UIApplication uiApp = uiViewVersion.getAncestorOfType(UIApplication.class) ;
uiApp.addMessage(new ApplicationMessage("UIViewVersion.msg.not-supported", null)) ;
return ;
}
}
static public class DownloadActionListener extends EventListener<UIViewVersion> {
public void execute(Event<UIViewVersion> event) throws Exception {
UIViewVersion uiComp = event.getSource() ;
String downloadLink = uiComp.getDownloadLink(org.exoplatform.wcm.webui.Utils.getFileLangNode(uiComp.getNode()));
RequireJS requireJS = event.getRequestContext().getJavascriptManager().getRequireJS();
requireJS.require("SHARED/ecm-utils", "ecmutil").addScripts("ecmutil.ECMUtils.ajaxRedirect('" + downloadLink + "');");
}
}
static public class ChangeNodeActionListener extends EventListener<UIViewVersion> {
public void execute(Event<UIViewVersion> event) throws Exception {
UIViewVersion uiViewVersion = event.getSource() ;
UIApplication uiApp = uiViewVersion.getAncestorOfType(UIApplication.class) ;
uiApp.addMessage(new ApplicationMessage("UIViewVersion.msg.not-supported", null)) ;
return ;
}
}
public UIComponent getUIComponent(String mimeType) throws Exception {
return Utils.getUIComponent(mimeType, this);
}
public boolean isEnableComment() {
return false;
}
public boolean isEnableVote() {
return false;
}
public void setEnableComment(boolean value) {
}
public void setEnableVote(boolean value) {
}
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);
}
}