1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.linecorp.centraldogma.server.internal.admin.auth;
17
18 import static java.util.Objects.requireNonNull;
19
20 import java.util.concurrent.CompletableFuture;
21
22 import com.github.benmanes.caffeine.cache.Cache;
23
24 import com.linecorp.centraldogma.server.auth.Session;
25 import com.linecorp.centraldogma.server.auth.SessionManager;
26
27
28
29
30 public final class CachedSessionManager extends ForwardingSessionManager {
31
32 private final Cache<String, Session> cache;
33
34
35
36
37
38
39
40
41 public CachedSessionManager(SessionManager delegate, Cache<String, Session> cache) {
42 super(delegate);
43 this.cache = requireNonNull(cache, "cache");
44 }
45
46 @Override
47 public CompletableFuture<Boolean> exists(String sessionId) {
48 requireNonNull(sessionId, "sessionId");
49 if (cache.getIfPresent(sessionId) != null) {
50 return CompletableFuture.completedFuture(true);
51 }
52 return super.exists(sessionId);
53 }
54
55 @Override
56 public CompletableFuture<Session> get(String sessionId) {
57 requireNonNull(sessionId, "sessionId");
58 final Session session = cache.getIfPresent(sessionId);
59 if (session != null) {
60 return CompletableFuture.completedFuture(session);
61 }
62 return super.get(sessionId).thenApply(found -> {
63 if (found != null) {
64 cache.put(sessionId, found);
65 }
66 return found;
67 });
68 }
69
70 @Override
71 public CompletableFuture<Void> create(Session session) {
72 return super.create(session).thenApply(unused -> {
73 cache.put(session.id(), session);
74 return null;
75 });
76 }
77
78 @Override
79 public CompletableFuture<Void> update(Session session) {
80 return super.update(session).thenApply(unused -> {
81 cache.put(session.id(), session);
82 return null;
83 });
84 }
85
86 @Override
87 public CompletableFuture<Void> delete(String sessionId) {
88 return super.delete(sessionId).thenApply(unused -> {
89 cache.invalidate(sessionId);
90 return null;
91 });
92 }
93 }