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.domain.dao;
    17
    18  import org.acegisecurity.domain.PersistableEntity;
    19
    20  import org.springframework.util.Assert;
    21
    22  import java.lang.reflect.Method;
    23  import java.util.Collection;
    24  import java.util.Iterator;
    25
    26
    27  /***
    28   * Convenience methods that support eviction of <code>PersistableEntity</code>s
    29   * from  those objects that implement {@link EvictionCapable}.
    30   *
    31   * @author Ben Alex
    32   * @version $Id: EvictionUtils.java,v 1.6 2005/11/17 00:55:47 benalex Exp $
    33   */
    34  public class EvictionUtils {
    35      //~ Methods ================================================================
    36
    37      /***
    38       * Evicts the <code>PersistableEntity</code> using the passed
    39       * <code>Object</code> (provided that the passed <code>Object</code>
    40       * implements <code>EvictionCapable</code>).
    41       *
    42       * @param daoOrServices the potential source for
    43       *        <code>EvictionCapable</code> services (never <code>null</code>)
    44       * @param entity to evict (can be <code>null</code>)
    45       */
    46      public static void evictIfRequired(Object daoOrServices,
    47          PersistableEntity entity) {
    48          EvictionCapable evictor = getEvictionCapable(daoOrServices);
    49
    50          if (evictor != null && entity != null) {
    51              evictor.evict(entity);
    52          }
    53      }
    54
    55      /***
    56       * Evicts the <code>PersistableEntity</code> using the passed
    57       * <code>Object</code> (provided that the passed <code>Object</code>
    58       * implements <code>EvictionCapable</code>), along with expressly
    59       * evicting every <code>PersistableEntity</code> returned by the
    60       * <code>PersistableEntity</code>'s getters.
    61       *
    62       * @param daoOrServices the potential source for
    63       *        <code>EvictionCapable</code> services (never <code>null</code>)
    64       * @param entity to evict includnig its getter results (can be <code>null</code>)
    65       */
    66      public static void evictPopulatedIfRequired(Object daoOrServices,
    67          PersistableEntity entity) {
    68          EvictionCapable evictor = getEvictionCapable(daoOrServices);
    69
    70          if (evictor != null && entity != null) {
    71              evictor.evict(entity);
    72
    73  			Method[] methods = entity.getClass().getMethods();
    74  			for (int i = 0; i < methods.length; i++) {
    75  				if (methods[i].getName().startsWith("get") && methods[i].getParameterTypes().length == 0) {
    76  					try {
    77  						Object result = methods[i].invoke(entity, new Object[] {});
    78  						if (result instanceof PersistableEntity) {
    79  							evictor.evict((PersistableEntity) result);
    80  						}
    81  					} catch (Exception ignored) {}
    82  				}
    83  			}
    84
    85          }
    86      }
    87
    88  	/***
    89       * Evicts each <code>PersistableEntity</code> element of the passed
    90       * <code>Collection</code> using the passed <code>Object</code> (provided
    91       * that the passed <code>Object</code> implements
    92       * <code>EvictionCapable</code>).
    93       *
    94       * @param daoOrServices the potential source for
    95       *        <code>EvictionCapable</code> services (never <code>null</code>)
    96       * @param collection whose members to evict (never <code>null</code>)
    97       */
    98      public static void evictIfRequired(Object daoOrServices,
    99          Collection<? extends Object> collection) {
    100         Assert.notNull(collection, "Cannot evict a null Collection");
    101
    102         if (getEvictionCapable(daoOrServices) == null) {
    103             // save expense of iterating collection
    104             return;
    105         }
    106
    107         Iterator<? extends Object> iter = collection.iterator();
    108
    109         while (iter.hasNext()) {
    110             Object obj = iter.next();
    111
    112             if (obj instanceof PersistableEntity) {
    113                 evictIfRequired(daoOrServices, (PersistableEntity) obj);
    114             }
    115         }
    116     }
    117
    118     /***
    119      * Obtain the <code>EvictionCapable</code> from the passed argument, or
    120      * <code>null</code>.
    121      *
    122      * @param daoOrServices to check if provides eviction services
    123      *
    124      * @return the <code>EvictionCapable</code> object or <code>null</code> if
    125      *         the object does not provide eviction services
    126      */
    127     private static EvictionCapable getEvictionCapable(Object daoOrServices) {
    128         Assert.notNull(daoOrServices,
    129             "Cannot evict if the object that may provide EvictionCapable is null");
    130
    131         if (daoOrServices instanceof EvictionCapable) {
    132             return (EvictionCapable) daoOrServices;
    133         } else {
    134             return null;
    135         }
    136     }
    137 }