Source code: org/acegisecurity/vote/AbstractAccessDecisionManager.java
1 /* Copyright 2004, 2005 Acegi Technology Pty Limited
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 package org.acegisecurity.vote;
17
18 import java.util.Iterator;
19 import java.util.List;
20
21 import org.acegisecurity.AccessDecisionManager;
22 import org.acegisecurity.AcegiMessageSource;
23 import org.acegisecurity.ConfigAttribute;
24 import org.springframework.beans.factory.InitializingBean;
25 import org.springframework.context.MessageSource;
26 import org.springframework.context.MessageSourceAware;
27 import org.springframework.context.support.MessageSourceAccessor;
28 import org.springframework.util.Assert;
29
30
31 /**
32 * Abstract implementation of {@link AccessDecisionManager}.
33 *
34 * <p>
35 * Handles configuration of a bean context defined list of {@link
36 * AccessDecisionVoter}s and the access control behaviour if all voters
37 * abstain from voting (defaults to deny access).
38 * </p>
39 */
40 public abstract class AbstractAccessDecisionManager
41 implements AccessDecisionManager, InitializingBean, MessageSourceAware {
42 //~ Instance fields ========================================================
43
44 private List decisionVoters;
45 protected MessageSourceAccessor messages = AcegiMessageSource.getAccessor();
46 private boolean allowIfAllAbstainDecisions = false;
47
48 //~ Methods ================================================================
49
50 public void afterPropertiesSet() throws Exception {
51 checkIfValidList(this.decisionVoters);
52 Assert.notNull(this.messages, "A message source must be set");
53 }
54
55 private void checkIfValidList(List listToCheck) {
56 if ((listToCheck == null) || (listToCheck.size() == 0)) {
57 throw new IllegalArgumentException(
58 "A list of AccessDecisionVoters is required");
59 }
60 }
61
62 public List getDecisionVoters() {
63 return this.decisionVoters;
64 }
65
66 public boolean isAllowIfAllAbstainDecisions() {
67 return allowIfAllAbstainDecisions;
68 }
69
70 public void setAllowIfAllAbstainDecisions(
71 boolean allowIfAllAbstainDecisions) {
72 this.allowIfAllAbstainDecisions = allowIfAllAbstainDecisions;
73 }
74
75 public void setDecisionVoters(List newList) {
76 checkIfValidList(newList);
77
78 Iterator iter = newList.iterator();
79
80 while (iter.hasNext()) {
81 Object currentObject = null;
82
83 try {
84 currentObject = iter.next();
85
86 AccessDecisionVoter attemptToCast = (AccessDecisionVoter) currentObject;
87 } catch (ClassCastException cce) {
88 throw new IllegalArgumentException("AccessDecisionVoter "
89 + currentObject.getClass().getName()
90 + " must implement AccessDecisionVoter");
91 }
92 }
93
94 this.decisionVoters = newList;
95 }
96
97 public void setMessageSource(MessageSource messageSource) {
98 this.messages = new MessageSourceAccessor(messageSource);
99 }
100
101 public boolean supports(ConfigAttribute attribute) {
102 Iterator iter = this.decisionVoters.iterator();
103
104 while (iter.hasNext()) {
105 AccessDecisionVoter voter = (AccessDecisionVoter) iter.next();
106
107 if (voter.supports(attribute)) {
108 return true;
109 }
110 }
111
112 return false;
113 }
114
115 /**
116 * Iterates through all <code>AccessDecisionVoter</code>s and ensures each
117 * can support the presented class.
118 *
119 * <p>
120 * If one or more voters cannot support the presented class,
121 * <code>false</code> is returned.
122 * </p>
123 *
124 * @param clazz DOCUMENT ME!
125 *
126 * @return DOCUMENT ME!
127 */
128 public boolean supports(Class clazz) {
129 Iterator iter = this.decisionVoters.iterator();
130
131 while (iter.hasNext()) {
132 AccessDecisionVoter voter = (AccessDecisionVoter) iter.next();
133
134 if (!voter.supports(clazz)) {
135 return false;
136 }
137 }
138
139 return true;
140 }
141 }