/* * 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.ecm.webui.component.explorer.popup.admin; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.jcr.Node; import org.exoplatform.commons.utils.LazyPageList; import org.exoplatform.commons.utils.ListAccess; import org.exoplatform.commons.utils.ListAccessImpl; import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer; import org.exoplatform.ecm.webui.core.UIPagingGrid; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.services.ecm.publication.AlreadyInPublicationLifecycleException; import org.exoplatform.services.ecm.publication.PublicationPlugin; import org.exoplatform.services.ecm.publication.PublicationPresentationService; import org.exoplatform.services.ecm.publication.PublicationService; import org.exoplatform.services.ecm.publication.plugins.webui.UIPublicationLogList; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.extensions.publication.lifecycle.authoring.AuthoringPublicationConstant; import org.exoplatform.services.wcm.publication.WCMPublicationService; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIContainer; import org.exoplatform.webui.core.UIPopupComponent; import org.exoplatform.webui.core.UIPopupContainer; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIForm; /* * Created by The eXo Platform SAS Author : Anh Do Ngoc anh.do@exoplatform.com * Sep 9, 2008 */ /** * The Class UIActivePublication. */ @ComponentConfig(template = "system:/groovy/ecm/webui/UIGridWithButton.gtmpl", events = { @EventConfig(listeners = UIActivePublication.EnrolActionListener.class), @EventConfig(listeners = UIActivePublication.CancelActionListener.class) }) public class UIActivePublication extends UIPagingGrid implements UIPopupComponent { /** The Constant LIFECYCLE_NAME. */ public final static String LIFECYCLE_NAME = "LifecycleName"; /** The Constant LIFECYCLE_DESC. */ public final static String LIFECYCLE_DESC = "LifecycleDesc"; /** The LIFECYCL e_ fields. */ public static String[] LIFECYCLE_FIELDS = { LIFECYCLE_NAME, LIFECYCLE_DESC }; /** The LIFECYCL e_ action. */ public static String[] LIFECYCLE_ACTION = { "Enrol" }; /** The Constant LIFECYCLE_SELECTED. */ public final static String LIFECYCLE_SELECTED = "LifecycleSelected"; private static final Log LOG = ExoLogger.getLogger(UIActivePublication.class.getName()); /** * Instantiates a new uI active publication. * * @throws Exception the exception */ public UIActivePublication() throws Exception { configure(LIFECYCLE_NAME, LIFECYCLE_FIELDS, LIFECYCLE_ACTION); getUIPageIterator().setId("LifecyclesIterator"); } /** * Gets the actions. * * @return the actions */ public String[] getActions() { return new String[] { "Cancel" }; } /** * Update lifecycles grid. * * @throws Exception the exception */ public void refresh(int currentPage) throws Exception { List<PublicationLifecycleBean> publicationLifecycleBeans = new ArrayList<PublicationLifecycleBean>(); PublicationService publicationService = getApplicationComponent(PublicationService.class); Collection<PublicationPlugin> publicationPlugins = publicationService.getPublicationPlugins() .values(); if (publicationPlugins.size() != 0) { for (PublicationPlugin publicationPlugin : publicationPlugins) { PublicationLifecycleBean lifecycleBean = new PublicationLifecycleBean(); lifecycleBean.setLifecycleName(publicationPlugin.getLifecycleName()); lifecycleBean.setLifecycleDesc(publicationPlugin.getDescription()); publicationLifecycleBeans.add(lifecycleBean); } } ListAccess<PublicationLifecycleBean> beanList = new ListAccessImpl<PublicationLifecycleBean>(PublicationLifecycleBean.class, publicationLifecycleBeans); LazyPageList<PublicationLifecycleBean> dataPageList = new LazyPageList<PublicationLifecycleBean>(beanList, getUIPageIterator().getItemsPerPage()); getUIPageIterator().setPageList(dataPageList); getUIPageIterator().setTotalItems(publicationLifecycleBeans.size()); if (currentPage > getUIPageIterator().getAvailablePage()) getUIPageIterator().setCurrentPage(getUIPageIterator().getAvailablePage()); else getUIPageIterator().setCurrentPage(currentPage); } public void enrolNodeInLifecycle(Node currentNode, String lifecycleName, WebuiRequestContext requestContext) throws Exception { UIJCRExplorer uiJCRExplorer = getAncestorOfType(UIJCRExplorer.class); UIApplication uiApp = getAncestorOfType(UIApplication.class); UIPublicationManager uiPublicationManager = uiJCRExplorer.createUIComponent( UIPublicationManager.class, null, null); uiJCRExplorer.addLockToken(currentNode); Node parentNode = currentNode.getParent(); uiJCRExplorer.addLockToken(parentNode); WCMPublicationService wcmPublicationService = getApplicationComponent(WCMPublicationService.class); PublicationPresentationService publicationPresentationService = getApplicationComponent(PublicationPresentationService.class); try { if(!currentNode.isCheckedOut()) { uiApp.addMessage(new ApplicationMessage("UIActionBar.msg.node-checkedin", null, ApplicationMessage.WARNING)); return; } String siteName = Util.getPortalRequestContext().getPortalOwner(); String remoteUser = Util.getPortalRequestContext().getRemoteUser(); if (AuthoringPublicationConstant.LIFECYCLE_NAME.equals(lifecycleName)) { wcmPublicationService.enrollNodeInLifecycle(currentNode, siteName, remoteUser); } else { wcmPublicationService.enrollNodeInLifecycle(currentNode, lifecycleName); } } catch (AlreadyInPublicationLifecycleException e) { uiApp.addMessage(new ApplicationMessage("UIActivePublication.msg.already-enroled", null, ApplicationMessage.ERROR)); return; } catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error", e); } uiApp.addMessage(new ApplicationMessage("UIActivePublication.msg.unknow-error", new String[] { e.getMessage() }, ApplicationMessage.ERROR)); return; } // refresh node prevent the situation node is changed in other session currentNode.refresh(true); UIContainer container = createUIComponent(UIContainer.class, null, null); UIForm uiFormPublicationManager = publicationPresentationService.getStateUI(currentNode, container); UIPopupContainer UIPopupContainer = uiJCRExplorer.getChild(UIPopupContainer.class); if(uiFormPublicationManager instanceof UIPopupComponent) { //TODO for future version, we need remove this code //This is special case for wcm which wants to more than 2 tabs in PublicationManager //The uiForm in this case should be a UITabPane or UIFormTabPane and need be an UIPopupComponent UIPopupContainer.activate(uiFormPublicationManager,700,500); }else { uiPublicationManager.addChild(uiFormPublicationManager); uiPublicationManager.addChild(UIPublicationLogList.class, null, null).setRendered(false); UIPublicationLogList uiPublicationLogList = uiPublicationManager.getChild(UIPublicationLogList.class); UIPopupContainer.activate(uiPublicationManager, 700, 500); uiPublicationLogList.setNode(currentNode); uiPublicationLogList.updateGrid(); } } /* * (non-Javadoc) * * @see org.exoplatform.ecm.webui.popup.UIPopupComponent#activate() */ public void activate() { } /* * (non-Javadoc) * * @see org.exoplatform.ecm.webui.popup.UIPopupComponent#deActivate() */ public void deActivate() { } /** * The Class PublicationLifecycleBean. */ public class PublicationLifecycleBean { private String lifecycleName; private String lifecycleDesc; /** * Gets the lifecycle name. * * @return the lifecycle name */ public String getLifecycleName() { return lifecycleName; } /** * Sets the lifecycle name. * * @param lifecycleName the new lifecycle name */ public void setLifecycleName(String lifecycleName) { this.lifecycleName = lifecycleName; } /** * Gets the lifecycle desc. * * @return the lifecycle desc */ public String getLifecycleDesc() { return lifecycleDesc; } /** * Sets the lifecycle desc. * * @param lifecycleDesc the new lifecycle desc */ public void setLifecycleDesc(String lifecycleDesc) { this.lifecycleDesc = lifecycleDesc; } } /** * The listener interface for receiving cancelAction events. The class that is * interested in processing a cancelAction event implements this interface, * and the object created with that class is registered with a component using * the component's <code>addCancelActionListener</code> method. When * the cancelAction event occurs, that object's appropriate * method is invoked. */ public static class CancelActionListener extends EventListener<UIActivePublication> { /* * (non-Javadoc) * * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UIActivePublication> event) throws Exception { UIJCRExplorer uiExplorer = event.getSource().getAncestorOfType(UIJCRExplorer.class); uiExplorer.cancelAction(); } } /** * The listener interface for receiving enrolAction events. The class that is * interested in processing a enrolAction event implements this interface, and * the object created with that class is registered with a component using the * component's <code>addEnrolActionListener</code> method. When * the enrolAction event occurs, that object's appropriate * method is invoked. */ public static class EnrolActionListener extends EventListener<UIActivePublication> { /* * (non-Javadoc) * * @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event) */ public void execute(Event<UIActivePublication> event) throws Exception { UIActivePublication uiActivePub = event.getSource(); UIJCRExplorer uiJCRExplorer = uiActivePub.getAncestorOfType(UIJCRExplorer.class); String selectedLifecycle = event.getRequestContext().getRequestParameter(OBJECTID); Node currentNode = uiJCRExplorer.getCurrentNode(); uiActivePub.enrolNodeInLifecycle(currentNode, selectedLifecycle,event.getRequestContext()); } } }