Written by The Jahia Team
 
Sysadmins
   Estimated reading time:

You have a message "Nothing to publish" but you know that something has been modified. 

Answer

A solution is to force a publication.

To see if a node needs to be published or not, Jahia compare the last modification date with the publication date. So a good way to force a publication is to update the last publication node of all nodes of a sub-tree.
Here is a script you could use to force a publication. Please set the startPath with the starting node path. You can run this script from the Groovy Console of the tools

import org.jahia.api.Constants
import javax.jcr.NodeIterator
import javax.jcr.RepositoryException
import javax.jcr.query.Query

String startPath = "/sites/mySite/home";

JCRTemplate.getInstance().doExecuteWithSystemSession(null, Constants.EDIT_WORKSPACE, null, new JCRCallback() {
    @Override
    Object doInJCR(JCRSessionWrapper session) throws RepositoryException {
        try {
            // touch the starting node
            JCRNodeWrapper startNode = session.getNode(startPath);
            touch(startNode);

            // touch all sub nodes
            String query = "select * from [nt:base] as p where isdescendantnode('" +  startPath + "')";
            NodeIterator iterator = session.getWorkspace().getQueryManager().createQuery(query, Query.JCR_SQL2).execute().getNodes();
            while (iterator.hasNext()) {
                JCRNodeWrapper node = (JCRNodeWrapper) iterator.nextNode();
                touch(node);
            }
        } catch (javax.jcr.PathNotFoundException e) {
            log.info("Could not find node with path " + startPath);
        }
        session.save();
        return null;
    }
});


private void touch(JCRNodeWrapper node) {
    if (node != null) {
        try {
            node.setProperty("jcr:lastModified", new GregorianCalendar());
            log.info(node.getPath())
        } catch (javax.jcr.nodetype.ConstraintViolationException e) {
        }
    }
}