|
5 | 5 | */ |
6 | 6 | package io.jooby.internal; |
7 | 7 |
|
| 8 | +import io.jooby.Context; |
8 | 9 | import io.jooby.Session; |
| 10 | +import io.jooby.SessionId; |
| 11 | +import io.jooby.SessionOptions; |
9 | 12 | import io.jooby.SessionStore; |
10 | 13 |
|
11 | 14 | import java.time.Instant; |
| 15 | +import java.util.Map; |
12 | 16 | import java.util.concurrent.ConcurrentHashMap; |
13 | 17 |
|
14 | 18 | public class InMemorySessionStore implements SessionStore { |
15 | | - private ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap<>(); |
| 19 | + private static class SessionData { |
| 20 | + private Instant lastAccessedTime; |
| 21 | + private Instant creationTime; |
| 22 | + private Map hash; |
16 | 23 |
|
17 | | - @Override public Session newSession(String id) { |
| 24 | + public SessionData(Instant creationTime, Instant lastAccessedTime, Map hash) { |
| 25 | + this.creationTime = creationTime; |
| 26 | + this.lastAccessedTime = lastAccessedTime; |
| 27 | + this.hash = hash; |
| 28 | + } |
| 29 | + } |
| 30 | + |
| 31 | + private ConcurrentHashMap<String, SessionData> sessions = new ConcurrentHashMap<>(); |
| 32 | + |
| 33 | + @Override public Session newSession(Context ctx) { |
| 34 | + SessionOptions options = sessionOptions(ctx); |
| 35 | + String sessionId = options.generateId(); |
18 | 36 | Instant now = Instant.now(); |
19 | | - Session session = Session.create(id) |
| 37 | + Session session = Session.create(ctx, sessionId) |
20 | 38 | .setCreationTime(now) |
21 | 39 | .setLastAccessedTime(now) |
22 | 40 | .setNew(true); |
| 41 | + options.getSessionId().saveSessionId(ctx, sessionId); |
23 | 42 | return session; |
24 | 43 | } |
25 | 44 |
|
26 | | - @Override public Session findSession(String id) { |
27 | | - Session session = sessions.get(id); |
28 | | - if (session != null) { |
29 | | - session.setLastAccessedTime(Instant.now()); |
| 45 | + @Override public Session findSession(Context ctx) { |
| 46 | + SessionOptions options = sessionOptions(ctx); |
| 47 | + String sessionId = options.getSessionId().findSessionId(ctx); |
| 48 | + if (sessionId == null) { |
| 49 | + return null; |
30 | 50 | } |
31 | | - return session; |
| 51 | + SessionData data = sessions.get(sessionId); |
| 52 | + if (data != null) { |
| 53 | + Session session = Session.create(ctx, sessionId, data.hash); |
| 54 | + session.setLastAccessedTime(data.lastAccessedTime); |
| 55 | + session.setCreationTime(data.creationTime); |
| 56 | + options.getSessionId().saveSessionId(ctx, sessionId); |
| 57 | + return session; |
| 58 | + } |
| 59 | + return null; |
| 60 | + } |
| 61 | + |
| 62 | + @Override public void deleteSession(Context ctx) { |
| 63 | + String sessionId = ctx.session().getId(); |
| 64 | + sessions.remove(sessionId); |
| 65 | + SessionOptions options = sessionOptions(ctx); |
| 66 | + SessionId store = options.getSessionId(); |
| 67 | + store.deleteSessionId(ctx, sessionId); |
32 | 68 | } |
33 | 69 |
|
34 | | - @Override public void deleteSession(String id) { |
35 | | - sessions.remove(id); |
| 70 | + @Override public void save(Context ctx) { |
| 71 | + Session session = ctx.session(); |
| 72 | + String sessionId = ctx.session().getId(); |
| 73 | + sessions.put(sessionId, |
| 74 | + new SessionData(session.getCreationTime(), Instant.now(), session.toMap())); |
| 75 | + // session |
| 76 | + // .setNew(false) |
| 77 | + // .setModify(false) |
| 78 | + // .setLastAccessedTime(Instant.now()); |
36 | 79 | } |
37 | 80 |
|
38 | | - @Override public void save(Session session) { |
39 | | - sessions.put(session.getId(), session); |
40 | | - session |
41 | | - .setNew(false) |
42 | | - .setModify(false) |
43 | | - .setLastAccessedTime(Instant.now()); |
| 81 | + private static SessionOptions sessionOptions(Context ctx) { |
| 82 | + return ctx.getRouter().getSessionOptions(); |
44 | 83 | } |
45 | 84 | } |
0 commit comments