View Javadoc

1   /*
2    * EL4J, the Extension Library for the J2EE, adds incremental enhancements to
3    * the spring framework, http://el4j.sf.net
4    * Copyright (C) 2005 by ELCA Informatique SA, Av. de la Harpe 22-24,
5    * 1000 Lausanne, Switzerland, http://www.elca.ch
6    *
7    * EL4J is published under the GNU Lesser General Public License (LGPL)
8    * Version 2.1. See http://www.gnu.org/licenses/
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13   * GNU Lesser General Public License for more details.
14   *
15   * For alternative licensing, please contact info@elca.ch
16   */
17  
18  package ch.elca.el4j.services.exceptionhandler.handler;
19  
20  import java.util.List;
21  
22  import org.aopalliance.intercept.MethodInvocation;
23  import org.slf4j.Logger;
24  import org.springframework.beans.factory.InitializingBean;
25  
26  import ch.elca.el4j.services.monitoring.notification.CoreNotificationHelper;
27  
28  /**
29   * This class implements a round robin strategy to swap a proxy's target. It
30   * even supports repairing targets that are not contained in the list of
31   * alternative targets.
32   *
33   * @svnLink $Revision: 3883 $;$Date: 2009-08-04 15:35:01 +0200 (Di, 04. Aug 2009) $;$Author: swismer $;$URL: https://el4j.svn.sourceforge.net/svnroot/el4j/branches/el4j_3_1/el4j/framework/modules/exception_handling/src/main/java/ch/elca/el4j/services/exceptionhandler/handler/RoundRobinSwappableTargetExceptionHandler.java $
34   *
35   * @author Andreas Bur (ABU)
36   */
37  public class RoundRobinSwappableTargetExceptionHandler
38  	extends AbstractSwappableTargetExceptionHandler
39  	implements InitializingBean {
40  
41  	/** The list with alternative targets, used one after the other. */
42  	private List m_targets;
43  	
44  	/**
45  	 * Sets the list of targets that are used one after the other if the current
46  	 * target doesn't work anymore.
47  	 *
48  	 * @param targets
49  	 *      The list of targets to set.
50  	 */
51  	public void setTargets(List targets) {
52  		m_targets = targets;
53  	}
54  
55  	/**
56  	 * {@inheritDoc}
57  	 */
58  	public void afterPropertiesSet() throws Exception {
59  		CoreNotificationHelper.notifyIfEssentialPropertyIsEmpty(
60  				m_targets, "targets", this);
61  	}
62  
63  	/**
64  	 * {@inheritDoc}
65  	 */
66  	protected Object getNewTarget(Object current, Throwable t,
67  			MethodInvocation invocation, Logger logger) throws Throwable {
68  
69  		// even works if 'current' isn't contained in the 'targets'-list
70  		int i = (m_targets.indexOf(current) + 1) % m_targets.size();
71  		return m_targets.get(i);
72  	}
73  }