samer@0: /* samer@0: * Properties.java samer@0: * samer@0: * Copyright (c) 2001, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS IS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.core.util; samer@0: import samer.core.*; samer@0: import java.io.*; samer@0: samer@0: public class Properties extends Environment samer@0: { samer@0: protected java.util.Properties props; samer@0: protected boolean writable; samer@0: samer@0: public Properties(Environment parent) { samer@0: this(parent,parent.node(),new java.util.Properties()); samer@0: } samer@0: public Properties(Environment parent, java.util.Properties pr) { samer@0: this(parent,parent.node(),pr); samer@0: } samer@0: public Properties(Environment parent, Node n) { samer@0: this(parent,n,new java.util.Properties()); samer@0: } samer@0: public Properties(Environment parent, Node n, java.util.Properties pr) { samer@0: super(parent,n); props=pr; writable=true; samer@0: } samer@0: samer@0: public void save(OutputStream out) throws Exception { props.store(out,"properties"); } samer@0: public void load(InputStream in) throws Exception { props.load(in); } samer@0: public void setWritable(boolean f) { writable=f; } samer@0: protected class Property implements Binding samer@0: { samer@0: String nm; samer@0: String vl; samer@0: int sc; samer@0: samer@0: Property(String n, String v, int s) { samer@0: nm=n; sc=s; samer@0: vl = v.equals("~default") ? null : v; samer@0: } 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==null?def:vl); } samer@0: public void get(Autocoder obj) { obj.decode(vl); } samer@0: samer@0: public void set(Object obj) { props.put(nm,(String)obj); } samer@0: public void remove() { props.remove(nm); } samer@0: } samer@0: samer@0: public void store(String name, Autocoder o) { samer@0: if (writable && belongs(name)) props.put(rel(name),o.string()); samer@0: else parent.store(name,o); samer@0: } samer@0: public void store(String name, Object o, Codec c) { samer@0: if (writable && belongs(name)) props.put(rel(name),c.string(o)); samer@0: else parent.store(name,o,c); samer@0: } samer@0: samer@0: public Datum datum(String name) samer@0: { samer@0: Datum local=localFind(rel(name)); // localised name samer@0: 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: Binding inherited=parent.binding(abs(name)); samer@0: if (inherited.score()=0; s++) { samer@0: pname = pname.substring(i+1); samer@0: val=props.getProperty(pname); samer@0: if (val!=null) return new Property(pname,val,s); samer@0: i = pname.indexOf('.'); samer@0: } samer@0: return Null; samer@0: } samer@0: } samer@0: