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 }