1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.acegisecurity.acl;
17
18 import org.acegisecurity.Authentication;
19
20 import org.apache.commons.logging.Log;
21 import org.apache.commons.logging.LogFactory;
22
23 import org.springframework.beans.factory.InitializingBean;
24 import org.springframework.util.Assert;
25
26 import java.util.Iterator;
27 import java.util.List;
28
29
30 /***
31 * Iterates through a list of {@link AclProvider}s to locate the ACLs that
32 * apply to a given domain object instance.
33 *
34 * <P>
35 * If no compatible provider is found, it is assumed that no ACLs apply for the
36 * specified domain object instance and <code>null</code> is returned.
37 * </p>
38 *
39 * @author Ben Alex
40 * @version $Id: AclProviderManager.java,v 1.4 2005/11/17 00:55:51 benalex Exp $
41 */
42 public class AclProviderManager implements AclManager, InitializingBean {
43
44
45 private static final Log logger = LogFactory.getLog(AclProviderManager.class);
46
47
48
49 private List providers;
50
51
52
53 public AclEntry[] getAcls(Object domainInstance) {
54 Assert.notNull(domainInstance, "domainInstance is null - violating interface contract");
55
56 Iterator iter = providers.iterator();
57
58 while (iter.hasNext()) {
59 AclProvider provider = (AclProvider) iter.next();
60
61 if (provider.supports(domainInstance)) {
62 if (logger.isDebugEnabled()) {
63 logger.debug("ACL lookup using "
64 + provider.getClass().getName());
65 }
66
67 return provider.getAcls(domainInstance);
68 }
69 }
70
71 if (logger.isDebugEnabled()) {
72 logger.debug("No AclProvider found for "
73 + domainInstance.toString());
74 }
75
76 return null;
77 }
78
79 public AclEntry[] getAcls(Object domainInstance,
80 Authentication authentication) {
81 Assert.notNull(domainInstance, "domainInstance is null - violating interface contract");
82 Assert.notNull(authentication, "authentication is null - violating interface contract");
83
84 Iterator iter = providers.iterator();
85
86 while (iter.hasNext()) {
87 AclProvider provider = (AclProvider) iter.next();
88
89 if (provider.supports(domainInstance)) {
90 if (logger.isDebugEnabled()) {
91 logger.debug("ACL lookup using "
92 + provider.getClass().getName());
93 }
94
95 return provider.getAcls(domainInstance, authentication);
96 } else {
97 if (logger.isDebugEnabled()) {
98 logger.debug("Provider " + provider.toString()
99 + " does not support " + domainInstance);
100 }
101 }
102 }
103
104 if (logger.isDebugEnabled()) {
105 logger.debug("No AclProvider found for "
106 + domainInstance.toString());
107 }
108
109 return null;
110 }
111
112 /***
113 * Sets the {@link AclProvider} objects to be used for ACL determinations.
114 *
115 * @param newList that should be used for ACL determinations
116 *
117 * @throws IllegalArgumentException if an invalid provider was included in
118 * the list
119 */
120 public void setProviders(List newList) {
121 checkIfValidList(newList);
122
123 Iterator iter = newList.iterator();
124
125 while (iter.hasNext()) {
126 Object currentObject = null;
127
128 try {
129 currentObject = iter.next();
130
131 AclProvider attemptToCast = (AclProvider) currentObject;
132 } catch (ClassCastException cce) {
133 throw new IllegalArgumentException("AclProvider "
134 + currentObject.getClass().getName()
135 + " must implement AclProvider");
136 }
137 }
138
139 this.providers = newList;
140 }
141
142 public List getProviders() {
143 return this.providers;
144 }
145
146 public void afterPropertiesSet() throws Exception {
147 checkIfValidList(this.providers);
148 }
149
150 private void checkIfValidList(List listToCheck) {
151 Assert.notEmpty(listToCheck, "A list of AclManagers is required");
152 }
153 }