diff --git a/source/java/org/alfresco/repo/domain/permissions/ADMAccessControlListDAO.java b/source/java/org/alfresco/repo/domain/permissions/ADMAccessControlListDAO.java index 7dc7bf4de3..a8ef5e18f4 100644 --- a/source/java/org/alfresco/repo/domain/permissions/ADMAccessControlListDAO.java +++ b/source/java/org/alfresco/repo/domain/permissions/ADMAccessControlListDAO.java @@ -26,6 +26,8 @@ import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.repo.domain.node.NodeIdAndAclId; +import org.alfresco.repo.domain.permissions.traitextender.AccessControlListDAOExtension; +import org.alfresco.repo.domain.permissions.traitextender.AccessControlListDAOTrait; import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.security.permissions.ACLType; import org.alfresco.repo.security.permissions.AccessControlList; @@ -36,6 +38,11 @@ import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.InvalidNodeRefException; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.traitextender.AJExtender; +import org.alfresco.traitextender.Extend; +import org.alfresco.traitextender.ExtendedTrait; +import org.alfresco.traitextender.Extensible; +import org.alfresco.traitextender.Trait; import org.alfresco.util.Pair; import org.springframework.dao.ConcurrencyFailureException; @@ -45,7 +52,7 @@ import org.springframework.dao.ConcurrencyFailureException; * * @author andyh */ -public class ADMAccessControlListDAO implements AccessControlListDAO +public class ADMAccessControlListDAO implements AccessControlListDAO, Extensible { /** * The DAO for Nodes. @@ -56,7 +63,14 @@ public class ADMAccessControlListDAO implements AccessControlListDAO private BehaviourFilter behaviourFilter; private boolean preserveAuditableData = true; - + + private final ExtendedTrait accessControlListDAOTrait; + + public ADMAccessControlListDAO() + { + accessControlListDAOTrait=new ExtendedTrait(createAccessControlListDAOTrait()); + } + public void setNodeDAO(NodeDAO nodeDAO) { this.nodeDAO = nodeDAO; @@ -97,6 +111,8 @@ public class ADMAccessControlListDAO implements AccessControlListDAO return nodePair.getFirst(); } + @Override + @Extend(traitAPI = AccessControlListDAOTrait.class, extensionAPI = AccessControlListDAOExtension.class) public Acl getAccessControlList(NodeRef nodeRef) { Long nodeId = getNodeIdNotNull(nodeRef); @@ -475,76 +491,104 @@ public class ADMAccessControlListDAO implements AccessControlListDAO } } } - - /** - * - * Counter for each type of ACL change - * @author andyh - * - */ - public static class CounterSet extends HashMap - { - /** - * - */ - private static final long serialVersionUID = -3682278258679211481L; - - CounterSet() - { - super(); - this.put(ACLType.DEFINING, new Counter()); - this.put(ACLType.FIXED, new Counter()); - this.put(ACLType.GLOBAL, new Counter()); - this.put(ACLType.LAYERED, new Counter()); - this.put(ACLType.OLD, new Counter()); - this.put(ACLType.SHARED, new Counter()); - } - - void add(ACLType type, Counter c) - { - Counter counter = get(type); - counter.add(c.getCounter()); - } - - void increment(ACLType type) - { - Counter counter = get(type); - counter.increment(); - } - - void add(CounterSet other) - { - add(ACLType.DEFINING, other.get(ACLType.DEFINING)); - add(ACLType.FIXED, other.get(ACLType.FIXED)); - add(ACLType.GLOBAL, other.get(ACLType.GLOBAL)); - add(ACLType.LAYERED, other.get(ACLType.LAYERED)); - add(ACLType.OLD, other.get(ACLType.OLD)); - add(ACLType.SHARED, other.get(ACLType.SHARED)); - } - } - - /** - * Simple counter - * @author andyh - * - */ - public static class Counter - { - int counter; - - void increment() - { - counter++; - } - - int getCounter() - { - return counter; - } - - void add(int i) - { - counter += i; - } - } -} + + /** + * + * Counter for each type of ACL change + * @author andyh + * + */ + public static class CounterSet extends HashMap + { + /** + * + */ + private static final long serialVersionUID = -3682278258679211481L; + + CounterSet() + { + super(); + this.put(ACLType.DEFINING, new Counter()); + this.put(ACLType.FIXED, new Counter()); + this.put(ACLType.GLOBAL, new Counter()); + this.put(ACLType.LAYERED, new Counter()); + this.put(ACLType.OLD, new Counter()); + this.put(ACLType.SHARED, new Counter()); + } + + void add(ACLType type, Counter c) + { + Counter counter = get(type); + counter.add(c.getCounter()); + } + + void increment(ACLType type) + { + Counter counter = get(type); + counter.increment(); + } + + void add(CounterSet other) + { + add(ACLType.DEFINING, other.get(ACLType.DEFINING)); + add(ACLType.FIXED, other.get(ACLType.FIXED)); + add(ACLType.GLOBAL, other.get(ACLType.GLOBAL)); + add(ACLType.LAYERED, other.get(ACLType.LAYERED)); + add(ACLType.OLD, other.get(ACLType.OLD)); + add(ACLType.SHARED, other.get(ACLType.SHARED)); + } + } + + /** + * Simple counter + * @author andyh + * + */ + public static class Counter + { + int counter; + + void increment() + { + counter++; + } + + int getCounter() + { + return counter; + } + + void add(int i) + { + counter += i; + } + } + + @Override + public ExtendedTrait getTrait(Class traitAPI) + { + return (ExtendedTrait) accessControlListDAOTrait; + } + + public AccessControlListDAOTrait createAccessControlListDAOTrait() + { + return new AccessControlListDAOTrait() + { + + @Override + public Acl getAccessControlList(final NodeRef nodeRef) + { + return AJExtender.run(new AJExtender.ExtensionBypass() + { + @Override + public Acl run() + { + return ADMAccessControlListDAO.this.getAccessControlList(nodeRef); + }; + }); + }; + + }; + + } +}