How to change the value of the external links in JCR?

  Written by The Jahia Team
 
Developers
   Estimated reading time:
7.1.2.0
How to change the value of the external links in JCR?

Answer

Here is the Groovy script to achieve this task:

import org.jahia.api.Constants
import org.jahia.tools.patches.LoggerWrapper
import org.jahia.services.content.JCRCallback
import org.jahia.services.content.JCRNodeWrapper
import org.jahia.services.content.JCRSessionWrapper
import org.jahia.services.content.JCRTemplate
import org.jahia.services.content.JCRPublicationService

import javax.jcr.NodeIterator
import javax.jcr.RepositoryException
import javax.jcr.query.Query

final LoggerWrapper logger = log

final String nodeTypeName = "jnt:externalLink"
final String jUrl = "j:url"
final String jUuid= "jcr:uuid"
final String jNodename = "j:nodename"
final String urlFound
final String nodeName
final String uuid
final String[] urlToFind = ["http://www.google.fr","http://www.google.en"]
final String[] urlToReplace = ["http://www.google.com","http://www.google.com"]


JCRTemplate.getInstance().doExecuteWithSystemSession(null, Constants.EDIT_WORKSPACE, new JCRCallback() {
    @Override
    Object doInJCR(JCRSessionWrapper session) throws RepositoryException {

        final String stmt = "SELECT * FROM [" + nodeTypeName + "] WHERE ISDESCENDANTNODE(&#quot;/sites/covea&#quot;)"
        final NodeIterator iteratorSites = session.getWorkspace().getQueryManager().createQuery(stmt, Query.JCR_SQL2).execute().getNodes()
        while (iteratorSites.hasNext()) {
            JCRNodeWrapper node = iteratorSites.nextNode() as JCRNodeWrapper
            urlFound = node.getPropertyAsString(jUrl)

            for(i = 0; i < urlToFind.length; i++)
                if (urlFound.equals(urlToFind[i]))
                {
                    nodeName = node.getPropertyAsString(jNodename)
                    uuid = node.getPropertyAsString(jUuid)
                    node.setProperty(jUrl,urlToReplace[i])
                    session.save()
                    JCRPublicationService.getInstance().publishByMainId(uuid)
                    log.info("URL: "+urlToFind[i]+" of Node name: "+nodeName+" replaced by URL: "+urlToReplace[i]+" in Default and Live workspaces")
                }

        }
        return null
    }
})