cancel
Showing results for 
Search instead for 
Did you mean: 

Count all uploaded documents in Share sites

ashankar
Champ in-the-making
Champ in-the-making
Alfresco gurus,

After looking fruitlessly for a tool that provides an accurate total count of uploaded files in the Share document libraries, I've cobbled together the following, inelegant Javascript script (I'm a fortran programmer!).  I've verified the count successfully against test Alfresco instances (versions 3.2r2 and 4.x) by going into each site and manually counting every file uploaded.  Please take a look and see if I've goofed up somewhere.


//
// Script to recursively descend into sites and count files in document libraries
//

var count = 0;

// Get an array of all site nodes
var sites = siteService.listSites(null,null,0);

// Loop over sites
for each (var site in sites) {
     //logger.log("Site: " + site.shortName);
    
     // First, find files at the top level in /documentLibrary (excluding subfolders)

     // Loop over the sites's children (doclib, wiki/blog, etc.)
     for each (child in site.node.children) {

         // Loop over the children of doclib/wiki/blog and get files in the doclib
         for each (item in child.children) {
                // Find unique files
                ufile = unique(item);

                if (ufile.isDocument && ufile.displayPath.match(/documentLibrary/)) {
                        //logger.log("   " + ufile.displayPath + "/" + ufile.name);
                        count++;
                }
          }
     }
    // Now add the file nodes in /documentLibrary subfolders
    getSpaces (site.node, 0);
}
logger.log("Total: " + count);

// Function to find every file in a doclib subfolder in a site
function getSpaces (node, depth) {
// Recursively descend into folders and files all files
  if (node.isContainer) {
       //logger.log("Folder: " + node.displayPath + "/" + node.name);
       for each (var file in node.children) {
         if (file.displayPath.match(/documentLibrary/) && file.isDocument) {
           //logger.log("   " + file.displayPath + "/" + file.name);
           count++;
         }
       }
  }
  var children = node.children;
  for each (var child in children) {
    if (child.isContainer && node.children.size != 0) {
      getSpaces(child, depth++);

    }
  }
}

// Function to find unique members of an array
function unique (origArr) {
    var newArr = [];
        found = undefined;
        x = 0;
        y = 0;
        origLen = origArr.length,
        found,
        x, y;

    for ( x = 0; x < origLen; x++ ) {
        found = undefined;
        for ( y = 0; y < newArr.length; y++ ) {
            if ( origArr[x] === newArr[y] ) {
              found = true;
              break;
            }
        }
        if ( !found) newArr.push( origArr[x] );
    }
   return newArr;
};


Regards,

Anurag
1 REPLY 1

rajupingili
Champ in-the-making
Champ in-the-making
You need not write the entire logic. just use the fallowing query to get all the documents that are uploaded into site

var noOfDocs=search.luceneSearch("TYPE:\"cm:content\" AND PATH:\"//app:company_home/st:sites//*\" ");

This will give the documents that are uploaded into site which are cm:content and it's subtypes.
if you have your own type just specify it.
Since you want count, just this will return array so you can use noOfDocs.length