package com.janrain.backplane2.server.dao.redis; import com.janrain.backplane.common.BackplaneServerException; import com.janrain.backplane2.server.config.User; import com.janrain.backplane2.server.dao.BusDAO; import com.janrain.backplane2.server.dao.BusOwnerDAO; import com.janrain.redis.Redis; import org.apache.commons.lang.SerializationUtils; import org.apache.log4j.Logger; import redis.clients.jedis.Jedis; import redis.clients.jedis.Response; import redis.clients.jedis.Transaction; import java.util.ArrayList; import java.util.List; /** * @author Tom Raney */ public class RedisBusOwnerDAO implements BusOwnerDAO { public static byte[] getKey(String id) { return ("v2_bus_owner_" + id).getBytes(); } public RedisBusOwnerDAO(BusDAO busDao) { this.busDao = busDao; } @Override public User get(String id) throws BackplaneServerException { byte[] bytes = Redis.getInstance().get(getKey(id)); if (bytes != null) { return (User) SerializationUtils.deserialize(bytes); } else { return null; } } @Override public List<User> getAll() throws BackplaneServerException { List<User> users = new ArrayList<User>(); List<byte[]> bytesList = Redis.getInstance().lrange(getKey("list"), 0, -1); for (byte [] bytes : bytesList) { if (bytes != null) { users.add((User) SerializationUtils.deserialize(bytes)); } } return users; } @Override public void persist(User obj) throws BackplaneServerException { Jedis jedis = null; try { jedis = Redis.getInstance().getWriteJedis(); byte[] bytes = SerializationUtils.serialize(obj); Transaction t = jedis.multi(); t.set(getKey(obj.getIdValue()), bytes); t.rpush(getKey("list"), bytes); t.exec(); } finally { Redis.getInstance().releaseToPool(jedis); } } @Override public void delete(String id) throws BackplaneServerException { Jedis jedis = null; try { logger.info("=== BEGIN BUS OWNER " + id + " DELETE ==="); jedis = Redis.getInstance().getWriteJedis(); byte[] bytes = jedis.get(getKey(id)); if (bytes != null) { Transaction t= jedis.multi(); Response<Long> del1 = t.del(getKey(id)); Response<Long> del2 = t.lrem(getKey("list"), 0, bytes); t.exec(); if (del1.get() == 0) { logger.warn("failed to remove " + new String(getKey(id))); } if (del2.get() == 0) { logger.warn("failed to remove " + new String(getKey(id)) + " from list " + new String(getKey("list"))); } } else { logger.warn("could not locate value for key " + new String(getKey(id))); } // delete all associated buses (and their dependencies) busDao.deleteByOwner(id); logger.info("Bus owner " + id + " deleted successfully"); logger.info("=== END BUS OWNER DELETE ==="); } catch (Exception e) { logger.error("An exception occurred during an atomic operation. Corruption may have occurred while removing bus owner: " + id); throw new BackplaneServerException(e.getMessage()); } finally { Redis.getInstance().releaseToPool(jedis); } } // PRIVATE private static final Logger logger = Logger.getLogger(RedisBusOwnerDAO.class); private final BusDAO busDao; }