/** * */ package com.c2kernel.utils; import com.c2kernel.common.InvalidDataException; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.entity.proxy.ProxyObserver; import com.c2kernel.entity.proxy.ItemProxy; import com.c2kernel.entity.proxy.MemberSubscription; import com.c2kernel.persistency.ClusterStorage; import com.c2kernel.persistency.outcome.Viewpoint; public abstract class DescriptionObjectCache { SoftCache> cache = new SoftCache>(); public D get(String name, int version) throws ObjectNotFoundException, InvalidDataException { D thisDef; synchronized(cache) { CacheEntry thisDefEntry = cache.get(name+"_"+version); if (thisDefEntry == null) { Logger.msg(6, name+" v"+version+" not found in cache. Retrieving."); ItemProxy defItem = LocalObjectLoader.loadLocalObjectDef(getDefRoot(), name); thisDef = loadObject(name, version, defItem); cache.put(name+"_"+version, new CacheEntry(thisDef, defItem, this)); } else { Logger.msg(6, name+" v"+version+" found in cache."); thisDef = thisDefEntry.def; } } return thisDef; } public abstract String getDefRoot(); public abstract D loadObject(String name, int version, ItemProxy proxy) throws ObjectNotFoundException, InvalidDataException; public void removeAct(String id) { synchronized(cache) { if (cache.keySet().contains(id)) { Logger.msg(7, "ActDefCache: Removing activity def "+id+" from cache"); cache.remove(id); } } } public class CacheEntry implements ProxyObserver { public String id; public ItemProxy proxy; public E def; public DescriptionObjectCache parent; public CacheEntry(E def, ItemProxy proxy, DescriptionObjectCache parent) { this.id = def.getName()+"_"+def.getVersion(); this.def = def; this.parent = parent; this.proxy = proxy; proxy.subscribe(new MemberSubscription(this, ClusterStorage.VIEWPOINT, false)); } @Override public void finalize() { parent.removeAct(id); proxy.unsubscribe(this); } @Override public void add(Viewpoint contents) { parent.removeAct(id); } @Override public void remove(String oldId) { parent.removeAct(oldId); } @Override public String toString() { return "Cache entry: "+id; } @Override public void control(String control, String msg) { } } }