/** * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.portal.webui.application; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.portlet.PortletMode; import org.exoplatform.commons.utils.ExceptionUtil; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.portal.pom.spi.portlet.Portlet; import org.exoplatform.portal.pom.spi.portlet.Preference; import org.exoplatform.portal.resource.SkinService; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.portal.webui.workspace.UIMaskWorkspace; import org.exoplatform.portal.webui.workspace.UIPortalApplication; import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.webui.application.WebuiRequestContext; 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.UIComponent; import org.exoplatform.webui.core.lifecycle.UIContainerLifecycle; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIFormInputIconSelector; import org.exoplatform.webui.form.UIFormInputInfo; import org.exoplatform.webui.form.UIFormInputSet; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.UIFormTabPane; import org.exoplatform.webui.form.UIFormTextAreaInput; import org.exoplatform.webui.form.input.UICheckBoxInput; import org.exoplatform.webui.form.validator.ExpressionValidator; import org.exoplatform.webui.form.validator.MandatoryValidator; import org.exoplatform.webui.form.validator.NotHTMLTagValidator; import org.exoplatform.webui.form.validator.StringLengthValidator; import org.exoplatform.webui.organization.UIListPermissionSelector; import org.exoplatform.webui.organization.UIListPermissionSelector.EmptyIteratorValidator; import org.gatein.pc.api.Mode; import org.gatein.pc.api.info.PreferenceInfo; import org.gatein.pc.api.invocation.PortletInvocation; import org.gatein.pc.api.invocation.RenderInvocation; import org.gatein.pc.api.invocation.response.PortletInvocationResponse; import org.gatein.pc.api.state.PropertyChange; /** Author : Nhu Dinh Thuan nhudinhthuan@yahoo.com Jun 8, 2006 */ @ComponentConfigs({ @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "system:/groovy/portal/webui/portal/UIPortletForm.gtmpl", events = { @EventConfig(listeners = UIPortletForm.SaveActionListener.class), @EventConfig(listeners = UIPortletForm.CloseActionListener.class, phase = Phase.DECODE) }), @ComponentConfig(id = "PortletPermission", type = UIFormInputSet.class, lifecycle = UIContainerLifecycle.class) }) public class UIPortletForm extends UIFormTabPane { private static Log log = ExoLogger.getLogger("portal:UIPortletForm"); private UIPortlet uiPortlet_; private UIComponent backComponent_; private static final String FIELD_THEME = "Theme"; private static final String FIELD_PORTLET_PREF = "PortletPref"; @SuppressWarnings("unchecked") public UIPortletForm() throws Exception { super("UIPortletForm"); UIFormInputSet uiPortletPrefSet = new UIFormInputSet(FIELD_PORTLET_PREF).setRendered(false); addUIFormInput(uiPortletPrefSet); UIFormInputSet uiSettingSet = new UIFormInputSet("PortletSetting"); uiSettingSet .addUIFormInput(new UIFormInputInfo("displayName", "displayName", null)) .addUIFormInput( new UIFormStringInput("title", "title", null).addValidator(StringLengthValidator.class, 3, 60) .addValidator(NotHTMLTagValidator.class, "UIPortletForm.msg.InvalidPortletTitle")) .addUIFormInput( new UIFormStringInput("width", "width", null).addValidator(ExpressionValidator.class, "(^([1-9]\\d*)(?:px)?$)?", "UIPortletForm.msg.InvalidWidthHeight")) .addUIFormInput( new UIFormStringInput("height", "height", null).addValidator(ExpressionValidator.class, "(^([1-9]\\d*)(?:px)?$)?", "UIPortletForm.msg.InvalidWidthHeight")) .addUIFormInput(new UICheckBoxInput("showInfoBar", "showInfoBar", false)) .addUIFormInput(new UICheckBoxInput("showPortletMode", "showPortletMode", false)) .addUIFormInput(new UICheckBoxInput("showWindowState", "showWindowState", false)) .addUIFormInput( new UIFormTextAreaInput("description", "description", null).addValidator(NotHTMLTagValidator.class, "UIPortletForm.msg.InvalidPortletDescription")); addUIFormInput(uiSettingSet); UIFormInputIconSelector uiIconSelector = new UIFormInputIconSelector("Icon", "icon"); addUIFormInput(uiIconSelector); UIFormInputThemeSelector uiThemeSelector = new UIFormInputThemeSelector(FIELD_THEME, null); SkinService skinService = getApplicationComponent(SkinService.class); uiThemeSelector.getChild(UIItemThemeSelector.class).setValues(skinService.getPortletThemes()); addUIFormInput(uiThemeSelector); PortalRequestContext prc = Util.getPortalRequestContext(); if (prc.getSiteType() != SiteType.USER) { UIListPermissionSelector uiListPermissionSelector = createUIComponent(UIListPermissionSelector.class, null, null); uiListPermissionSelector.configure(WebuiRequestContext.generateUUID("UIListPermissionSelector"), "accessPermissions"); uiListPermissionSelector.addValidator(EmptyIteratorValidator.class); UIFormInputSet uiPermissionSet = createUIComponent(UIFormInputSet.class, "PortletPermission", null); uiPermissionSet.addChild(uiListPermissionSelector); addUIFormInput(uiPermissionSet); } } public UIComponent getBackComponent() { return backComponent_; } public void setBackComponent(final UIComponent uiComp) { backComponent_ = uiComp; } public UIPortlet getUIPortlet() { return uiPortlet_; } public boolean hasEditMode() { return uiPortlet_.getSupportModes().contains("edit"); } public String getEditModeContent() { try { PortalRequestContext prcontext = (PortalRequestContext) WebuiRequestContext.getCurrentInstance(); prcontext.ignoreAJAXUpdateOnPortlets(true); PortletInvocation portletInvocation = uiPortlet_.create(RenderInvocation.class, prcontext); RenderInvocation renderInvocation = (RenderInvocation) portletInvocation; // make sure we are in the EDIT mode, and not whatever the current portlet mode is for the Portlet renderInvocation.setMode(Mode.create(PortletMode.EDIT.toString())); PortletInvocationResponse portletResponse = uiPortlet_.invoke(renderInvocation); StringWriter writer = new StringWriter(); uiPortlet_.generateRenderMarkup(portletResponse, prcontext).writeTo(writer); return writer.toString(); } catch (Throwable ex) { WebuiRequestContext webuiRequest = WebuiRequestContext.getCurrentInstance(); log.error("The portlet " + uiPortlet_.getName() + " could not be loaded. Check if properly deployed.", ExceptionUtil.getRootCause(ex)); return webuiRequest.getApplicationResourceBundle().getString("UIPortlet.message.RuntimeError"); } } public boolean setValues(final UIPortlet uiPortlet) throws Exception { uiPortlet_ = uiPortlet; org.gatein.pc.api.Portlet portlet = uiPortlet.getProducedOfferedPortlet(); if (portlet == null) { return false; } invokeGetBindingBean(uiPortlet_); String icon = uiPortlet.getIcon(); if (icon == null || icon.length() < 0) { icon = "PortletIcon"; } getChild(UIFormInputIconSelector.class).setSelectedIcon(icon); getChild(UIFormInputThemeSelector.class).getChild(UIItemThemeSelector.class).setSelectedTheme( uiPortlet.getSuitedTheme(null)); if (hasEditMode()) { uiPortlet.setCurrentPortletMode(PortletMode.EDIT); } else { Map<String, String> portletPreferenceMaps = new HashMap<String, String>(); Set<String> keySet = portlet.getInfo().getPreferences().getKeys(); for (String key : keySet) { PreferenceInfo preferenceInfo = portlet.getInfo().getPreferences().getPreference(key); if (!preferenceInfo.isReadOnly()) { String ppValue = (preferenceInfo.getDefaultValue().size() > 0) ? preferenceInfo.getDefaultValue().get(0) : ""; portletPreferenceMaps.put(key, ppValue); } } Portlet pp = uiPortlet.getPreferences(); if (pp != null) { for (Preference pref : pp) { if (!pref.isReadOnly()) { portletPreferenceMaps.put(pref.getName(), (pref.getValues().size() > 0) ? pref.getValues().get(0) : ""); } } } if (portletPreferenceMaps.size() > 0) { Set<String> ppKeySet = portletPreferenceMaps.keySet(); UIFormInputSet uiPortletPrefSet = getChildById(FIELD_PORTLET_PREF); uiPortletPrefSet.getChildren().clear(); for (String ppKey : ppKeySet) { String ppValue = portletPreferenceMaps.get(ppKey); UIFormStringInput preferenceStringInput = new UIFormStringInput(ppKey, null, ppValue); preferenceStringInput.setLabel(ppKey); preferenceStringInput.addValidator(MandatoryValidator.class); uiPortletPrefSet.addUIFormInput(preferenceStringInput); } uiPortletPrefSet.setRendered(true); setSelectedTab(FIELD_PORTLET_PREF); } else { setSelectedTab("PortletSetting"); } } return true; } private void savePreferences() throws Exception { UIFormInputSet uiPortletPrefSet = getChildById(FIELD_PORTLET_PREF); List<UIFormStringInput> uiFormInputs = new ArrayList<UIFormStringInput>(3); uiPortletPrefSet.findComponentOfType(uiFormInputs, UIFormStringInput.class); if (uiFormInputs.size() < 1) { return; } PropertyChange[] propertyChanges = new PropertyChange[uiFormInputs.size()]; for (int i = 0; i < uiFormInputs.size(); i++) { String name = uiFormInputs.get(i).getName(); String value = uiFormInputs.get(i).getValue(); propertyChanges[i] = PropertyChange.newUpdate(name, value); } // Now save it uiPortlet_.update(propertyChanges); } public static class SaveActionListener extends EventListener<UIPortletForm> { public void execute(final Event<UIPortletForm> event) throws Exception { UIPortletForm uiPortletForm = event.getSource(); UIPortlet uiPortlet = uiPortletForm.getUIPortlet(); UIFormInputIconSelector uiIconSelector = uiPortletForm.getChild(UIFormInputIconSelector.class); uiPortletForm.invokeSetBindingBean(uiPortlet); if (uiIconSelector.getSelectedIcon().equals("Default")) { uiPortlet.setIcon("PortletIcon"); } else { uiPortlet.setIcon(uiIconSelector.getSelectedIcon()); } UIFormInputThemeSelector uiThemeSelector = uiPortletForm.getChild(UIFormInputThemeSelector.class); uiPortlet.putSuitedTheme(null, uiThemeSelector.getChild(UIItemThemeSelector.class).getSelectedTheme()); uiPortletForm.savePreferences(); UIMaskWorkspace uiMaskWorkspace = uiPortletForm.getParent(); PortalRequestContext pcontext = (PortalRequestContext) event.getRequestContext(); uiMaskWorkspace.createEvent("Close", Phase.DECODE, pcontext).broadcast(); if (uiPortletForm.hasEditMode()) { uiPortlet.setCurrentPortletMode(PortletMode.VIEW); } String width = uiPortletForm.getUIStringInput("width").getValue(); if (width == null || width.length() == 0) { uiPortlet.setWidth(null); } else { if (!width.endsWith("px")) { width = width.concat("px"); } uiPortlet.setWidth(width); } String height = uiPortletForm.getUIStringInput("height").getValue(); if (height == null || height.length() == 0) { uiPortlet.setHeight(null); } else { if (!height.endsWith("px")) { height = height.concat("px"); } uiPortlet.setHeight(height); } pcontext.getJavascriptManager().require("SHARED/portalComposer", "portalComposer") .addScripts("portalComposer.toggleSaveButton();"); UIPortalApplication uiPortalApp = uiPortlet.getAncestorOfType(UIPortalApplication.class); UIWorkingWorkspace uiWorkingWS = uiPortalApp.getChildById(UIPortalApplication.UI_WORKING_WS_ID); pcontext.addUIComponentToUpdateByAjax(uiWorkingWS); pcontext.ignoreAJAXUpdateOnPortlets(true); } } public static class CloseActionListener extends EventListener<UIPortletForm> { public void execute(final Event<UIPortletForm> event) throws Exception { UIPortletForm uiPortletForm = event.getSource(); UIPortlet uiPortlet = uiPortletForm.getUIPortlet(); if (uiPortletForm.hasEditMode()) { uiPortlet.setCurrentPortletMode(PortletMode.VIEW); } UIPortalApplication uiPortalApp = Util.getUIPortalApplication(); PortalRequestContext pcontext = (PortalRequestContext) event.getRequestContext(); // add by Pham Dinh Tan UIMaskWorkspace uiMaskWorkspace = uiPortalApp.getChildById(UIPortalApplication.UI_MASK_WS_ID); uiMaskWorkspace.broadcast(event, Phase.DECODE); pcontext.ignoreAJAXUpdateOnPortlets(true); } } }