View Javadoc
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  }