| .. | .. |
|---|
| 1 | 1 | package net.curisit.securis.utils; |
|---|
| 2 | 2 | |
|---|
| 3 | +import java.util.ArrayList; |
|---|
| 3 | 4 | import java.util.Date; |
|---|
| 4 | | -import java.util.Hashtable; |
|---|
| 5 | +import java.util.HashMap; |
|---|
| 6 | +import java.util.List; |
|---|
| 5 | 7 | import java.util.Map; |
|---|
| 6 | 8 | |
|---|
| 7 | 9 | import javax.inject.Inject; |
|---|
| .. | .. |
|---|
| 25 | 27 | */ |
|---|
| 26 | 28 | private static int DEFAULT_CACHE_DURATION = 24 * 60 * 60; |
|---|
| 27 | 29 | |
|---|
| 28 | | - private Map<String, CachedObject> data = new Hashtable<>(); |
|---|
| 30 | + private Map<String, CachedObject> data = new HashMap<>(); |
|---|
| 29 | 31 | |
|---|
| 30 | 32 | private Thread cleaningThread = null; |
|---|
| 31 | 33 | |
|---|
| .. | .. |
|---|
| 46 | 48 | } |
|---|
| 47 | 49 | // log.info("Cheking expired objects " + new Date()); |
|---|
| 48 | 50 | Date now = new Date(); |
|---|
| 51 | + List<String> keysToRemove = new ArrayList<>(); |
|---|
| 49 | 52 | for (String key : CacheTTL.this.data.keySet()) { |
|---|
| 50 | 53 | CachedObject co = CacheTTL.this.data.get(key); |
|---|
| 51 | 54 | if (now.after(co.getExpireAt())) { |
|---|
| 52 | | - CacheTTL.this.data.remove(key); |
|---|
| 55 | + keysToRemove.add(key); |
|---|
| 53 | 56 | } |
|---|
| 54 | 57 | } |
|---|
| 58 | + for (String key : keysToRemove) { |
|---|
| 59 | + // If we try to remove directly in the previous loop an exception is thrown java.util.ConcurrentModificationException |
|---|
| 60 | + CacheTTL.this.data.remove(key); |
|---|
| 61 | + } |
|---|
| 55 | 62 | } |
|---|
| 56 | 63 | } |
|---|
| 57 | 64 | }); |
|---|