X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fbind%2FBindable.java;h=a51996e144c4cac89f2cc3b5b94802f755741a6a;hp=0e2da13b635d23badfa8fa02f03418867fe08b79;hb=aa4e862db418a090b37b2d70c72fc9e0d1a4265c;hpb=f8dec42308b5eb1196db5bf56bb2f5426b4a76af
diff --git a/src/edu/berkeley/sbp/bind/Bindable.java b/src/edu/berkeley/sbp/bind/Bindable.java
index 0e2da13..a51996e 100644
--- a/src/edu/berkeley/sbp/bind/Bindable.java
+++ b/src/edu/berkeley/sbp/bind/Bindable.java
@@ -1,3 +1,5 @@
+// Copyright 2006 all rights reserved; see LICENSE file for BSD-style license
+
package edu.berkeley.sbp.bind;
import edu.berkeley.sbp.util.*;
@@ -8,6 +10,7 @@ import java.util.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
import java.io.*;
+import java.security.*;
import static edu.berkeley.sbp.util.Reflection.*;
public abstract class Bindable implements ToJava {
@@ -20,6 +23,12 @@ public abstract class Bindable implements ToJava {
public abstract Annotation[][] getArgAnnotations();
public abstract String[] getArgNames();
+ public abstract Class[] getArgTypes();
+
+ public Binding createBinding() { return new SimpleBinding(); }
+ public Binding createBinding(final int[] map) { return new SimpleBinding(map); }
+ public Binding createBinding(final int[] map, Object prepend) { return new SimpleBinding(map, prepend); }
+
public static Bindable create(Object o) {
if (o instanceof Class) return new BindableClass((Class)o);
@@ -28,15 +37,18 @@ public abstract class Bindable implements ToJava {
return null;
}
+ // Subclasses //////////////////////////////////////////////////////////////////////////////
+
private static class BindableMethod extends Bindable {
private final Method _method;
public String toString() { return "BindableMethod["+_method+"]"; }
public BindableMethod(Method _method) { this._method = _method; }
public String getSimpleName() { return _method.getName(); }
- public A getAnnotation(Class c) { return _method.getAnnotation(c); }
+ public A getAnnotation(final Class c) { return _method.getAnnotation(c); }
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 Class[] getArgTypes() { return _method.getParameterTypes(); }
public void toJava(StringBuffer sb) {
sb.append("Bindable.create(");
sb.append(_method.getDeclaringClass().getName().replace('$','.'));
@@ -57,6 +69,7 @@ public abstract class Bindable implements ToJava {
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 Class[] getArgTypes() { return _constructor.getParameterTypes(); }
public void toJava(StringBuffer sb) {
sb.append("Bindable.create(");
sb.append(_constructor.getDeclaringClass().getName().replace('$','.'));
@@ -87,6 +100,13 @@ public abstract class Bindable implements ToJava {
ret[i] = fields[i].getName();
return ret;
}
+ public Class[] getArgTypes() {
+ Field[] fields = _class.getFields();
+ Class[] ret = new Class[fields.length];
+ for(int i=0; i