/* * Copyright (C) 2003-2010 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.symlink; import java.util.Calendar; import java.util.GregorianCalendar; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.PathNotFoundException; import javax.jcr.Session; import javax.jcr.UnsupportedRepositoryOperationException; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import org.exoplatform.services.cms.CmsService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.listener.Event; import org.exoplatform.services.listener.Listener; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.utils.WCMCoreUtils; /** * Created by The eXo Platform SAS * Author : Phan Le Thanh Chuong * chuong.phan@exoplatform.com, phan.le.thanh.chuong@gmail.com * Jun 11, 2010 */ public class PublicationUpdateStateListener extends Listener<CmsService, Node> { private static final Log LOG = ExoLogger.getLogger(PublicationUpdateStateListener.class.getName()); private RepositoryService repositoryService; public PublicationUpdateStateListener() { repositoryService = WCMCoreUtils.getService(RepositoryService.class); } public void onEvent(Event<CmsService, Node> event) throws Exception { if ("WCMPublicationService.event.updateState".equals(event.getEventName())) { Node targetNode = event.getData(); if (targetNode.isNodeType("exo:taxonomyLink")) return; try { targetNode.getUUID(); } catch (UnsupportedRepositoryOperationException e) { return; } String title = null; Node liveNode = null; Calendar liveDate = null; String titlePublished = null; Long index = null; Calendar dateModified = new GregorianCalendar(); if(targetNode.canAddMixin("exo:datetime")) { targetNode.addMixin("exo:datetime"); } targetNode.setProperty("exo:dateModified", dateModified); if (targetNode.hasProperty("exo:title")) { try { title = targetNode.getProperty("exo:title").getString(); } catch (PathNotFoundException e) { if (LOG.isInfoEnabled()) { LOG.info("No such of property exo:title for this node:"); } } } if (targetNode.hasProperty("publication:liveDate")) { try { liveDate = targetNode.getProperty("publication:liveDate").getDate(); } catch (PathNotFoundException e) { if (LOG.isInfoEnabled()) { LOG.info("No such of property publication:liveDate for this node:"); } } } if (targetNode.hasProperty("publication:liveRevision")) { try { String nodeVersionUUID = targetNode.getProperty("publication:liveRevision").getString(); Node revNode = targetNode.getVersionHistory().getSession().getNodeByUUID(nodeVersionUUID); if (revNode!=null) liveNode = revNode.getNode("jcr:frozenNode"); } catch (Exception e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } } try { if (!targetNode.isNodeType("exo:sortable") && targetNode.canAddMixin("exo:sortable")) { targetNode.addMixin("exo:sortable"); } } catch (PathNotFoundException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } if (!targetNode.hasProperty("exo:index")) { targetNode.setProperty("exo:index", new Long(1000)); } if (targetNode.hasProperty("exo:index")) { try { index = targetNode.getProperty("exo:index").getLong(); } catch (PathNotFoundException e) { if (LOG.isInfoEnabled()) { LOG.info("No such of property exo:index for this node:"); } } } if (liveNode!=null && liveNode.hasProperty("exo:title")) { titlePublished = targetNode.hasProperty("exo:titlePublished") ? targetNode.getProperty("exo:titlePublished") .getString() : null; String liveTitle = liveNode.getProperty("exo:title").getString(); if (liveTitle != null && !liveTitle.equals(titlePublished)) { targetNode.setProperty("exo:titlePublished", liveTitle); titlePublished = liveTitle; targetNode.save(); } } String[] wsNames = repositoryService.getCurrentRepository().getWorkspaceNames(); for (String workspace:wsNames) { Session session = repositoryService.getCurrentRepository().getSystemSession(workspace); try { QueryManager queryManager = session.getWorkspace().getQueryManager(); Query query = queryManager.createQuery("SELECT * FROM exo:taxonomyLink WHERE exo:uuid='" + targetNode.getUUID() + "'", Query.SQL); NodeIterator iterator = query.execute().getNodes(); boolean needSessionSave=false; while (iterator.hasNext()) { Node linkNode = iterator.nextNode(); if (!linkNode.isNodeType("exo:sortable")) { if (!linkNode.canAddMixin("exo:sortable")) { break; } linkNode.addMixin("exo:sortable"); } try { String currentName = linkNode.hasProperty("exo:name")?linkNode.getProperty("exo:name").getString():null; if (name != null && !name.equals(currentName)) { linkNode.setProperty("exo:name", name); needSessionSave = true; } } catch (PathNotFoundException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } try { Long currentIndex = linkNode.hasProperty("exo:index")?linkNode.getProperty("exo:index").getLong():null; if (index != null && !index.equals(currentIndex)) { linkNode.setProperty("exo:index", index); needSessionSave = true; } } catch (PathNotFoundException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } try { String currentTitle = linkNode.hasProperty("exo:title")?linkNode.getProperty("exo:title").getString():null; if (title != null && !title.equals(currentTitle)) { linkNode.setProperty("exo:title", title); needSessionSave = true; } } catch (PathNotFoundException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } try { String currTitlePublished = linkNode.hasProperty("exo:titlePublished") ? linkNode.getProperty("exo:titlePublished") .getString() : null; if (titlePublished != null && !titlePublished.equals(currTitlePublished)) { linkNode.setProperty("exo:titlePublished", titlePublished); needSessionSave = true; } } catch (PathNotFoundException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } try { Calendar currLiveDate = linkNode.hasProperty("publication:liveDate") ? linkNode.getProperty("publication:liveDate") .getDate() : null; if (liveDate != null && !liveDate.equals(currLiveDate)) { linkNode.setProperty("publication:liveDate", liveDate); needSessionSave = true; } } catch (PathNotFoundException e) { if (LOG.isWarnEnabled()) { LOG.warn(e.getMessage()); } } if (linkNode.hasProperty("exo:dateModified")) { Calendar currentDateModified = linkNode.getProperty("exo:dateModified").getDate(); if (dateModified != null && !dateModified.equals(currentDateModified)) { linkNode.setProperty("exo:dateModified", dateModified); needSessionSave = true; } } if (LOG.isInfoEnabled()) { String currentState = targetNode.hasProperty("publication:currentState") ? targetNode. getProperty("publication:currentState") .getString() : ""; String currentName = linkNode.hasProperty("exo:name") ? linkNode.getProperty("exo:name") .getString() : ""; String currentIndex = linkNode.hasProperty("exo:index") ? linkNode.getProperty("exo:index") .getString() : ""; String currentTitle = linkNode.hasProperty("exo:title") ? linkNode.getProperty("exo:title") .getString() : ""; String currentTitlePub = linkNode.hasProperty("exo:titlePublished") ? linkNode.getProperty("exo:titlePublished") .getString() : ""; String currLiveDate = linkNode.hasProperty("publication:liveDate") ? linkNode.getProperty("publication:liveDate") .getDate() .getTime() .toString() : ""; String currentDateModified = linkNode.hasProperty("exo:dateModified") ? linkNode.getProperty("exo:dateModified") .getDate() .getTime() .toString() : ""; LOG.info("@@@@ " + needSessionSave + " @state@" + currentState + " @Name@" + currentName + " @Index@" + currentIndex + " @Title@" + currentTitle + " @TitlePub@" + currentTitlePub + " @DateLive@" + currLiveDate + " @DateMod@" + currentDateModified); } } if (needSessionSave) session.save(); } catch(Exception e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected problem occur. Update state process is not completed", e); } } finally { if(session != null) session.logout(); } } } return; } }