/*************************************************************************** * Copyright 2001-2010 The eXo Platform SARL All rights reserved. * * Please look at license.txt in info directory for more license detail. * **************************************************************************/ package org.exoplatform.wcm.webui.scv; import org.exoplatform.ecm.utils.text.Text; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.services.cms.drives.DriveData; import org.exoplatform.services.cms.drives.ManageDriveService; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.wcm.webui.Utils; import org.exoplatform.wcm.webui.reader.ContentReader; import org.exoplatform.wcm.webui.selector.content.UIContentSelector; import org.exoplatform.wcm.webui.selector.content.one.UIContentBrowsePanelOne; import org.exoplatform.wcm.webui.selector.content.one.UIContentSelectorOne; import org.exoplatform.wcm.webui.selector.page.UIPageSelector; import org.exoplatform.web.application.ApplicationMessage; 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.UIComponent; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.core.model.SelectItemOption; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIFormInputSet; import org.exoplatform.webui.form.UIFormRadioBoxInput; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.UIFormTabPane; import org.exoplatform.webui.form.ext.UIFormInputSetWithAction; import org.exoplatform.webui.form.input.UICheckBoxInput; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.portlet.PortletPreferences; import java.util.ArrayList; import java.util.List; /** * Created by The eXo Platform SARL * Author : Nguyen The Vinh * vinh.nguyen@exoplatform.com * Jul 16, 2010 */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/groovy/SingleContentViewer/UISCVPreferences.gtmpl", events = { @EventConfig(listeners = UISCVPreferences.SaveActionListener.class), @EventConfig(listeners = UISCVPreferences.AddPathActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UISCVPreferences.CancelActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UISCVPreferences.SelectTabActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UISCVPreferences.SelectTargetPageActionListener.class, phase = Phase.DECODE) } ) public class UISCVPreferences extends UIFormTabPane implements UISelectable{ /** The Constant ITEM_PATH_FORM_INPUT_SET. */ public final static String ITEM_PATH_FORM_INPUT_SET = "UISCVConfigItemPathFormInputSet"; public final static String CONTENT_FORM_INPUT_SET = "UISCVConfigContentFormInputSet"; public final static String DISPLAY_FORM_INPUT_SET = "UISCVConfigDisplayFormInputSet"; public final static String PRINT_FORM_INPUT_SET = "UISCVConfigPrintFormInputSet"; public final static String ADVANCED_FORM_INPUT_SET = "UISCVConfigAdvancedFormInputSet"; public static final String CONTENT_PATH_INPUT = "UISCVContentPathConfigurationInputBox"; public static final String SHOW_TITLE_CHECK_BOX = "UISCVShowTitleConfigurationCheckBox"; public static final String SHOW_DATE_CHECK_BOX = "UISCVShowDateConfigurationCheckBox"; public static final String SHOW_OPION_BAR_CHECK_BOX = "UISCVShowOptionBarConfigurationCheckBox"; public static final String CONTEXTUAL_SELECT_RADIO_BOX = "UISCVContextualRadioBox"; public static final String PARAMETER_INPUT_BOX = "UISCVParameterInputBox"; public static final String CACHE_ENABLE_SELECT_RADIO_BOX = "UISCVCacheRadioBox"; public final static String PRINT_PAGE_FORM_INPUT_SET = "UISCVConfigPrintPageFormInputSet"; public static final String PRINT_VIEW_PAGE_INPUT = "UISCVPrintViewPageInput"; /** The Constant PRINT_PAGE_SELECTOR_POPUP. */ public final static String PRINT_PAGE_SELECTOR_POPUP = "UISCVConfigPrintPageSelectorPopupWindow"; public static final String PRINT_PAGE_PARAMETER_INPUT = "UISCVPrintPageParameter"; public static final String ENABLE_STRING = "Enable"; public static final String DISABLE_STRING = "Disable"; protected PortletPreferences portletPreferences; protected String contentSelectorID; protected String selectedNodeUUID =null; protected String selectedNodeReporitory =null; protected String selectedNodeWorkspace =null; protected String selectedNodeDrive = null; protected String selectedNodePath = null; private UIFormStringInput txtContentPath, txtPrintPage, txtPrintPageParameter; private UICheckBoxInput chkShowTitle; private UICheckBoxInput chkShowDate; private UICheckBoxInput chkShowOptionBar; private UIFormRadioBoxInput contextOptionsRadioInputBox; private UIFormRadioBoxInput cacheOptionsRadioInputBox; public UISCVPreferences() throws Exception{ super("UISCVPreferences"); portletPreferences = ((PortletRequestContext) WebuiRequestContext.getCurrentInstance()).getRequest().getPreferences(); initComponent(); setActions(new String[] { "Save", "Cancel" }); } /** * Initialize the preferences setting form * * @throws Exception */ public void initComponent() throws Exception{ /** Content name **/ String strNodeName = getNodeNameByPreferences(); txtContentPath = new UIFormStringInput(CONTENT_PATH_INPUT, CONTENT_PATH_INPUT, strNodeName); txtContentPath.setReadOnly(true); UIFormInputSetWithAction itemPathInputSet = new UIFormInputSetWithAction(ITEM_PATH_FORM_INPUT_SET); itemPathInputSet.setActionInfo(CONTENT_PATH_INPUT, new String[] { "AddPath" }) ; itemPathInputSet.addUIFormInput(txtContentPath); UIFormInputSetWithAction contentInputSet = new UIFormInputSetWithAction(CONTENT_FORM_INPUT_SET); contentInputSet.addUIFormInput((UIFormInputSet)itemPathInputSet); setSelectedTab(CONTENT_FORM_INPUT_SET); /** Option Show Title/Show Date/Show OptionBar **/ boolean blnShowTitle = Boolean.parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.SHOW_TITLE, null)); chkShowTitle = new UICheckBoxInput(SHOW_TITLE_CHECK_BOX, SHOW_TITLE_CHECK_BOX, null); chkShowTitle.setChecked(blnShowTitle); boolean blnShowDate = Boolean.parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.SHOW_DATE, null)); chkShowDate = new UICheckBoxInput(SHOW_DATE_CHECK_BOX, SHOW_DATE_CHECK_BOX, null); chkShowDate.setChecked(blnShowDate); boolean blnShowOptionBar = Boolean.parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.SHOW_OPTIONBAR, null)); chkShowOptionBar = new UICheckBoxInput(SHOW_OPION_BAR_CHECK_BOX, SHOW_OPION_BAR_CHECK_BOX, null); chkShowOptionBar.setChecked(blnShowOptionBar); UIFormInputSetWithAction displayInputSet = new UIFormInputSetWithAction(DISPLAY_FORM_INPUT_SET); displayInputSet.addChild(chkShowTitle); displayInputSet.addChild(chkShowDate); displayInputSet.addChild(chkShowOptionBar); /** CONTEXTUAL MODE */ boolean isShowContextOption = Boolean.parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.CONTEXTUAL_MODE, "false")); List<SelectItemOption<String>> contextOptions = new ArrayList<SelectItemOption<String>>(); contextOptions.add(new SelectItemOption<String>(ENABLE_STRING, ENABLE_STRING)); contextOptions.add(new SelectItemOption<String>(DISABLE_STRING, DISABLE_STRING)); contextOptionsRadioInputBox = new UIFormRadioBoxInput(CONTEXTUAL_SELECT_RADIO_BOX, CONTEXTUAL_SELECT_RADIO_BOX, contextOptions); contextOptionsRadioInputBox.setValue(isShowContextOption?ENABLE_STRING:DISABLE_STRING); String strParameterName = portletPreferences.getValue(UISingleContentViewerPortlet.PARAMETER, null); UIFormStringInput txtParameterName = new UIFormStringInput(PARAMETER_INPUT_BOX, strParameterName); /** CACHE MANAGEMENT */ boolean isCacheEnabled = Boolean.parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.ENABLE_CACHE, "false")); List<SelectItemOption<String>> cacheOptions = new ArrayList<SelectItemOption<String>>(); cacheOptions.add(new SelectItemOption<String>(ENABLE_STRING, ENABLE_STRING)); cacheOptions.add(new SelectItemOption<String>(DISABLE_STRING, DISABLE_STRING)); cacheOptionsRadioInputBox = new UIFormRadioBoxInput(CACHE_ENABLE_SELECT_RADIO_BOX, CACHE_ENABLE_SELECT_RADIO_BOX, cacheOptions); cacheOptionsRadioInputBox.setValue(isCacheEnabled ? ENABLE_STRING : DISABLE_STRING); UIFormInputSetWithAction advancedInputSet = new UIFormInputSetWithAction(ADVANCED_FORM_INPUT_SET); advancedInputSet.addChild(cacheOptionsRadioInputBox); advancedInputSet.addChild(txtParameterName); advancedInputSet.addChild(contextOptionsRadioInputBox); /** PRINT PAGE */ String strPrintParameterName = portletPreferences.getValue(UISingleContentViewerPortlet.PRINT_PARAMETER, null); txtPrintPageParameter = new UIFormStringInput(PRINT_PAGE_PARAMETER_INPUT, strPrintParameterName); /** TARGET PAGE */ String strPrintPageName = portletPreferences.getValue(UISingleContentViewerPortlet.PRINT_PAGE, null); UIFormInputSetWithAction targetPageInputSet = new UIFormInputSetWithAction(PRINT_PAGE_FORM_INPUT_SET); txtPrintPage = new UIFormStringInput(PRINT_VIEW_PAGE_INPUT, PRINT_VIEW_PAGE_INPUT, strPrintPageName); txtPrintPage.setValue(strPrintPageName); txtPrintPage.setReadOnly(true); targetPageInputSet.setActionInfo(PRINT_VIEW_PAGE_INPUT, new String[] {"SelectTargetPage"}) ; targetPageInputSet.addUIFormInput(txtPrintPage); UIFormInputSetWithAction printInputSet = new UIFormInputSetWithAction(PRINT_FORM_INPUT_SET); printInputSet.addChild(txtPrintPageParameter); printInputSet.addChild(targetPageInputSet); addChild(contentInputSet); addChild(displayInputSet); addChild(printInputSet); addChild(advancedInputSet); } /** * ActionListener: save preferences action * @author exo.VinhNT * */ public static class SaveActionListener extends EventListener<UISCVPreferences> { public void execute(Event<UISCVPreferences> event) throws Exception { WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance(); UISCVPreferences uiSCVPref = event.getSource(); PortletPreferences portletPreferences = ((PortletRequestContext) event.getRequestContext()).getRequest() .getPreferences(); UIFormInputSetWithAction displayInputSet = uiSCVPref.findComponentById(DISPLAY_FORM_INPUT_SET); String strShowTitle = displayInputSet.getUICheckBoxInput(SHOW_TITLE_CHECK_BOX).isChecked() ? "true" : "false"; String strShowDate = displayInputSet.getUICheckBoxInput(SHOW_DATE_CHECK_BOX).isChecked() ? "true" : "false"; String strShowOptionBar = displayInputSet.getUICheckBoxInput(SHOW_OPION_BAR_CHECK_BOX) .isChecked() ? "true" : "false"; String strIsContextEnable = ((UIFormRadioBoxInput) uiSCVPref.findComponentById(CONTEXTUAL_SELECT_RADIO_BOX)).getValue(); UIFormInputSetWithAction advancedInputSet = uiSCVPref.findComponentById(ADVANCED_FORM_INPUT_SET); strIsContextEnable = strIsContextEnable.equals(ENABLE_STRING) ? "true":"false"; String strParameterName = advancedInputSet.getUIStringInput(PARAMETER_INPUT_BOX).getValue(); String strIsCacheEnabled = ((UIFormRadioBoxInput) advancedInputSet.getChildById(CACHE_ENABLE_SELECT_RADIO_BOX)).getValue(); strIsCacheEnabled = ENABLE_STRING.equals(strIsCacheEnabled) ? "true" : "false"; UIFormInputSetWithAction printInputSet = uiSCVPref.findComponentById(PRINT_FORM_INPUT_SET); String strPrintPageName = printInputSet.getUIStringInput(PRINT_VIEW_PAGE_INPUT).getValue(); String strPrintParameterName = printInputSet.getUIStringInput(PRINT_PAGE_PARAMETER_INPUT).getValue(); if (!Boolean.parseBoolean(strIsContextEnable)) { if (uiSCVPref.getSelectedNodeUUID() != null) { if (uiSCVPref.getSelectedNodeUUID().length() == 0) { Utils.createPopupMessage(uiSCVPref, "UISCVPreferences.msg.not-valid-path", null, ApplicationMessage.WARNING); requestContext.addUIComponentToUpdateByAjax(uiSCVPref); return; } } else { Utils.createPopupMessage(uiSCVPref, "UISCVPreferences.msg.not-valid-path", null, ApplicationMessage.WARNING); requestContext.addUIComponentToUpdateByAjax(uiSCVPref); return; } } portletPreferences.setValue(UISingleContentViewerPortlet.REPOSITORY, uiSCVPref.getSelectedNodeRepository()); portletPreferences.setValue(UISingleContentViewerPortlet.WORKSPACE, uiSCVPref.getSelectedNodeWorkspace()); portletPreferences.setValue(UISingleContentViewerPortlet.IDENTIFIER, uiSCVPref.getSelectedNodeUUID()) ; portletPreferences.setValue(UISingleContentViewerPortlet.DRIVE, uiSCVPref.getSelectedNodeDrive()); portletPreferences.setValue(UISingleContentViewerPortlet.SHOW_TITLE, strShowTitle); portletPreferences.setValue(UISingleContentViewerPortlet.SHOW_DATE, strShowDate); portletPreferences.setValue(UISingleContentViewerPortlet.SHOW_OPTIONBAR, strShowOptionBar); portletPreferences.setValue(UISingleContentViewerPortlet.CONTEXTUAL_MODE, strIsContextEnable); portletPreferences.setValue(UISingleContentViewerPortlet.PARAMETER, strParameterName); portletPreferences.setValue(UISingleContentViewerPortlet.PRINT_PAGE, strPrintPageName); portletPreferences.setValue(UISingleContentViewerPortlet.PRINT_PARAMETER, strPrintParameterName); portletPreferences.setValue(UISingleContentViewerPortlet.ENABLE_CACHE, strIsCacheEnabled); portletPreferences.store(); if (uiSCVPref.getInternalPreferencesMode()) { if (!Utils.isPortalEditMode()) { uiSCVPref.getAncestorOfType(UISingleContentViewerPortlet.class).changeToViewMode(); } } else { Utils.closePopupWindow(uiSCVPref, UISingleContentViewerPortlet.UIPreferencesPopupID); } } } public static class CancelActionListener extends EventListener<UISCVPreferences> { public void execute(Event<UISCVPreferences> event) throws Exception { UISCVPreferences uiSCVPref = event.getSource(); if (uiSCVPref.getInternalPreferencesMode()) { if (!Utils.isPortalEditMode()) { uiSCVPref.getAncestorOfType(UISingleContentViewerPortlet.class).changeToViewMode(); } } else { Utils.closePopupWindow(uiSCVPref, UISingleContentViewerPortlet.UIPreferencesPopupID); } } } /** * setSelectedNodeInfo: Save temporary data when user select a node from ContentSelector * @param nodeUUID * @param nodeRepo * @param nodeWS */ public void setSelectedNodeInfo(String nodeUUID, String nodeRepo, String nodeWS, String nodeDrive) { this.selectedNodeUUID = nodeUUID; this.selectedNodeReporitory = nodeRepo; this.selectedNodeWorkspace = nodeWS; this.selectedNodeDrive = nodeDrive; } public void setSelectedNodePath(String path) { this.selectedNodePath = path; } public String getSelectedNodePath() { return this.selectedNodePath; } /** * Get the temporary node UUID * @return */ public String getSelectedNodeUUID() { return this.selectedNodeUUID; } /** * Get the temporary Node Repository string * @return */ public String getSelectedNodeRepository() { return this.selectedNodeReporitory; } /** * Get the temporary node Workspace string * @return */ public String getSelectedNodeWorkspace() { return this.selectedNodeWorkspace; } /** * Get the temporary node Drive string * @return */ public String getSelectedNodeDrive() { return this.selectedNodeDrive; } /** * The listener interface for receiving selectTabAction events. * The class that is interested in processing a selectTabAction * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addSelectTabActionListener</code> method. When * the selectTabAction event occurs, that object's appropriate * method is invoked. */ static public class SelectTabActionListener extends EventListener<UISCVPreferences> { /* (non-Javadoc) * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UISCVPreferences> event) throws Exception { WebuiRequestContext context = event.getRequestContext(); String renderTab = context.getRequestParameter(UIComponent.OBJECTID); if (renderTab == null) { return; } event.getSource().setSelectedTab(renderTab); event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource()); } } public static class AddPathActionListener extends EventListener<UISCVPreferences> { public void execute(Event<UISCVPreferences> event) throws Exception { UISCVPreferences uiSCVPref = event.getSource(); UIContentSelectorOne contentSelector = uiSCVPref.createUIComponent(UIContentSelectorOne.class, null, null); Node node = Utils.getViewableNodeByComposer(uiSCVPref.getSelectedNodeRepository(), uiSCVPref.getSelectedNodeWorkspace(), uiSCVPref.getSelectedNodeUUID()); contentSelector.init(uiSCVPref.getSelectedNodeDrive(), fixPath(node == null ? "" : node.getPath(), uiSCVPref)); contentSelector.getChild(UIContentBrowsePanelOne.class) .setSourceComponent(uiSCVPref, new String[] { UISCVPreferences.CONTENT_PATH_INPUT }); Utils.createPopupWindow(uiSCVPref, contentSelector, UIContentSelector.CORRECT_CONTENT_SELECTOR_POPUP_WINDOW, 800); uiSCVPref.setContentSelectorID(UIContentSelector.CORRECT_CONTENT_SELECTOR_POPUP_WINDOW); } private String fixPath(String path, UISCVPreferences uiScvPref) throws Exception { if (path == null || path.length() == 0 || uiScvPref.getSelectedNodeDrive() == null || uiScvPref.getSelectedNodeDrive().length() == 0 || uiScvPref.getSelectedNodeRepository() == null || uiScvPref.getSelectedNodeRepository().length() == 0) return ""; ManageDriveService managerDriveService = uiScvPref.getApplicationComponent(ManageDriveService.class); DriveData driveData = managerDriveService.getDriveByName(uiScvPref.getSelectedNodeDrive()); if (!path.startsWith(driveData.getHomePath())) return ""; if ("/".equals(driveData.getHomePath())) return path; return path.substring(driveData.getHomePath().length()); } } /** * * @return A string point to the node from preferences */ protected String getNodeNameByPreferences(){ String repository = WCMCoreUtils.getRepository().getConfiguration().getName(); String workspace = portletPreferences.getValue(UISingleContentViewerPortlet.WORKSPACE, null); String nodeIdentifier = portletPreferences.getValue(UISingleContentViewerPortlet.IDENTIFIER, null); String nodeDrive = portletPreferences.getValue(UISingleContentViewerPortlet.DRIVE, null); try { Node savedNode = Utils.getRealNode(repository, workspace, nodeIdentifier, false); if (savedNode==null) return null; this.setSelectedNodeInfo(savedNode.getUUID(), repository, workspace, nodeDrive); this.setSelectedNodePath(savedNode.getPath()); return getTitle(savedNode); }catch (RepositoryException re) { return null; } } /** * Gets the title. * * @param node the node * * @return the title * * @throws Exception the exception */ private String getTitle(Node node) throws RepositoryException { String title = null; if (node.hasProperty("exo:title")) { title = node.getProperty("exo:title").getValue().getString(); } 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 e) { title = null; } } } if (title==null) title = node.getName(); return ContentReader.getUnescapeIllegalJcrContent(title); } public void setContentSelectorID(String id) { this.contentSelectorID = id; } public String getContetSelectorID() { return this.contentSelectorID; } public boolean isContextualEnable() { return Boolean.parseBoolean(portletPreferences.getValue(UISingleContentViewerPortlet.CONTEXTUAL_MODE, "false")); } public void doSelect(String selectField, Object value) throws Exception { String strRepository, strWorkspace, strDrive, strIdentifier, strNodeUUID; int driveIndex; String strPath = (String) value; if (CONTENT_PATH_INPUT.equals(selectField) ) { String[] splits = strPath.split(":"); driveIndex = (splits.length == 4) ? 1 : 0; strRepository = splits[driveIndex]; strWorkspace = splits[driveIndex + 1]; strIdentifier = splits[driveIndex + 2]; strDrive= (driveIndex == 1) ? splits[0] : ""; strIdentifier = Text.escapeIllegalJcrChars(strIdentifier); Node selectedNode = Utils.getRealNode(strRepository, strWorkspace, strIdentifier, false); if (selectedNode==null) return; strNodeUUID = selectedNode.getUUID(); this.setSelectedNodeInfo(strNodeUUID, strRepository, strWorkspace, strDrive); this.setSelectedNodePath(selectedNode.getPath()); getUIStringInput(selectField).setValue(getTitle(selectedNode)); }else if (PRINT_VIEW_PAGE_INPUT.equals(selectField)) { getUIStringInput(selectField).setValue(strPath); } Utils.closePopupWindow(this, contentSelectorID); } /** * The listener interface for receiving selectTargetPageAction events. * The class that is interested in processing a selectTargetPageAction * event implements this interface, and the object created * with that class is registered with a component using the * component's <code>addSelectTargetPageActionListener</code> method. When * the selectTargetPageAction event occurs, that object's appropriate * method is invoked. */ public static class SelectTargetPageActionListener extends EventListener<UISCVPreferences> { /* (non-Javadoc) * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UISCVPreferences> event) throws Exception { UISCVPreferences uiscv = event.getSource(); UIPageSelector pageSelector = uiscv.createUIComponent(UIPageSelector.class, null, null); pageSelector.setSourceComponent(uiscv, new String[] {PRINT_VIEW_PAGE_INPUT}); Utils.createPopupWindow(uiscv, pageSelector, PRINT_PAGE_SELECTOR_POPUP, 800); uiscv.setContentSelectorID(PRINT_PAGE_SELECTOR_POPUP); } } public void setInternalPreferencesMode(boolean isInternal) { this.isInternal = isInternal; } public boolean getInternalPreferencesMode() { return this.isInternal; } boolean isInternal = false; }