checkpoint
[sbp.git] / src / edu / berkeley / sbp / bind / Bindable.java
index 9e5564e..c2c0a02 100644 (file)
@@ -10,7 +10,7 @@ import java.lang.reflect.*;
 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();
@@ -37,6 +37,15 @@ public abstract class Bindable {
         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 {
@@ -48,6 +57,13 @@ public abstract class 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 {
@@ -71,6 +87,27 @@ public abstract class Bindable {
                 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())+"[]";
+    }
 }