View Javadoc

1   package net.sourceforge.jparam.conversion.creators;
2   
3   import java.lang.reflect.Method;
4   import java.lang.reflect.Modifier;
5   
6   import net.sourceforge.jparam.util.Utils;
7   
8   public class MethodCreator extends AbstractCreator {
9   
10  	boolean[] canArgBeNull;
11  
12  	Method m;
13  
14  	public static String getMethodValidError(Method m) {
15  		if (!m.getName().startsWith("create"))
16  			return "Creator method name must begin with \"create\", method: "
17  					+ m;
18  		if (m.getReturnType().getClass().equals(void.class))
19  			return "Creator method must have a return type, method: " + m;
20  		if (m.getReturnType().getClass().isPrimitive())
21  			return "Creator method must have a non-primitive return type, method: "
22  					+ m;
23  		if (!Modifier.isStatic(m.getModifiers()))
24  			return "Creator method must be static, method: " + m;
25  		if (!Modifier.isPublic(m.getModifiers()))
26  			return "Creator method must be public, method: " + m;
27  		return null;
28  	}
29  
30  	public MethodCreator(Method m) {
31  
32  		String validationError = getMethodValidError(m);
33  		Utils.assert(validationError == null, validationError);
34  
35  		this.m = m;
36  		this.returnType = m.getReturnType();
37  		this.parameterTypes = m.getParameterTypes();
38  		canArgBeNull = new boolean[parameterTypes.length];
39  		for (int i = 0; i < parameterTypes.length; i++) {
40  			if (parameterTypes[i].isPrimitive()) {
41  				canArgBeNull[i] = false;
42  				parameterTypes[i] = ObjectCreator.getInstance()
43  						.getNonPrimitiveClass(parameterTypes[i]);
44  
45  			} else {
46  				canArgBeNull[i] = true;
47  			}
48  		}
49  	}
50  
51  	protected Object internalCreate(Object[] parameters) throws Exception {
52  		return m.invoke(null, parameters);
53  	}
54  
55  	public static boolean isMethodValid(Method m) {
56  		return getMethodValidError(m) == null;
57  	}
58  
59  	protected boolean creatorEquals(ICreator o) {
60  		MethodCreator other = (MethodCreator) o;
61  
62  		return m.equals(other.m);
63  	}
64  
65  	public boolean canBeNull(int index) {
66  		return canArgBeNull[index];
67  	}
68  
69  }