samer@0: package samer.core.util; samer@0: import samer.core.*; samer@0: samer@0: samer@0: public class HashMap extends Environment samer@0: { samer@0: java.util.HashMap map=new java.util.HashMap(); samer@0: samer@0: public HashMap(Environment parent) { super(parent,parent.node()); } samer@0: public HashMap(Environment parent, String name) { samer@0: super(parent,new Node(name,parent.node())); samer@0: } samer@0: samer@0: protected class Entry implements Binding samer@0: { samer@0: String nm; samer@0: Object vl; samer@0: int sc; samer@0: samer@0: Entry(String n, Object v, int s) { nm=n; vl=v; sc=s; } samer@0: samer@0: public String name() { return abs(nm); } samer@0: public int score() { return sc; } samer@0: samer@0: public Object get() { return vl; } samer@0: public Object get(Codec c, Object def) { return c.decode(vl); } samer@0: public void get(Autocoder obj) { obj.decode(vl); } samer@0: samer@0: public void set(Object obj) { map.put(nm,obj); } samer@0: public void remove() { map.remove(nm); } samer@0: } samer@0: samer@0: public Binding add(String name, Object value) samer@0: { samer@0: // check for existing value?? samer@0: if (belongs(name)) { samer@0: String key=rel(name); samer@0: map.put(key,value); samer@0: return new Entry(key,value,0); samer@0: } else return super.add(name,value); samer@0: } samer@0: samer@0: public Datum datum(String name) samer@0: { samer@0: Binding local=localFind(rel(name)); // localised name samer@0: if (local.score()>0) { samer@0: // if match is less than perfect, get parent's best match samer@0: Datum inherited=parent.datum(abs(name)); samer@0: if (inherited.score()0) { samer@0: // if match is less than perfect, get parent's best match samer@0: Binding inherited=parent.binding(abs(name)); samer@0: if (inherited.score()=0; s++) { samer@0: pname = pname.substring(i+1); samer@0: Object val=map.get(pname); samer@0: if (val!=null) return new Entry(pname,val,s); samer@0: i = pname.indexOf('.'); samer@0: } samer@0: return Null; samer@0: } samer@0: } samer@0: