HistoryScheduler

Job name:

Remove the History of Documents

Job description:

The documents to remove the history for are configured on this configuration page

Job cron expression:

0 0 3 5 * ?

Job script:

import org.slf4j.LoggerFactory;
import com.xpn.xwiki.api.*;
import com.xpn.xwiki.doc.*;
import com.xpn.xwiki.web.*;
   def LOGGER = LoggerFactory.getLogger("RemoveHistory");
   def cXWiki = xwiki.getXWiki();
   def cContext = xcontext;
   def doc = cContext.getDoc();
   def cDocs = [];
   def hql = "";
   def fromClause = "";
   def whereClause = "";
   def maxResults = 0;
   def configObject = xwiki.getDocument('Code.RemoveHistoryConfiguration').getObject('Code.RemoveHistoryConfigurationClass');
   def spaces = configObject.getProperty('spaceList').value;
   def pages = configObject.getProperty('pageList').value;
   def configWhereClause = configObject.getProperty('whereClause').value;
   def configFromClause = configObject.getProperty('fromClause').value;
   def configMaxResults = configObject.getProperty('maxResults').value;
   if(spaces != null && !spaces.equals("")) {
      whereClause = whereClause + "doc.space in (" + spaces + ")";
      LOGGER.warn("Configuration spaces: $spaces");
   }
   if(pages != null && !pages.equals("")) {
     if(whereClause.equals("")) {
        whereClause = "(doc.fullName in (" + pages + "))";
     } else {
        whereClause = whereClause + "or (doc.fullName in (" + pages + "))";
     }
      LOGGER.warn("Configuration pages: $pages");
   }
   if(configWhereClause != null && !configWhereClause.equals("")) {
      whereClause = whereClause + configWhereClause;
      LOGGER.warn("Configuration where clause:  $configWhereClause");
   }
   if(configFromClause != null && !configFromClause.equals("")) {
      fromClause = configFromClause;
      LOGGER.warn("Configuration from clause:  $configFromClause");
   }
   if(configMaxResults != null) {
      maxResults = configMaxResults;
      LOGGER.warn("Max number of results: $maxResults");
   }
   if(!fromClause.equals("") || !whereClause.equals("")) {
     // select just the users and do not check the versions to improve performance
     //hql = "select doc2 from XWikiDocument as doc2, XWikiRCSNodeInfo as node where node.id.docId=doc2.id and doc2.fullName in (select doc.fullName from XWikiDocument as doc " + fromClause + " where "+ whereClause + ") group by doc2.fullName having count(node.id.version1)>1";
     hql = "select doc from XWikiDocument as doc " + fromClause + " where "+ whereClause;
      LOGGER.warn("Final query: $hql");
      cDocs = cXWiki.getStore().search(hql, maxResults, 0, cContext);
     def totalDocs = cDocs.size();
      LOGGER.warn("Found " + totalDocs + " documents in the list.");
   } else {
      LOGGER.warn("No restrictions available");
   }
   def index = 0;
   for(cDoc in cDocs) {  
     def cArchive = cDoc.getDocumentArchive(cContext);
     def cLatestVersion = cArchive.getLatestVersion();
     def v0 = v1 = v2 = 0;

     if(cLatestVersion != null) {
        v2 = cArchive.getPrevVersion(cLatestVersion);

       // We assume there are 2 versions in total
       // -> remove the oldest one
       v1 = v2;
        v0 = v1;

       // Build archive range to delete (v1 -> v2)
       while(v0 != null) {
          v0 = cArchive.getPrevVersion(v0);

         // Get the oldest (non-null) version
         if(v0 != null) {
            v1 = v0;
         }     
       }

       if(v1 != null) {
          cArchive.removeVersions(v2, v1, cContext);
          cXWiki.getVersioningStore().saveXWikiDocArchive(cArchive, true, cContext);
          cDoc.setDocumentArchive(cArchive);    
          LOGGER.warn("Removed archive for " + cDoc.prefixedFullName + " from v" + v1 + " to v" + v2);
       } else {
          LOGGER.warn("Previous version not available for " + cDoc.prefixedFullName + " because v1= " + v1 + " and v2= " + v2);
       }
        index++;
     }
   }

Back to the job list