/* * Copyright (C) 2016 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.ecms.upgrade.action; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Session; import org.exoplatform.commons.upgrade.UpgradeProductPlugin; import org.exoplatform.commons.version.util.VersionComparator; import org.exoplatform.container.PortalContainer; import org.exoplatform.container.component.RequestLifeCycle; import org.exoplatform.container.xml.InitParams; import org.exoplatform.services.cms.actions.ActionServiceContainer; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; /** * Created by The eXo Platform SAS * Author : Aymen Boughzela aboughzela@exoplatform.com * This upgrade will be used to clean allexo:addToFavoriteAction (Favorite action) created under favorite user folder. * The removed actions it's replaced by one favorite action created on the rootbfolder /Users. * */ public class CleanFavoriteActionUpgradePlugin extends UpgradeProductPlugin { private static final Log LOG = ExoLogger.getLogger(CleanFavoriteActionUpgradePlugin.class.getName()); /** * Define relative path for action node */ private static final String EXO_ACTIONS = "exo:actions"; /** * Define nodetype ACTION_STORAGE */ private static final String ACTION_STORAGE = "exo:actionStorage"; /** * Define nodetype favorite */ private static final String ACTION_NODE_TYPE = "exo:addToFavoriteAction"; /** * Define favorite mixin */ private static final String FAVORITE_MIXIN = "exo:favoriteFolder"; private ActionServiceContainer actionServiceContainer; private NodeHierarchyCreator nodeHierarchyCreator; private RepositoryService repoService; public CleanFavoriteActionUpgradePlugin(RepositoryService repoService, ActionServiceContainer actionServiceContainer, NodeHierarchyCreator nodeHierarchyCreator, InitParams initParams) { super(initParams); this.nodeHierarchyCreator = nodeHierarchyCreator; this.actionServiceContainer = actionServiceContainer; this.repoService = repoService; } @Override public boolean shouldProceedToUpgrade(String newVersion, String previousVersion) { // --- return true only for the first version of platform return VersionComparator.isAfter(newVersion, previousVersion); } @Override public void processUpgrade(String oldVersion, String newVersion) { SessionProvider sessionProvider = null; try { LOG.info("Start " + getClass().getName() + "............."); RequestLifeCycle.begin(PortalContainer.getInstance()); sessionProvider = SessionProvider.createSystemProvider(); Session session = sessionProvider.getSession( this.repoService.getCurrentRepository() .getConfiguration() .getDefaultWorkspaceName(), this.repoService.getCurrentRepository()); String usersNodePath = this.nodeHierarchyCreator.getJcrPath("usersPath"); if (!usersNodePath.endsWith("/")) { usersNodePath = usersNodePath + "/"; } // Select all favorite Action NodeIterator nodeIter = session.getWorkspace() .getQueryManager() .createQuery("SELECT * FROM " + ACTION_NODE_TYPE + " WHERE jcr:path like '" + usersNodePath + "%'", "sql") .execute() .getNodes(); if (LOG.isDebugEnabled()) { LOG.debug("Clean unused addToFavorite count : " + nodeIter.getSize()); } while (nodeIter.hasNext()) { Node favoriteActionNode = nodeIter.nextNode(); Node actionStorageNode = favoriteActionNode.getParent(); if (LOG.isDebugEnabled()) { LOG.debug("Clean unused addToFavorite Path : " + favoriteActionNode.getPath()); } if (actionStorageNode == null || favoriteActionNode == null) { continue; } Node favoriteNode = actionStorageNode.getParent(); // skip remove favorite action created on root users folder if (usersNodePath.concat(EXO_ACTIONS).equals(actionStorageNode.getPath()) || !favoriteNode.isNodeType(FAVORITE_MIXIN)) { continue; } try { if (this.actionServiceContainer.getAction(favoriteNode, favoriteActionNode.getName()) != null) { this.actionServiceContainer.removeAction(favoriteNode, favoriteActionNode.getName(), this.repoService.getCurrentRepository().getConfiguration().getName()); } if (actionStorageNode.isNodeType(ACTION_STORAGE) && actionStorageNode.getNodes().getSize() == 0) { actionStorageNode.remove(); session.save(); } } catch (Exception ex) { LOG.error("Failed to clean addToFavorite PATH= " + favoriteActionNode.getPath(), ex); } } LOG.info("End " + getClass().getName() + "............."); } catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error(getClass().getName() + " Failed : ", e); } } finally { RequestLifeCycle.end(); if (sessionProvider != null) { sessionProvider.close(); } } } }