00001
00002
00003
00004
00005
00006
00007 package GuiComponents.scripting;
00008
00009 import org.apache.bsf.util.*;
00010 import java.util.*;
00011 import java.lang.reflect.*;
00012
00017 public class SearchableObjectRegistry extends ObjectRegistry implements NameCompleter {
00018
00020 public SearchableObjectRegistry() {
00021 }
00022
00026 Hashtable reg = new Hashtable ();
00027 SearchableObjectRegistry parent = null;
00028
00029 public SearchableObjectRegistry (SearchableObjectRegistry parent) {
00030 this.parent = parent;
00031 }
00032
00033
00034 public void register(String name, Object obj) {
00035 reg.put(name, obj);
00036 }
00037
00038
00039 public void unregister(String name) {
00040 reg.remove(name);
00041 }
00042
00043
00044 public Object lookup(String name) throws IllegalArgumentException {
00045 Object obj = reg.get(name);
00046
00047 if (obj == null && parent != null) {
00048 obj = parent.lookup(name);
00049 }
00050
00051 if (obj == null) {
00052 throw new IllegalArgumentException("object '" + name + "' not in registry");
00053 }
00054
00055 return obj;
00056 }
00057
00058
00071 public List completeName(String context, String part) {
00072 int index = part.indexOf('.');
00073 if (index == -1) {
00074 return completeVarName(part);
00075 } else {
00076 String expr = part.substring(0, index + 1);
00077 String varname = part.substring(0, index);
00078 String prefix = part.substring(index+1);
00079
00080 try {
00081 Object var = lookup(varname);
00082 return completeMemberName(var, expr, prefix);
00083 } catch (IllegalArgumentException e) {
00084 return new Vector(0);
00085 }
00086 }
00087 }
00088
00092 protected List completeVarName(String str) {
00093
00094 Vector v = new Vector();
00095 Enumeration e = reg.keys();
00096 while (e.hasMoreElements()) {
00097 String s = (String)e.nextElement();
00098 if (s.startsWith(str))
00099 v.add(s);
00100 }
00101
00102 if (parent != null) v.addAll(parent.completeVarName(str));
00103 return v;
00104 }
00105
00111 protected List completeMemberName(Object var, String expr, String prefix) {
00112 Class c = var.getClass();
00113
00114
00115 if (prefix.indexOf('.') != -1) {
00116 int index = prefix.lastIndexOf('.');
00117 String str = prefix.substring(0, index);
00118 prefix = prefix.substring(index+1);
00119 expr += str + ".";
00120 c = parseString(c, str);
00121 }
00122
00123 if (c==null) return new Vector(0);
00124
00125 Vector v = new Vector();
00126
00127
00128 Method[] ms = c.getMethods();
00129 for (int i=0; i<ms.length; i++) {
00130 if (ms[i].getName().startsWith(prefix)) v.add(expr + ms[i].getName()+'(');
00131 }
00132
00133
00134 Field[] fs = c.getDeclaredFields();
00135 for (int i=0; i<fs.length; i++) {
00136 if (fs[i].getName().startsWith(prefix)) v.add(expr + fs[i].getName());
00137 }
00138
00139 return v;
00140 }
00141
00146 protected Class parseString(Class c, String str) {
00147
00148 if (str.indexOf('.') != -1) {
00149 int index = str.lastIndexOf('.');
00150 String prefix = str.substring(0,index);
00151 str = str.substring(index+1);
00152 c = parseString(c, prefix);
00153 }
00154
00155
00156 if (str.indexOf('(') == -1) {
00157 try {
00158 Field f = c.getDeclaredField(str);
00159 return f.getType();
00160 } catch (Exception e) {
00161 return null;
00162 }
00163 } else {
00164 str = str.substring(0, str.indexOf('('));
00165 Method[] ms = c.getMethods();
00166 for (int i=0; i<ms.length; i++) {
00167 if (ms[i].getName().equals(str)) return ms[i].getReturnType();
00168 }
00169
00170 }
00171 return null;
00172 }
00173
00174 public List provideHelp(String method) {
00175 return new Vector(0);
00176 }
00177
00178 }