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(';')