// (c) Tuomas J. Lukka package org.fenfire.impl; import java.util.*; import org.nongnu.libvob.util.CachingMap; import org.fenfire.*; import org.fenfire.util.*; import org.nongnu.alph.Enfilade1D; public class CachingNodeContent implements NodeContent { NodeContent base; private class Cached implements Obs { Object node; Enfilade1D enf; Set obses; public void addObs(Obs o) { if(obses == null) obses = new HashSet(); obses.add(o); } public void chg() { if(obses != null) { for(Iterator i = obses.iterator(); i.hasNext();) { ((Obs)i.next()).chg(); } } cache.remove(node); } public void finalize() { // Because we are going away, we need to make the // observed ones be observed by the real nodecontent. if(obses == null) return; Iterator i = obses.iterator(); Obs cur = (Obs)i.next(); while(i.hasNext()) { cur = new ObsDoubler(cur, (Obs)i.next()); } base.get(node, cur); } } private CachingMap cache = new CachingMap(500); public org.nongnu.alph.Enfilade1D get(Object resource) { return get(resource, null); } public org.nongnu.alph.Enfilade1D get(Object resource, Obs o) { Cached cac = (Cached)cache.get(resource); if(cac == null) { cac = new Cached(); cac.node = resource; cac.enf = base.get(resource, cac); cache.put(resource, cac); } if(o != null) cac.addObs(o); return cac.enf; } public void set(Object resource, org.nongnu.alph.Enfilade1D vstream) { base.set(resource, vstream); } public NodeContent _getObserved(Fen obsFen, Obs o) { throw new Error("Not implemented"); } public void _close() { throw new Error("Not implemented"); } }