2933 |
14 Nov 14 |
olle |
1 |
package net.sf.basedb.meludi; |
2933 |
14 Nov 14 |
olle |
2 |
|
2933 |
14 Nov 14 |
olle |
3 |
import java.util.HashMap; |
2933 |
14 Nov 14 |
olle |
4 |
import java.util.Iterator; |
2933 |
14 Nov 14 |
olle |
5 |
import java.util.Map; |
2933 |
14 Nov 14 |
olle |
6 |
|
2933 |
14 Nov 14 |
olle |
7 |
/** |
2933 |
14 Nov 14 |
olle |
Simple implementation for keeping track of reserved "items" for a didicated |
2933 |
14 Nov 14 |
olle |
amount of time. After the given timeout expires the items are considered |
2933 |
14 Nov 14 |
olle |
removed. |
2933 |
14 Nov 14 |
olle |
11 |
|
2933 |
14 Nov 14 |
olle |
@since 2.16 |
2933 |
14 Nov 14 |
olle |
13 |
*/ |
2933 |
14 Nov 14 |
olle |
14 |
public class ReservedItems<I> |
2933 |
14 Nov 14 |
olle |
15 |
{ |
2933 |
14 Nov 14 |
olle |
16 |
|
2933 |
14 Nov 14 |
olle |
17 |
private final Map<I, Long> reserve; |
2933 |
14 Nov 14 |
olle |
18 |
private final long timeout; |
2933 |
14 Nov 14 |
olle |
19 |
private long nextCleanup; |
2933 |
14 Nov 14 |
olle |
20 |
|
2933 |
14 Nov 14 |
olle |
21 |
/** |
2933 |
14 Nov 14 |
olle |
Create a new reserved cache with the given timeout. |
2933 |
14 Nov 14 |
olle |
@param timeout Timeout in seconds |
2933 |
14 Nov 14 |
olle |
24 |
*/ |
2933 |
14 Nov 14 |
olle |
25 |
public ReservedItems(int timeout) |
2933 |
14 Nov 14 |
olle |
26 |
{ |
2933 |
14 Nov 14 |
olle |
27 |
this.timeout = timeout * 1000; |
2933 |
14 Nov 14 |
olle |
28 |
this.nextCleanup = System.currentTimeMillis() + 10 * this.timeout; |
2933 |
14 Nov 14 |
olle |
29 |
this.reserve = new HashMap<I, Long>(); |
2933 |
14 Nov 14 |
olle |
30 |
} |
2933 |
14 Nov 14 |
olle |
31 |
|
2933 |
14 Nov 14 |
olle |
32 |
/** |
2933 |
14 Nov 14 |
olle |
Try to reserve the given item. If it is not currently |
2933 |
14 Nov 14 |
olle |
reserved, a new reservation is made and TRUE is returned. |
2933 |
14 Nov 14 |
olle |
If the item is already reserved, FALSE is returned. |
2933 |
14 Nov 14 |
olle |
36 |
|
2933 |
14 Nov 14 |
olle |
37 |
*/ |
2933 |
14 Nov 14 |
olle |
38 |
public synchronized boolean reserve(I item) |
2933 |
14 Nov 14 |
olle |
39 |
{ |
2933 |
14 Nov 14 |
olle |
40 |
long now = System.currentTimeMillis(); |
2933 |
14 Nov 14 |
olle |
41 |
|
2933 |
14 Nov 14 |
olle |
42 |
Long itemTimeout = reserve.get(item); |
2933 |
14 Nov 14 |
olle |
43 |
if (itemTimeout != null && itemTimeout > now) |
2933 |
14 Nov 14 |
olle |
44 |
{ |
2933 |
14 Nov 14 |
olle |
// The item is reserved and has not timed out |
2933 |
14 Nov 14 |
olle |
46 |
return false; |
2933 |
14 Nov 14 |
olle |
47 |
} |
2933 |
14 Nov 14 |
olle |
48 |
|
2933 |
14 Nov 14 |
olle |
// Reserve the given item |
2933 |
14 Nov 14 |
olle |
50 |
reserve.put(item, now + timeout); |
2933 |
14 Nov 14 |
olle |
51 |
|
2933 |
14 Nov 14 |
olle |
// Do cleanup if it was a long time ago |
2933 |
14 Nov 14 |
olle |
53 |
if (now > nextCleanup) cleanUp(); |
2933 |
14 Nov 14 |
olle |
54 |
|
2933 |
14 Nov 14 |
olle |
55 |
return true; |
2933 |
14 Nov 14 |
olle |
56 |
} |
2933 |
14 Nov 14 |
olle |
57 |
|
2933 |
14 Nov 14 |
olle |
58 |
private void cleanUp() |
2933 |
14 Nov 14 |
olle |
59 |
{ |
2933 |
14 Nov 14 |
olle |
60 |
long now = System.currentTimeMillis(); |
2933 |
14 Nov 14 |
olle |
61 |
Iterator<Long> it = reserve.values().iterator(); |
2933 |
14 Nov 14 |
olle |
62 |
while (it.hasNext()) |
2933 |
14 Nov 14 |
olle |
63 |
{ |
2933 |
14 Nov 14 |
olle |
64 |
if (it.next() < now) it.remove(); |
2933 |
14 Nov 14 |
olle |
65 |
} |
2933 |
14 Nov 14 |
olle |
66 |
nextCleanup = now + 10 * timeout; |
2933 |
14 Nov 14 |
olle |
67 |
} |
2933 |
14 Nov 14 |
olle |
68 |
|
2933 |
14 Nov 14 |
olle |
69 |
} |