1 package net.avcompris.commons3.dao.impl;
2
3 import static com.google.common.base.Preconditions.checkNotNull;
4 import static com.google.common.collect.Maps.newHashMap;
5
6 import java.io.IOException;
7 import java.sql.SQLException;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.stream.Collectors;
11
12 import org.joda.time.DateTime;
13 import org.springframework.beans.factory.annotation.Autowired;
14 import org.springframework.stereotype.Component;
15
16 import net.avcompris.commons3.dao.CorrelationDao;
17 import net.avcompris.commons3.dao.exception.DuplicateEntityException;
18 import net.avcompris.commons3.utils.Clock;
19
20 @Component
21 public final class CorrelationDaoInMemory extends AbstractDao implements CorrelationDao {
22
23 private final Map<String, Holder> holders = newHashMap();
24
25 @Autowired
26 public CorrelationDaoInMemory(final Clock clock) {
27
28 super(clock);
29 }
30
31 private static class Holder {
32
33 public final String correlationId;
34 public final DateTime createdAt;
35
36 public Holder(final String correlationId, final DateTime createdAt) {
37
38 this.correlationId = checkNotNull(correlationId, "correlationId");
39 this.createdAt = checkNotNull(createdAt, "createdAt");
40 }
41 }
42
43 @Override
44 public boolean isCorrelationIdValid(final String correlationId) {
45
46 checkNotNull(correlationId, "correlationId");
47
48 return holders.containsKey(correlationId);
49 }
50
51 @Override
52 public void addCorrelationId(final String correlationId)
53 throws SQLException, IOException, DuplicateEntityException {
54
55 checkNotNull(correlationId, "correlationId");
56
57 synchronized (holders) {
58
59 if (holders.containsKey(correlationId)) {
60 throw new DuplicateEntityException("correlationId: " + correlationId);
61 }
62
63 holders.put(correlationId, new Holder(correlationId, clock.now()));
64 }
65 }
66
67 @Override
68 public void purgeOlderThanSec(final int seconds) throws SQLException, IOException {
69
70 final DateTime olderThan = clock.now().minusSeconds(seconds);
71
72 final List<String> correlationIdsToRemove = holders.values().stream()
73 .filter(holder -> holder.createdAt.isBefore(olderThan))
74 .map(holder -> holder.correlationId)
75 .collect(Collectors.toList());
76
77 correlationIdsToRemove.stream().forEach(correlationId
78
79 -> holders.remove(correlationId));
80 }
81 }