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 }