From: <ma...@us...> - 2010-11-05 11:38:55
|
Revision: 374 http://objectlabkit.svn.sourceforge.net/objectlabkit/?rev=374&view=rev Author: marchy Date: 2010-11-05 11:38:49 +0000 (Fri, 05 Nov 2010) Log Message: ----------- Checking in Expiring Map for Benoit - he had problems with SVN Added Paths: ----------- trunk/utils/src/main/java/net/objectlab/kit/collections/ 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/main/java/net/objectlab/kit/collections/MapBuilder.java trunk/utils/src/main/java/net/objectlab/kit/collections/MapLoader.java trunk/utils/src/main/java/net/objectlab/kit/collections/SetBuilder.java trunk/utils/src/main/java/net/objectlab/kit/collections/SetLoader.java Added: trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,85 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * @author xhensevalb + * + */ +public abstract class AbstractImmutabeExpiringCollection { + private long expiryTimeoutMilliseconds; + private boolean loadOnExpiry = true; + private boolean loadOnFirstAccess = true; + private long lastLoadingTime; + private Timer timer; + + protected void setLastLoadingTime(final long lastLoadingTime) { + this.lastLoadingTime = lastLoadingTime; + } + + public void setExpiryTimeoutMilliseconds(final long milliseconds) { + this.expiryTimeoutMilliseconds = milliseconds; + } + + public void setLoadOnExpiry(final boolean loadOnExpiry) { + this.loadOnExpiry = loadOnExpiry; + } + + public void setLoadOnFirstAccess(final boolean loadOnFirstAccess) { + this.loadOnFirstAccess = loadOnFirstAccess; + } + + protected boolean hasExpired() { + return System.currentTimeMillis() - lastLoadingTime > expiryTimeoutMilliseconds; + } + + public void start() { + if (loadOnExpiry) { + // start timer + timer = new Timer(); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + load(); + } + }, 0, expiryTimeoutMilliseconds); + } + if (!loadOnFirstAccess) { + load(); + } + } + + protected void validateOnAccess() { + if (hasExpired()) { + load(); + } + } + + private void load() { + doLoad(); + lastLoadingTime = System.currentTimeMillis(); + } + + protected abstract void doLoad(); + + protected long getExpiryTimeoutMilliseconds() { + return expiryTimeoutMilliseconds; + } + + protected boolean isLoadOnExpiry() { + return loadOnExpiry; + } + + protected boolean isLoadOnFirstAccess() { + return loadOnFirstAccess; + } + + protected long getLastLoadingTime() { + return lastLoadingTime; + } + +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/AbstractImmutabeExpiringCollection.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,18 @@ +/** + * + */ +package net.objectlab.kit.collections; + +/** + * @author xhensevalb + * + */ +public interface ImmutableExpiringCollection { + void setExpiryTimeoutMilliseconds(long milliseconds); + + void setLoadOnFirstAccess(boolean loadOnFirstAccess); + + void setLoadOnExpiry(boolean loadOnExpiry); + + void start(); +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollection.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,35 @@ +package net.objectlab.kit.collections; + +public class ImmutableExpiringCollectionBuilder { + private long expiryTimeoutMilliseconds; + private boolean loadOnExpiry = true; + private boolean loadOnFirstAccess = true; + + public ImmutableExpiringCollectionBuilder expiryTimeoutMilliseconds(final long expiryTimeourMilliseconds) { + this.expiryTimeoutMilliseconds = expiryTimeourMilliseconds; + return this; + } + + public ImmutableExpiringCollectionBuilder loadOnExpiry(final boolean loadOnExpiry) { + this.loadOnExpiry = loadOnExpiry; + return this; + } + + public ImmutableExpiringCollectionBuilder loadOnFirstAccess(final boolean loadOnFirstAccess) { + this.loadOnFirstAccess = loadOnFirstAccess; + return this; + } + + final long getExpiryTimeoutMilliseconds() { + return expiryTimeoutMilliseconds; + } + + final boolean isLoadOnExpiry() { + return loadOnExpiry; + } + + final boolean isLoadOnFirstAccess() { + return loadOnFirstAccess; + } + +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringCollectionBuilder.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,89 @@ +/** + * + */ +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(); + setExpiryTimeoutMilliseconds(builder.getExpiryTimeoutMilliseconds()); + setLoadOnExpiry(builder.isLoadOnExpiry()); + setLoadOnFirstAccess(builder.isLoadOnFirstAccess()); + start(); + } + + @Override + protected void doLoad() { + final MapBuilder<K, V> builder = new MapBuilder<K, V>(); + 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(); + } +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMap.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMapBuilder.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMapBuilder.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMapBuilder.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,14 @@ +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; + } +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashMapBuilder.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,93 @@ +/** + * + */ +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(); + setExpiryTimeoutMilliseconds(builder.getExpiryTimeoutMilliseconds()); + setLoadOnExpiry(builder.isLoadOnExpiry()); + setLoadOnFirstAccess(builder.isLoadOnFirstAccess()); + start(); + } + + @Override + protected void doLoad() { + final SetBuilder<T> builder = new SetBuilder<T>(); + 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); + } +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSet.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,14 @@ +package net.objectlab.kit.collections; + +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; + } +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringHashSetBuilder.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringMap.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringMap.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringMap.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,13 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.Map; + +/** + * @author xhensevalb + * + */ +public interface ImmutableExpiringMap<K, V> extends ImmutableExpiringCollection, Map<K, V> { +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringMap.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringSet.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringSet.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringSet.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,13 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.Set; + +/** + * @author xhensevalb + * + */ +public interface ImmutableExpiringSet<T> extends ImmutableExpiringCollection, Set<T> { +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/ImmutableExpiringSet.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/MapBuilder.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/MapBuilder.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/MapBuilder.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,68 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import net.objectlab.kit.util.Pair; + +/** + * Inspired by the Google Collection builder. + * + * @author Benoit Xhenseval + * + */ +public class MapBuilder<K, V> { + final List<Pair<K, V>> entries = new ArrayList<Pair<K, V>>(); + + public MapBuilder() { + } + + /** + * Associates {@code key} with {@code value} in the built map. + */ + public MapBuilder<K, V> put(final K key, final V value) { + entries.add(new Pair<K, V>(key, value)); + return this; + } + + /** + * Associates all of the given map's keys and values in the built map. + * + * @throws NullPointerException if any key or value in {@code map} is null + */ + public MapBuilder<K, V> putAll(final Map<? extends K, ? extends V> map) { + for (final Entry<? extends K, ? extends V> entry : map.entrySet()) { + put(entry.getKey(), entry.getValue()); + } + return this; + } + + /** + * Returns a newly-created immutable map. + * + * @throws IllegalArgumentException if duplicate keys were added + */ + public Map<K, V> build() { + return fromEntryList(entries); + } + + private static <K, V> Map<K, V> fromEntryList(final List<Pair<K, V>> entries) { + final int size = entries.size(); + switch (size) { + case 0: + return new HashMap<K, V>(); + default: + final Map<K, V> m = new HashMap<K, V>(); + for (final Pair<K, V> entry : entries) { + m.put(entry.getElement1(), entry.getElement2()); + } + return m; + } + } +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/MapBuilder.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/MapLoader.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/MapLoader.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/MapLoader.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,12 @@ +/** + * + */ +package net.objectlab.kit.collections; + +/** + * Whenever the map needs to be reloaded, it will call the loader. + * @author Benoit Xhenseval + */ +public interface MapLoader<K, V> { + void load(MapBuilder<K, V> builder); +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/MapLoader.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/SetBuilder.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/SetBuilder.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/SetBuilder.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,23 @@ +/** + * + */ +package net.objectlab.kit.collections; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author xhensevalb + * + */ +public class SetBuilder<T> { + private final Set<T> set = new HashSet<T>(); + + public void add(final T t) { + set.add(t); + } + + public Set<T> build() { + return new HashSet<T>(set); + } +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/SetBuilder.java ___________________________________________________________________ Added: svn:executable + * Added: trunk/utils/src/main/java/net/objectlab/kit/collections/SetLoader.java =================================================================== --- trunk/utils/src/main/java/net/objectlab/kit/collections/SetLoader.java (rev 0) +++ trunk/utils/src/main/java/net/objectlab/kit/collections/SetLoader.java 2010-11-05 11:38:49 UTC (rev 374) @@ -0,0 +1,12 @@ +/** + * + */ +package net.objectlab.kit.collections; + +/** + * Whenever the set needs to be reloaded, it will call the loader. + * + */ +public interface SetLoader<T> { + void load(SetBuilder<T> builder); +} Property changes on: trunk/utils/src/main/java/net/objectlab/kit/collections/SetLoader.java ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |