|
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] |