/*
* 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.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import javax.jcr.ItemNotFoundException;
import javax.jcr.NoSuchWorkspaceException;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.portlet.MimeResponse;
import javax.portlet.PortletMode;
import javax.portlet.PortletPreferences;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.services.wcm.core.WCMService;
import org.exoplatform.services.wcm.publication.WCMComposer;
import org.exoplatform.wcm.webui.Utils;
import org.exoplatform.webui.application.WebuiApplication;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.core.UIPopupContainer;
import org.exoplatform.webui.core.UIPortletApplication;
import org.exoplatform.webui.core.lifecycle.UIApplicationLifecycle;
import org.gatein.portal.controller.resource.ResourceScope;
/*
* Created by The eXo Platform SAS Author : Anh Do Ngoc anh.do@exoplatform.com
* Oct 15, 2008
*/
/**
* The Class UICLVPortlet.
*/
@ComponentConfig(lifecycle = UIApplicationLifecycle.class, template = "system:/groovy/ContentListViewer/UICLVPortlet.gtmpl")
public class UICLVPortlet extends UIPortletApplication {
/** The Constant PREFERENCE_DISPLAY_MODE. */
public static final String PREFERENCE_DISPLAY_MODE = "mode";
/** The Constant PREFERENCE_ITEM_PATH. */
public final static String PREFERENCE_ITEM_PATH = "folderPath";
/** The Constant PREFERENCE_ITEM_PATH. */
public final static String PREFERENCE_ITEM_DRIVE = "nodeDrive";
/** The Constant PREFERENCE_ORDER_BY. */
public static final String PREFERENCE_ORDER_BY = "orderBy";
/** The Constant ORDER_BY_TITLE. */
public static final String ORDER_BY_TITLE = "OrderByTitle";
/** The Constant ORDER_BY_DATE_CREATED. */
public static final String ORDER_BY_DATE_CREATED = "OrderByDateCreated";
/** The Constant ORDER_BY_DATE_MODIFIED. */
public static final String ORDER_BY_DATE_MODIFIED = "OrderByDateModified";
/** The Constant ORDER_BY_DATE_PUBLISHED. */
public static final String ORDER_BY_DATE_PUBLISHED = "OrderByDatePublished";
/** The Constant ORDER_BY_DATE_START_EVENT. */
public static final String ORDER_BY_DATE_START_EVENT = "OrderByDateStartEvent";
/** The Constant ORDER_BY_INDEX. */
public static final String ORDER_BY_INDEX = "OrderByIndex";
/** The Constant PREFERENCE_ORDER_TYPE. */
public static final String PREFERENCE_ORDER_TYPE = "orderType";
/** The Constant ORDER_TYPE_DESCENDENT. */
public static final String ORDER_TYPE_DESCENDENT = "OrderDesc";
/** The Constant ORDER_TYPE_ASCENDENT. */
public static final String ORDER_TYPE_ASCENDENT = "OrderAsc";
/** The Constant PREFERENCE_HEADER. */
public final static String PREFERENCE_HEADER = "header";
/** The Constant PREFERENCE_AUTOMATIC_DETECTION. */
public final static String PREFERENCE_AUTOMATIC_DETECTION = "automaticDetection";
/** The Constant PREFERENCE_DISPLAY_TEMPLATE. */
public final static String PREFERENCE_DISPLAY_TEMPLATE = "formViewTemplatePath";
/** The Constant PREFERENCE_PAGINATOR_TEMPLATE. */
public final static String PREFERENCE_PAGINATOR_TEMPLATE = "paginatorTemplatePath";
/** The Constant PREFERENCE_ITEMS_PER_PAGE. */
public final static String PREFERENCE_ITEMS_PER_PAGE = "itemsPerPage";
/** The Constant PREFERENCE_SHOW_TITLE. */
public final static String PREFERENCE_SHOW_TITLE = "showTitle";
/** The Constant PREFERENCE_SHOW_HEADER. */
public final static String PREFERENCE_SHOW_HEADER = "showHeader";
/** The Constant PREFERENCE_SHOW_REFRESH_BUTTON. */
public final static String PREFERENCE_SHOW_REFRESH_BUTTON = "showRefreshButton";
/** The Constant PREFERENCE_SHOW_ILLUSTRATION. */
/** The Constant PREFERENCE_SHOW_IMAGE. */
public final static String PREFERENCE_SHOW_ILLUSTRATION = "showThumbnailsView";
/** The Constant PREFERENCE_SHOW_DATE_CREATED. */
public final static String PREFERENCE_SHOW_DATE_CREATED = "showDateCreated";
/** The Constant PREFERENCE_SHOW_MORE_LINK. */
public final static String PREFERENCE_SHOW_READMORE = "showReadmore";
/** The Constant PREFERNECE_SHOW_SUMMARY. */
public final static String PREFERENCE_SHOW_SUMMARY = "showSummary";
/** The Constant PREFERENCE_SHOW_LINK. */
public final static String PREFERENCE_SHOW_LINK = "showLink";
/** The Constant PREFERENCE_SHOW_RSSLINK. */
public final static String PREFERENCE_SHOW_RSSLINK = "showRssLink";
/** The Constant PREFERENCE_CONTEXTUAL_FOLDER. */
public final static String PREFERENCE_CONTEXTUAL_FOLDER = "contextualFolder";
/** The Constant PREFERENCE_CONTEXTUAL_FOLDER_ENABLE. */
public final static String PREFERENCE_CONTEXTUAL_FOLDER_ENABLE = "contextualEnable";
/** The Constant PREFERENCE_CONTEXTUAL_FOLDER_DISABLE. */
public final static String PREFERENCE_CONTEXTUAL_FOLDER_DISABLE = "contextualDisable";
/** The Constant PREFERENCE_TARGET_PAGE. */
public final static String PREFERENCE_TARGET_PAGE = "basePath";
/** The Constant PREFERENCE_SHOW_SCL_WITH. */
public final static String PREFERENCE_SHOW_SCV_WITH = "showScvWith";
/** The Constant PREFERENCE_SHOW_CLV_BY. */
public final static String PREFERENCE_SHOW_CLV_BY = "showClvBy";
/** The Constant PREFERENCE_CACHE_ENABLED. */
public final static String PREFERENCE_CACHE_ENABLED = "sharedCache";
/** The Constant CONTENT_BY_QUERY. */
public final static String PREFERENCE_CONTENTS_BY_QUERY = "query";
/** The Constant PREFERENCE_WORKSPACE. */
public final static String PREFERENCE_WORKSPACE = "workspace";
/** The Constant DISPLAY_MODE_MANUAL. */
public static final String DISPLAY_MODE_MANUAL = "ManualViewerMode";
/** The Constant DISPLAY_MODE_AUTOMATIC. */
public static final String DISPLAY_MODE_AUTOMATIC = "AutoViewerMode";
public static final String DEFAULT_SHOW_CLV_BY = "folder-id";
public static final String DEFAULT_SHOW_SCV_WITH = "content-id";
public static final String PREFERENCE_APPLICATION_TYPE = "application";
public static final String APPLICATION_CLV_BY_QUERY = "ContentsByQuery";
public static final String PREFERENCE_SHARED_CACHE = "sharedCache";
/* Dynamic parameter for CLV by query */
public static final String QUERY_USER_PARAMETER = "user";
public static final String QUERY_LANGUAGE_PARAMETER = "lang";
private PortletMode cpMode;
private UICLVFolderMode folderMode;
private UICLVManualMode manualMode;
private UICLVConfig clvConfig;
private String currentFolderPath;
private String header;
private String currentDisplayMode;
private String currentApplicationMode;
/**
* Instantiates a new uICLV portlet.
*
* @throws Exception the exception
*/
public UICLVPortlet() throws Exception {
addChild(UIPopupContainer.class, null, "UIPopupContainer-" + new Date().getTime());
currentFolderPath = getFolderPath();
}
public String getHeader() {
return header;
}
public void setCurrentFolderPath(String value) {
currentFolderPath = value;
}
public String getFolderPath() {
PortalRequestContext preq = Util.getPortalRequestContext();
currentFolderPath = "";
if (!preq.useAjax()) {
currentFolderPath = getFolderPathParamValue();
}
try {
if (currentFolderPath != null && currentFolderPath.length() > 0) {
Node folderNode = null;
NodeLocation folderLocation = NodeLocation.getNodeLocationByExpression(currentFolderPath);
folderNode = NodeLocation.getNodeByLocation(folderLocation);
if (folderNode == null) {
header = null;
} else {
if (folderNode.hasProperty(org.exoplatform.ecm.webui.utils.Utils.EXO_TITLE))
header = folderNode.getProperty(org.exoplatform.ecm.webui.utils.Utils.EXO_TITLE).getString();
else header = folderNode.getName();
}
} else header = null;
} catch(IllegalArgumentException ex) {
header = null;
} catch(ItemNotFoundException ex) {
header = null;
} catch(PathNotFoundException ex) {
header = null;
} catch(NoSuchWorkspaceException ex) {
header = null;
} catch(RepositoryException ex) {
header = null;
}
PortletPreferences preferences = Utils.getAllPortletPreferences();
currentDisplayMode = preferences.getValue(PREFERENCE_DISPLAY_MODE, null);
currentApplicationMode = preferences.getValue(PREFERENCE_APPLICATION_TYPE, null);
if (DISPLAY_MODE_AUTOMATIC.equals(currentDisplayMode)) {
if (currentFolderPath == null || currentFolderPath.length() == 0) {
currentFolderPath = Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ITEM_PATH);
}
}
return currentFolderPath;
}
public String getFolderPathParamValue() {
PortletPreferences preferences = Utils.getAllPortletPreferences();
String contextualMode = preferences.getValue(PREFERENCE_CONTEXTUAL_FOLDER, null);
Node folderNode = null;
String folderPath = null;
if (PREFERENCE_CONTEXTUAL_FOLDER_ENABLE.equals(contextualMode)) {
String folderParamName = preferences.getValue(PREFERENCE_SHOW_CLV_BY, null);
if (folderParamName == null || folderParamName.length() == 0)
folderParamName = DEFAULT_SHOW_CLV_BY;
folderPath = Util.getPortalRequestContext().getRequestParameter(folderParamName);
try {
NodeLocation folderLocation = NodeLocation.getNodeLocationByExpression(folderPath);
folderNode = NodeLocation.getNodeByLocation(folderLocation);
if (folderNode == null)
return null;
} catch (Exception e) {
folderNode = null;
folderPath = null;
}
}
return folderPath;
}
/**
*
* @param params
* @return
*/
public HashMap<String, String> getQueryParammeter(HashSet<String> params) {
HashMap<String, String> paramMap = new HashMap<String, String>();
PortalRequestContext context = Util.getPortalRequestContext();
for (String param : params) {
String value = context.getRequestParameter(param);
if (value != null) {
paramMap.put(param, value);
} else {
paramMap.put(param, "");
}
}
paramMap.put(UICLVPortlet.QUERY_USER_PARAMETER, context.getRemoteUser());
paramMap.put(UICLVPortlet.QUERY_LANGUAGE_PARAMETER, context.getLocale().getLanguage());
return paramMap;
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.webui.core.UIPortletApplication#processRender(org.exoplatform
* .webui.application.WebuiApplication,
* org.exoplatform.webui.application.WebuiRequestContext)
*/
public void processRender(WebuiApplication app, WebuiRequestContext context) throws Exception {
PortletRequestContext pContext = (PortletRequestContext) context;
PortletPreferences preferences = pContext.getRequest().getPreferences();
Boolean sharedCache = "true".equals(preferences.getValue(PREFERENCE_SHARED_CACHE, "true"));
if (context.getRemoteUser() == null
|| (Utils.isLiveMode() && sharedCache && !Utils.isPortalEditMode() && Utils.isPortletViewMode(pContext))) {
WCMService wcmService = getApplicationComponent(WCMService.class);
pContext.getResponse().setProperty(MimeResponse.EXPIRATION_CACHE,
"" + wcmService.getPortletExpirationCache());
if (log.isTraceEnabled())
log.trace("CLV rendering : cache set to " + wcmService.getPortletExpirationCache());
}
String nDisplayMode = preferences.getValue(PREFERENCE_DISPLAY_MODE, null);
PortletMode npMode = pContext.getApplicationMode();
if (!nDisplayMode.equals(currentDisplayMode)) {
activateMode(npMode, nDisplayMode);
} else {
if (!npMode.equals(cpMode)) {
activateMode(npMode, nDisplayMode);
}
}
setId(UICLVPortlet.class.getSimpleName() + "_" + pContext.getWindowId());
if (context.getRemoteUser() != null && WCMComposer.MODE_EDIT.equals(Utils.getCurrentMode())) {
pContext.getJavascriptManager().loadScriptResource(ResourceScope.SHARED, "content-selector");
pContext.getJavascriptManager().loadScriptResource(ResourceScope.SHARED, "quick-edit");
}
super.processRender(app, context);
}
/**
* Decide which element will be displayed for correspond PortletMode/DisplayMode
* @param npMode: View/Edit
* @param nDisplayMode : FolderMode/ManualMode
* @throws Exception : Exception will be throws if child addition action fails
*/
private void activateMode(PortletMode npMode, String nDisplayMode) throws Exception {
PortletRequestContext pContext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
if (npMode.equals(cpMode)) {
// Switch manual/auto
// Not reach in the case of queryMode.
removeChildren();
if (Utils.isPortalEditMode()){
clvConfig = addChild(UICLVConfig.class, null, null);
clvConfig.setModeInternal(false);
}else {
if (nDisplayMode.equals(DISPLAY_MODE_AUTOMATIC)) {
folderMode = addChild(UICLVFolderMode.class, null, UICLVFolderMode.class.getSimpleName() +
"_" + pContext.getWindowId());
folderMode.init();
folderMode.setRendered(true);
} else {
manualMode = addChild(UICLVManualMode.class, null, UICLVManualMode.class.getSimpleName() +
"_" + pContext.getWindowId());
manualMode.init();
manualMode.setRendered(true);
}
}
} else {
if (npMode.equals(PortletMode.VIEW)) { //Change from edit to iew
removeChildren();
if (nDisplayMode.equals(DISPLAY_MODE_AUTOMATIC)) {
folderMode = addChild(UICLVFolderMode.class, null, UICLVFolderMode.class.getSimpleName() +
"_" + pContext.getWindowId());
folderMode.init();
folderMode.setRendered(true);
} else {
manualMode = addChild(UICLVManualMode.class, null, UICLVManualMode.class.getSimpleName() +
"_" + pContext.getWindowId());
manualMode.init();
manualMode.setRendered(true);
}
} else {
// Change from view to edit
removeChildren();
clvConfig = addChild(UICLVConfig.class, null, null);
clvConfig.setModeInternal(true);
}
}
cpMode = npMode;
currentDisplayMode = nDisplayMode;
}
private void removeChildren() {
clvConfig = getChild(UICLVConfig.class);
if (clvConfig != null)
removeChild(UICLVConfig.class);
folderMode = getChild(UICLVFolderMode.class);
if (folderMode != null)
removeChild(UICLVFolderMode.class);
manualMode = getChild(UICLVManualMode.class);
if (manualMode != null)
removeChild(UICLVManualMode.class);
}
/**
* Force porlet to change to ViewMode
*
* @throws Exception
*/
public void changeToViewMode() throws Exception {
PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
portletRequestContext.setApplicationMode(PortletMode.VIEW);
updatePortlet();
}
/**
* Update the current portlet if config/data changed.
* @throws Exception
*/
public void updatePortlet() throws Exception {
PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
PortletMode npMode = portletRequestContext.getApplicationMode();
PortletPreferences preferences = Utils.getAllPortletPreferences();
String nDisplayMode = preferences.getValue(PREFERENCE_DISPLAY_MODE, null);
activateMode(npMode, nDisplayMode);
}
/**
*
* @param sqlQuery
* @return
*/
public String getQueryStatement(String sqlQuery) {
HashSet<String> params = Utils.getQueryParams(sqlQuery);
HashMap<String, String> queryParam = getQueryParammeter(params);
return Utils.buildQuery(sqlQuery, queryParam);
}
/**
*
* @return
*/
public boolean isQueryApplication() {
return APPLICATION_CLV_BY_QUERY.equals(currentApplicationMode);
}
}