package com.janrain.backplane2.server.dao.redis;
import com.janrain.backplane.common.BackplaneServerException;
import com.janrain.backplane2.server.config.Client;
import com.janrain.backplane2.server.dao.ClientDAO;
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 RedisClientDAO implements ClientDAO {
public static byte[] getKey(String id) {
return ("v2_client_" + id).getBytes();
}
@Override
public Client get(String id) throws BackplaneServerException {
byte[] bytes = Redis.getInstance().get(getKey(id));
if (bytes != null) {
return (Client) SerializationUtils.deserialize(bytes);
} else {
return null;
}
}
@Override
public List<Client> getAll() throws BackplaneServerException {
List<Client> clients = new ArrayList<Client>();
List<byte[]> byteList = Redis.getInstance().lrange(getKey("list"), 0, -1);
for (byte [] bytes: byteList) {
if (bytes != null) {
clients.add((Client) SerializationUtils.deserialize(bytes));
}
}
return clients;
}
@Override
public void persist(Client obj) throws BackplaneServerException {
Jedis jedis = null;
try {
byte[] bytes = SerializationUtils.serialize(obj);
jedis = Redis.getInstance().getWriteJedis();
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 {
jedis = Redis.getInstance().getWriteJedis();
byte[] bytes = jedis.get(getKey(id));
if (bytes != null) {
Transaction t = jedis.multi();
Response<Long> del1 = t.lrem(getKey("list"), 0, bytes);
Response<Long> del2 = t.del(getKey(id));
t.exec();
if (del1.get() == 0) {
logger.warn("could not delete client " + new String(getKey(id)) + " from list " + new String(getKey("list")));
}
if (del2.get() == 0) {
logger.warn("could not delete client key " + new String(getKey(id)));
}
} else {
logger.warn("could not locate value for key " + new String(getKey(id)));
}
} finally {
Redis.getInstance().releaseToPool(jedis);
}
}
// PRIVATE
private static final Logger logger = Logger.getLogger(RedisClientDAO.class);
}