/**
*
*/
package net.objectlab.kit.collections;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* @author Benoit Xhenseval
*
*/
public class ReadOnlyExpiringHashSet<T> extends AbstractReadOnlyExpiringCollection implements ReadOnlyExpiringSet<T> {
private final SetLoader<T> loader;
private Set<T> delegate = new HashSet<>();
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());
setTimeProvider(builder.getTimeProvider());
start();
}
@Override
protected void doLoad() {
final DefaultSetBuilder<T> builder = new DefaultSetBuilder<>(getId());
loader.load(builder);
delegate = builder.build();
}
@Override
public boolean add(final T e) {
validateOnAccess();
return delegate.add(e);
}
@Override
public boolean addAll(final Collection<? extends T> c) {
throw new UnsupportedOperationException("Collection is immutable");
}
@Override
public void clear() {
throw new UnsupportedOperationException("Collection is immutable");
}
@Override
public boolean contains(final Object o) {
validateOnAccess();
return delegate.contains(o);
}
@Override
public boolean containsAll(final Collection<?> c) {
validateOnAccess();
return delegate.containsAll(c);
}
@Override
public boolean isEmpty() {
validateOnAccess();
return delegate.isEmpty();
}
@Override
public Iterator<T> iterator() {
validateOnAccess();
return delegate.iterator();
}
@Override
public boolean remove(final Object o) {
throw new UnsupportedOperationException("Collection is immutable");
}
@Override
public boolean removeAll(final Collection<?> c) {
throw new UnsupportedOperationException("Collection is immutable");
}
@Override
public boolean retainAll(final Collection<?> c) {
throw new UnsupportedOperationException("Collection is immutable");
}
@Override
public int size() {
validateOnAccess();
return delegate.size();
}
@Override
public Object[] toArray() {
validateOnAccess();
return delegate.toArray();
}
@Override
public <T> T[] toArray(final T[] a) {
validateOnAccess();
return delegate.toArray(a);
}
@Override
protected void doClear() {
delegate.clear();
}
@Override
public void reload() {
doLoad();
}
}