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