|
From: <be...@us...> - 2010-11-20 22:49:14
|
Revision: 376
http://objectlabkit.svn.sourceforge.net/objectlabkit/?rev=376&view=rev
Author: benoitx
Date: 2010-11-20 22:49:07 +0000 (Sat, 20 Nov 2010)
Log Message:
-----------
Added Unit Test for the immutable collections with timeout...
Modified Paths:
--------------
trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java
trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java
trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java
trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java
trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java
trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java
trunk/utils/src/main/java/net/objectlab/kit/collections/MapBuilder.java
trunk/utils/src/main/java/net/objectlab/kit/collections/SetBuilder.java
Added Paths:
-----------
trunk/utils/src/main/java/net/objectlab/kit/collections/DefaultMapBuilder.java
trunk/utils/src/main/java/net/objectlab/kit/collections/DefaultSetBuilder.java
trunk/utils/src/main/java/net/objectlab/kit/util/PeriodBuilder.java
trunk/utils/src/test/java/net/objectlab/kit/collections/
trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashMapTest.java
trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashSetTest.java
Modified: trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java 2010-11-05 11:41:20 UTC (rev 375)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -8,15 +8,24 @@
/**
* @author xhensevalb
- *
*/
public abstract class AbstractImmutabeExpiringCollection {
private long expiryTimeoutMilliseconds;
- private boolean loadOnExpiry = true;
+ private boolean reloadOnExpiry = true;
+ private boolean reloadWhenExpired = true;
private boolean loadOnFirstAccess = true;
private long lastLoadingTime;
+ private String id;
private Timer timer;
+ protected void setId(final String id) {
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+
protected void setLastLoadingTime(final long lastLoadingTime) {
this.lastLoadingTime = lastLoadingTime;
}
@@ -25,20 +34,24 @@
this.expiryTimeoutMilliseconds = milliseconds;
}
- public void setLoadOnExpiry(final boolean loadOnExpiry) {
- this.loadOnExpiry = loadOnExpiry;
+ public void setReloadOnExpiry(final boolean reloadOnExpiry) {
+ this.reloadOnExpiry = reloadOnExpiry;
}
public void setLoadOnFirstAccess(final boolean loadOnFirstAccess) {
this.loadOnFirstAccess = loadOnFirstAccess;
}
+ public void setReloadWhenExpired(final boolean reloadWhenExpired) {
+ this.reloadWhenExpired = reloadWhenExpired;
+ }
+
protected boolean hasExpired() {
return System.currentTimeMillis() - lastLoadingTime > expiryTimeoutMilliseconds;
}
public void start() {
- if (loadOnExpiry) {
+ if (reloadOnExpiry) {
// start timer
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@@ -55,7 +68,11 @@
protected void validateOnAccess() {
if (hasExpired()) {
- load();
+ if (reloadWhenExpired || loadOnFirstAccess && lastLoadingTime == 0) {
+ load();
+ } else {
+ doClear();
+ }
}
}
@@ -66,12 +83,14 @@
protected abstract void doLoad();
+ protected abstract void doClear();
+
protected long getExpiryTimeoutMilliseconds() {
return expiryTimeoutMilliseconds;
}
- protected boolean isLoadOnExpiry() {
- return loadOnExpiry;
+ protected boolean isReloadOnExpiry() {
+ return reloadOnExpiry;
}
protected boolean isLoadOnFirstAccess() {
Added: trunk/utils/src/main/java/net/objectlab/kit/collections/DefaultMapBuilder.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/DefaultMapBuilder.java (rev 0)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/DefaultMapBuilder.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -0,0 +1,74 @@
+/**
+ *
+ */
+package net.objectlab.kit.collections;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import net.objectlab.kit.util.Pair;
+
+/**
+ * Inspired by the Google Collection builder.
+ *
+ * @author Benoit Xhenseval
+ *
+ */
+public class DefaultMapBuilder<K, V> implements MapBuilder<K, V> {
+ private final List<Pair<K, V>> entries = new ArrayList<Pair<K, V>>();
+ private final String id;
+
+ public DefaultMapBuilder(final String id) {
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * Associates {@code key} with {@code value} in the built map.
+ */
+ public DefaultMapBuilder<K, V> put(final K key, final V value) {
+ entries.add(new Pair<K, V>(key, value));
+ return this;
+ }
+
+ /**
+ * Associates all of the given map's keys and values in the built map.
+ *
+ * @throws NullPointerException if any key or value in {@code map} is null
+ */
+ public DefaultMapBuilder<K, V> putAll(final Map<? extends K, ? extends V> map) {
+ for (final Entry<? extends K, ? extends V> entry : map.entrySet()) {
+ put(entry.getKey(), entry.getValue());
+ }
+ return this;
+ }
+
+ /**
+ * Returns a newly-created immutable map.
+ *
+ * @throws IllegalArgumentException if duplicate keys were added
+ */
+ public Map<K, V> build() {
+ return fromEntryList(entries);
+ }
+
+ private static <K, V> Map<K, V> fromEntryList(final List<Pair<K, V>> entries) {
+ final int size = entries.size();
+ switch (size) {
+ case 0:
+ return new HashMap<K, V>();
+ default:
+ final Map<K, V> m = new HashMap<K, V>();
+ for (final Pair<K, V> entry : entries) {
+ m.put(entry.getElement1(), entry.getElement2());
+ }
+ return m;
+ }
+ }
+}
Added: trunk/utils/src/main/java/net/objectlab/kit/collections/DefaultSetBuilder.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/DefaultSetBuilder.java (rev 0)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/DefaultSetBuilder.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -0,0 +1,38 @@
+/**
+ *
+ */
+package net.objectlab.kit.collections;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author xhensevalb
+ *
+ */
+public class DefaultSetBuilder<T> implements SetBuilder<T> {
+ private final Set<T> set = new HashSet<T>();
+ private final String id;
+
+ public DefaultSetBuilder(final String id) {
+ super();
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void add(final T t) {
+ set.add(t);
+ }
+
+ public void addAll(final Collection<T> t) {
+ set.addAll(t);
+ }
+
+ Set<T> build() {
+ return new HashSet<T>(set);
+ }
+}
Modified: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java 2010-11-05 11:41:20 UTC (rev 375)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -12,7 +12,9 @@
void setLoadOnFirstAccess(boolean loadOnFirstAccess);
- void setLoadOnExpiry(boolean loadOnExpiry);
+ void setReloadOnExpiry(boolean loadOnExpiry);
+ void setReloadWhenExpired(boolean loadWhenExpired);
+
void start();
}
Modified: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java 2010-11-05 11:41:20 UTC (rev 375)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -1,20 +1,52 @@
package net.objectlab.kit.collections;
+import net.objectlab.kit.util.PeriodBuilder;
+
+/**
+ * Builder for the immutable classes.
+ * Default:
+ * - no time out
+ * - reload on expiry: true
+ * - load on first access only (ie not at construction time)
+ *
+ * @author xhensevalb
+ *
+ */
public class ImmutableExpiringCollectionBuilder {
- private long expiryTimeoutMilliseconds;
- private boolean loadOnExpiry = true;
+ private long expiryTimeoutMilliseconds = -1;
+ private boolean reloadOnExpiry = true;
+ private boolean reloadWhenExpired = true;
private boolean loadOnFirstAccess = true;
+ private String id;
- public ImmutableExpiringCollectionBuilder expiryTimeoutMilliseconds(final long expiryTimeourMilliseconds) {
- this.expiryTimeoutMilliseconds = expiryTimeourMilliseconds;
+ public ImmutableExpiringCollectionBuilder id(final String id) {
+ this.id = id;
return this;
}
- public ImmutableExpiringCollectionBuilder loadOnExpiry(final boolean loadOnExpiry) {
- this.loadOnExpiry = loadOnExpiry;
+ public ImmutableExpiringCollectionBuilder expiryTimeout(final PeriodBuilder expiryTimeout) {
+ assert expiryTimeout != null;
+ if (expiryTimeout != null) {
+ this.expiryTimeoutMilliseconds = expiryTimeout.calculateMilliseconds();
+ }
return this;
}
+ public ImmutableExpiringCollectionBuilder expiryTimeoutMilliseconds(final long expiryTimeoutMilliseconds) {
+ this.expiryTimeoutMilliseconds = expiryTimeoutMilliseconds;
+ return this;
+ }
+
+ public ImmutableExpiringCollectionBuilder reloadWhenExpired(final boolean reloadWhenExpired) {
+ this.reloadWhenExpired = reloadWhenExpired;
+ return this;
+ }
+
+ public ImmutableExpiringCollectionBuilder reloadOnExpiry(final boolean loadOnExpiry) {
+ this.reloadOnExpiry = loadOnExpiry;
+ return this;
+ }
+
public ImmutableExpiringCollectionBuilder loadOnFirstAccess(final boolean loadOnFirstAccess) {
this.loadOnFirstAccess = loadOnFirstAccess;
return this;
@@ -24,12 +56,19 @@
return expiryTimeoutMilliseconds;
}
- final boolean isLoadOnExpiry() {
- return loadOnExpiry;
+ final boolean isReloadOnExpiry() {
+ return reloadOnExpiry;
}
+ final boolean isReloadWhenExpired() {
+ return reloadWhenExpired;
+ }
+
final boolean isLoadOnFirstAccess() {
return loadOnFirstAccess;
}
+ final String getId() {
+ return id;
+ }
}
Modified: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java 2010-11-05 11:41:20 UTC (rev 375)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -18,15 +18,17 @@
public ImmutableExpiringHashMap(final ImmutableExpiringHashMapBuilder<K, V> builder) {
loader = builder.getLoader();
+ setId(builder.getId());
setExpiryTimeoutMilliseconds(builder.getExpiryTimeoutMilliseconds());
- setLoadOnExpiry(builder.isLoadOnExpiry());
+ setReloadOnExpiry(builder.isReloadOnExpiry());
setLoadOnFirstAccess(builder.isLoadOnFirstAccess());
+ setReloadWhenExpired(builder.isReloadWhenExpired());
start();
}
@Override
protected void doLoad() {
- final MapBuilder<K, V> builder = new MapBuilder<K, V>();
+ final DefaultMapBuilder<K, V> builder = new DefaultMapBuilder<K, V>(getId());
loader.load(builder);
delegate = builder.build();
}
@@ -86,4 +88,9 @@
validateOnAccess();
return delegate.values();
}
+
+ @Override
+ protected void doClear() {
+ delegate.clear();
+ }
}
Modified: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java 2010-11-05 11:41:20 UTC (rev 375)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -18,15 +18,17 @@
public ImmutableExpiringHashSet(final ImmutableExpiringHashSetBuilder<T> builder) {
this.loader = builder.getLoader();
+ setId(builder.getId());
setExpiryTimeoutMilliseconds(builder.getExpiryTimeoutMilliseconds());
- setLoadOnExpiry(builder.isLoadOnExpiry());
+ setReloadOnExpiry(builder.isReloadOnExpiry());
setLoadOnFirstAccess(builder.isLoadOnFirstAccess());
+ setReloadWhenExpired(builder.isReloadWhenExpired());
start();
}
@Override
protected void doLoad() {
- final SetBuilder<T> builder = new SetBuilder<T>();
+ final DefaultSetBuilder<T> builder = new DefaultSetBuilder<T>(getId());
loader.load(builder);
delegate = builder.build();
}
@@ -90,4 +92,9 @@
validateOnAccess();
return delegate.toArray(a);
}
+
+ @Override
+ protected void doClear() {
+ delegate.clear();
+ }
}
Modified: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java 2010-11-05 11:41:20 UTC (rev 375)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -1,5 +1,12 @@
package net.objectlab.kit.collections;
+/**
+ * The builder in charge of providing the parameters for the Set.
+ *
+ * @author xhensevalb
+ *
+ * @param <T>
+ */
public class ImmutableExpiringHashSetBuilder<T> extends ImmutableExpiringCollectionBuilder {
private final SetLoader<T> loader;
Modified: trunk/utils/src/main/java/net/objectlab/kit/collections/MapBuilder.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/MapBuilder.java 2010-11-05 11:41:20 UTC (rev 375)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/MapBuilder.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -3,66 +3,26 @@
*/
package net.objectlab.kit.collections;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
-import net.objectlab.kit.util.Pair;
-
/**
* Inspired by the Google Collection builder.
*
* @author Benoit Xhenseval
*
*/
-public class MapBuilder<K, V> {
- final List<Pair<K, V>> entries = new ArrayList<Pair<K, V>>();
+public interface MapBuilder<K, V> {
+ String getId();
- public MapBuilder() {
- }
-
/**
* Associates {@code key} with {@code value} in the built map.
*/
- public MapBuilder<K, V> put(final K key, final V value) {
- entries.add(new Pair<K, V>(key, value));
- return this;
- }
+ MapBuilder<K, V> put(K key, V value);
/**
* Associates all of the given map's keys and values in the built map.
*
* @throws NullPointerException if any key or value in {@code map} is null
*/
- public MapBuilder<K, V> putAll(final Map<? extends K, ? extends V> map) {
- for (final Entry<? extends K, ? extends V> entry : map.entrySet()) {
- put(entry.getKey(), entry.getValue());
- }
- return this;
- }
-
- /**
- * Returns a newly-created immutable map.
- *
- * @throws IllegalArgumentException if duplicate keys were added
- */
- public Map<K, V> build() {
- return fromEntryList(entries);
- }
-
- private static <K, V> Map<K, V> fromEntryList(final List<Pair<K, V>> entries) {
- final int size = entries.size();
- switch (size) {
- case 0:
- return new HashMap<K, V>();
- default:
- final Map<K, V> m = new HashMap<K, V>();
- for (final Pair<K, V> entry : entries) {
- m.put(entry.getElement1(), entry.getElement2());
- }
- return m;
- }
- }
-}
+ MapBuilder<K, V> putAll(Map<? extends K, ? extends V> map);
+}
\ No newline at end of file
Modified: trunk/utils/src/main/java/net/objectlab/kit/collections/SetBuilder.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/collections/SetBuilder.java 2010-11-05 11:41:20 UTC (rev 375)
+++ trunk/utils/src/main/java/net/objectlab/kit/collections/SetBuilder.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -3,21 +3,16 @@
*/
package net.objectlab.kit.collections;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.Collection;
/**
* @author xhensevalb
*
*/
-public class SetBuilder<T> {
- private final Set<T> set = new HashSet<T>();
+public interface SetBuilder<T> {
+ String getId();
- public void add(final T t) {
- set.add(t);
- }
+ void add(final T t);
- public Set<T> build() {
- return new HashSet<T>(set);
- }
+ void addAll(final Collection<T> t);
}
Added: trunk/utils/src/main/java/net/objectlab/kit/util/PeriodBuilder.java
===================================================================
--- trunk/utils/src/main/java/net/objectlab/kit/util/PeriodBuilder.java (rev 0)
+++ trunk/utils/src/main/java/net/objectlab/kit/util/PeriodBuilder.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -0,0 +1,60 @@
+/**
+ *
+ */
+package net.objectlab.kit.util;
+
+/**
+ * A simple helper class that is NOT SCIENTIFIC but accurate enough
+ * for the mere mortals, to calculate the number of milliseconds to
+ * be used in say a timer but setup in a easier way...
+ * @author xhensevalb
+ *
+ */
+public class PeriodBuilder {
+ private int weeks = 0;
+ private int days = 0;
+ private int hours = 0;
+ private int minutes = 0;
+ private int seconds = 0;
+ private long milliseconds = 0;
+
+ public long calculateMilliseconds() {
+ return milliseconds //
+ + seconds * 1000L //
+ + minutes * 60L * 1000L //
+ + hours * 60L * 60L * 1000L //
+ + days * 24L * 60L * 60L * 1000L //
+ + weeks * 7L * 24L * 60L * 60L * 1000L //
+ ;
+ }
+
+ public PeriodBuilder weeks(final int weeks) {
+ this.weeks = weeks;
+ return this;
+ }
+
+ public PeriodBuilder days(final int days) {
+ this.days = days;
+ return this;
+ }
+
+ public PeriodBuilder hours(final int hours) {
+ this.hours = hours;
+ return this;
+ }
+
+ public PeriodBuilder minutes(final int minutes) {
+ this.minutes = minutes;
+ return this;
+ }
+
+ public PeriodBuilder seconds(final int seconds) {
+ this.seconds = seconds;
+ return this;
+ }
+
+ public PeriodBuilder milliseconds(final int milliseconds) {
+ this.milliseconds = milliseconds;
+ return this;
+ }
+}
Added: trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashMapTest.java
===================================================================
--- trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashMapTest.java (rev 0)
+++ trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashMapTest.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -0,0 +1,228 @@
+/**
+ *
+ */
+package net.objectlab.kit.collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author xhensevalb
+ *
+ */
+public class ImmutableExpiringHashMapTest implements MapLoader<String, Integer> {
+
+ private int reloadCount;
+
+ @Before
+ public void reset() {
+ reloadCount = 0;
+ }
+
+ @Test
+ public void basicConstructorNoReload() {
+ final ImmutableExpiringHashMapBuilder<String, Integer> builder = new ImmutableExpiringHashMapBuilder<String, Integer>(this);
+ builder.expiryTimeoutMilliseconds(1000);
+ builder.loadOnFirstAccess(true);
+ builder.reloadOnExpiry(false);
+ builder.reloadWhenExpired(false);
+ builder.id("Greetings");
+
+ final ImmutableExpiringMap<String, Integer> ims = new ImmutableExpiringHashMap<String, Integer>(builder);
+
+ assertEquals("Should not call load until called", 0, reloadCount);
+
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ try {
+ Thread.sleep(101);
+ } catch (final InterruptedException e) {
+ }
+
+ // second call
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ try {
+ Thread.sleep(901);
+ } catch (final InterruptedException e) {
+ }
+
+ // should be gone
+ assertTrue(ims.isEmpty());
+ assertEquals(0, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertFalse("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertNull(ims.get("Yo"));
+ }
+
+ @Test
+ public void basicConstructorWithReloadWhenCalled() {
+ final ImmutableExpiringHashMapBuilder<String, Integer> builder = new ImmutableExpiringHashMapBuilder<String, Integer>(this);
+ builder.expiryTimeoutMilliseconds(1000);
+ builder.loadOnFirstAccess(true);
+ builder.reloadOnExpiry(false);
+ builder.reloadWhenExpired(true);
+ builder.id("Greetings");
+
+ final ImmutableExpiringMap<String, Integer> ims = new ImmutableExpiringHashMap<String, Integer>(builder);
+
+ assertEquals("Should not call load until called", 0, reloadCount);
+
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ try {
+ Thread.sleep(101);
+ } catch (final InterruptedException e) {
+ }
+
+ // second call
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ try {
+ Thread.sleep(901);
+ } catch (final InterruptedException e) {
+ }
+
+ assertEquals("2) Should not call load until called", 1, reloadCount);
+
+ // should be gone
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(2, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ }
+
+ @Test
+ public void basicConstructorWithImmediateLoadAndWhenExpired() {
+ final ImmutableExpiringHashMapBuilder<String, Integer> builder = new ImmutableExpiringHashMapBuilder<String, Integer>(this);
+ builder.expiryTimeoutMilliseconds(1000);
+ builder.loadOnFirstAccess(false);
+ builder.reloadOnExpiry(false);
+ builder.reloadWhenExpired(true);
+ builder.id("Greetings");
+
+ final ImmutableExpiringMap<String, Integer> ims = new ImmutableExpiringHashMap<String, Integer>(builder);
+
+ assertEquals("Should not call load until called", 1, reloadCount);
+
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ try {
+ Thread.sleep(101);
+ } catch (final InterruptedException e) {
+ }
+
+ // second call
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ try {
+ Thread.sleep(901);
+ } catch (final InterruptedException e) {
+ }
+
+ assertEquals("2) Should not call load until called", 1, reloadCount);
+
+ // should be gone
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(2, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ }
+
+ @Test
+ public void basicConstructorWithReloadOnExpiry() {
+ final ImmutableExpiringHashMapBuilder<String, Integer> builder = new ImmutableExpiringHashMapBuilder<String, Integer>(this);
+ builder.expiryTimeoutMilliseconds(1000);
+ builder.loadOnFirstAccess(false);
+ builder.reloadOnExpiry(true);
+ builder.reloadWhenExpired(false);
+ builder.id("Greetings");
+
+ final ImmutableExpiringMap<String, Integer> ims = new ImmutableExpiringHashMap<String, Integer>(builder);
+
+ assertEquals("Should not call load until called", 1, reloadCount);
+
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+
+ // second call
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ try {
+ Thread.sleep(901);
+ } catch (final InterruptedException e) {
+ }
+
+ assertEquals("2) Should not call load until called", 2, reloadCount);
+
+ // should be gone
+ assertFalse(ims.isEmpty());
+ assertEquals(2, ims.size());
+ assertEquals(2, reloadCount);
+ assertFalse("diff key", ims.containsKey("Hi"));
+ assertTrue("Correct key", ims.containsKey("Hello"));
+ assertNull("diff key", ims.get("Hi"));
+ assertEquals(Integer.valueOf(2), ims.get("Yo"));
+ }
+
+ public void load(final MapBuilder<String, Integer> builder) {
+ assertEquals("Greetings", builder.getId());
+ builder.put("Hello", 1);
+ builder.put("Yo", 2);
+ reloadCount++;
+ }
+
+}
Added: trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashSetTest.java
===================================================================
--- trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashSetTest.java (rev 0)
+++ trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashSetTest.java 2010-11-20 22:49:07 UTC (rev 376)
@@ -0,0 +1,206 @@
+/**
+ *
+ */
+package net.objectlab.kit.collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author xhensevalb
+ *
+ */
+public class ImmutableExpiringHashSetTest implements SetLoader<String> {
+
+ private int reloadCount;
+
+ @Before
+ public void reset() {
+ reloadCount = 0;
+ }
+
+ @Test
+ public void basicConstructorNoReload() {
+ final ImmutableExpiringHashSetBuilder<String> builder = new ImmutableExpiringHashSetBuilder<String>(this);
+ builder.expiryTimeoutMilliseconds(1000);
+ builder.loadOnFirstAccess(true);
+ builder.reloadOnExpiry(false);
+ builder.reloadWhenExpired(false);
+ builder.id("Greetings");
+
+ final ImmutableExpiringSet<String> ims = new ImmutableExpiringHashSet<String>(builder);
+
+ assertEquals("Should not call load until called", 0, reloadCount);
+
+ assertFalse(ims.isEmpty());
+ assertEquals(1, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ try {
+ Thread.sleep(101);
+ } catch (final InterruptedException e) {
+ }
+
+ // second call
+ assertFalse(ims.isEmpty());
+ assertEquals(1, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ try {
+ Thread.sleep(901);
+ } catch (final InterruptedException e) {
+ }
+
+ // should be gone
+ assertTrue(ims.isEmpty());
+ assertEquals(0, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.contains("Hi"));
+ assertFalse("Correct key", ims.contains("Hello"));
+ }
+
+ @Test
+ public void basicConstructorWithReloadWhenCalled() {
+ final ImmutableExpiringHashSetBuilder<String> builder = new ImmutableExpiringHashSetBuilder<String>(this);
+ builder.expiryTimeoutMilliseconds(1000);
+ builder.loadOnFirstAccess(true);
+ builder.reloadOnExpiry(false);
+ builder.reloadWhenExpired(true);
+ builder.id("Greetings");
+
+ final ImmutableExpiringSet<String> ims = new ImmutableExpiringHashSet<String>(builder);
+
+ assertEquals("Should not call load until called", 0, reloadCount);
+
+ assertFalse(ims.isEmpty());
+ assertEquals(1, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ try {
+ Thread.sleep(101);
+ } catch (final InterruptedException e) {
+ }
+
+ // second call
+ assertFalse(ims.isEmpty());
+ assertEquals(1, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ try {
+ Thread.sleep(901);
+ } catch (final InterruptedException e) {
+ }
+
+ assertEquals("Should NOT have reloaded until called!", 1, reloadCount);
+
+ // should be gone
+ assertFalse(ims.isEmpty());
+ assertEquals("Now it should have called the reload", 2, reloadCount);
+ assertEquals(1, ims.size());
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ }
+
+ @Test
+ public void basicConstructorWithImmediateLoadAndWhenExpired() {
+ final ImmutableExpiringHashSetBuilder<String> builder = new ImmutableExpiringHashSetBuilder<String>(this);
+ builder.expiryTimeoutMilliseconds(1000);
+ builder.loadOnFirstAccess(false);
+ builder.reloadOnExpiry(false);
+ builder.reloadWhenExpired(true);
+ builder.id("Greetings");
+
+ final ImmutableExpiringSet<String> ims = new ImmutableExpiringHashSet<String>(builder);
+
+ assertEquals("Should call load immediately", 1, reloadCount);
+
+ assertFalse(ims.isEmpty());
+ assertEquals(1, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ try {
+ Thread.sleep(101);
+ } catch (final InterruptedException e) {
+ }
+
+ // second call
+ assertFalse(ims.isEmpty());
+ assertEquals(1, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ try {
+ Thread.sleep(901);
+ } catch (final InterruptedException e) {
+ }
+
+ assertEquals("Should NOT have reloaded until called!", 1, reloadCount);
+
+ // should be gone
+ assertFalse(ims.isEmpty());
+ assertEquals("Now it should have called the reload", 2, reloadCount);
+ assertEquals(1, ims.size());
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ }
+
+ @Test
+ public void basicConstructorWithReloadOnExpiry() {
+ final ImmutableExpiringHashSetBuilder<String> builder = new ImmutableExpiringHashSetBuilder<String>(this);
+ builder.expiryTimeoutMilliseconds(1000);
+ builder.loadOnFirstAccess(false);
+ builder.reloadOnExpiry(true);
+ builder.reloadWhenExpired(false); // but does not matter
+ builder.id("Greetings");
+
+ final ImmutableExpiringSet<String> ims = new ImmutableExpiringHashSet<String>(builder);
+
+ assertEquals("Should have called load immediately", 1, reloadCount);
+
+ assertFalse(ims.isEmpty());
+ assertEquals(1, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ // try {
+ // Thread.sleep(101);
+ // } catch (final InterruptedException e) {
+ // }
+
+ // second call
+ assertFalse(ims.isEmpty());
+ assertEquals(1, ims.size());
+ assertEquals(1, reloadCount);
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ try {
+ Thread.sleep(901);
+ } catch (final InterruptedException e) {
+ }
+
+ assertEquals("Should have reloaded until called!", 2, reloadCount);
+
+ // should be gone
+ assertFalse(ims.isEmpty());
+ assertEquals("Now it should have called the reload", 2, reloadCount);
+ assertEquals(1, ims.size());
+ assertFalse("diff key", ims.contains("Hi"));
+ assertTrue("Correct key", ims.contains("Hello"));
+ }
+
+ public void load(final SetBuilder<String> builder) {
+ assertEquals("Greetings", builder.getId());
+ builder.add("Hello");
+ reloadCount++;
+ }
+
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|