boot/src/main/java/org/apidesign/html/boot/impl/FnUtils.java
changeset 171 54ac82353158
parent 163 2652760705d6
child 183 19ee92613f00
     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          }