Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

SearchableObjectRegistry.java

00001 /*
00002  * SearchableObjectRegistry.java
00003  *
00004  * Created on 28 November 2002, 23:14
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     // register an object
00034     public void register(String name, Object obj) {
00035         reg.put(name, obj);       
00036     }
00037     
00038     // unregister an object (silent if unknown name)
00039     public void unregister(String name) {
00040         reg.remove(name);      
00041     }
00042     
00043     // lookup an object: cascade up if needed
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         //Complete strings in this Registry
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         //If there is a dot in the prefix, then things get tricky
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         //Methods
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         //Fields
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         //Recurse if there are more dots
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         //Is it a field or method?
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             // We don't try anything fancy here - we get all methods and use the one that works
00170         }
00171         return null;
00172     }
00173     
00174     public List provideHelp(String method) {
00175         return new Vector(0);
00176     }
00177     
00178 }

Generated on Thu Jul 15 09:55:49 2004 for SCT DAQ/DCS Software - Java by doxygen 1.3.5