package org.exoplatform.ecms.upgrade.path; import org.exoplatform.commons.upgrade.UpgradeProductPlugin; import org.exoplatform.commons.version.util.VersionComparator; import org.exoplatform.container.xml.InitParams; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ExtendedSession; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.PathNotFoundException; /** * * This class is used to migrade nodes which path is changed. It will move these nodes to new position. We must * configured source node and target node in configuration.xml via two variable source.node and target.node. * source.node must contains the workspace name. * Ex: source.node=collaboration:/sites content/live * target.node=/sites * */ public class NodePathUpgradePlugin extends UpgradeProductPlugin { private Log log = ExoLogger.getLogger(this.getClass()); private RepositoryService repositoryService_; private String srcNode; private String destNode; public NodePathUpgradePlugin(RepositoryService repoService, InitParams initParams){ super(initParams); this.repositoryService_ = repoService; this.srcNode= initParams.getValueParam("source.node").getValue(); this.destNode = initParams.getValueParam("target.node").getValue(); } @Override public void processUpgrade(String oldVersion, String newVersion) { log.info("Start " + this.getClass().getName() + "............."); if ((srcNode == null) || ("".equals(srcNode)) || (destNode == null) || ("".equals(destNode))) { log.info("Source and target node must be set to run plugin!"); return; } String workspace = srcNode.split(":")[0]; String nodePath = srcNode.split(":")[1]; SessionProvider sessionProvider = SessionProvider.createSystemProvider(); try{ ExtendedSession session = (ExtendedSession)sessionProvider.getSession(workspace, repositoryService_.getCurrentRepository()); Node sourceNode = session.getRootNode().getNode(nodePath.substring(1)); Node targetNode = null; try { targetNode = session.getRootNode().getNode(destNode.substring(1)); } catch(PathNotFoundException pne) { targetNode = session.getRootNode().addNode("sites"); session.getRootNode().save(); } if (sourceNode.hasNodes()){ NodeIterator iter = sourceNode.getNodes(); while (iter.hasNext()){ Node child = (Node) iter.next(); if (targetNode.hasNode(child.getName())) { targetNode.getNode(child.getName()).remove(); session.save(); } log.info("Move " + nodePath + "/" + child.getName() + " to " + destNode + "/" + child.getName()); session.move(nodePath + "/" + child.getName(), destNode + "/" + child.getName(), false); session.save(); } //Remove source node sourceNode.remove(); session.save(); } }catch(Exception e){ log.error("Unexpected error happens in moving nodes", e.getMessage()); }finally { if (sessionProvider != null) { sessionProvider.close(); } } } @Override public boolean shouldProceedToUpgrade(String newVersion, String previousVersion) { // --- return true only for the first version of platform return VersionComparator.isAfter(newVersion,previousVersion); } }