1.1 --- a/boot/src/main/java/org/apidesign/html/boot/impl/FnUtils.java Wed Jun 26 08:43:32 2013 +0200
1.2 +++ b/boot/src/main/java/org/apidesign/html/boot/impl/FnUtils.java Sat Jun 29 22:44:59 2013 +0200
1.3 @@ -29,6 +29,7 @@
1.4 import java.util.Collections;
1.5 import java.util.Enumeration;
1.6 import java.util.List;
1.7 +import java.util.Map;
1.8 import org.apidesign.html.boot.spi.Fn;
1.9 import org.objectweb.asm.Type;
1.10
1.11 @@ -76,9 +77,9 @@
1.12 };
1.13 }
1.14
1.15 - static String callback(String body, ClassLoader loader) {
1.16 + static String callback(String body, ClassLoader loader, String ownName, Map<String,String> ownMethods) {
1.17 try {
1.18 - return callbackImpl(body, loader);
1.19 + return callbackImpl(body, loader, ownName, ownMethods);
1.20 } catch (ClassNotFoundException ex) {
1.21 throw new IllegalStateException("Can't parse " + body, ex);
1.22 } catch (NoSuchMethodException ex) {
1.23 @@ -86,8 +87,9 @@
1.24 }
1.25 }
1.26
1.27 - private static String callbackImpl(String body, ClassLoader loader)
1.28 - throws ClassNotFoundException, NoSuchMethodException {
1.29 + private static String callbackImpl(
1.30 + String body, ClassLoader loader, String ownName, Map<String,String> ownMethods
1.31 + ) throws ClassNotFoundException, NoSuchMethodException {
1.32 StringBuilder sb = new StringBuilder();
1.33 int pos = 0;
1.34 for (;;) {
1.35 @@ -111,21 +113,36 @@
1.36 String method = body.substring(colon4 + 2, sigBeg);
1.37 String params = body.substring(sigBeg, sigEnd + 1);
1.38
1.39 - Class<?> clazz = Class.forName(fqn, false, loader);
1.40 - final Type[] argTps = Type.getArgumentTypes(params);
1.41 - Class<?>[] argCls = new Class<?>[argTps.length];
1.42 - for (int i = 0; i < argCls.length; i++) {
1.43 - argCls[i] = toClass(argTps[i], loader);
1.44 + if (fqn.equals(ownName.replace('/', '.'))) {
1.45 + if (!ownMethods.containsKey(method + params)) {
1.46 + throw new IllegalStateException("Wrong refernece to " + method + params);
1.47 + }
1.48 + sb.append("['").append(method).append("(");
1.49 + final Type[] argTps = Type.getArgumentTypes(params);
1.50 + Class<?>[] argCls = new Class<?>[argTps.length];
1.51 + String sep = "";
1.52 + for (int i = 0; i < argCls.length; i++) {
1.53 + sb.append(sep).append(toClass(argTps[i], loader).getName());
1.54 + sep = ",";
1.55 + }
1.56 + sb.append(")']");
1.57 + } else {
1.58 + Class<?> clazz = Class.forName(fqn, false, loader);
1.59 + final Type[] argTps = Type.getArgumentTypes(params);
1.60 + Class<?>[] argCls = new Class<?>[argTps.length];
1.61 + for (int i = 0; i < argCls.length; i++) {
1.62 + argCls[i] = toClass(argTps[i], loader);
1.63 + }
1.64 + Method m = clazz.getMethod(method, argCls);
1.65 +
1.66 + sb.append("['").append(m.getName()).append("(");
1.67 + String sep = "";
1.68 + for (Class<?> pt : m.getParameterTypes()) {
1.69 + sb.append(sep).append(pt.getName());
1.70 + sep = ",";
1.71 + }
1.72 + sb.append(")']");
1.73 }
1.74 - Method m = clazz.getMethod(method, argCls);
1.75 -
1.76 - sb.append("['").append(m.getName()).append("(");
1.77 - String sep = "";
1.78 - for (Class<?> pt : m.getParameterTypes()) {
1.79 - sb.append(sep).append(pt.getName());
1.80 - sep = ",";
1.81 - }
1.82 - sb.append(")']");
1.83
1.84 pos = sigEnd + 1;
1.85 }