package com.smtaiserver.smtaiserver.graph; import org.springframework.cache.ehcache.EhCacheCacheManager; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import com.smtaiserver.smtaiserver.core.SMTAIServerApp; import com.smtaiserver.smtaiserver.database.SMTDatabase; import com.smtservlet.core.SMTApp; import com.smtservlet.util.SMTStatic; public class SMTAIGraphManager { public static class DBCache { private SMTDatabase _db; public SMTDatabase allocDatabase() throws Exception { if(_db == null) _db = SMTAIServerApp.getApp().allocDatabase(); return _db; } public void close() { if(_db != null) { _db.close(); _db = null; } } } private String _tableNode = "graph_node"; private String _tableLink = "graph_link"; private Cache _cacheNode; @SuppressWarnings("unused") private Cache _cacheLink; public SMTAIGraphManager() { EhCacheCacheManager springCacheManager = SMTApp.getBean(EhCacheCacheManager.class); CacheManager cacheManager = springCacheManager.getCacheManager(); { String cacheNodeId = SMTStatic.newUUID(); cacheManager.addCache(new Cache(cacheNodeId, 10000, false, true, 100, 100)); _cacheNode = cacheManager.getCache(cacheNodeId); } { String cacheLinkId = SMTStatic.newUUID(); cacheManager.addCache(new Cache(cacheLinkId, 10000, false, true, 100, 100)); _cacheLink = cacheManager.getCache(cacheLinkId); } } public void initInstance() throws Exception { } public SMTAIGraphNode getGraphNode(String recId) throws Exception { DBCache dbCache = new DBCache(); try { return getGraphNode(recId, dbCache); } finally { dbCache.close(); } } public SMTAIGraphNode getGraphNode(String recId, DBCache dbCache) throws Exception { if(recId == null) recId = "__GRAPH_ROOT__"; Element element = _cacheNode.get(recId); if(element == null) { _cacheNode.acquireWriteLockOnKey(recId); try { element = _cacheNode.get(recId); if(element == null) { SMTDatabase db = dbCache.allocDatabase(); SMTAIGraphNode graphNode = new SMTAIGraphNode(this, db, recId, this._tableNode, this._tableLink); element = new Element(graphNode.getRecId(), graphNode); _cacheNode.put(element); } } finally { _cacheNode.releaseWriteLockOnKey(recId); } } return (SMTAIGraphNode)element.getObjectValue(); } }