package fi.iki.mkuokkanen.seda.queue.eventhandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.lmax.disruptor.EventHandler;
import fi.iki.mkuokkanen.seda.keyStore.Storage;
import fi.iki.mkuokkanen.seda.queue.event.Message;
import fi.iki.mkuokkanen.seda.queue.event.MessageType;
/**
* Acts on given operation described in message.
* Reads data from message and pushes it forward as normal primitive types.
*
* @author Mikko Kuokkanen
*/
public class OpInEventHandler implements EventHandler<Message> {
private static Logger logger = LoggerFactory.getLogger(OpInEventHandler.class);
private final Storage keyStore;
public OpInEventHandler(Storage keyStore) {
this.keyStore = keyStore;
}
@Override
public void onEvent(Message event, long sequence, boolean endOfBatch) throws Exception {
MessageType type = (MessageType) event.type.get();
logger.debug("Handling event type {} (seq {}).", type, sequence);
switch (type) {
case IN_PUSH:
doPush(event);
break;
case IN_DELETE:
doDelete(event);
break;
case IN_BROADCAST:
doBroadcast();
break;
case UNKNOWN:
case OUT_BROADCAST:
logger.error("Event type {} should not come to execution! Ignoring it.", type);
break;
default:
logger.error("Unknown event type {}!", type);
break;
}
}
private void doPush(Message event) {
String key = event.asPush.key.get();
String value = event.asPush.value.get();
keyStore.push(key, value);
}
private void doDelete(Message event) {
String key = event.asDelete.key.get();
keyStore.delete(key);
}
private void doBroadcast() {
keyStore.broadcast();
}
}