package org.radargun.service;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import org.infinispan.AdvancedCache;
import org.infinispan.commons.util.CloseableIterable;
import org.infinispan.container.entries.CacheEntry;
import org.infinispan.iteration.EntryIterable;
/**
* Infinispan and JDG are only partially binary compatible
*
* @author Radim Vansa <rvansa@redhat.com>
*/
public class JDG63Iterable extends InfinispanIterable {
public JDG63Iterable(InfinispanEmbeddedService service) {
super(service);
}
@Override
public <K, V> CloseableIterator<Map.Entry<K, V>> getIterator(String cacheName, Filter<K, V> filter) {
if (trace) log.tracef("Retrieving iterator for cache %s using filter %s", cacheName, filter);
AdvancedCache<K, V> cache = (AdvancedCache<K, V>) service.getCache(cacheName).getAdvancedCache();
EntryIterable<K, V> iterable = cache.filterEntries(wrap(filter));
return new CloseableIteratorImpl(iterable, new EntryOutConverter());
}
@Override
public <K, V, T> CloseableIterator<T> getIterator(String cacheName, Filter<K, V> filter, Converter<K, V, T> converter) {
if (trace)
log.tracef("Retrieving iterator for cache %s using filter %s and converter %s", cacheName, filter, converter);
AdvancedCache<K, V> cache = (AdvancedCache<K, V>) service.getCache(cacheName).getAdvancedCache();
EntryIterable<K, V> iterable = cache.filterEntries(wrap(filter));
return new CloseableIteratorImpl(iterable.converter(wrap(converter)), new ValueOutConverter());
}
private interface OutConverter<T> {
T convert(CacheEntry entry);
}
private static class EntryOutConverter implements OutConverter<Map.Entry<Object, Object>> {
@Override
public Map.Entry<Object, Object> convert(CacheEntry entry) {
return entry;
}
}
private static class ValueOutConverter implements OutConverter<Object> {
@Override
public Object convert(CacheEntry entry) {
return entry.getValue();
}
}
private static class CloseableIteratorImpl<T> implements CloseableIterator<T> {
private final CloseableIterable<CacheEntry> iterable;
private final Iterator<CacheEntry> iterator;
private final OutConverter<T> outConverter;
public CloseableIteratorImpl(CloseableIterable<CacheEntry> iterable, OutConverter<T> outConverter) {
this.iterable = iterable;
this.outConverter = outConverter;
this.iterator = iterable.iterator();
}
@Override
public void close() throws IOException {
iterable.close();
}
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public T next() {
return outConverter.convert(iterator.next());
}
@Override
public void remove() {
iterator.remove();
}
}
}