package org.infinispan.util;
import java.util.Iterator;
import org.infinispan.Cache;
import org.infinispan.container.DataContainer;
import org.infinispan.container.entries.CacheEntry;
import org.infinispan.container.entries.InternalCacheEntry;
/**
* This is an iterator that will iterate upon the data container. A cache is also provided to be used
* when the remove method on the iterator is invoked. Note that this means it will take part of any
* ongoing transaction if there is one.
*/
public class DataContainerRemoveIterator<K, V> implements Iterator<CacheEntry<K, V>> {
private final Cache<K, V> cache;
private final Iterator<InternalCacheEntry<K, V>> dataContainerIterator;
private K previousKey;
public DataContainerRemoveIterator(Cache<K, V> cache) {
this(cache, cache.getAdvancedCache().getDataContainer());
}
public DataContainerRemoveIterator(Cache<K, V> cache, DataContainer<K, V> dataContainer) {
if (cache == null || dataContainer == null) {
throw new NullPointerException();
}
this.cache = cache;
this.dataContainerIterator = dataContainer.iterator();
}
@Override
public boolean hasNext() {
return dataContainerIterator.hasNext();
}
@Override
public CacheEntry<K, V> next() {
CacheEntry<K, V> entry = dataContainerIterator.next();
previousKey = entry.getKey();
return entry;
}
@Override
public void remove() {
if (previousKey == null) {
throw new IllegalStateException();
}
cache.remove(previousKey);
previousKey = null;
}
}