import java.io.*;
import static edu.berkeley.sbp.util.Reflection.*;
-public abstract class Bindable {
+public abstract class Bindable implements ToJava {
public abstract String getSimpleName();
public abstract String toString();
public Object impose(Object[] fields) { return Reflection.impose(_method, fields); }
public Annotation[][] getArgAnnotations() { return _method.getParameterAnnotations(); }
public String[] getArgNames() { return new String[_method.getParameterTypes().length]; }
+ public void toJava(StringBuffer sb) {
+ sb.append("Bindable.create(");
+ sb.append(_method.getDeclaringClass().getName().replace('$','.'));
+ sb.append(".class.getMethod(\"");
+ sb.append(_method.getName());
+ sb.append("\", ");
+ appendClassArray(sb, _method.getParameterTypes());
+ sb.append("))");
+ }
}
private static class BindableConstructor extends Bindable {
public Object impose(Object[] fields) { return Reflection.impose(_constructor, fields); }
public Annotation[][] getArgAnnotations() { return _constructor.getParameterAnnotations(); }
public String[] getArgNames() { return new String[_constructor.getParameterTypes().length]; }
+ public void toJava(StringBuffer sb) {
+ sb.append("Bindable.create(");
+ sb.append(_constructor.getDeclaringClass().getName().replace('$','.'));
+ sb.append(".class.getConstructor(");
+ appendClassArray(sb, _constructor.getParameterTypes());
+ sb.append("))");
+ }
}
private static class BindableClass extends Bindable {
private final Class _class;
public String toString() { return "BindableClass["+_class+"]"; }
public BindableClass(Class _class) { this._class = _class; }
- public String getSimpleName() { return _class.getSimpleName(); }
+ public String getSimpleName() {
+ String s = _class.getSimpleName();
+ if (s.indexOf('$') != -1)
+ return s.substring(s.indexOf('$')+1);
+ return s;
+ }
public <A extends Annotation> A getAnnotation(Class<A> c) { return (A)_class.getAnnotation(c); }
public Object impose(Object[] fields) { return Reflection.impose(_class, fields); }
public Annotation[][] getArgAnnotations() {
ret[i] = fields[i].getName();
return ret;
}
+ public void toJava(StringBuffer sb) {
+ sb.append("Bindable.create(");
+ sb.append(_class.getName().replace('$','.'));
+ sb.append(".class)");
+ }
}
+
+ private static void appendClassArray(StringBuffer sb, Class[] c) {
+ sb.append("new Class[] {");
+ for(int i=0; i<c.length; i++) {
+ sb.append(makeClass(c[i]));
+ sb.append(".class");
+ if (i<c.length-1)
+ sb.append(",");
+ }
+ sb.append("}");
+ }
+
+ private static String makeClass(Class c) {
+ if (!c.isArray()) return c.getName().replace('$','.');
+ return makeClass(c.getComponentType())+"[]";
+ }
}