1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.sra.session;
20
21 import org.apache.syncope.sra.SessionConfig;
22 import org.springframework.beans.factory.annotation.Autowired;
23 import org.springframework.cache.CacheManager;
24 import org.springframework.session.MapSession;
25 import org.springframework.session.ReactiveSessionRepository;
26 import reactor.core.publisher.Mono;
27
28 public class CacheManagerReactiveSessionRepository implements ReactiveSessionRepository<MapSession> {
29
30 @Autowired
31 private CacheManager cacheManager;
32
33 @Override
34 public Mono<MapSession> createSession() {
35 return Mono.just(new MapSession());
36 }
37
38 @Override
39 public Mono<Void> save(final MapSession session) {
40 return Mono.fromRunnable(() -> {
41 if (!session.getId().equals(session.getOriginalId())) {
42 cacheManager.getCache(SessionConfig.DEFAULT_CACHE).evictIfPresent(session.getOriginalId());
43 }
44 cacheManager.getCache(SessionConfig.DEFAULT_CACHE).put(session.getId(), session);
45 });
46 }
47
48 @Override
49 public Mono<MapSession> findById(final String id) {
50 return Mono.defer(() -> Mono.justOrEmpty(
51 cacheManager.getCache(SessionConfig.DEFAULT_CACHE).get(id, MapSession.class)).
52 map(MapSession::new).
53 switchIfEmpty(deleteById(id).then(Mono.empty())));
54 }
55
56 @Override
57 public Mono<Void> deleteById(final String id) {
58 return Mono.fromRunnable(() -> cacheManager.getCache(SessionConfig.DEFAULT_CACHE).evictIfPresent(id));
59 }
60 }