/** * */ package com.c2kernel.utils; import com.c2kernel.common.InvalidDataException; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.entity.proxy.EntityProxyObserver; import com.c2kernel.entity.proxy.ItemProxy; import com.c2kernel.entity.proxy.MemberSubscription; import com.c2kernel.lifecycle.ActivityDef; import com.c2kernel.persistency.ClusterStorage; import com.c2kernel.persistency.ClusterStorageException; import com.c2kernel.persistency.outcome.Viewpoint; import com.c2kernel.process.Gateway; public class ActDefCache { SoftCache actCache = new SoftCache(); public ActivityDef get(String actName, int actVersion) throws ObjectNotFoundException, InvalidDataException { ActivityDef thisActDef; synchronized(actCache) { ActCacheEntry thisActDefEntry = actCache.get(actName+"_"+actVersion); if (thisActDefEntry == null) { Logger.msg(6, actName+" v"+actVersion+" not found in cache. Retrieving."); ItemProxy actDefItem = LocalObjectLoader.loadLocalObjectDef("/desc/ActivityDesc/", actName); String actType = actDefItem.getProperty("Complexity"); Viewpoint actView = (Viewpoint)actDefItem.getObject(ClusterStorage.VIEWPOINT + "/" + actType + "ActivityDef/" + actVersion); String marshalledAct; try { marshalledAct = actView.getOutcome().getData(); } catch (ClusterStorageException ex) { Logger.error(ex); throw new ObjectNotFoundException("Problem loading "+actName+" v"+actVersion+": "+ex.getMessage(), ""); } try { thisActDef = (ActivityDef)Gateway.getMarshaller().unmarshall(marshalledAct); } catch (Exception ex) { Logger.error(ex); throw new InvalidDataException("Could not unmarshall '"+actName+"' v"+actVersion+": "+ex.getMessage(), ""); } thisActDef.setName(actName); thisActDef.setVersion(actVersion); actCache.put(actName+"_"+actVersion, new ActCacheEntry(thisActDef, actDefItem, this)); } else { Logger.msg(6, actName+" v"+actVersion+" found in cache."); thisActDef = thisActDefEntry.actDef; } } return thisActDef; } public void removeAct(String id) { synchronized(actCache) { if (actCache.keySet().contains(id)) { Logger.msg(7, "ActDefCache: Removing activity def "+id+" from cache"); actCache.remove(id); } } } public class ActCacheEntry implements EntityProxyObserver { public String id; public ItemProxy actProxy; public ActivityDef actDef; public ActDefCache parent; public ActCacheEntry(ActivityDef actDef, ItemProxy actProxy, ActDefCache parent) { this.id = actDef.getName()+"_"+actDef.getVersion(); this.actDef = actDef; this.parent = parent; this.actProxy = actProxy; actProxy.subscribe(new MemberSubscription(this, ClusterStorage.VIEWPOINT, false)); } @Override public void finalize() { parent.removeAct(id); actProxy.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 "ActDef cache entry: "+id; } @Override public void control(String control, String msg) { } } }