boot/src/main/java/org/apidesign/html/boot/impl/FnUtils.java
changeset 183 19ee92613f00
parent 171 54ac82353158
child 184 6c0807571258
     1.1 --- a/boot/src/main/java/org/apidesign/html/boot/impl/FnUtils.java	Sat Jun 29 22:44:59 2013 +0200
     1.2 +++ b/boot/src/main/java/org/apidesign/html/boot/impl/FnUtils.java	Thu Jul 11 13:12:51 2013 +0200
     1.3 @@ -79,97 +79,13 @@
     1.4  
     1.5      static String callback(String body, ClassLoader loader, String ownName, Map<String,String> ownMethods) {
     1.6          try {
     1.7 -            return callbackImpl(body, loader, ownName, ownMethods);
     1.8 +            return new JsCallback(loader, ownName, ownMethods).callbackImpl(body);
     1.9          } catch (ClassNotFoundException ex) {
    1.10              throw new IllegalStateException("Can't parse " + body, ex);
    1.11          } catch (NoSuchMethodException ex) {
    1.12              throw new IllegalStateException("Can't parse " + body, ex);
    1.13          }
    1.14      }
    1.15 -    
    1.16 -    private static String callbackImpl(
    1.17 -        String body, ClassLoader loader, String ownName, Map<String,String> ownMethods
    1.18 -    ) throws ClassNotFoundException, NoSuchMethodException {
    1.19 -        StringBuilder sb = new StringBuilder();
    1.20 -        int pos = 0;
    1.21 -        for (;;) {
    1.22 -            int next = body.indexOf(".@", pos);
    1.23 -            if (next == -1) {
    1.24 -                sb.append(body.substring(pos));
    1.25 -                return sb.toString();
    1.26 -            }
    1.27 -            sb.append(body.substring(pos, next));
    1.28 -            
    1.29 -            int sigBeg = body.indexOf('(', next);
    1.30 -            int sigEnd = body.indexOf(')', sigBeg);
    1.31 -            
    1.32 -            int colon4 = body.indexOf("::", next);
    1.33 -            
    1.34 -            if (sigBeg == -1 || sigEnd == -1 || colon4 == -1) {
    1.35 -                throw new IllegalStateException("Malformed body " + body);
    1.36 -            }
    1.37 -            
    1.38 -            String fqn = body.substring(next + 2, colon4);
    1.39 -            String method = body.substring(colon4 + 2, sigBeg);
    1.40 -            String params = body.substring(sigBeg, sigEnd + 1);
    1.41 -            
    1.42 -            if (fqn.equals(ownName.replace('/', '.'))) {
    1.43 -                if (!ownMethods.containsKey(method + params)) {
    1.44 -                    throw new IllegalStateException("Wrong refernece to " + method + params);
    1.45 -                }
    1.46 -                sb.append("['").append(method).append("(");
    1.47 -                final Type[] argTps = Type.getArgumentTypes(params);
    1.48 -                Class<?>[] argCls = new Class<?>[argTps.length];
    1.49 -                String sep = "";
    1.50 -                for (int i = 0; i < argCls.length; i++) {
    1.51 -                    sb.append(sep).append(toClass(argTps[i], loader).getName());
    1.52 -                    sep = ",";
    1.53 -                }
    1.54 -                sb.append(")']");
    1.55 -            } else {
    1.56 -                Class<?> clazz = Class.forName(fqn, false, loader);
    1.57 -                final Type[] argTps = Type.getArgumentTypes(params);
    1.58 -                Class<?>[] argCls = new Class<?>[argTps.length];
    1.59 -                for (int i = 0; i < argCls.length; i++) {
    1.60 -                    argCls[i] = toClass(argTps[i], loader);
    1.61 -                }
    1.62 -                Method m = clazz.getMethod(method, argCls);
    1.63 -
    1.64 -                sb.append("['").append(m.getName()).append("(");
    1.65 -                String sep = "";
    1.66 -                for (Class<?> pt : m.getParameterTypes()) {
    1.67 -                    sb.append(sep).append(pt.getName());
    1.68 -                    sep = ",";
    1.69 -                }
    1.70 -                sb.append(")']");
    1.71 -            }
    1.72 -            
    1.73 -            pos = sigEnd + 1;
    1.74 -        }
    1.75 -    }
    1.76 -
    1.77 -    private static Class<?> toClass(final Type t, ClassLoader loader) throws ClassNotFoundException {
    1.78 -        if (t == Type.INT_TYPE) {
    1.79 -            return Integer.TYPE;
    1.80 -        } else if (t == Type.VOID_TYPE) {
    1.81 -            return Void.TYPE;
    1.82 -        } else if (t == Type.BOOLEAN_TYPE) {
    1.83 -            return Boolean.TYPE;
    1.84 -        } else if (t == Type.BYTE_TYPE) {
    1.85 -            return Byte.TYPE;
    1.86 -        } else if (t == Type.CHAR_TYPE) {
    1.87 -            return Character.TYPE;
    1.88 -        } else if (t == Type.SHORT_TYPE) {
    1.89 -            return Short.TYPE;
    1.90 -        } else if (t == Type.DOUBLE_TYPE) {
    1.91 -            return Double.TYPE;
    1.92 -        } else if (t == Type.FLOAT_TYPE) {
    1.93 -            return Float.TYPE;
    1.94 -        } else if (t == Type.LONG_TYPE) {
    1.95 -            return Long.TYPE;
    1.96 -        }
    1.97 -        return Class.forName(t.getClassName(), false, loader);
    1.98 -    }
    1.99  
   1.100      static void loadScript(JsClassLoader jcl, String resource) {
   1.101          final InputStream script = jcl.getResourceAsStream(resource);