diff --git a/core/src/main/java/org/acegisecurity/vote/AbstractAccessDecisionManager.java b/core/src/main/java/org/acegisecurity/vote/AbstractAccessDecisionManager.java index 3b8291d7d7..37c8c0b1b6 100644 --- a/core/src/main/java/org/acegisecurity/vote/AbstractAccessDecisionManager.java +++ b/core/src/main/java/org/acegisecurity/vote/AbstractAccessDecisionManager.java @@ -38,136 +38,125 @@ import org.springframework.util.Assert; /** * Abstract implementation of {@link AccessDecisionManager}. - *
+ *
* Handles configuration of a bean context defined list of * {@link AccessDecisionVoter}s and the access control behaviour if all voters * abstain from voting (defaults to deny access). * */ public abstract class AbstractAccessDecisionManager implements AccessDecisionManager, InitializingBean, - MessageSourceAware, ApplicationContextAware { - // ~ Instance fields - // ================================================================================================ + MessageSourceAware, ApplicationContextAware { + // ~ Instance fields + // ================================================================================================ - private List decisionVoters; + private List decisionVoters; - protected MessageSourceAccessor messages = AcegiMessageSource.getAccessor(); + protected MessageSourceAccessor messages = AcegiMessageSource.getAccessor(); - private boolean allowIfAllAbstainDecisions = false; + private boolean allowIfAllAbstainDecisions = false; - private boolean isSetDecisionVotersInvoked = false; + private ApplicationContext applicationContext; - private ApplicationContext applicationContext; + // ~ Methods + // ======================================================================================================== - // ~ Methods - // ======================================================================================================== + public void afterPropertiesSet() throws Exception { + if (decisionVoters == null || decisionVoters.isEmpty()) { + autoDetectVoters(); + } + Assert.notEmpty(this.decisionVoters, "A list of AccessDecisionVoters is required"); + Assert.notNull(this.messages, "A message source must be set"); + } - public void afterPropertiesSet() throws Exception { - if (!isSetDecisionVotersInvoked) { - autoDetectVoters(); - } - Assert.notEmpty(this.decisionVoters, "A list of AccessDecisionVoters is required"); - Assert.notNull(this.messages, "A message source must be set"); + private void autoDetectVoters() { + Assert.notNull(applicationContext, "Auto-detection of voters requires an application context"); + Map map = this.applicationContext.getBeansOfType(AccessDecisionVoter.class); + List list = new ArrayList(); + + for (Iterator it = map.values().iterator(); it.hasNext();) { + list.add((it.next())); + } + Collections.sort(list, new OrderComparator()); + setDecisionVoters(list); + } + + protected final void checkAllowIfAllAbstainDecisions() { + if (!this.isAllowIfAllAbstainDecisions()) { + throw new AccessDeniedException(messages.getMessage("AbstractAccessDecisionManager.accessDenied", + "Access is denied")); + } + } + + public List getDecisionVoters() { + return this.decisionVoters; + } + + public boolean isAllowIfAllAbstainDecisions() { + return allowIfAllAbstainDecisions; + } + + public void setAllowIfAllAbstainDecisions(boolean allowIfAllAbstainDecisions) { + this.allowIfAllAbstainDecisions = allowIfAllAbstainDecisions; + } + + public void setDecisionVoters(List newList) { + Assert.notEmpty(newList); + + Iterator iter = newList.iterator(); + + while (iter.hasNext()) { + Object currentObject = iter.next(); + Assert.isInstanceOf(AccessDecisionVoter.class, currentObject, "AccessDecisionVoter " + currentObject.getClass().getName() + + " must implement AccessDecisionVoter"); + } + + this.decisionVoters = newList; + } + + public void setMessageSource(MessageSource messageSource) { + this.messages = new MessageSourceAccessor(messageSource); + } + + public boolean supports(ConfigAttribute attribute) { + Iterator iter = this.decisionVoters.iterator(); + + while (iter.hasNext()) { + AccessDecisionVoter voter = (AccessDecisionVoter) iter.next(); + + if (voter.supports(attribute)) { + return true; + } + } + + return false; + } + + /** + * Iterates through allAccessDecisionVoter
s and ensures
+ * each can support the presented class.
+ *
+ * If one or more voters cannot support the presented class,
+ * false
is returned.
+ *
+ *
+ * @param clazz DOCUMENT ME!
+ * @return DOCUMENT ME!
+ */
+ public boolean supports(Class clazz) {
+ Iterator iter = this.decisionVoters.iterator();
+
+ while (iter.hasNext()) {
+ AccessDecisionVoter voter = (AccessDecisionVoter) iter.next();
+
+ if (!voter.supports(clazz)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ this.applicationContext = applicationContext;
}
-
- private void autoDetectVoters() {
- Map map = this.applicationContext.getBeansOfType(AccessDecisionVoter.class);
- List list = new ArrayList();
- for(Iterator it = map.values().iterator(); it.hasNext();) {
- list.add((it.next()));
- }
- Collections.sort(list, new OrderComparator());
- setDecisionVoters(list);
- }
-
- protected final void checkAllowIfAllAbstainDecisions() {
- if (!this.isAllowIfAllAbstainDecisions()) {
- throw new AccessDeniedException(messages.getMessage("AbstractAccessDecisionManager.accessDenied",
- "Access is denied"));
- }
- }
-
- public List getDecisionVoters() {
- return this.decisionVoters;
- }
-
- public boolean isAllowIfAllAbstainDecisions() {
- return allowIfAllAbstainDecisions;
- }
-
- public void setAllowIfAllAbstainDecisions(boolean allowIfAllAbstainDecisions) {
- this.allowIfAllAbstainDecisions = allowIfAllAbstainDecisions;
- }
-
- public void setDecisionVoters(List newList) {
- isSetDecisionVotersInvoked = true;
- Assert.notEmpty(newList);
-
- Iterator iter = newList.iterator();
-
- while (iter.hasNext()) {
- Object currentObject = null;
-
- try {
- currentObject = iter.next();
-
- AccessDecisionVoter attemptToCast = (AccessDecisionVoter) currentObject;
- }
- catch (ClassCastException cce) {
- throw new IllegalArgumentException("AccessDecisionVoter " + currentObject.getClass().getName()
- + " must implement AccessDecisionVoter");
- }
- }
-
- this.decisionVoters = newList;
- }
-
- public void setMessageSource(MessageSource messageSource) {
- this.messages = new MessageSourceAccessor(messageSource);
- }
-
- public boolean supports(ConfigAttribute attribute) {
- Iterator iter = this.decisionVoters.iterator();
-
- while (iter.hasNext()) {
- AccessDecisionVoter voter = (AccessDecisionVoter) iter.next();
-
- if (voter.supports(attribute)) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Iterates through all AccessDecisionVoter
s and ensures
- * each can support the presented class.
- *
- * If one or more voters cannot support the presented class,
- * false
is returned.
- *