01: package org.acegisecurity.util;
02:
03: import java.lang.reflect.Method;
04: import java.util.Map;
05:
06: import org.springframework.context.ApplicationContext;
07: import org.springframework.core.Ordered;
08: import org.springframework.util.Assert;
09: import org.springframework.util.ReflectionUtils;
10:
11: /**
12: * Proivdes common logic for manipulating classes implementing the Spring
13: * {@link Ordered} interface.
14: *
15: * @author Ben Alex
16: * @author Vishal Puri
17: */
18: public abstract class OrderedUtils {
19: /**
20: * Introspects the application context for a single instance of <code>sourceClass</code>. If found, the order from the source
21: * class instance is copied into the <code>destinationObject</code>. If more than one instance of <code>sourceClass</code>
22: * is found, the method throws <code>IllegalStateException</code>.
23: *
24: * <p>The <code>destinationObject</code> is required to provide a public <code>setOrder(int)</code> method to permit
25: * mutation of the order property.
26: *
27: * @param sourceClass to locate in the application context (must be assignable to Ordered)
28: * @param applicationContext to locate the class
29: * @param destinationObject to copy the order into (must provide public setOrder(int) method)
30: * @param skipIfMoreThanOneCandidateSourceClassInstance if the application context provides more than one potential source, skip modifications (if false, the first located matching source will be used)
31: * @return whether or not the destination class was updated
32: */
33: public static boolean copyOrderFromOtherClass(Class sourceClass,
34: ApplicationContext applicationContext,
35: Object destinationObject,
36: boolean skipIfMoreThanOneCandidateSourceClassInstance) {
37: Assert.notNull(sourceClass, "Source class required");
38: Assert.notNull(applicationContext,
39: "ApplicationContext required");
40: Assert
41: .notNull(destinationObject,
42: "Destination object required");
43: Assert.isAssignable(Ordered.class, sourceClass, "Source class "
44: + sourceClass + " must be assignable to Ordered");
45: Map map = applicationContext.getBeansOfType(sourceClass);
46: if (map.size() == 0) {
47: return false;
48: } else if (map.size() > 1
49: && skipIfMoreThanOneCandidateSourceClassInstance) {
50: return false;
51: } else {
52: copyOrderFromOtherObject((Ordered) map.values().iterator()
53: .next(), destinationObject);
54: return true;
55: }
56: }
57:
58: /**
59: * Copies the order property from the <code>sourceObject</code> into the <code>destinationObject</code>.
60: *
61: * <p>The <code>destinationObject</code> is required to provide a public <code>setOrder(int)</code> method to permit
62: * mutation of the order property.
63: *
64: * @param sourceObject to copy the order from
65: * @param destinationObject to copy the order into (must provide public setOrder(int) method)
66: */
67: public static void copyOrderFromOtherObject(Ordered sourceObject,
68: Object destinationObject) {
69: Assert.notNull(sourceObject, "Source object required");
70: Assert
71: .notNull(destinationObject,
72: "Destination object required");
73: Method m = ReflectionUtils.findMethod(destinationObject
74: .getClass(), "setOrder", new Class[] { int.class });
75: Assert.notNull(m, "Method setOrder(int) not found on "
76: + destinationObject.getClass());
77: ReflectionUtils.invokeMethod(m, destinationObject,
78: new Object[] { Integer
79: .valueOf((sourceObject.getOrder())) });
80: }
81:
82: }
|