From d7663be072ed045348bfaadb0e77c1f360834d6f Mon Sep 17 00:00:00 2001 From: Kevin Roast Date: Fri, 16 Oct 2009 10:04:05 +0000 Subject: [PATCH] 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 --- .../org/alfresco/repo/jscript/ScriptNode.java | 104 ++++++++++++++++++ .../repo/jscript/test_childfilefolders.js | 8 ++ 2 files changed, 112 insertions(+) create mode 100644 source/java/org/alfresco/repo/jscript/test_childfilefolders.js diff --git a/source/java/org/alfresco/repo/jscript/ScriptNode.java b/source/java/org/alfresco/repo/jscript/ScriptNode.java index 607b810651..c241cfd6e1 100644 --- a/source/java/org/alfresco/repo/jscript/ScriptNode.java +++ b/source/java/org/alfresco/repo/jscript/ScriptNode.java @@ -34,7 +34,9 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; 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 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 searchTypeQNames = new HashSet(16, 1.0f); + if (folders) + { + Collection qnames = dd.getSubTypes(ContentModel.TYPE_FOLDER, true); + searchTypeQNames.addAll(qnames); + searchTypeQNames.add(ContentModel.TYPE_FOLDER); + } + if (files) + { + Collection 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 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)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 childAssocRefs = this.nodeService.getChildAssocs(this.nodeRef, searchTypeQNames); + results = new Object[childAssocRefs.size()]; + for (int i=0; i