package com.bagri.xdm.client.jcache.impl; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.cache.Cache; import javax.cache.CacheManager; import javax.cache.Caching; import javax.cache.configuration.Configuration; import javax.cache.configuration.MutableConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bagri.xdm.domain.XDMElement; /** * @author Denis Sukhoroslov: dsukhoroslov@gmail.com * @version 0.1 */ public class JCacheDocumentManager { private static final Logger logger = LoggerFactory.getLogger(JCacheDocumentManager.class); private CacheManager cMgr; private String cn_data = "xdm.cache"; private Cache<Long, XDMElement> xdmCache; // must be configurable... private int batchSize = 1000; public JCacheDocumentManager() { initialize(); } private void initialize() { cMgr = Caching.getCachingProvider().getCacheManager(); logger.trace("initialize; got cache manager: {}, with properties: {}", cMgr, cMgr.getProperties()); xdmCache = cMgr.getCache(cn_data); if (xdmCache == null) { Configuration<Long, XDMElement> config = new MutableConfiguration<Long, XDMElement>(); logger.trace("initialize; got configuration: {}", config); xdmCache = cMgr.createCache(cn_data, config); // xdmCache = cMgr. <Long, XDMElement>createCacheBuilder(cn_data).build(); } logger.trace("initialize; got cache: {}", xdmCache); //cMgr.enableManagement(cn_data, true); //cMgr.enableStatistics(cn_data, true); } public void store(XDMElement data) { //xdmCache.put(data.getElementId(), data); } public void store(Long id, XDMElement data) { xdmCache.put(id, data); } public void storeAll(Collection<XDMElement> data) { logger.trace("storeAll.enter; got {} entries", data.size()); int size = Math.max(batchSize, data.size()); int idx = 1; Map<Long, XDMElement> map = new HashMap<Long, XDMElement>(size); for (Iterator<XDMElement> itr = data.iterator(); itr.hasNext(); idx++) { XDMElement xdm = itr.next(); //map.put(xdm.getElementId(), xdm); if (idx % size == 0) { xdmCache.putAll(map); logger.trace("storeAll; stored {} entries", map.size()); map.clear(); } } if (map.size() > 0) { xdmCache.putAll(map); logger.trace("storeAll; stored {} entries", map.size()); } // no size method ?? //map = xdmCache.getAll(); //logger.trace("storeAll.exit; now cached {} entries", map.size()); } public void storeAll(Map<Long, XDMElement> data) { xdmCache.putAll(data); } public Map<Long, XDMElement> execQuery(String query) { // logger.trace("execQuery.enter; got query: {}", query); //Map<Long, XDMData> result = xdmCache.getAll(null); Map<Long, XDMElement> result = new HashMap<Long, XDMElement>(); for (Iterator<Cache.Entry<Long, XDMElement>> itr=xdmCache.iterator(); itr.hasNext(); ) { Cache.Entry<Long, XDMElement> entry = itr.next(); result.put(entry.getKey(), entry.getValue()); } logger.trace("execQuery.exit; returning {} entries", result.size()); return result; } }