/*
* 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.wcm.webui.clv;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.MissingResourceException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.portlet.PortletPreferences;
import javax.portlet.PortletRequest;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.commons.utils.PageList;
import org.exoplatform.container.PortalContainer;
import org.exoplatform.ecm.utils.text.Text;
import org.exoplatform.ecm.utils.lock.LockUtil;
import org.exoplatform.portal.mop.SiteType;
import org.exoplatform.portal.webui.container.UIContainer;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.resolver.ResourceResolver;
import org.exoplatform.services.cms.documents.TrashService;
import org.exoplatform.services.cms.folksonomy.NewFolksonomyService;
import org.exoplatform.services.ecm.publication.PublicationService;
import org.exoplatform.services.jcr.access.PermissionType;
import org.exoplatform.services.jcr.core.ExtendedNode;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.services.wcm.core.WebSchemaConfigService;
import org.exoplatform.services.wcm.friendly.FriendlyService;
import org.exoplatform.services.wcm.publication.PublicationDefaultStates;
import org.exoplatform.services.wcm.publication.WCMComposer;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.services.wcm.webcontent.WebContentSchemaHandler;
import org.exoplatform.wcm.webui.Utils;
import org.exoplatform.wcm.webui.administration.UIEditingForm;
import org.exoplatform.wcm.webui.paginator.UICustomizeablePaginator;
import org.exoplatform.wcm.webui.reader.ContentReader;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.web.application.JavascriptManager;
import org.exoplatform.web.url.navigation.NavigationResource;
import org.exoplatform.web.url.navigation.NodeURL;
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.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPageIterator;
import org.exoplatform.webui.core.lifecycle.Lifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
/*
* Created by The eXo Platform SAS Author : Anh Do Ngoc anh.do@exoplatform.com
* Oct 21, 2008
*/
/**
* The Class UICLVPresentation.
*/
@SuppressWarnings("deprecation")
@ComponentConfigs( {
@ComponentConfig(lifecycle = Lifecycle.class, events = {
@EventConfig(listeners = UICLVPresentation.RefreshActionListener.class),
@EventConfig(listeners = UICLVPresentation.DeleteContentActionListener.class,
confirm = "UICLVPresentation.msg.confirm-delete"),
@EventConfig(listeners = UICLVPresentation.FastPublishActionListener.class) }),
@ComponentConfig(type = UICustomizeablePaginator.class,
events = @EventConfig(listeners = UICustomizeablePaginator.ShowPageActionListener.class)) })
public class UICLVPresentation extends UIContainer {
public static final String defaultScvParam = "content-id";
private static final Log LOG = ExoLogger.getLogger(UICLVPresentation.class.getName());
/** The template path. */
private String templatePath;
/** The resource resolver. */
private ResourceResolver resourceResolver;
/** The ui paginator. */
private UICustomizeablePaginator uiPaginator;
/** The date formatter. */
private DateFormat dateFormatter = null;
/** Generic TagStyles configurable in ECM Administration */
private Map<String, String> tagStyles = null;
/**
* Instantiates a new uICLV presentation.
*/
public UICLVPresentation() {
}
/**
* Init portlet information.
*
* @param resourceResolver the resource resolver
* @param dataPageList the data page list
* @throws Exception the exception
*/
public void init(ResourceResolver resourceResolver, PageList dataPageList) throws Exception {
String paginatorTemplatePath = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_PAGINATOR_TEMPLATE);
this.templatePath = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_DISPLAY_TEMPLATE);
this.resourceResolver = resourceResolver;
uiPaginator = addChild(UICustomizeablePaginator.class, null, null);
uiPaginator.setTemplatePath(paginatorTemplatePath);
uiPaginator.setResourceResolver(resourceResolver);
uiPaginator.setPageList(dataPageList);
Locale locale = Util.getPortalRequestContext().getLocale();
dateFormatter = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.MEDIUM,
SimpleDateFormat.MEDIUM,
locale);
}
public List<CategoryBean> getCategories() throws Exception {
String fullPath = this.getAncestorOfType(UICLVPortlet.class).getFolderPath();
return getCategories(fullPath, "exo:taxonomy", 0);
}
public List<CategoryBean> getCategories(String primaryType) throws Exception {
String fullPath = this.getAncestorOfType(UICLVPortlet.class).getFolderPath();
return getCategories(fullPath, primaryType, 0);
}
public List<CategoryBean> getCategories(boolean withChildren) throws Exception {
String fullPath = this.getAncestorOfType(UICLVPortlet.class).getFolderPath();
return getCategories(fullPath, "exo:taxonomy", 0, withChildren);
}
public List<CategoryBean> getCategories(String fullPath, String primaryType, int depth) throws Exception {
return getCategories(fullPath, primaryType, depth, true);
}
public List<CategoryBean> getCategories(String fullPath, String primaryType, int depth, boolean withChildren) throws Exception {
if (fullPath == null || fullPath.length() == 0) {
return null;
}
WCMComposer wcmComposer = getApplicationComponent(WCMComposer.class);
HashMap<String, String> filters = new HashMap<String, String>();
filters.put(WCMComposer.FILTER_MODE, Utils.getCurrentMode());
String orderType = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ORDER_TYPE);
String orderBy = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ORDER_BY);
// orderType = "ASC";
// orderBy = "jcr:path";
filters.put(WCMComposer.FILTER_ORDER_BY, orderBy);
filters.put(WCMComposer.FILTER_ORDER_TYPE, orderType);
filters.put(WCMComposer.FILTER_LANGUAGE, Util.getPortalRequestContext()
.getLocale()
.getLanguage());
// filters.put(WCMComposer.FILTER_RECURSIVE, "true");
filters.put(WCMComposer.FILTER_PRIMARY_TYPE, primaryType);
String clvBy = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_SHOW_CLV_BY);
/* Allows us to know the current selected node */
String paramPath = Util.getPortalRequestContext().getRequestParameter(clvBy);
NodeLocation nodeLocation = NodeLocation.getNodeLocationByExpression(fullPath);
List<Node> nodes = wcmComposer.getContents(nodeLocation.getWorkspace(),
nodeLocation.getPath(),
filters,
WCMCoreUtils.getUserSessionProvider());
List<CategoryBean> categories = new LinkedList<CategoryBean>();
for (Node node : nodes) {
String title = getTitle(node);
String url = getCategoryURL(node);
String path = node.getPath();
long total = (node.hasProperty("exo:total")) ? node.getProperty("exo:total")
.getValue()
.getLong() : 0;
boolean isSelected = paramPath != null && paramPath.endsWith(path);
CategoryBean cat = new CategoryBean(node.getName(),
node.getPath(),
title,
url,
isSelected,
depth,
total);
NodeLocation catLocation = NodeLocation.getNodeLocationByNode(node);
if (withChildren) {
List<CategoryBean> childs = getCategories(catLocation.toString(), primaryType, depth + 1);
if (childs != null && childs.size() > 0)
cat.setChilds(childs);
}
// System.out.println(cat.getName()+"::"+cat.getPath()+"::"+cat.getTitle()+"::"+cat.isSelected()+"::"+cat.getDepth());
categories.add(cat);
}
return categories;
}
public String getTagHtmlStyle(long tagCount) throws Exception {
for (Entry<String, String> entry : getTagStyles().entrySet()) {
if (checkTagRate(tagCount, entry.getKey()))
return entry.getValue();
}
return "";
}
private Map<String, String> getTagStyles() throws Exception {
if (tagStyles == null) {
NewFolksonomyService folksonomyService = getApplicationComponent(NewFolksonomyService.class);
String workspace = "dms-system";
tagStyles = new HashMap<String, String>();
for (Node tag : folksonomyService.getAllTagStyle(workspace)) {
tagStyles.put(tag.getProperty("exo:styleRange").getValue().getString(),
tag.getProperty("exo:htmlStyle").getValue().getString());
}
}
return tagStyles;
}
private boolean checkTagRate(long numOfDocument, String range) throws Exception {
String[] vals = StringUtils.split(range, "..");
int minValue = Integer.parseInt(vals[0]);
int maxValue;
if (vals[1].equals("*")) {
maxValue = Integer.MAX_VALUE;
} else {
maxValue = Integer.parseInt(vals[1]);
}
if (minValue <= numOfDocument && numOfDocument < maxValue)
return true;
return false;
}
/**
* Gets the uRL.
*
* @param node the node
* @return the uRL
* @throws Exception the exception
*/
public String getCategoryURL(Node node) throws Exception {
String link = null;
PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
PortletRequest portletRequest = portletRequestContext.getRequest();
NodeLocation nodeLocation = NodeLocation.getNodeLocationByNode(node);
String baseURI = portletRequest.getScheme() + "://" + portletRequest.getServerName() + ":"
+ String.format("%s", portletRequest.getServerPort());
String basePath = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_TARGET_PAGE);
String clvBy = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_SHOW_CLV_BY);
if (clvBy == null || clvBy.length() == 0)
clvBy = UICLVPortlet.DEFAULT_SHOW_CLV_BY;
String params = nodeLocation.getRepository() + ":" + nodeLocation.getWorkspace() +":"+ node.getPath();
NodeURL nodeURL = Util.getPortalRequestContext().createURL(NodeURL.TYPE);
NavigationResource resource = new NavigationResource(SiteType.PORTAL,
Util.getPortalRequestContext()
.getPortalOwner(), basePath);
nodeURL.setResource(resource).setQueryParameterValue(clvBy, params);
link = baseURI + nodeURL.toString();
FriendlyService friendlyService = getApplicationComponent(FriendlyService.class);
link = friendlyService.getFriendlyUri(link);
return link;
}
/**
* Checks if is show field.
*
* @param field the field
* @return true, if is show field
*/
public boolean isShowField(String field) {
String visible = Utils.getPortletPreference(field);
return (visible != null) ? Boolean.parseBoolean(visible) : false;
}
/**
* Show paginator.
*
* @return true, if successful
* @throws Exception the exception
*/
public boolean showPaginator() throws Exception {
String itemsPerPage = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ITEMS_PER_PAGE);
int totalItems = uiPaginator.getTotalItems();
if (totalItems > Integer.parseInt(itemsPerPage)) {
return true;
}
return false;
}
/*
* (non-Javadoc)
* @see org.exoplatform.portal.webui.portal.UIPortalComponent#getTemplate()
*/
public String getTemplate() {
return templatePath;
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.webui.core.UIComponent#getTemplateResourceResolver(org.
* exoplatform.webui.application.WebuiRequestContext, java.lang.String)
*/
public ResourceResolver getTemplateResourceResolver(WebuiRequestContext context, String template) {
return resourceResolver;
}
/**
* Gets the title.
*
* @param node the node
* @return the title
* @throws Exception the exception
*/
public String getTitle(Node node) throws Exception {
String title = null;
if (node.hasProperty("exo:title")) {
title = node.getProperty("exo:title").getValue().getString();
} else if (node.hasNode("jcr:content")) {
Node content = node.getNode("jcr:content");
if (content.hasProperty("dc:title")) {
try {
title = content.getProperty("dc:title").getValues()[0].getString();
} catch (Exception ex) {
// Do nothing
}
}
}
if (title == null) {
if (node.isNodeType("nt:frozenNode")) {
String uuid = node.getProperty("jcr:frozenUuid").getString();
Node originalNode = node.getSession().getNodeByUUID(uuid);
title = originalNode.getName();
} else {
title = node.getName();
}
}
return ContentReader.getXSSCompatibilityContent(title);
}
/**
* Gets the summary.
*
* @param node the node
* @return the summary
* @throws Exception the exception
*/
public String getSummary(Node node) throws Exception {
String desc = null;
if (node.hasProperty("exo:summary")) {
desc = node.getProperty("exo:summary").getValue().getString();
} else if (node.hasNode("jcr:content")) {
Node content = node.getNode("jcr:content");
if (content.hasProperty("dc:description")) {
try {
desc = ContentReader.getXSSCompatibilityContent(content.getProperty("dc:description").getValues()[0].getString());
} catch (Exception ex) {
return null;
}
}
}
return desc;
}
public static 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 getSummaryField(Node node) throws Exception {
String desc = null;
if (node.hasProperty("exo:summary")) {
return "exo:summary";
} else if (node.hasNode("jcr:content")) {
Node content = node.getNode("jcr:content");
if (content.hasProperty("dc:description")) {
try {
desc = content.getProperty("dc:description").getValues()[0].getString();
return "jcr:content/dc:description";
} catch (Exception ex) {
return null;
}
}
}
return desc;
}
/**
* Gets the uRL.
*
* @param node the node
* @return the uRL
* @throws Exception the exception
*/
public String getURL(Node node) throws Exception {
String link = null;
NodeLocation nodeLocation = NodeLocation.getNodeLocationByNode(node);
String basePath = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_TARGET_PAGE);
String scvWith = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_SHOW_SCV_WITH);
if (scvWith == null || scvWith.length() == 0)
scvWith = UICLVPortlet.DEFAULT_SHOW_SCV_WITH;
StringBuffer sb = new StringBuffer();
sb.append("/")
.append(nodeLocation.getRepository())
.append("/")
.append(nodeLocation.getWorkspace());
if (node.isNodeType("nt:frozenNode")) {
String uuid = node.getProperty("jcr:frozenUuid").getString();
Node originalNode = node.getSession().getNodeByUUID(uuid);
sb.append(originalNode.getPath());
} else {
sb.append(node.getPath());
}
String param = sb.toString();
param = Text.escapeIllegalJcrChars(param);
NodeURL nodeURL = Util.getPortalRequestContext().createURL(NodeURL.TYPE);
NavigationResource resource = new NavigationResource(SiteType.PORTAL,
Util.getPortalRequestContext()
.getPortalOwner(), basePath);
nodeURL.setResource(resource).setQueryParameterValue(scvWith, param);
String fullPath = this.getAncestorOfType(UICLVPortlet.class).getFolderPathParamValue();
if (fullPath != null) {
String clvBy = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_SHOW_CLV_BY);
nodeURL.setQueryParameterValue(clvBy, fullPath);
}
link = nodeURL.toString();
FriendlyService friendlyService = getApplicationComponent(FriendlyService.class);
link = friendlyService.getFriendlyUri(link);
return link;
}
/**
* Gets the webdav url.
*
* @param node the node
* @return the webdav url
* @throws Exception the exception
*/
public String getWebdavURL(Node node) throws Exception {
NodeLocation nodeLocation = NodeLocation.getNodeLocationByNode(node);
String repository = nodeLocation.getRepository();
String workspace = nodeLocation.getWorkspace();
FriendlyService friendlyService = getApplicationComponent(FriendlyService.class);
String link = "#";// friendlyService.getFriendlyUri(link);
String portalName = PortalContainer.getCurrentPortalContainerName();
String restContextName = PortalContainer.getCurrentRestContextName();
if (node.isNodeType("nt:frozenNode")) {
String uuid = node.getProperty("jcr:frozenUuid").getString();
Node originalNode = node.getSession().getNodeByUUID(uuid);
link = "/" + portalName + "/" + restContextName + "/jcr/" + repository + "/"
+ workspace + originalNode.getPath() + "?version=" + node.getParent().getName();
} else {
link = "/" + portalName + "/" + restContextName + "/jcr/" + repository + "/"
+ workspace + node.getPath();
}
return friendlyService.getFriendlyUri(link);
}
/**
* Gets the author.
*
* @param node the node
* @return the author
* @throws Exception the exception
*/
public String getAuthor(Node node) throws Exception {
if (node.hasProperty("exo:owner")) {
String ownerId = node.getProperty("exo:owner").getValue().getString();
return ownerId;
}
return null;
}
/**
* Gets the created date.
*
* @param node the node
* @return the created date
* @throws Exception the exception
*/
public String getCreatedDate(Node node) throws Exception {
if (node.hasProperty("exo:dateCreated")) {
Calendar calendar = node.getProperty("exo:dateCreated").getValue().getDate();
if (calendar!=null) {
return dateFormatter.format(calendar.getTime());
}
}
return null;
}
/**
* Gets the modified date.
*
* @param node the node
* @return the modified date
* @throws Exception the exception
*/
public String getModifiedDate(Node node) throws Exception {
if (node.hasProperty("exo:dateModified")) {
Calendar calendar = node.getProperty("exo:dateModified").getValue().getDate();
return dateFormatter.format(calendar.getTime());
}
return null;
}
/**
* Gets the content icon.
*
* @param node the node
* @return the content icon
*/
public String getContentIcon(Node node) {
try {
if (node.isNodeType("nt:frozenNode")) {
String uuid = node.getProperty("jcr:frozenUuid").getString();
Node originalNode = node.getSession().getNodeByUUID(uuid);
return org.exoplatform.ecm.webui.utils.Utils.getNodeTypeIcon(originalNode, "uiIcon16x16");
}
return org.exoplatform.ecm.webui.utils.Utils.getNodeTypeIcon(node, "uiIcon16x16");
} catch (RepositoryException e) {
Utils.createPopupMessage(this,
"UIMessageBoard.msg.get-content-icon",
null,
ApplicationMessage.ERROR);
}
return null;
}
public String getHeader() {
String header = this.getAncestorOfType(UICLVPortlet.class).getHeader();
if(header == null)
header = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_HEADER);
return header;
}
public UIPageIterator getUIPageIterator() {
return uiPaginator;
}
public List getCurrentPageData() throws Exception {
return NodeLocation.getNodeListByLocationList(uiPaginator.getCurrentPageData());
}
public void setDateTimeFormat(String format) {
((SimpleDateFormat) dateFormatter).applyPattern(format);
}
public String getEditLink(Node node, boolean isEditable, boolean isNew) {
return Utils.getEditLink(node, isEditable, isNew);
}
public boolean isShowEdit(Node node) {
if (Utils.isShowQuickEdit()) {
try {
Node parent = node.getParent();
((ExtendedNode) node).checkPermission(PermissionType.SET_PROPERTY);
((ExtendedNode) parent).checkPermission(PermissionType.ADD_NODE);
} catch (Exception e) {
return false;
}
return true;
}
return false;
}
public boolean isViewMode() {
return Utils.getCurrentMode().equals(WCMComposer.MODE_LIVE);
}
/**
* Gets the illustrative image.
*
* @param node the node
* @return the illustrative image
*/
public String getIllustrativeImage(Node node) {
WebSchemaConfigService schemaConfigService = getApplicationComponent(WebSchemaConfigService.class);
WebContentSchemaHandler contentSchemaHandler = schemaConfigService.getWebSchemaHandlerByType(WebContentSchemaHandler.class);
Node illustrativeImage = null;
String uri = null;
try {
illustrativeImage = contentSchemaHandler.getIllustrationImage(node);
uri = WCMCoreUtils.generateImageURI(illustrativeImage, null);
} catch (PathNotFoundException ex) {
// We don't do anything here because so many documents doesn't have
// illustration image
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage(), e);
}
}
return uri;
}
public boolean isShowRssLink() {
if (getUIPageIterator().getAvailable() == 0) {
return false;
}
PortletPreferences portletPreferences = Utils.getAllPortletPreferences();
String currentApplicationMode = portletPreferences.getValue(UICLVPortlet.PREFERENCE_APPLICATION_TYPE, null);
if (currentApplicationMode.equals(UICLVPortlet.APPLICATION_CLV_BY_QUERY))
return false;
return isShowField(UICLVPortlet.PREFERENCE_SHOW_RSSLINK)
&& (this.getAncestorOfType(UICLVPortlet.class).getFolderPathParamValue() != null
|| UICLVPortlet.DISPLAY_MODE_AUTOMATIC.equals(Utils.getPortletPreference(UICLVPortlet.PREFERENCE_DISPLAY_MODE)));
}
public String getFastPublicLink(Node viewNode) {
String fastPublishLink = null;
try {
fastPublishLink = event("FastPublish", NodeLocation.getExpressionByNode(viewNode));
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
return fastPublishLink;
}
/**
* Gets the rss link.
*
* @return the rss link
*/
public String getRssLink() {
String portal = PortalContainer.getCurrentPortalContainerName();
String rest = PortalContainer.getCurrentRestContextName();
String server = Util.getPortalRequestContext().getRequest().getRequestURL().toString();
int lastIndex = server.indexOf(portal);
server = server.substring(0, lastIndex-1) + Util.getPortalRequestContext().getPortalURI();
String fullPath = this.getAncestorOfType(UICLVPortlet.class).getFolderPathParamValue();
if (fullPath == null || fullPath.length() == 0)
fullPath = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ITEM_PATH);
if (fullPath == null)
return "/" + portal + "/" + rest + "&siteName=" + Util.getUIPortal().getSiteKey().getName() + "&orderBy="
+ Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ORDER_BY) + "&orderType="
+ Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ORDER_TYPE) + "&detailPage="
+ Utils.getPortletPreference(UICLVPortlet.PREFERENCE_TARGET_PAGE) + "&detailParam="
+ Utils.getPortletPreference(UICLVPortlet.PREFERENCE_SHOW_SCV_WITH);
String[] repoWsPath = fullPath.split(":");
return "/" + portal + "/" + rest + "/feed/rss?repository=" + repoWsPath[0] + "&workspace="
+ repoWsPath[1] + "&server=" + server + "&siteName=" + Util.getUIPortal().getSiteKey().getName()
+ "&folderPath=" + repoWsPath[2] + "&orderBy="
+ Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ORDER_BY)
+ "&orderType="
+ Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ORDER_TYPE)
+
// "&title="
// "&desc="My%20description
"&detailPage=" + Utils.getPortletPreference(UICLVPortlet.PREFERENCE_TARGET_PAGE)
+ "&detailParam=" + Utils.getPortletPreference(UICLVPortlet.PREFERENCE_SHOW_SCV_WITH);
}
/**
* This method will put the mandatory html code to manage QuickEdit mode
*
* @param cssClass
* @param viewNode
* @return
* @throws Exception
*/
public String addQuickEditDiv(String cssClass, Node viewNode) throws Exception {
StringBuffer sb = new StringBuffer();
String id = this.getClass().getSimpleName() + System.currentTimeMillis();
PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
sb.append("<div id=\""+id+"\" class=\"" + cssClass + " \">");
if (Utils.isShowQuickEdit()) {
sb.append(" <div class=\"edittingContent\" style=\" z-index: 5\">");
sb.append(" <div class=\"edittingToolBar clearfix\" >");
sb.append(" <div class=\"btn-group\" >");
if (isShowEdit(viewNode) && !LockUtil.isLocked(viewNode)) {
String strEditBundle = "Edit in the Content Explorer";
try {
strEditBundle = portletRequestContext.getApplicationResourceBundle()
.getString("UICLVPresentation.action.edit");
} catch (MissingResourceException e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
if (org.exoplatform.wcm.webui.utils.Utils.isShowFastPublish(viewNode)) {
String fastPublishLink = event("FastPublish", NodeLocation.getExpressionByNode(viewNode));
String strFastPublishBundle = "Publish";
try {
strFastPublishBundle = portletRequestContext.getApplicationResourceBundle()
.getString("UICLVPresentation.action.publish");
} catch (MissingResourceException e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
sb.append(" <a class=\"btn\" href=\"" + fastPublishLink + "\" rel=\"tooltip\" data-placement=\"left\" title=\"" + strFastPublishBundle + "\">");
sb.append(" <i class=\"uiIconEcmsPublish\" ></i>");
sb.append(" </a>");
}
String contentEditLink = getEditLink(viewNode, true, false);
sb.append(" <a class=\"btn\" onclick = 'eXo.ecm.CLV.addURL(this)' href=\"" + contentEditLink + "\" rel=\"tooltip\" data-placement=\"left\" title=\"" + strEditBundle + "\">");
sb.append(" <i class=\"uiIconEdit\"></i>");
sb.append(" </a>");
} else {
sb.append(" <a class=\"btn\" >");
sb.append(" <i class=\"uiIconEcmsLock\" ></i>");
sb.append(" </a>");
}
if (Utils.isShowDelete(viewNode)) {
String contentDeleteLink = event("DeleteContent", NodeLocation.getExpressionByNode(viewNode));
String strDeleteBundle = "Delete";
try {
strDeleteBundle = portletRequestContext.getApplicationResourceBundle()
.getString("UICLVPresentation.action.delete");
} catch (MissingResourceException e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
sb.append(" <a class=\"btn\" href=\"" + contentDeleteLink + "\" rel=\"tooltip\" data-placement=\"left\" title=\"" + strDeleteBundle + "\">");
sb.append(" <i class=\"uiIconRemove\"></i>");
sb.append(" </a>");
}
sb.append(" </div>");
if (viewNode.hasProperty("publication:currentState")) {
PublicationService publicationService = WCMCoreUtils.getService(PublicationService.class);
String state = publicationService.getCurrentState(viewNode);
String stateLabel="";
try {
stateLabel = portletRequestContext.getApplicationResourceBundle()
.getString("PublicationStates." + state);
} catch (MissingResourceException e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
sb.append("<div class=\"edittingCurrentState pull-left\">");
sb.append("<span class=\""+state+"Text\">");
if(PublicationDefaultStates.PUBLISHED.equals(state)) sb.append("<i class=\"uiIconTick\"></i>");
sb.append(stateLabel + "</span>");
sb.append(" </div>");
}
sb.append(" </div>");
sb.append(" </div>");
}
String className = cssClass + " " + this.getAncestorOfType(UICLVPortlet.class).getName();
String hoverClass = Utils.isShowQuickEdit() ? " containerHoverClassInner" : "";
JavascriptManager jsManager = portletRequestContext.getJavascriptManager();
jsManager.getRequireJS()
.require("SHARED/jquery", "gj")
.addScripts("gj('#" + id
+ "').mouseenter( function() {eXo.ecm.WCMUtils.changeStyleClass('" + id + "','"
+ className + " " + hoverClass + "');});")
.addScripts("gj('#" + id
+ "').mouseleave( function() {eXo.ecm.WCMUtils.changeStyleClass('" + id + "',"
+ "'" + className + "');});");
return sb.toString();
}
public String getBackLink (String currentPath) {
String preferencePath = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ITEM_PATH);
String targetPage = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_TARGET_PAGE);
NodeURL nodeURL = Util.getPortalRequestContext().createURL(NodeURL.TYPE);
NavigationResource resource = new NavigationResource(SiteType.PORTAL,
Util.getPortalRequestContext()
.getPortalOwner(), targetPage);
nodeURL.setResource(resource);
if (currentPath.contains(preferencePath)) {
String treePath = currentPath.substring(preferencePath.length() + 1);
String[] treeNodes = treePath.split("/");
if (treeNodes.length > 1) {
String paramPath = currentPath.substring(0, currentPath.lastIndexOf("/"));
String clvBy = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_SHOW_CLV_BY);
nodeURL.setQueryParameterValue(clvBy, paramPath);
}
}
return nodeURL.toString();
}
/**
* The listener interface for receiving refreshAction events. The class that
* is interested in processing a refreshAction event implements this
* interface, and the object created with that class is registered with a
* component using the component's
* <code>addRefreshActionListener</code> method. When
* the refreshAction event occurs, that object's appropriate
* method is invoked.
*/
public static class RefreshActionListener extends EventListener<UICLVPresentation> {
/*
* (non-Javadoc)
* @see
* org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui
* .event.Event)
*/
public void execute(Event<UICLVPresentation> event) throws Exception {
UICLVPresentation clvPresentation = event.getSource();
clvPresentation.getAncestorOfType(UICLVContainer.class).onRefresh(event);
}
}
public static class DeleteContentActionListener extends EventListener<UICLVPresentation> {
/*
* (non-Javadoc)
* @see
* org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui
* .event.Event)
*/
public void execute(Event<UICLVPresentation> event) throws Exception {
String itemPath = event.getRequestContext().getRequestParameter(OBJECTID);
Node node = NodeLocation.getNodeByExpression(itemPath);
Node parent = node.getParent();
TrashService trashService = WCMCoreUtils.getService(TrashService.class);
trashService.moveToTrash(node, WCMCoreUtils.getUserSessionProvider());
parent.getSession().save();
event.getRequestContext().getJavascriptManager().getRequireJS().addScripts("location.reload(true);");
}
}
public static class FastPublishActionListener extends EventListener<UICLVPresentation> {
/*
* (non-Javadoc)
* @see
* org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui
* .event.Event)
*/
public void execute(Event<UICLVPresentation> event) throws Exception {
UICLVPresentation contentListPresentation = event.getSource();
String nodePath = event.getRequestContext().getRequestParameter(OBJECTID);
Node node = NodeLocation.getNodeByExpression(Text.escapeIllegalJcrChars(nodePath));
PublicationService publicationService = WCMCoreUtils.getService(PublicationService.class);
if (node.isLocked()) {
node.getSession().addLockToken(LockUtil.getLockToken(node));
}
HashMap<String, String> context = new HashMap<String, String>();
publicationService.changeState(node, "published", context);
event.getRequestContext().getJavascriptManager().getRequireJS().addScripts("location.reload(true);");
}
}
}