/* * 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.ecm.publication.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import javax.jcr.Node; import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.nodetype.NoSuchNodeTypeException; import javax.jcr.nodetype.NodeType; import org.exoplatform.services.ecm.publication.AlreadyInPublicationLifecycleException; import org.exoplatform.services.ecm.publication.IncorrectStateUpdateLifecycleException; import org.exoplatform.services.ecm.publication.NotInPublicationLifecycleException; 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.jcr.core.ManageableRepository; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.cms.CmsService; import org.exoplatform.services.listener.ListenerService; import org.exoplatform.services.wcm.publication.WCMPublicationService; import org.exoplatform.services.wcm.utils.WCMCoreUtils; /** * Created by The eXo Platform SAS * Author : Romain Dénarié * romain.denarie@exoplatform.com * 7 mai 08 */ public class PublicationServiceImpl implements PublicationService { private static final Log LOG = ExoLogger.getLogger(PublicationServiceImpl.class.getName()); private PublicationPresentationService publicationPresentationService; private ListenerService listenerService; private CmsService cmsService; private final String localeFile = "locale.portlet.publication.PublicationService"; Map<String, PublicationPlugin> publicationPlugins_; public PublicationServiceImpl (PublicationPresentationService presentationService) { if (LOG.isInfoEnabled()) { LOG.info("# PublicationService initialization #"); } this.publicationPresentationService = presentationService; this.listenerService = WCMCoreUtils.getService(ListenerService.class); this.cmsService = WCMCoreUtils.getService(CmsService.class); publicationPlugins_ = new HashMap<String, PublicationPlugin>(); } /* (non-Javadoc) * @see org.exoplatform.services.cms.publication.PublicationService#addLog(javax.jcr.Node, java.lang.String[]) */ public void addLog(Node node, String[] args) throws NotInPublicationLifecycleException, Exception { Session session = node.getSession() ; ManageableRepository repository = (ManageableRepository)session.getRepository() ; Session systemSession = repository.getSystemSession(session.getWorkspace().getName()) ; if (!isNodeEnrolledInLifecycle(node)) { throw new NotInPublicationLifecycleException(); } List<Value> newValues = new ArrayList<Value>(); Value[] values = node.getProperty(HISTORY).getValues(); newValues.addAll(Arrays.<Value>asList(values)) ; StringBuffer string2add = new StringBuffer(); for (int i=0; i<args.length;i++) { if (i==0) string2add.append(args[i]); else string2add.append(",").append(args[i]); } Value value2add=systemSession.getValueFactory().createValue(string2add.toString()); newValues.add(value2add); node.setProperty(HISTORY,newValues.toArray(new Value[newValues.size()])) ; systemSession.logout(); } /* * (non-Javadoc) * @seeorg.exoplatform.services.cms.publication.PublicationService# * addPublicationPlugin * (org.exoplatform.services.cms.publication.PublicationPlugin) */ public void addPublicationPlugin(PublicationPlugin p) { this.publicationPlugins_.put(p.getLifecycleName(),p); publicationPresentationService.addPublicationPlugin(p); } /* * (non-Javadoc) * @see * org.exoplatform.services.cms.publication.PublicationService#changeState * (javax.jcr.Node, java.lang.String, java.util.HashMap) */ public void changeState(Node node, String newState, HashMap<String, String> context) throws NotInPublicationLifecycleException, IncorrectStateUpdateLifecycleException, Exception { if (!isNodeEnrolledInLifecycle(node)) throw new NotInPublicationLifecycleException(); String lifecycleName=getNodeLifecycleName(node); PublicationPlugin nodePlugin = this.publicationPlugins_.get(lifecycleName); nodePlugin.changeState(node, newState, context); listenerService.broadcast(WCMPublicationService.UPDATE_EVENT, cmsService, node); } /* * (non-Javadoc) * @seeorg.exoplatform.services.cms.publication.PublicationService# * enrollNodeInLifecycle(javax.jcr.Node, java.lang.String) */ public void enrollNodeInLifecycle(Node node, String lifecycle) throws AlreadyInPublicationLifecycleException, Exception { if (isNodeEnrolledInLifecycle(node)) throw new AlreadyInPublicationLifecycleException(); //create mixin publication, //with lifecycleName = lifecycle //current state = default state = enrolled //history : empty if(publicationPlugins_.get(lifecycle).canAddMixin(node)) publicationPlugins_.get(lifecycle).addMixin(node) ; else throw new NoSuchNodeTypeException() ; node.setProperty(LIFECYCLE_NAME, lifecycle); node.setProperty(CURRENT_STATE, "enrolled"); List<Value> history = new ArrayList<Value>(); node.setProperty(HISTORY, history.toArray(new Value[history.size()])); publicationPlugins_.get(lifecycle).changeState(node, "enrolled", new HashMap<String,String>()); } public void unsubcribeLifecycle(Node node) throws NotInPublicationLifecycleException, Exception { if(!isNodeEnrolledInLifecycle(node)) throw new NotInPublicationLifecycleException(); //remove all extended publication mixin nodetype for this node String lifecycleName = getNodeLifecycleName(node); if (LOG.isInfoEnabled()) { LOG.info("The document: " + node.getName() + " unsubcribe publication lifecycle: " + lifecycleName); } for(NodeType nodeType: node.getMixinNodeTypes()) { if(!nodeType.isNodeType(PUBLICATION)) continue; node.removeMixin(nodeType.getName()); } node.getSession().save(); } /* (non-Javadoc) * @see org.exoplatform.services.cms.publication.PublicationService#getCurrentState(javax.jcr.Node) */ public String getCurrentState(Node node) throws NotInPublicationLifecycleException,Exception { if (!isNodeEnrolledInLifecycle(node)) throw new NotInPublicationLifecycleException(); return node.getProperty(CURRENT_STATE).getString(); } /* (non-Javadoc) * @see org.exoplatform.services.cms.publication.PublicationService#getLog(javax.jcr.Node) */ public String[][] getLog(Node node) throws NotInPublicationLifecycleException, Exception { if (!isNodeEnrolledInLifecycle(node)) throw new NotInPublicationLifecycleException(); Value[] values = node.getProperty(HISTORY).getValues(); String [][] result=new String[values.length][]; for (int i=0;i<values.length;i++) { Value currentValue=values[i]; String currentString=currentValue.getString(); String [] currentStrings=currentString.split(","); result[i]=currentStrings; } return result; } /* * (non-Javadoc) * @seeorg.exoplatform.services.cms.publication.PublicationService# * getNodeLifecycleDesc(javax.jcr.Node) */ public String getNodeLifecycleDesc(Node node) throws NotInPublicationLifecycleException, Exception { if (!isNodeEnrolledInLifecycle(node)) throw new NotInPublicationLifecycleException(); String lifecycleName = getNodeLifecycleName(node); PublicationPlugin nodePlugin = this.publicationPlugins_.get(lifecycleName); return nodePlugin.getNodeLifecycleDesc(node); } /* (non-Javadoc) * @see org.exoplatform.services.cms.publication.PublicationService#getNodeLifecycleName(javax.jcr.Node) */ public String getNodeLifecycleName(Node node) throws NotInPublicationLifecycleException, Exception { if (!isNodeEnrolledInLifecycle(node)) throw new NotInPublicationLifecycleException(); return node.getProperty(LIFECYCLE_NAME).getString(); } /* (non-Javadoc) * @see org.exoplatform.services.cms.publication.PublicationService#getPublicationPlugins() */ public Map<String,PublicationPlugin> getPublicationPlugins() { return this.publicationPlugins_; } /* (non-Javadoc) * @see org.exoplatform.services.cms.publication.PublicationService#getStateImage(javax.jcr.Node) */ public byte[] getStateImage(Node node,Locale locale) throws NotInPublicationLifecycleException, Exception { if (!isNodeEnrolledInLifecycle(node)) { throw new NotInPublicationLifecycleException(); } String lifecycleName = getNodeLifecycleName(node); PublicationPlugin nodePlugin = this.publicationPlugins_.get(lifecycleName); return nodePlugin.getStateImage(node, locale); } /* (non-Javadoc) * @see org.exoplatform.services.cms.publication.PublicationService#getUserInfo(javax.jcr.Node) */ public String getUserInfo(Node node, Locale locale) throws NotInPublicationLifecycleException, Exception { if (!isNodeEnrolledInLifecycle(node)) { throw new NotInPublicationLifecycleException(); } String lifecycleName=getNodeLifecycleName(node); PublicationPlugin nodePlugin = this.publicationPlugins_.get(lifecycleName); return nodePlugin.getUserInfo(node, locale); } /* (non-Javadoc) * @see org.exoplatform.services.cms.publication.PublicationService#isNodeEnrolledInLifecycle(javax.jcr.Node) */ public boolean isNodeEnrolledInLifecycle(Node node) throws Exception { return node.isNodeType(PUBLICATION); } public String getLocalizedAndSubstituteLog(Locale locale, String key, String[] values){ ClassLoader cl=this.getClass().getClassLoader(); ResourceBundle resourceBundle=ResourceBundle.getBundle(localeFile,locale,cl); String result = resourceBundle.getString(key); return String.format(result,values); } public String getLocalizedAndSubstituteLog(Node node, Locale locale, String key, String[] values) throws NotInPublicationLifecycleException, Exception { String lifecycleName = getNodeLifecycleName(node); PublicationPlugin publicationPlugin = publicationPlugins_.get(lifecycleName); try { return publicationPlugin.getLocalizedAndSubstituteMessage(locale, key, values); } catch (Exception e) { if (LOG.isWarnEnabled()) { LOG.warn("Exception when get log message", e); } return key; } } public boolean isUnsubcribeLifecycle(Node node) throws Exception { /* Check lifecycle of node */ if (isNodeEnrolledInLifecycle(node)) return false; return true; } public Node getNodePublish(Node node, String pluginName) throws Exception { if (node.isNodeType(PUBLICATION)) { PublicationPlugin publicationPlugin; if (pluginName == null || pluginName.trim().equals("")) { String lifecycleName = node.getProperty(LIFECYCLE_NAME).getString(); publicationPlugin = publicationPlugins_.get(lifecycleName); } else { publicationPlugin = publicationPlugins_.get(pluginName); } return publicationPlugin.getNodeView(node, null); } return null; } }