First part of ETHREEOH-3062.

- Fast NodeService.getChildAssocs(types) based API added to ScriptNode for non-xpath based retrieval of file folder child nodes
 - Optionally retrieve files, folders or both
 - Optionally ignore certain sub-types e.g. fm:forum
 - Automatically remove cm:systemfolder sub-types - equivalent to FileFolderService.list() and related methods
 - Modified Share treenode data webscript to use faster API for child folder node counts

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@16980 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2009-10-16 10:04:05 +00:00
parent 7df0bd8088
commit d7663be072
2 changed files with 112 additions and 0 deletions

View File

@@ -34,7 +34,9 @@ import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
@@ -467,6 +469,108 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol
return Context.getCurrentContext().newArray(this.scope, getChildrenByXPath(xpath, null, false)); return Context.getCurrentContext().newArray(this.scope, getChildrenByXPath(xpath, null, false));
} }
/**
* @return Returns a JavaScript array of child file/folder nodes for this nodes.
* Automatically retrieves all sub-types of cm:content and cm:folder, also removes
* system folder types from the results.
* This is equivalent to @see FileFolderService.list()
*/
public Scriptable childFileFolders()
{
return childFileFolders(true, true, null);
}
/**
* @param files Return files extending from cm:content
* @param folders Return folders extending from cm:folder - ignoring sub-types of cm:systemfolder
* @return Returns a JavaScript array of child file/folder nodes for this nodes.
* Automatically retrieves all sub-types of cm:content and cm:folder, also removes
* system folder types from the results.
* This is equivalent to @see FileFolderService.listFiles() and @see FileFolderService.listFolders()
*/
public Scriptable childFileFolders(boolean files, boolean folders)
{
return childFileFolders(files, folders, null);
}
/**
* @param files Return files extending from cm:content
* @param folders Return folders extending from cm:folder - ignoring sub-types of cm:systemfolder
* @return Returns a JavaScript array of child file/folder nodes for this nodes.
* Automatically retrieves all sub-types of cm:content and cm:folder, also removes
* system folder types from the results.
* Also optionally removes additional type qnames. The additional type can be
* specified in short or long qname string form as a single string or an Array e.g. "fm:forum".
* This is equivalent to @see FileFolderService.listFiles() and @see FileFolderService.listFolders()
*/
public Scriptable childFileFolders(boolean files, boolean folders, Object ignoreTypes)
{
Object[] results;
// Build a list of file and folder types
DictionaryService dd = services.getDictionaryService();
Set<QName> searchTypeQNames = new HashSet<QName>(16, 1.0f);
if (folders)
{
Collection<QName> qnames = dd.getSubTypes(ContentModel.TYPE_FOLDER, true);
searchTypeQNames.addAll(qnames);
searchTypeQNames.add(ContentModel.TYPE_FOLDER);
}
if (files)
{
Collection<QName> qnames = dd.getSubTypes(ContentModel.TYPE_CONTENT, true);
searchTypeQNames.addAll(qnames);
searchTypeQNames.add(ContentModel.TYPE_CONTENT);
qnames = dd.getSubTypes(ContentModel.TYPE_LINK, true);
searchTypeQNames.addAll(qnames);
searchTypeQNames.add(ContentModel.TYPE_LINK);
}
// Remove 'system' folder types
Collection<QName> qnames = dd.getSubTypes(ContentModel.TYPE_SYSTEM_FOLDER, true);
searchTypeQNames.removeAll(qnames);
searchTypeQNames.remove(ContentModel.TYPE_SYSTEM_FOLDER);
// Add user defined types to ignore from the search
if (ignoreTypes instanceof ScriptableObject)
{
Serializable types = getValueConverter().convertValueForRepo((ScriptableObject)ignoreTypes);
if (types instanceof List)
{
for (Serializable typeObj : (List<Serializable>)types)
{
searchTypeQNames.remove(createQName(typeObj.toString()));
}
}
else if (types instanceof String)
{
searchTypeQNames.remove(createQName(types.toString()));
}
}
else if (ignoreTypes instanceof String)
{
searchTypeQNames.remove(createQName(ignoreTypes.toString()));
}
// Perform the query and collect the results
if (searchTypeQNames.size() != 0)
{
List<ChildAssociationRef> childAssocRefs = this.nodeService.getChildAssocs(this.nodeRef, searchTypeQNames);
results = new Object[childAssocRefs.size()];
for (int i=0; i<childAssocRefs.size(); i++)
{
ChildAssociationRef assocRef = childAssocRefs.get(i);
results[i] = newInstance(assocRef.getChildRef(), this.services, this.scope);
}
}
else
{
results = new Object[0];
}
return Context.getCurrentContext().newArray(this.scope, results);
}
/** /**
* Return the target associations from this Node. As a Map of assoc name to a JavaScript array of Nodes. * Return the target associations from this Node. As a Map of assoc name to a JavaScript array of Nodes.
* The Map returned implements the Scriptable interface to allow access to the assoc arrays via JavaScript * The Map returned implements the Scriptable interface to allow access to the assoc arrays via JavaScript

View File

@@ -0,0 +1,8 @@
var results1 = companyhome.childFileFolders();
var results2 = companyhome.childFileFolders(true, false);
var results3 = companyhome.childFileFolders(false, true);
var results4 = companyhome.childFileFolders(false, true, "fm:forums");
var types = new Array();
types.push("fm:forums");
types.push("fm:forum");
var results5 = companyhome.childFileFolders(false, true, types);