extensions/net.sf.basedb.meludi/trunk/src/net/sf/basedb/meludi/ReservedItems.java

Code
Comments
Other
Rev Date Author Line
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 8   Simple implementation for keeping track of reserved "items" for a didicated 
2933 14 Nov 14 olle 9   amount of time. After the given timeout expires the items are considered
2933 14 Nov 14 olle 10   removed.
2933 14 Nov 14 olle 11   
2933 14 Nov 14 olle 12   @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 22     Create a new reserved cache with the given timeout.
2933 14 Nov 14 olle 23     @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 33     Try to reserve the given item. If it is not currently
2933 14 Nov 14 olle 34     reserved, a new reservation is made and TRUE is returned.
2933 14 Nov 14 olle 35     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 45       // 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 49     // 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 52     // 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 }