View Javadoc

    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 }