package com.easyooo.framework.cache.transaction; import java.util.Collection; import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.easyooo.framework.cache.CacheException; import com.easyooo.framework.cache.storage.JVMCache; /** * JVM 本地缓存事务操作实现,该类只能直接使用 * * @see BufferedCacheRemoteSender * * @author Killer */ public class DefaultJvmCacheTransactionCallback { private final Logger logger = LoggerFactory.getLogger(getClass()); private Collection<Command> commands; private Map<String, Object> cacheMap; public DefaultJvmCacheTransactionCallback(Map<String, Object> cacheMap, Collection<Command> commands){ this.commands = commands; this.cacheMap = cacheMap; } public void doCallback()throws CacheException { for (Command cmd : commands) { doProcessCommand(cmd); } } private void doProcessCommand(Command cmd){ if(cmd.getOp() == null){ logger.warn("No operations"); return; } if(logger.isDebugEnabled()){ logger.debug("Execute the command: " + cmd); } switch (cmd.getOp()) { case SET: set(cmd); break; case MOD: set(cmd); break; case DEL: del(cmd); break; case SETS: sets(cmd); break; case ADD_MEMBERS: addMembers(cmd); break; case DEL_MEMBERS: delMembers(cmd); break; default: break; } } private void set(Command cmd){ cacheMap.put(cmd.getCacheKey(), cmd.getCacheValue()); } private void del(Command cmd){ cacheMap.remove(cmd.getCacheKey()); } private void sets(Command cmd){ String[] keyvalues = cmd.getKeyvalues(); for (int i = 0; i < keyvalues.length; i+=2) { String cacheKey = keyvalues[i]; String value = keyvalues[i+1]; cacheMap.put(cacheKey, value); } } private void addMembers(Command cmd){ String groupKey = cmd.getCacheGroupKey(); String[] members = cmd.getGroupValues(); Object o = cacheMap.get(groupKey); if(o == null){ if(logger.isDebugEnabled()){ logger.debug("The local cache didn't find the group key["+ groupKey +"], Have been discarded"); } return; } try { Set<String> memberSet = JVMCache.castToSet(groupKey, o); for (String member : members) { memberSet.add(member); } } catch (CacheException e) { logger.error("cast to set", e); } } private void delMembers(Command cmd){ String groupKey = cmd.getCacheGroupKey(); String[] members = cmd.getGroupValues(); Object o = cacheMap.get(groupKey); if(o == null){ if(logger.isDebugEnabled()){ logger.debug("The local cache didn't find the group key["+ groupKey +"], Have been discarded"); } return; } try { Set<String> memberSet = JVMCache.castToSet(groupKey, o); for (String member : members) { memberSet.remove(member); } } catch (CacheException e) { logger.error("cast to set", e); } } }