/*
* Copyright (C) 2003-2009 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 javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Session;
import javax.jcr.query.Row;
import javax.portlet.PortletPreferences;
import org.exoplatform.ecm.resolver.JCRResourceResolver;
import org.exoplatform.resolver.ResourceResolver;
import org.exoplatform.services.cms.impl.DMSConfiguration;
import org.exoplatform.services.jcr.access.PermissionType;
import org.exoplatform.services.jcr.core.ExtendedNode;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.services.wcm.search.base.SearchDataCreator;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.wcm.webui.Utils;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
/**
* Created by The eXo Platform SAS
* Author : anh.do
* anh.do@exoplatform.com, anhdn86@gmail.com
* Feb 23, 2009
*/
public abstract class UICLVContainer extends UIContainer {
/** The message key. */
protected String messageKey;
/**
* Inits the.
*
* @throws Exception the exception
*/
public abstract void init() throws Exception;
/**
* Get portlet name.
*
* @throws Exception the exception
*/
public abstract String getPortletName() throws Exception;
/**
* Gets the message.
*
* @return the message
*
* @throws Exception the exception
*/
public String getMessageKey() throws Exception {
return messageKey;
}
/**
* Gets the portlet id.
*
* @return the portlet id
*/
public String getPortletId() {
PortletRequestContext pContext = (PortletRequestContext) WebuiRequestContext.getCurrentInstance();
return pContext.getWindowId();
}
/* (non-Javadoc)
* @see org.exoplatform.webui.core.UIComponent#processRender(org.exoplatform.webui.application.WebuiRequestContext)
*/
public void processRender(WebuiRequestContext context) throws Exception {
if(!Boolean.parseBoolean(Utils.getCurrentMode()) || context.getFullRender()) {
init();
}
super.processRender(context);
}
public String getEditLink(boolean isEditable, boolean isNew) throws Exception {
String folderPath = this.getAncestorOfType(UICLVPortlet.class).getFolderPath();
if (folderPath==null) folderPath="";
Node folderNode = null;
try{
folderNode = getFolderNode(folderPath);
}catch(PathNotFoundException e){
folderNode = getFolderNode("");
}
return Utils.getEditLink(folderNode, isEditable, isNew);
}
public Node getFolderNode() {
return NodeLocation.getNodeByExpression(
Utils.getPortletPreference(UICLVPortlet.PREFERENCE_ITEM_PATH));
}
private Node getFolderNode(String oldPath) throws Exception {
if ((oldPath==null) || ((oldPath!=null) && (oldPath.length()==0))) return null;
int slashIndex = oldPath.indexOf("/");
String path = oldPath.substring(slashIndex);
String[] repoWorkspace = oldPath.substring(0, slashIndex).split(":");
String strWorkspace = repoWorkspace[1];
Session session = WCMCoreUtils.getUserSessionProvider().getSession(strWorkspace, WCMCoreUtils.getRepository());
return (Node)session.getItem(path);
}
/**
* Gets the template resource resolver.
*
* @return the template resource resolver
*
* @throws Exception the exception
*/
public ResourceResolver getTemplateResourceResolver() throws Exception {
DMSConfiguration dmsConfiguration = getApplicationComponent(DMSConfiguration.class);
String workspace = dmsConfiguration.getConfig().getSystemWorkspace();
return new JCRResourceResolver(workspace);
}
/**
* The listener interface for receiving quickEditAction events.
* The class that is interested in processing a quickEditAction
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addQuickEditActionListener</code> method. When
* the quickEditAction event occurs, that object's appropriate
* method is invoked.
*
*/
public static class PreferencesActionListener extends EventListener<UICLVFolderMode> {
/* (non-Javadoc)
* @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
*/
public void execute(Event<UICLVFolderMode> event) throws Exception {
UICLVContainer clvContainer = event.getSource();
UICLVConfig viewerManagementForm = clvContainer.createUIComponent(UICLVConfig.class, null, null);
Utils.createPopupWindow(clvContainer, viewerManagementForm, "UIViewerManagementPopupWindow", 800);
}
}
public void onRefresh(Event<UICLVPresentation> event) throws Exception {
UICLVPresentation clvPresentation = event.getSource();
UICLVContainer uiListViewerBase = clvPresentation.getParent();
uiListViewerBase.getChildren().clear();
uiListViewerBase.init();
}
public boolean isModeByFolder() {
PortletPreferences portletPreferences = Utils.getAllPortletPreferences();
String currentApplicationMode = portletPreferences.getValue(UICLVPortlet.PREFERENCE_APPLICATION_TYPE, null);
if (currentApplicationMode.equals(UICLVPortlet.APPLICATION_CLV_BY_QUERY))
return false;
return UICLVPortlet.DISPLAY_MODE_AUTOMATIC.equals(
Utils.getPortletPreference(UICLVPortlet.PREFERENCE_DISPLAY_MODE));
}
public boolean hasFolderPath() {
PortletPreferences portletPreferences = Utils.getAllPortletPreferences();
String itemPath = portletPreferences.getValue(UICLVPortlet.PREFERENCE_ITEM_PATH, null);
return (itemPath != null && itemPath.length() > 0) ? true : false;
}
public boolean isShowManageContent() {
return (Utils.isShowQuickEdit() && isModeByFolder() && hasFolderPath());
}
public boolean isShowAddContent() {
if (isShowManageContent()) {
PortletPreferences portletPreferences = ((PortletRequestContext) WebuiRequestContext.
getCurrentInstance()).getRequest().getPreferences();
String itemPath = portletPreferences.getValue(UICLVPortlet.PREFERENCE_ITEM_PATH, null);
try {
Node content = NodeLocation.getNodeByExpression(itemPath);
((ExtendedNode) content).checkPermission(PermissionType.ADD_NODE);
} catch (Exception e) {
return false;
}
return true;
} else return false;
}
public boolean isShowPreferences() {
try {
return Utils.isShowQuickEdit() && Utils.hasEditPermissionOnPage();
} catch (Exception e) {
return false;
}
}
public static class CLVNodeCreator implements SearchDataCreator<NodeLocation> {
@Override
public NodeLocation createData(Node node, Row row) {
return NodeLocation.getNodeLocationByNode(node);
}
}
}