From: <be...@us...> - 2010-11-21 15:45:47
|
Revision: 379 http://objectlabkit.svn.sourceforge.net/objectlabkit/?rev=379&view=rev Author: benoitx Date: 2010-11-21 15:45:38 +0000 (Sun, 21 Nov 2010) Log Message: ----------- Thanks to Tom Folga for the following suggestions: 1) Should be called ReadOnly not Immutable... 2) Externalize the current time 3) some multithreading suggestions. 4) added stop() Modified Paths: -------------- trunk/utils/pom.xml Added Paths: ----------- trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractReadOnlyExpiringCollection.java trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringCollection.java trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringCollectionBuilder.java trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMap.java trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMapBuilder.java trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashSet.java trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashSetBuilder.java trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringMap.java trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringSet.java trunk/utils/src/main/java/net/objectlab/kit/collections/SystemTimeProvider.java trunk/utils/src/main/java/net/objectlab/kit/collections/TimeProvider.java trunk/utils/src/test/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMapTest.java trunk/utils/src/test/java/net/objectlab/kit/collections/ReadOnlyExpiringHashSetTest.java Removed 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/ImmutableExpiringHashMapBuilder.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/ImmutableExpiringMap.java trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringSet.java 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/pom.xml =================================================================== --- trunk/utils/pom.xml 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/pom.xml 2010-11-21 15:45:38 UTC (rev 379) @@ -5,7 +5,7 @@ <groupId>net.objectlab.kit</groupId> <artifactId>objectlab-utils</artifactId> - <version>1.0-cs</version> + <version>1.0-SNAPSHOT</version> <packaging>bundle</packaging> <name>ObjectLab Kit - General Utilities</name> Deleted: trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,104 +0,0 @@ -/** - * - */ -package net.objectlab.kit.collections; - -import java.util.Timer; -import java.util.TimerTask; - -/** - * @author xhensevalb - */ -public abstract class AbstractImmutabeExpiringCollection { - private long expiryTimeoutMilliseconds; - 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; - } - - public void setExpiryTimeoutMilliseconds(final long milliseconds) { - this.expiryTimeoutMilliseconds = milliseconds; - } - - 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 (reloadOnExpiry) { - // start timer - timer = new Timer(); - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - load(); - } - }, 0, expiryTimeoutMilliseconds); - } - if (!loadOnFirstAccess) { - load(); - } - } - - protected void validateOnAccess() { - if (hasExpired()) { - if (reloadWhenExpired || loadOnFirstAccess && lastLoadingTime == 0) { - load(); - } else { - doClear(); - } - } - } - - private void load() { - doLoad(); - lastLoadingTime = System.currentTimeMillis(); - } - - protected abstract void doLoad(); - - protected abstract void doClear(); - - protected long getExpiryTimeoutMilliseconds() { - return expiryTimeoutMilliseconds; - } - - protected boolean isReloadOnExpiry() { - return reloadOnExpiry; - } - - protected boolean isLoadOnFirstAccess() { - return loadOnFirstAccess; - } - - protected long getLastLoadingTime() { - return lastLoadingTime; - } - -} Copied: trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractReadOnlyExpiringCollection.java (from rev 376, trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java) =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractReadOnlyExpiringCollection.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractReadOnlyExpiringCollection.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,121 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * @author xhensevalb + */ +public abstract class AbstractReadOnlyExpiringCollection { + private TimeProvider timeProvider; + private long expiryTimeoutMilliseconds; + 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; + } + + protected void setTimeProvider(final TimeProvider timeProvider) { + this.timeProvider = timeProvider != null ? timeProvider : new SystemTimeProvider(); + } + + public String getId() { + return id; + } + + public void setExpiryTimeoutMilliseconds(final long milliseconds) { + this.expiryTimeoutMilliseconds = milliseconds; + } + + 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 timeProvider.getCurrentTimeMillis() - lastLoadingTime > expiryTimeoutMilliseconds; + } + + public void start() { + if (reloadOnExpiry) { + // start timer + timer = new Timer(); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + load(); + } + }, 0, expiryTimeoutMilliseconds); + } + if (!loadOnFirstAccess) { + load(); + } + } + + public void stop() { + if (timer != null) { + timer.cancel(); + timer.purge(); + timer = null; + } + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + stop(); + } + + protected void validateOnAccess() { + if (hasExpired()) { + if (reloadWhenExpired || loadOnFirstAccess && lastLoadingTime == 0) { + load(); + } else { + doClear(); + } + } + } + + private synchronized void load() { + if (hasExpired()) { + doLoad(); + lastLoadingTime = timeProvider.getCurrentTimeMillis(); + } + } + + protected abstract void doLoad(); + + protected abstract void doClear(); + + protected long getExpiryTimeoutMilliseconds() { + return expiryTimeoutMilliseconds; + } + + protected boolean isReloadOnExpiry() { + return reloadOnExpiry; + } + + protected boolean isLoadOnFirstAccess() { + return loadOnFirstAccess; + } + + protected long getLastLoadingTime() { + return lastLoadingTime; + } + +} Deleted: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,22 +0,0 @@ -/** - * - */ -package net.objectlab.kit.collections; - -/** - * @author xhensevalb - * - */ -public interface ImmutableExpiringCollection { - void setExpiryTimeoutMilliseconds(long milliseconds); - - void setLoadOnFirstAccess(boolean loadOnFirstAccess); - - void setReloadOnExpiry(boolean loadOnExpiry); - - void setReloadWhenExpired(boolean loadWhenExpired); - - void start(); - - void reload(); -} Deleted: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,74 +0,0 @@ -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 = -1; - private boolean reloadOnExpiry = true; - private boolean reloadWhenExpired = true; - private boolean loadOnFirstAccess = true; - private String id; - - public ImmutableExpiringCollectionBuilder id(final String id) { - this.id = id; - return this; - } - - 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; - } - - final long getExpiryTimeoutMilliseconds() { - return expiryTimeoutMilliseconds; - } - - final boolean isReloadOnExpiry() { - return reloadOnExpiry; - } - - final boolean isReloadWhenExpired() { - return reloadWhenExpired; - } - - final boolean isLoadOnFirstAccess() { - return loadOnFirstAccess; - } - - final String getId() { - return id; - } -} Deleted: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,100 +0,0 @@ -/** - * - */ -package net.objectlab.kit.collections; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -/** - * @author xhensevalb - * - */ -public class ImmutableExpiringHashMap<K, V> extends AbstractImmutabeExpiringCollection implements ImmutableExpiringMap<K, V> { - private Map<K, V> delegate = new HashMap<K, V>(); - private final MapLoader<K, V> loader; - - public ImmutableExpiringHashMap(final ImmutableExpiringHashMapBuilder<K, V> builder) { - loader = builder.getLoader(); - setId(builder.getId()); - setExpiryTimeoutMilliseconds(builder.getExpiryTimeoutMilliseconds()); - setReloadOnExpiry(builder.isReloadOnExpiry()); - setLoadOnFirstAccess(builder.isLoadOnFirstAccess()); - setReloadWhenExpired(builder.isReloadWhenExpired()); - start(); - } - - @Override - protected void doLoad() { - final DefaultMapBuilder<K, V> builder = new DefaultMapBuilder<K, V>(getId()); - loader.load(builder); - delegate = builder.build(); - } - - public void clear() { - throw new IllegalAccessError("Collection is immutable"); - } - - public boolean containsKey(final Object key) { - validateOnAccess(); - return delegate.containsKey(key); - } - - public boolean containsValue(final Object value) { - validateOnAccess(); - return delegate.containsValue(value); - } - - public Set<java.util.Map.Entry<K, V>> entrySet() { - validateOnAccess(); - return delegate.entrySet(); - } - - public V get(final Object key) { - validateOnAccess(); - return delegate.get(key); - } - - public boolean isEmpty() { - validateOnAccess(); - return delegate.isEmpty(); - } - - public Set<K> keySet() { - validateOnAccess(); - return delegate.keySet(); - } - - public V put(final K key, final V value) { - throw new IllegalAccessError("Collection is immutable"); - } - - public void putAll(final Map<? extends K, ? extends V> m) { - throw new IllegalAccessError("Collection is immutable"); - } - - public V remove(final Object key) { - throw new IllegalAccessError("Collection is immutable"); - } - - public int size() { - validateOnAccess(); - return delegate.size(); - } - - public Collection<V> values() { - validateOnAccess(); - return delegate.values(); - } - - @Override - protected void doClear() { - delegate.clear(); - } - - public void reload() { - doLoad(); - } -} Deleted: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMapBuilder.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMapBuilder.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMapBuilder.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,14 +0,0 @@ -package net.objectlab.kit.collections; - -public class ImmutableExpiringHashMapBuilder<K, V> extends ImmutableExpiringCollectionBuilder { - private final MapLoader<K, V> loader; - - public ImmutableExpiringHashMapBuilder(final MapLoader<K, V> loader) { - super(); - this.loader = loader; - } - - final MapLoader<K, V> getLoader() { - return loader; - } -} Deleted: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,104 +0,0 @@ -/** - * - */ -package net.objectlab.kit.collections; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -/** - * @author xhensevalb - * - */ -public class ImmutableExpiringHashSet<T> extends AbstractImmutabeExpiringCollection implements ImmutableExpiringSet<T> { - private final SetLoader<T> loader; - private Set<T> delegate = new HashSet<T>(); - - public ImmutableExpiringHashSet(final ImmutableExpiringHashSetBuilder<T> builder) { - this.loader = builder.getLoader(); - setId(builder.getId()); - setExpiryTimeoutMilliseconds(builder.getExpiryTimeoutMilliseconds()); - setReloadOnExpiry(builder.isReloadOnExpiry()); - setLoadOnFirstAccess(builder.isLoadOnFirstAccess()); - setReloadWhenExpired(builder.isReloadWhenExpired()); - start(); - } - - @Override - protected void doLoad() { - final DefaultSetBuilder<T> builder = new DefaultSetBuilder<T>(getId()); - loader.load(builder); - delegate = builder.build(); - } - - public boolean add(final T e) { - validateOnAccess(); - return delegate.add(e); - } - - public boolean addAll(final Collection<? extends T> c) { - throw new IllegalAccessError("Collection is immutable"); - } - - public void clear() { - throw new IllegalAccessError("Collection is immutable"); - } - - public boolean contains(final Object o) { - validateOnAccess(); - return delegate.contains(o); - } - - public boolean containsAll(final Collection<?> c) { - validateOnAccess(); - return delegate.containsAll(c); - } - - public boolean isEmpty() { - validateOnAccess(); - return delegate.isEmpty(); - } - - public Iterator<T> iterator() { - validateOnAccess(); - return delegate.iterator(); - } - - public boolean remove(final Object o) { - throw new IllegalAccessError("Collection is immutable"); - } - - public boolean removeAll(final Collection<?> c) { - throw new IllegalAccessError("Collection is immutable"); - } - - public boolean retainAll(final Collection<?> c) { - throw new IllegalAccessError("Collection is immutable"); - } - - public int size() { - validateOnAccess(); - return delegate.size(); - } - - public Object[] toArray() { - validateOnAccess(); - return delegate.toArray(); - } - - public <T> T[] toArray(final T[] a) { - validateOnAccess(); - return delegate.toArray(a); - } - - @Override - protected void doClear() { - delegate.clear(); - } - - public void reload() { - doLoad(); - } -} Deleted: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,21 +0,0 @@ -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; - - public ImmutableExpiringHashSetBuilder(final SetLoader<T> loader) { - super(); - this.loader = loader; - } - - final SetLoader<T> getLoader() { - return loader; - } -} Deleted: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringMap.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringMap.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringMap.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,13 +0,0 @@ -/** - * - */ -package net.objectlab.kit.collections; - -import java.util.Map; - -/** - * @author xhensevalb - * - */ -public interface ImmutableExpiringMap<K, V> extends ImmutableExpiringCollection, Map<K, V> { -} Deleted: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringSet.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringSet.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringSet.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,13 +0,0 @@ -/** - * - */ -package net.objectlab.kit.collections; - -import java.util.Set; - -/** - * @author xhensevalb - * - */ -public interface ImmutableExpiringSet<T> extends ImmutableExpiringCollection, Set<T> { -} Copied: trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringCollection.java (from rev 377, trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java) =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringCollection.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringCollection.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,23 @@ +/** + * + */ +package net.objectlab.kit.collections; + +/** + * @author xhensevalb + * + */ +public interface ReadOnlyExpiringCollection { + // void setExpiryTimeoutMilliseconds(long milliseconds); + + // void setLoadOnFirstAccess(boolean loadOnFirstAccess); + + // void setReloadOnExpiry(boolean loadOnExpiry); + + // void setReloadWhenExpired(boolean loadWhenExpired); + + // void start(); + void stop(); + + void reload(); +} Copied: trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringCollectionBuilder.java (from rev 376, trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java) =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringCollectionBuilder.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringCollectionBuilder.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,84 @@ +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 ReadOnlyExpiringCollectionBuilder { + private long expiryTimeoutMilliseconds = -1; + private boolean reloadOnExpiry = true; + private boolean reloadWhenExpired = true; + private boolean loadOnFirstAccess = true; + private String id; + private TimeProvider timeProvider; + + public ReadOnlyExpiringCollectionBuilder timeProvider(final TimeProvider timeProvider) { + this.timeProvider = timeProvider; + return this; + } + + public ReadOnlyExpiringCollectionBuilder id(final String id) { + this.id = id; + return this; + } + + public ReadOnlyExpiringCollectionBuilder expiryTimeout(final PeriodBuilder expiryTimeout) { + assert expiryTimeout != null; + if (expiryTimeout != null) { + this.expiryTimeoutMilliseconds = expiryTimeout.calculateMilliseconds(); + } + return this; + } + + public ReadOnlyExpiringCollectionBuilder expiryTimeoutMilliseconds(final long expiryTimeoutMilliseconds) { + this.expiryTimeoutMilliseconds = expiryTimeoutMilliseconds; + return this; + } + + public ReadOnlyExpiringCollectionBuilder reloadWhenExpired(final boolean reloadWhenExpired) { + this.reloadWhenExpired = reloadWhenExpired; + return this; + } + + public ReadOnlyExpiringCollectionBuilder reloadOnExpiry(final boolean loadOnExpiry) { + this.reloadOnExpiry = loadOnExpiry; + return this; + } + + public ReadOnlyExpiringCollectionBuilder loadOnFirstAccess(final boolean loadOnFirstAccess) { + this.loadOnFirstAccess = loadOnFirstAccess; + return this; + } + + final long getExpiryTimeoutMilliseconds() { + return expiryTimeoutMilliseconds; + } + + final boolean isReloadOnExpiry() { + return reloadOnExpiry; + } + + final boolean isReloadWhenExpired() { + return reloadWhenExpired; + } + + final boolean isLoadOnFirstAccess() { + return loadOnFirstAccess; + } + + final String getId() { + return id; + } + + final TimeProvider getTimeProvider() { + return timeProvider; + } +} Copied: trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMap.java (from rev 377, trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java) =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMap.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMap.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,100 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * @author xhensevalb + * + */ +public class ReadOnlyExpiringHashMap<K, V> extends AbstractReadOnlyExpiringCollection implements ReadOnlyExpiringMap<K, V> { + private Map<K, V> delegate = new HashMap<K, V>(); + private final MapLoader<K, V> loader; + + public ReadOnlyExpiringHashMap(final ReadOnlyExpiringHashMapBuilder<K, V> builder) { + loader = builder.getLoader(); + setId(builder.getId()); + setExpiryTimeoutMilliseconds(builder.getExpiryTimeoutMilliseconds()); + setReloadOnExpiry(builder.isReloadOnExpiry()); + setLoadOnFirstAccess(builder.isLoadOnFirstAccess()); + setReloadWhenExpired(builder.isReloadWhenExpired()); + start(); + } + + @Override + protected void doLoad() { + final DefaultMapBuilder<K, V> builder = new DefaultMapBuilder<K, V>(getId()); + loader.load(builder); + delegate = builder.build(); + } + + public void clear() { + throw new UnsupportedOperationException("Collection is immutable"); + } + + public boolean containsKey(final Object key) { + validateOnAccess(); + return delegate.containsKey(key); + } + + public boolean containsValue(final Object value) { + validateOnAccess(); + return delegate.containsValue(value); + } + + public Set<java.util.Map.Entry<K, V>> entrySet() { + validateOnAccess(); + return delegate.entrySet(); + } + + public V get(final Object key) { + validateOnAccess(); + return delegate.get(key); + } + + public boolean isEmpty() { + validateOnAccess(); + return delegate.isEmpty(); + } + + public Set<K> keySet() { + validateOnAccess(); + return delegate.keySet(); + } + + public V put(final K key, final V value) { + throw new UnsupportedOperationException("Collection is immutable"); + } + + public void putAll(final Map<? extends K, ? extends V> m) { + throw new UnsupportedOperationException("Collection is immutable"); + } + + public V remove(final Object key) { + throw new UnsupportedOperationException("Collection is immutable"); + } + + public int size() { + validateOnAccess(); + return delegate.size(); + } + + public Collection<V> values() { + validateOnAccess(); + return delegate.values(); + } + + @Override + protected void doClear() { + delegate.clear(); + } + + public void reload() { + doLoad(); + } +} Copied: trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMapBuilder.java (from rev 375, trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMapBuilder.java) =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMapBuilder.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMapBuilder.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,14 @@ +package net.objectlab.kit.collections; + +public class ReadOnlyExpiringHashMapBuilder<K, V> extends ReadOnlyExpiringCollectionBuilder { + private final MapLoader<K, V> loader; + + public ReadOnlyExpiringHashMapBuilder(final MapLoader<K, V> loader) { + super(); + this.loader = loader; + } + + final MapLoader<K, V> getLoader() { + return loader; + } +} Copied: trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashSet.java (from rev 377, trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java) =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashSet.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashSet.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,104 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +/** + * @author xhensevalb + * + */ +public class ReadOnlyExpiringHashSet<T> extends AbstractReadOnlyExpiringCollection implements ReadOnlyExpiringSet<T> { + private final SetLoader<T> loader; + private Set<T> delegate = new HashSet<T>(); + + public ReadOnlyExpiringHashSet(final ReadOnlyExpiringHashSetBuilder<T> builder) { + this.loader = builder.getLoader(); + setId(builder.getId()); + setExpiryTimeoutMilliseconds(builder.getExpiryTimeoutMilliseconds()); + setReloadOnExpiry(builder.isReloadOnExpiry()); + setLoadOnFirstAccess(builder.isLoadOnFirstAccess()); + setReloadWhenExpired(builder.isReloadWhenExpired()); + start(); + } + + @Override + protected void doLoad() { + final DefaultSetBuilder<T> builder = new DefaultSetBuilder<T>(getId()); + loader.load(builder); + delegate = builder.build(); + } + + public boolean add(final T e) { + validateOnAccess(); + return delegate.add(e); + } + + public boolean addAll(final Collection<? extends T> c) { + throw new UnsupportedOperationException("Collection is immutable"); + } + + public void clear() { + throw new UnsupportedOperationException("Collection is immutable"); + } + + public boolean contains(final Object o) { + validateOnAccess(); + return delegate.contains(o); + } + + public boolean containsAll(final Collection<?> c) { + validateOnAccess(); + return delegate.containsAll(c); + } + + public boolean isEmpty() { + validateOnAccess(); + return delegate.isEmpty(); + } + + public Iterator<T> iterator() { + validateOnAccess(); + return delegate.iterator(); + } + + public boolean remove(final Object o) { + throw new UnsupportedOperationException("Collection is immutable"); + } + + public boolean removeAll(final Collection<?> c) { + throw new UnsupportedOperationException("Collection is immutable"); + } + + public boolean retainAll(final Collection<?> c) { + throw new UnsupportedOperationException("Collection is immutable"); + } + + public int size() { + validateOnAccess(); + return delegate.size(); + } + + public Object[] toArray() { + validateOnAccess(); + return delegate.toArray(); + } + + public <T> T[] toArray(final T[] a) { + validateOnAccess(); + return delegate.toArray(a); + } + + @Override + protected void doClear() { + delegate.clear(); + } + + public void reload() { + doLoad(); + } +} Copied: trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashSetBuilder.java (from rev 376, trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java) =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashSetBuilder.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringHashSetBuilder.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,21 @@ +package net.objectlab.kit.collections; + +/** + * The builder in charge of providing the parameters for the Set. + * + * @author xhensevalb + * + * @param <T> + */ +public class ReadOnlyExpiringHashSetBuilder<T> extends ReadOnlyExpiringCollectionBuilder { + private final SetLoader<T> loader; + + public ReadOnlyExpiringHashSetBuilder(final SetLoader<T> loader) { + super(); + this.loader = loader; + } + + final SetLoader<T> getLoader() { + return loader; + } +} Copied: trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringMap.java (from rev 375, trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringMap.java) =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringMap.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringMap.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,13 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.Map; + +/** + * @author xhensevalb + * + */ +public interface ReadOnlyExpiringMap<K, V> extends ReadOnlyExpiringCollection, Map<K, V> { +} Copied: trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringSet.java (from rev 375, trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringSet.java) =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringSet.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ReadOnlyExpiringSet.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,13 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.Set; + +/** + * @author xhensevalb + * + */ +public interface ReadOnlyExpiringSet<T> extends ReadOnlyExpiringCollection, Set<T> { +} Added: trunk/utils/src/main/java/net/objectlab/kit/collections/SystemTimeProvider.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/SystemTimeProvider.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/SystemTimeProvider.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,19 @@ +/** + * + */ +package net.objectlab.kit.collections; + +/** + * @author xhensevalb + * + */ +public class SystemTimeProvider implements TimeProvider { + + /* (non-Javadoc) + * @see net.objectlab.kit.collections.TimeProvider#getCurrentMillis() + */ + public long getCurrentTimeMillis() { + return System.currentTimeMillis(); + } + +} Added: trunk/utils/src/main/java/net/objectlab/kit/collections/TimeProvider.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/TimeProvider.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/TimeProvider.java 2010-11-21 15:45:38 UTC (rev 379) @@ -0,0 +1,12 @@ +/** + * + */ +package net.objectlab.kit.collections; + +/** + * @author xhensevalb + * + */ +public interface TimeProvider { + long getCurrentTimeMillis(); +} Deleted: trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashMapTest.java =================================================================== --- trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashMapTest.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashMapTest.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,228 +0,0 @@ -/** - * - */ -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++; - } - -} Deleted: trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashSetTest.java =================================================================== --- trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashSetTest.java 2010-11-21 12:02:45 UTC (rev 378) +++ trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashSetTest.java 2010-11-21 15:45:38 UTC (rev 379) @@ -1,205 +0,0 @@ -/** - * - */ -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++; - } -} Copied: trunk/utils/src/test/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMapTest.java (from rev 376, trunk/utils/src/test/java/net/objectlab/kit/collections/ImmutableExpiringHashMapTest.java) =================================================================== --- trunk/utils/src/test/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMapTest.java (rev 0) +++ trunk/utils/src/test/java/net/objectlab/kit/collections/ReadOnlyExpiringHashMapTest.java 2010-11-21 15:45:38 UTC (rev 379) @@ -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 ReadOnlyExpiringHashMapTest implements MapLoader<String, Integer> { + + private int reloadCount; + + @Before + public void reset() { + reloadCount = 0; + } + + @Test + public void basicConstructorNoReload() { + final ReadOnlyExpiringHashMapBuilder<String, Integer> builder = new ReadOnlyExpiringHashMapBuilder<String, Integer>(this); + builder.expiryTimeoutMilliseconds(1000); + builder.loadOnFirstAccess(true); + builder.reloadOnExpiry(false); + builder.reloadWhenExpired(false); + builder.id("Greetings"); + + final ReadOnlyExpiringMap<String, Integer> ims = new ReadOnlyExpiringHashMap<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 ReadOnlyExpiringHashMapBuilder<String, Integer> builder = new ReadOnlyExpiringHashMapBuilder<String, Integer>(this); + builder.expiryTimeoutMilliseconds(1000); + builder.loadOnFirstAccess(true); + builder.reloadOnExpiry(false); + builder.reloadWhenExpired(true); + builder.id("Greetings"); + + final ReadOnlyExpiringMap<String, Integer> ims = new ReadOnlyExpiringHashMap<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 ReadOnlyExpiringHashMapBuilder<String, Integer> builder = new ReadOnlyExpiringHashMapBuilder<String, Integer>(this); + builder.expiryTimeoutMilliseconds(1000); + builder.loadOnFirstAccess(false); + builder.reloadOnExpiry(false); + builder.reloadWhenExpired(true); + builder.id("Greetings"); + + final ReadOnlyExpiringMap<String, Integer> ims = new ReadOnlyExpiringHashMap<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")); + assert... [truncated message content] |