From 259d5ebea71f77a27a0dc5dbfa12e655dcd69c4d Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Fri, 11 Mar 2016 22:25:39 +0000 Subject: [PATCH] Merged 5.1.N (5.1.1) to HEAD (5.2) 122341 rneamtu: Merged 5.0.N (5.0.4) to 5.1.N (5.1.1) (PARTIAL MERGE) 122280 amorarasu: Merged V4.2-BUG-FIX (4.2.7) to 5.0.N (5.0.4) 122237 amukha: Merged V4.2.6 (4.2.6) to V4.2-BUG-FIX (4.2.7) 122236 amukha: Merged AMUKHA/MNT-15509 (4.2.6) to V4.2.6 (4.2.6) 122202 amukha: MNT-15509: Changing a Site from Private to Public duplicates permissions - Removed duplicate permissions for ScripNodes - Added JUnit test git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@123658 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/repo/jscript/ScriptNode.java | 32 +++++++++++++++++-- .../jscript/app/JSONConversionComponent.java | 10 ++++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/source/java/org/alfresco/repo/jscript/ScriptNode.java b/source/java/org/alfresco/repo/jscript/ScriptNode.java index 536fc23984..e8e861b510 100644 --- a/source/java/org/alfresco/repo/jscript/ScriptNode.java +++ b/source/java/org/alfresco/repo/jscript/ScriptNode.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2014 Alfresco Software Limited. + * Copyright (C) 2005-2016 Alfresco Software Limited. * * This file is part of Alfresco * @@ -31,6 +31,7 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; @@ -45,6 +46,7 @@ import java.util.StringTokenizer; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ApplicationModel; import org.alfresco.model.ContentModel; +import org.alfresco.opencmis.CMISConnector; import org.alfresco.query.PagingRequest; import org.alfresco.query.PagingResults; import org.alfresco.repo.action.executer.TransformActionExecuter; @@ -1536,6 +1538,31 @@ public class ScriptNode implements Scopeable, NamespacePrefixResolverProvider return Context.getCurrentContext().newArray(this.scope, retrieveAllSetPermissions(false, true)); } + /** + * @return Sorted list of AccessPermission based on CMISConnector.AccessPermissionComparator + * and AccessStatus of the permission for an authority. + */ + public static List getSortedACLs(Set acls) + { + ArrayList ordered = new ArrayList(acls); + Map deDuplicatedPermissions = new HashMap(acls.size()); + Collections.sort(ordered, new CMISConnector.AccessPermissionComparator()); + for (AccessPermission current : ordered) + { + String composedKey = current.getAuthority() + current.getPermission(); + if (current.getAccessStatus() == AccessStatus.ALLOWED) + { + deDuplicatedPermissions.put(composedKey, current); + } + else if (current.getAccessStatus() == AccessStatus.DENIED) + { + deDuplicatedPermissions.remove(composedKey); + } + } + + return new ArrayList(deDuplicatedPermissions.values()); + } + /** * Helper to construct the response object for the various getPermissions() calls. * @@ -1549,7 +1576,8 @@ public class ScriptNode implements Scopeable, NamespacePrefixResolverProvider { Set acls = this.services.getPermissionService().getAllSetPermissions(getNodeRef()); List permissions = new ArrayList(acls.size()); - for (AccessPermission permission : acls) + List ordered = getSortedACLs(acls); + for (AccessPermission permission : ordered) { if (!direct || permission.isSetDirectly()) { diff --git a/source/java/org/alfresco/repo/jscript/app/JSONConversionComponent.java b/source/java/org/alfresco/repo/jscript/app/JSONConversionComponent.java index ee48fb11d7..cbff3a8191 100644 --- a/source/java/org/alfresco/repo/jscript/app/JSONConversionComponent.java +++ b/source/java/org/alfresco/repo/jscript/app/JSONConversionComponent.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2016 Alfresco Software Limited. * * This file is part of Alfresco * @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Set; import org.alfresco.model.ContentModel; +import org.alfresco.repo.jscript.ScriptNode; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.lock.LockService; import org.alfresco.service.cmr.lock.LockStatus; @@ -444,8 +445,11 @@ public class JSONConversionComponent { Set acls = permissionService.getAllSetPermissions(nodeRef); JSONArray permissions = new JSONArray(); - for (AccessPermission permission : acls) - { + + List ordered = ScriptNode.getSortedACLs(acls); + + for (AccessPermission permission : ordered) + { StringBuilder buf = new StringBuilder(64); buf.append(permission.getAccessStatus()) .append(';')