From 322731b1a2ce7feecccffe7aec241eff4f199b8b Mon Sep 17 00:00:00 2001 From: Jan Vonka Date: Mon, 21 Nov 2011 16:56:26 +0000 Subject: [PATCH] Merged DEV to HEAD: (ALF-11606) 31637: THOR-358: update CMIS getChildren (V3.x => CMISServicesImpl) 31700: THOR-358: update CMIS getChildren (V3.x => CMISServicesImpl) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@32155 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/repo/cmis/rest/CMISScript.java | 60 ++++++++++++++----- .../repo/cmis/ws/DMNavigationServicePort.java | 55 ++++++++++++----- 2 files changed, 84 insertions(+), 31 deletions(-) diff --git a/source/java/org/alfresco/repo/cmis/rest/CMISScript.java b/source/java/org/alfresco/repo/cmis/rest/CMISScript.java index 5aaf2ebf06..de92214bde 100644 --- a/source/java/org/alfresco/repo/cmis/rest/CMISScript.java +++ b/source/java/org/alfresco/repo/cmis/rest/CMISScript.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2011 Alfresco Software Limited. * * This file is part of Alfresco * @@ -19,6 +19,7 @@ package org.alfresco.repo.cmis.rest; import java.io.Serializable; +import java.math.BigInteger; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -59,6 +60,7 @@ import org.alfresco.cmis.CMISTypesFilterEnum; import org.alfresco.cmis.CMISVersioningStateEnum; import org.alfresco.cmis.CMISQueryOptions.CMISQueryMode; import org.alfresco.cmis.acl.CMISAccessControlEntryImpl; +import org.alfresco.query.PagingResults; import org.alfresco.repo.cmis.reference.ObjectIdReference; import org.alfresco.repo.cmis.reference.ReferenceFactory; import org.alfresco.repo.jscript.Association; @@ -70,8 +72,10 @@ import org.alfresco.repo.web.util.paging.Page; import org.alfresco.repo.web.util.paging.PagedResults; import org.alfresco.repo.web.util.paging.Paging; import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.util.Pair; import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; @@ -395,27 +399,53 @@ public class CMISScript extends BaseScopableProcessorExtension */ public PagedResults queryChildren(ScriptNode parent, String typesFilter, String orderBy, Page page) { - CMISTypesFilterEnum filter = resolveTypesFilter(typesFilter); - NodeRef[] children; try { - children = cmisService.getChildren(parent.getNodeRef(), filter, orderBy); + CMISTypesFilterEnum filter = resolveTypesFilter(typesFilter); + + int maxItems = page.getSize(); + int skipCount = (page.getNumber() - (page.isZeroBasedIdx() ? 0 : 1)) * maxItems; + + PagingResults pageOfNodeInfos = cmisService.getChildren(parent.getNodeRef(), filter, BigInteger.valueOf(maxItems), BigInteger.valueOf(skipCount), orderBy); + + int pageCnt = pageOfNodeInfos.getPage().size(); + NodeRef[] children = new NodeRef[pageCnt]; + + int idx = 0; + for (FileInfo child : pageOfNodeInfos.getPage()) + { + children[idx] = child.getNodeRef(); + idx++; + } + + // total count ? + int totalCount = pageCnt; + Pair totalCounts = pageOfNodeInfos.getTotalResultCount(); + if (totalCounts != null) + { + Integer totalCountLower = totalCounts.getFirst(); + Integer totalCountUpper = totalCounts.getSecond(); + if ((totalCountLower != null) && (totalCountLower.equals(totalCountUpper))) + { + totalCount = totalCountLower; + } + } + + Cursor cursor = paging.createCursor(totalCount, page); + + ScriptNode[] nodes = new ScriptNode[pageCnt]; + for (int i = 0; i < pageCnt; i++) + { + nodes[i] = new ScriptNode(children[i], services, getScope()); + } + + PagedResults results = paging.createPagedResults(nodes, cursor); + return results; } catch (CMISInvalidArgumentException e) { throw new WebScriptException(e.getStatusCode(), e.getMessage(), e); } - - Cursor cursor = paging.createCursor(children.length, page); - int cnt = (cursor.getRowCount() < 0 ? 0 : cursor.getRowCount()); - ScriptNode[] nodes = new ScriptNode[cnt]; - for (int i = cursor.getStartRow(); i <= cursor.getEndRow(); i++) - { - nodes[i - cursor.getStartRow()] = new ScriptNode(children[i], services, getScope()); - } - - PagedResults results = paging.createPagedResults(nodes, cursor); - return results; } /** diff --git a/source/java/org/alfresco/repo/cmis/ws/DMNavigationServicePort.java b/source/java/org/alfresco/repo/cmis/ws/DMNavigationServicePort.java index 0c959af0a0..68b716d605 100644 --- a/source/java/org/alfresco/repo/cmis/ws/DMNavigationServicePort.java +++ b/source/java/org/alfresco/repo/cmis/ws/DMNavigationServicePort.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2011 Alfresco Software Limited. * * This file is part of Alfresco * @@ -29,11 +29,14 @@ import org.alfresco.cmis.CMISInvalidArgumentException; import org.alfresco.cmis.CMISServiceException; import org.alfresco.cmis.CMISTypesFilterEnum; import org.alfresco.cmis.PropertyFilter; +import org.alfresco.query.PagingResults; import org.alfresco.repo.cmis.ws.utils.ExceptionUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.web.util.paging.Cursor; +import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.util.Pair; /** * Port for navigation service @@ -107,34 +110,54 @@ public class DMNavigationServicePort extends DMAbstractServicePort implements Na { checkRepositoryId(repositoryId); PropertyFilter propertyFilter = createPropertyFilter(filter); - + try { NodeRef folderNodeRef = cmisService.getFolder(folderId); - - NodeRef[] listing = cmisService.getChildren(folderNodeRef, CMISTypesFilterEnum.ANY, orderBy); - - CmisObjectInFolderListType result = new CmisObjectInFolderListType(); - - Cursor cursor = createCursor(listing.length, skipCount, maxItems); - - for (int index = cursor.getStartRow(); index <= cursor.getEndRow(); index++) + + PagingResults pageOfNodeInfos = cmisService.getChildren(folderNodeRef, CMISTypesFilterEnum.ANY, maxItems, skipCount, orderBy); + + int pageCnt = pageOfNodeInfos.getPage().size(); + NodeRef[] children = new NodeRef[pageCnt]; + + int idx = 0; + for (FileInfo child : pageOfNodeInfos.getPage()) { - CmisObjectType cmisObject = createCmisObject(listing[index], propertyFilter, includeRelationships, + children[idx] = child.getNodeRef(); + idx++; + } + + CmisObjectInFolderListType result = new CmisObjectInFolderListType(); + + // has more ? + result.setHasMoreItems(pageOfNodeInfos.hasMoreItems()); + + // total count ? + Pair totalCounts = pageOfNodeInfos.getTotalResultCount(); + if (totalCounts != null) + { + Integer totalCountLower = totalCounts.getFirst(); + Integer totalCountUpper = totalCounts.getSecond(); + if ((totalCountLower != null) && (totalCountLower.equals(totalCountUpper))) + { + result.setNumItems(BigInteger.valueOf(totalCountLower)); + } + } + + for (int index = 0; index < pageCnt; index++) + { + CmisObjectType cmisObject = createCmisObject(children[index], propertyFilter, includeRelationships, includeAllowableActions, renditionFilter); CmisObjectInFolderType cmisObjectInFolder = new CmisObjectInFolderType(); cmisObjectInFolder.setObject(cmisObject); if (includePathSegments != null && includePathSegments) { - cmisObjectInFolder.setPathSegment(propertiesUtil.getProperty(listing[index], + cmisObjectInFolder.setPathSegment(propertiesUtil.getProperty(children[index], CMISDictionaryModel.PROP_NAME, "")); } result.getObjects().add(cmisObjectInFolder); } - - result.setHasMoreItems(cursor.getEndRow() < (listing.length - 1)); - result.setNumItems(BigInteger.valueOf(listing.length)); - + // TODO: Process includeRelationships, includeACL return result; }