From ed487863f7ab2638029bb915ec0656afcab50878 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Wed, 8 Jun 2011 15:38:14 +0000 Subject: [PATCH] Merged DEV/SWIFT to HEAD 26373: WIP: ALF-7339: RSOLR 009: Index track and build from SOLR - track content, track dates, basic sorting 26388: WIP: ALF-7339: RSOLR 009: Index track and build from SOLR - basic tracking of d:text and d:mltext (not dual tokenisation and identifier support) 26527: WIP ALF-7339: RSOLR 009: Index track and build from SOLR - track d:content, d:mltext, d:text - start of cross locale search and ordering support int the index (not at query time yet) - no dual tokenisation support yet - currently adding all fields for tokenized BOTH - .sort needs additional tokenisation support to use a different separator (\u0000 used to indicate locale and split stuff - better toe use {en}woof style with \u0000 split 26822: ALF-8166: RINF 10: treenode.get.js - tweak to use "childFileFolders" 26825: ALF-8133: RINF 10: ScriptNode - update "childByNamePath" to use optimised NodeService.getChildByName 26850: ALF-8133: RINF 10: ScriptNode - update "childByNamePath" to use optimised NodeService.getChildByName - follow-on to r26825 26862: ALF-8110: RINF 10: doclist.get.js - update "path" filter to use DB-based queries (by default) - milestone check-in for review and comparison (note: sorting will be pushed down as part of paging support in lower layers) 26872: Updated SOLR dev env 26915: ALF-8224: part 1: encapsulate cmis dictionary for SOLR usage 27017: Javadoc: removed uncommented param 27018: Added 'namePattern' property to NamedObjectRegistry to enforce naming conventions where required 27019: CannedQuery interface and related infrastructure - Provides basic support for query, sort, filter and page - CannedQueryFactory allows more complex implementations where required - Should be enough of a starter for tasks requiring miscellaneous queries - ALF-7167: Canned queries 27037: WCM QS Needs the Web-Client, so define the dependency to Eclipse 27041: Move WCM-QS test setup to a common base class 27044: Start to conver the WCM QS behaviour from JS to Java 27080: Added comment section for NodeLocator script declarations 27081: General cleanup: Removed non-javadocs, empty javadocs, unused code, etc 27104: Fixed ALF-7476: Typo in output from MMT 27114: ALF-7479: RSOLR 016: Query Handler ALF-7480: RSOLR 017: SOLR result set ALF-7481: RSOLR 018: Execute query against SOLR - First working stack git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@28286 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../solr/getNodeContent.get.desc.xml | 3 +- .../slingshot/documentlibrary/doclist.get.js | 156 ++++++++++++++++-- .../slingshot/documentlibrary/treenode.get.js | 27 ++- .../web-scripts-application-context.xml | 6 +- .../repo/cmis/rest/CMISAclMethod.java | 2 +- .../repo/cmis/ws/DMAbstractServicePort.java | 2 +- .../repo/cmis/ws/DMAclServicePort.java | 2 +- .../repo/web/scripts/solr/GetNodeContent.java | 5 +- 8 files changed, 161 insertions(+), 42 deletions(-) diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/solr/getNodeContent.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/solr/getNodeContent.get.desc.xml index f994c2a04e..b3ece26c60 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/solr/getNodeContent.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/solr/getNodeContent.get.desc.xml @@ -1,8 +1,7 @@ Get node property content as text Get the content for the node property as text. - /api/solr/textContent/{nodeId} - /api/solr/textContent/{nodeId}/{propertyQName} + /api/solr/textContent?nodeId={nodeId}&propertyQName={propertyQName?} argument admin required diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.js index adb65ec038..b0c89e744a 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/doclist.get.js @@ -27,24 +27,65 @@ function getDoclist() favourites: favourites }), query = filterParams.query; - - // Query the nodes - passing in sort and result limit parameters - if (query !== "") + + var useDB = true; + + if ((useDB == true) && ((filter == "path") || (filter == "") || (filter == null))) { - allNodes = search.query( - { - query: query, - language: filterParams.language, - page: - { - maxItems: (filterParams.limitResults ? parseInt(filterParams.limitResults, 10) : 0) - }, - sort: filterParams.sort, - templates: filterParams.templates, - namespace: (filterParams.namespace ? filterParams.namespace : null) - }); + // TODO also add DB filter by "node" (in addition to "path") + + var parentNode = parsedArgs.pathNode; + if (parentNode !== null) + { + var ignoreTypes=["cm:thumbnail", "fm:forums","fm:forum","fm:topic","fm:post"]; + + allNodes = parentNode.childFileFolders(true, true, ignoreTypes); + + // TODO push down sorting to FileFolderService.list (see also AlfrescoCmisService.getChildren) + if ((args.sortField == null) || (args.sortField == "cm:name")) + { + sortByName(allNodes, args.sortAsc); + } + else if (args.sortField == "cm:content.size") + { + sortBySize(allNodes, args.sortAsc); + } + else if (args.sortField == "cm:content.mimetype") + { + sortByMimetype(allNodes, args.sortAsc); + } + else if ((args.sortField == "cm:created") || (args.sortField == "cm:modified")) + { + sortByPropDate(allNodes, args.sortAsc, args.sortField); + } + else + { + // assume string (=> supports toLowerCase) + sortByPropStr(allNodes, args.sortAsc, args.sortField); + } + } } - + else + { + // Query the nodes - passing in sort and result limit parameters + if (query !== "") + { + allNodes = search.query( + { + query: query, + language: filterParams.language, + page: + { + maxItems: (filterParams.limitResults ? parseInt(filterParams.limitResults, 10) : 0) + }, + sort: filterParams.sort, + templates: filterParams.templates, + namespace: (filterParams.namespace ? filterParams.namespace : null) + }); + } + } + + // Ensure folders and folderlinks appear at the top of the list var folderNodes = [], documentNodes = []; @@ -216,6 +257,89 @@ function getDoclist() }); } +// TEMP +function sortByName(arr, sortAsc) +{ + arr.sort + ( + function( a, b ) + { + return ((sortAsc == null) || (sortAsc == "true")) + ? (b.name.toLowerCase() > a.name.toLowerCase() ? -1 : 1) + : (a.name.toLowerCase() > b.name.toLowerCase() ? -1 : 1); + } + ); +} + +// TEMP +function sortBySize(arr, sortAsc) +{ + arr.sort + ( + function( a, b ) + { + return ((sortAsc == null) || (sortAsc == "true")) + ? (b.size > a.size ? -1 : 1) + : (a.size > b.size ? -1 : 1); + } + ); +} + +// TEMP +function sortByMimetype(arr, sortAsc) +{ + arr.sort + ( + function( a, b ) + { + return ((sortAsc == null) || (sortAsc == "true")) + ? (b.mimetype.toLowerCase() > a.mimetype.toLowerCase() ? -1 : 1) + : (a.mimetype.toLowerCase() > b.mimetype.toLowerCase() ? -1 : 1); + } + ); +} + +// TEMP +function sortByPropStr(arr, sortAsc, sortField) +{ + arr.sort + ( + function( a, b ) + { + var aStr = a.properties[sortField]; + if (aStr == null) + { + aStr = ""; + } + + var bStr = b.properties[sortField]; + if (bStr == null) + { + bStr = ""; + } + + return ((sortAsc == null) || (sortAsc == "true")) + ? (bStr == "" && aStr != "" ? -1 : (bStr != "" && aStr == "" ? 1 : (bStr.toLowerCase() > aStr.toLowerCase() ? -1 : 1))) + : (aStr == "" && bStr != "" ? -1 : (aStr != "" && bStr == "" ? 1 : (aStr.toLowerCase() > bStr.toLowerCase() ? -1 : 1))); + } + ); +} + +// TEMP +function sortByPropDate(arr, sortAsc, sortField) +{ + arr.sort + ( + function( a, b ) + { + return ((sortAsc == null) || (sortAsc == "true")) + ? (b.properties[sortField] - a.properties[sortField]) + : (a.properties[sortField] - b.properties[sortField]); + } + ); +} + + /** * Document List Component: doclist */ diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/treenode.get.js b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/treenode.get.js index 84b3e6898f..487d514dcd 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/treenode.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/treenode.get.js @@ -12,17 +12,12 @@ function getTreeNode() { var items = new Array(), hasSubfolders = true, - ignoredTypes = - { - "{http://www.alfresco.org/model/forum/1.0}forum": true, - "{http://www.alfresco.org/model/forum/1.0}topic": true, - "{http://www.alfresco.org/model/content/1.0}systemfolder": true - }, + ignoredTypes = ['fm:forum','fm:topic'], evalChildFolders = args["children"] !== "false", resultsTrimmed = false, argMax = parseInt(args["max"], 10), maxItems = isNaN(argMax) ? -1 : argMax; - + // Use helper function to get the arguments var parsedArgs = ParseArgs.getParsedArgs(); if (parsedArgs === null) @@ -31,22 +26,20 @@ function getTreeNode() } // Look for folders in the pathNode - for each (item in parsedArgs.pathNode.children) + var folders = parsedArgs.pathNode.childFileFolders(false, true, ignoredTypes); + for each (item in folders) { - if (item.isSubType("cm:folder") && !(item.type in ignoredTypes)) + if (evalChildFolders) { - if (evalChildFolders) - { hasSubfolders = item.childFileFolders(false, true, "fm:forum").length > 0; - } + } - items.push( - { + items.push( + { node: item, hasSubfolders: hasSubfolders - }); - } - + }); + if (maxItems !== -1 && items.length > maxItems) { items.pop(); diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml index 9fd59b4059..d33d676606 100644 --- a/config/alfresco/web-scripts-application-context.xml +++ b/config/alfresco/web-scripts-application-context.xml @@ -1254,7 +1254,11 @@ - + + + + + diff --git a/source/java/org/alfresco/repo/cmis/rest/CMISAclMethod.java b/source/java/org/alfresco/repo/cmis/rest/CMISAclMethod.java index adb9b6b04f..1b081e3383 100644 --- a/source/java/org/alfresco/repo/cmis/rest/CMISAclMethod.java +++ b/source/java/org/alfresco/repo/cmis/rest/CMISAclMethod.java @@ -20,8 +20,8 @@ package org.alfresco.repo.cmis.rest; import java.util.List; -import org.alfresco.cmis.CMISAccessControlFormatEnum; import org.alfresco.cmis.CMISAccessControlService; +import org.alfresco.opencmis.CMISAccessControlFormatEnum; import org.alfresco.repo.template.TemplateNode; import org.alfresco.service.cmr.repository.NodeRef; diff --git a/source/java/org/alfresco/repo/cmis/ws/DMAbstractServicePort.java b/source/java/org/alfresco/repo/cmis/ws/DMAbstractServicePort.java index 41e4c25afa..0be03d44c7 100644 --- a/source/java/org/alfresco/repo/cmis/ws/DMAbstractServicePort.java +++ b/source/java/org/alfresco/repo/cmis/ws/DMAbstractServicePort.java @@ -33,7 +33,6 @@ import java.util.Map.Entry; import javax.xml.bind.JAXBElement; import org.alfresco.cmis.CMISAccessControlEntry; -import org.alfresco.cmis.CMISAccessControlFormatEnum; import org.alfresco.cmis.CMISAccessControlReport; import org.alfresco.cmis.CMISAccessControlService; import org.alfresco.cmis.CMISAclPropagationEnum; @@ -54,6 +53,7 @@ import org.alfresco.cmis.PropertyFilter; import org.alfresco.cmis.acl.CMISAccessControlEntryImpl; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; +import org.alfresco.opencmis.CMISAccessControlFormatEnum; import org.alfresco.repo.cmis.ws.utils.ExceptionUtil; import org.alfresco.repo.cmis.ws.utils.PropertyUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil; diff --git a/source/java/org/alfresco/repo/cmis/ws/DMAclServicePort.java b/source/java/org/alfresco/repo/cmis/ws/DMAclServicePort.java index 9e70f7f26d..1a835bf571 100644 --- a/source/java/org/alfresco/repo/cmis/ws/DMAclServicePort.java +++ b/source/java/org/alfresco/repo/cmis/ws/DMAclServicePort.java @@ -18,9 +18,9 @@ */ package org.alfresco.repo.cmis.ws; -import org.alfresco.cmis.CMISAccessControlFormatEnum; import org.alfresco.cmis.CMISAccessControlReport; import org.alfresco.cmis.CMISServiceException; +import org.alfresco.opencmis.CMISAccessControlFormatEnum; import org.alfresco.repo.cmis.ws.utils.ExceptionUtil; import org.alfresco.service.cmr.repository.NodeRef; diff --git a/source/java/org/alfresco/repo/web/scripts/solr/GetNodeContent.java b/source/java/org/alfresco/repo/web/scripts/solr/GetNodeContent.java index 418f00f0c8..02ed60f890 100644 --- a/source/java/org/alfresco/repo/web/scripts/solr/GetNodeContent.java +++ b/source/java/org/alfresco/repo/web/scripts/solr/GetNodeContent.java @@ -93,16 +93,15 @@ public class GetNodeContent extends StreamContent { ContentReader textReader = null; Exception transformException = null; - Map templateVars = req.getServiceMatch().getTemplateVars(); - String nodeIDString = templateVars.get("nodeId"); + String nodeIDString = req.getParameter("nodeId"); if(nodeIDString == null) { throw new WebScriptException("nodeID parameter is required for GetNodeContent"); } long nodeId = Long.valueOf(nodeIDString).longValue(); - String propertyQName = templateVars.get("propertyQName"); + String propertyQName = req.getParameter("propertyQName"); QName propertyName = null; if(propertyQName == null) {