package org.sdnplatform.sync.internal.store;
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.sdnplatform.sync.IStoreListener;
import org.sdnplatform.sync.IStoreListener.UpdateType;
import org.sdnplatform.sync.internal.util.ByteArray;
import com.fasterxml.jackson.core.type.TypeReference;
/**
* A class that will map from the raw serialized keys to the appropriate key
* type for a store listener
* @author readams
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class MappingStoreListener {
TypeReference typeRef;
Class keyClass;
IStoreListener listener;
public MappingStoreListener(TypeReference typeRef, Class keyClass,
IStoreListener listener) {
super();
this.typeRef = typeRef;
this.keyClass = keyClass;
this.listener = listener;
}
public void notify(Iterator<ByteArray> keys, UpdateType type) {
listener.keysModified(new MappingIterator(keys), type);
}
class MappingIterator implements Iterator {
Iterator<ByteArray> keys;
protected Object next;
public MappingIterator(Iterator<ByteArray> keys) {
super();
this.keys = keys;
}
private Object map() {
try {
ByteArray ka = keys.next();
Object key = null;
if (typeRef != null)
key = JacksonStore.mapper.readValue(ka.get(), typeRef);
else if (keyClass != null)
key = JacksonStore.mapper.readValue(ka.get(), keyClass);
return key;
} catch (Exception e) {
return null;
}
}
@Override
public boolean hasNext() {
if (next != null) return true;
while (keys.hasNext()) {
next = map();
if (next != null) return true;
}
return false;
}
@Override
public Object next() {
if (hasNext()) {
Object cur = next;
next = null;
return cur;
}
throw new NoSuchElementException();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}