package org.infinispan.persistence.remote.upgrade; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.infinispan.client.hotrod.impl.iteration.RemoteCloseableIterator; import org.infinispan.client.hotrod.impl.operations.OperationsFactory; import org.infinispan.commons.marshall.jboss.GenericJBossMarshaller; /** * A remote iterator for testing that does a callback when certain keys are reached. */ class CallbackRemoteIterator<E> extends RemoteCloseableIterator<E> { private Set<Object> callBackKeys = new HashSet<>(); private GenericJBossMarshaller marshaller = new GenericJBossMarshaller(); private IterationCallBack callback; CallbackRemoteIterator(OperationsFactory operationsFactory, int batchSize, Set<Integer> segments, boolean metadata) { super(operationsFactory, batchSize, segments, metadata); } @Override public void close() { super.close(); } @Override public boolean hasNext() { return super.hasNext(); } @Override public Map.Entry<Object, E> next() { Map.Entry<Object, E> next = super.next(); Object key = unmarshall(next.getKey()); if (callBackKeys.contains(key)) { callback.iterationReached(key); } return next; } private Object unmarshall(Object key) { try { return marshaller.objectFromByteBuffer((byte[]) key); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } return key; } void addCallback(IterationCallBack callback, Object... keys) { Arrays.stream(keys).forEach(callBackKeys::add); this.callback = callback; } }