/* * 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.services.wcm.publication; import java.util.HashMap; import java.util.Map; import javax.jcr.Node; import org.exoplatform.services.cms.CmsService; import org.exoplatform.services.ecm.publication.NotInPublicationLifecycleException; import org.exoplatform.services.ecm.publication.PublicationPlugin; import org.exoplatform.services.ecm.publication.PublicationService; import org.exoplatform.services.listener.ListenerService; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.picocontainer.Startable; /** * Created by The eXo Platform SAS * Author : Hoa Pham * hoa.pham@exoplatform.com * Sep 29, 2008 */ public class WCMPublicationServiceImpl implements WCMPublicationService, Startable { /** The Constant SIMPLE_LIFECYCLE_NAME. */ private static final String SIMPLE_LIFECYCLE_NAME = "Simple publication"; /** The Constant STATEVERSION_LIFECYCLE_NAME. */ public static final String STATEVERSION_LIFECYCLE_NAME = "States and versions based publication"; /** The publication plugins. */ private HashMap<String, WebpagePublicationPlugin> publicationPlugins = new HashMap<String, WebpagePublicationPlugin>(); /** The publication service. */ protected PublicationService publicationService; protected ListenerService listenerService; protected CmsService cmsService; /** * Instantiates a new WCM publication service. * This service delegate to PublicationService to manage the publication */ public WCMPublicationServiceImpl() { this.publicationService = WCMCoreUtils.getService(PublicationService.class); this.listenerService = WCMCoreUtils.getService(ListenerService.class); this.cmsService = WCMCoreUtils.getService(CmsService.class); } /* * (non-Javadoc) * @see * org.exoplatform.services.wcm.publication.WCMPublicationPresentationService * #addPublicationPlugin * (org.exoplatform.services.wcm.publication.WebpagePublicationPlugin) */ public void addPublicationPlugin(WebpagePublicationPlugin p) { publicationPlugins.put(p.getLifecycleName(),p); publicationService.addPublicationPlugin(PublicationPlugin.class.cast(p)); } /* * (non-Javadoc) * @seeorg.exoplatform.services.wcm.publication.WCMPublicationService# * enrollNodeInLifecycle(javax.jcr.Node, java.lang.String) */ public void enrollNodeInLifecycle(Node node, String lifecycleName) throws Exception { publicationService.enrollNodeInLifecycle(node,lifecycleName); } /* * (non-Javadoc) * @see * org.exoplatform.services.wcm.publication.WCMPublicationPresentationService * #unsubcribeLifecycle(javax.jcr.Node) */ public void unsubcribeLifecycle(Node node) throws NotInPublicationLifecycleException, Exception { publicationService.unsubcribeLifecycle(node); } /* * (non-Javadoc) * @see * org.exoplatform.services.wcm.publication.WCMPublicationPresentationService * #getWebpagePublicationPlugins() */ public Map<String, WebpagePublicationPlugin> getWebpagePublicationPlugins() { return publicationPlugins; } /* (non-Javadoc) * @see org.picocontainer.Startable#start() */ public void start() { } /* (non-Javadoc) * @see org.picocontainer.Startable#stop() */ public void stop() { } /* (non-Javadoc) * @see org.exoplatform.services.wcm.publication.WCMPublicationService#isEnrolledInWCMLifecycle(javax.jcr.Node) */ public boolean isEnrolledInWCMLifecycle(Node node) throws NotInPublicationLifecycleException, Exception { if(!publicationService.isNodeEnrolledInLifecycle(node)) return false; String lifecyleName = publicationService.getNodeLifecycleName(node); if(publicationPlugins.containsKey(lifecyleName)) return true; throw new NotInWCMPublicationException(); } /** * This default implementation uses "States and versions based publication" as * a default lifecycle for all sites and "Simple Publishing" for the root * user. */ public void enrollNodeInLifecycle(Node node, String siteName, String remoteUser) throws Exception { /* * lifecycle based on site (each site can define its own publication * lifecycle) We choose to use a different publication plugin for testing * only for now (test has to be created separetly) */ if ("test".equals(siteName)) { enrollNodeInLifecycle(node, SIMPLE_LIFECYCLE_NAME); } else { enrollNodeInLifecycle(node, STATEVERSION_LIFECYCLE_NAME); } } /** * This default implementation simply delegates updates to the node WebpagePublicationPlugin. */ public void updateLifecyleOnChangeContent(Node node, String siteName, String remoteUser) throws Exception { updateLifecyleOnChangeContent(node, siteName, remoteUser, null); } /** * This default implementation checks if the state is valid then delegates the update to the node WebpagePublicationPlugin. */ public void updateLifecyleOnChangeContent(Node node, String siteName, String remoteUser, String newState) throws Exception { if(!publicationService.isNodeEnrolledInLifecycle(node)) { enrollNodeInLifecycle(node,siteName, remoteUser); } String lifecycleName = publicationService.getNodeLifecycleName(node); WebpagePublicationPlugin publicationPlugin = publicationPlugins.get(lifecycleName); boolean hasState = false; if (newState!=null) { String[] states = publicationPlugin.getPossibleStates(); for (String state:states) { if (state.equals(newState)) hasState=true; } } if (hasState) publicationPlugin.updateLifecyleOnChangeContent(node, remoteUser, newState); else publicationPlugin.updateLifecyleOnChangeContent(node, remoteUser); listenerService.broadcast(UPDATE_EVENT, cmsService, node); } public String getContentState(Node node) throws Exception { String currentState = null; if(node.hasProperty("publication:currentState")) { currentState = node.getProperty("publication:currentState").getString(); } return currentState; } }