org.jasig.portal.services.persondir.support
Class CascadingPersonAttributeDao

java.lang.Object
  extended by org.jasig.portal.services.persondir.support.AbstractDefaultQueryPersonAttributeDao
      extended by org.jasig.portal.services.persondir.support.CascadingPersonAttributeDao
All Implemented Interfaces:
IPersonAttributeDao

public class CascadingPersonAttributeDao
extends AbstractDefaultQueryPersonAttributeDao

This IPersonAttributeDao implementation iterates through an ordered List of IPersonAttributeDao impls when getting user attributes.
The first DAO is queried using the seed Map passed to this class. The results of the query are merged into a general result map. After the first DAO this general result map used as the query seed for each DAO and each DAOs results are merged into it.
This behavior allows a DAO lower on the list to rely on attributes returned by a DAO higher on the list.
The default merger for the general result set is ReplacingAttributeAdder.
Note that most DAOs expect a Map of String->String. Some of the DAOs return a Map of String->Object or String->List. This may cause problems in the DAO if the key for an attribute with a non String value matches a key needed by the DAO for the query it is running.
It is highly recomended that the first DAO on the list for this class is the EchoPersonAttributeDaoImpl to ensure the seed gets placed into the general result map.

Since:
uPortal 2.5
Version:
$Revision: 1.8 $ $Date: 2005/04/06 15:30:20 $
Author:
Eric Dalquist edalquist@unicon.net

Field Summary
private  IAttributeMerger attrMerger
          Strategy for merging together the results from successive PersonAttributeDaos.
private  java.util.List personAttributeDaos
          A List of child IPersonAttributeDao instances which we will poll in order.
private  boolean recoverExceptions
          True if we should catch, log, and ignore Throwables propogated by individual DAOs.
 
Fields inherited from class org.jasig.portal.services.persondir.support.AbstractDefaultQueryPersonAttributeDao
log
 
Constructor Summary
CascadingPersonAttributeDao()
           
 
Method Summary
 IAttributeMerger getMerger()
          Get the strategy whereby we accumulate attributes.
 java.util.List getPersonAttributeDaos()
          Get an unmodifiable List of delegates which we will poll for attributes.
 java.util.Set getPossibleUserAttributeNames()
          This implementation is not always correct.
 java.util.Map getUserAttributes(java.util.Map seed)
          Iterates through the configured List of IPersonAttributeDao instances.
 boolean isRecoverExceptions()
          True if this class will catch exceptions thrown by its delegate DAOs and fail to propogate them.
 void setMerger(IAttributeMerger merger)
          Set the strategy whereby we accumulate attributes from the results of polling our delegates.
 void setPersonAttributeDaos(java.util.List daos)
          Set the List of delegates which we will poll for attributes.
 void setRecoverExceptions(boolean recover)
          Set to true if you would like this class to swallow RuntimeExceptions thrown by its delegates.
 
Methods inherited from class org.jasig.portal.services.persondir.support.AbstractDefaultQueryPersonAttributeDao
getDefaultAttributeName, getUserAttributes, setDefaultAttributeName
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

personAttributeDaos

private java.util.List personAttributeDaos
A List of child IPersonAttributeDao instances which we will poll in order.


attrMerger

private IAttributeMerger attrMerger
Strategy for merging together the results from successive PersonAttributeDaos.


recoverExceptions

private boolean recoverExceptions
True if we should catch, log, and ignore Throwables propogated by individual DAOs.

Constructor Detail

CascadingPersonAttributeDao

public CascadingPersonAttributeDao()
Method Detail

getUserAttributes

public java.util.Map getUserAttributes(java.util.Map seed)
Iterates through the configured List of IPersonAttributeDao instances. The results from each DAO are merged into the result Map by the configured IAttributeMerger.

Parameters:
seed - immutable Map of attributes to values to seed the query
Returns:
Map from attribute names to values
See Also:
IPersonAttributeDao.getUserAttributes(java.util.Map)

getPossibleUserAttributeNames

public java.util.Set getPossibleUserAttributeNames()
This implementation is not always correct. It handles the basic case where the Set of attributes returned by this implementation is the union of the attributes declared by all of the underlying implementations to be merged. Of course, an IAttributeMerger might provide for a merging policy such that the attributes resulting from invoking this IPersonAttributeDao implementation are not the union of the attributes declared by the underlying PersonAttributeDaos.

Returns:
A {link Set} of possible attribute names for user queries.
See Also:
IPersonAttributeDao.getPossibleUserAttributeNames()

getMerger

public IAttributeMerger getMerger()
Get the strategy whereby we accumulate attributes.

Returns:
Returns the attrMerger.

setMerger

public void setMerger(IAttributeMerger merger)
Set the strategy whereby we accumulate attributes from the results of polling our delegates.

Parameters:
merger - The attrMerger to set.
Throws:
java.lang.IllegalArgumentException - If merger is null.

getPersonAttributeDaos

public java.util.List getPersonAttributeDaos()
Get an unmodifiable List of delegates which we will poll for attributes.

Returns:
Returns the personAttributeDaos.

setPersonAttributeDaos

public void setPersonAttributeDaos(java.util.List daos)
Set the List of delegates which we will poll for attributes.

Parameters:
daos - The personAttributeDaos to set.
Throws:
java.lang.IllegalArgumentException - If daos is null.

isRecoverExceptions

public boolean isRecoverExceptions()
True if this class will catch exceptions thrown by its delegate DAOs and fail to propogate them. False if this class will stop on failure.

Returns:
true if will recover exceptions, false otherwise

setRecoverExceptions

public void setRecoverExceptions(boolean recover)
Set to true if you would like this class to swallow RuntimeExceptions thrown by its delegates. This allows it to recover if a particular attribute source fails, still considering previous and subsequent sources. Set to false if you would like this class to fail hard upon any Throwable thrown by its children. This is desirable in cases where your Portal will not function without attributes from all of its sources.

Parameters:
recover - whether you would like exceptions recovered internally