]> git.somenet.org - pub/jan/dst18.git/blob - ass1-kv/src/main/java/dst/ass1/kv/impl/SessionManager.java
Make ElasticityControllerTest more tolernat to edge cases
[pub/jan/dst18.git] / ass1-kv / src / main / java / dst / ass1 / kv / impl / SessionManager.java
1 package dst.ass1.kv.impl;
2
3 import dst.ass1.kv.ISessionManager;
4 import dst.ass1.kv.SessionCreationFailedException;
5 import dst.ass1.kv.SessionNotFoundException;
6 import redis.clients.jedis.Jedis;
7 import redis.clients.jedis.Transaction;
8
9 import java.util.UUID;
10
11 public class SessionManager implements ISessionManager {
12     // "sUser:${userId}" -> UUID - Reverse-sessiondata-userId-mapping.
13     private final static String SUSER = "sUser:";
14     //  "sData:${UUID}" -> hashmap - Sessiondata.
15     private final static String SDATA = "sData:";
16
17     private final Jedis jedis; // no lightsabers :(
18
19     public SessionManager(String host, int port) {
20         jedis = new Jedis(host, port);
21     }
22
23     @Override
24     public String createSession(Long userId, int timeToLive) throws SessionCreationFailedException {
25         jedis.del(SUSER + userId.toString());
26         return requireSession(userId, timeToLive);
27     }
28
29     @Override
30     public void setSessionVariable(String sessionId, String key, String value) throws SessionNotFoundException {
31         if (!jedis.exists(SDATA + sessionId)) throw new SessionNotFoundException("Unknown sessionId:" + sessionId);
32         jedis.hset(SDATA + sessionId, key, value);
33     }
34
35     @Override
36     public String getSessionVariable(String sessionId, String key) throws SessionNotFoundException {
37         if (!jedis.exists(SDATA + sessionId)) throw new SessionNotFoundException("Unknown sessionId:" + sessionId);
38         return jedis.hget(SDATA + sessionId, key);
39     }
40
41     @Override
42     public Long getUserId(String sessionId) throws SessionNotFoundException {
43         if (!jedis.exists(SDATA + sessionId)) throw new SessionNotFoundException("Unknown sessionId:" + sessionId);
44         return Long.valueOf(jedis.hget(SDATA + sessionId, "userId"));
45     }
46
47     @Override
48     public int getTimeToLive(String sessionId) throws SessionNotFoundException {
49         if (!jedis.exists(SDATA + sessionId)) throw new SessionNotFoundException("Unknown sessionId:" + sessionId);
50         return jedis.ttl(SDATA + sessionId).intValue();
51     }
52
53     @Override
54     public String requireSession(Long userId, int timeToLive) throws SessionCreationFailedException {
55         String uuid = jedis.get(SUSER + userId.toString());
56         if (uuid == null) {
57             uuid = UUID.randomUUID().toString();
58             jedis.watch(SUSER + userId.toString());
59             Transaction t = jedis.multi();
60             t.set(SUSER + userId.toString(), uuid);
61             t.expire(SUSER + userId.toString(), timeToLive);
62             t.hset(SDATA + uuid, "userId", userId.toString());
63             t.expire(SDATA + uuid, timeToLive);
64             t.exec();
65         }
66         return uuid;
67     }
68
69     @Override
70     public void close() {
71         jedis.close();
72     }
73 }