package fi.iki.mkuokkanen.seda.queue.eventhandler;
import static com.google.common.base.Preconditions.checkNotNull;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.lmax.disruptor.EventHandler;
import fi.iki.mkuokkanen.seda.api.session.SessionManager;
import fi.iki.mkuokkanen.seda.queue.event.Message;
import fi.iki.mkuokkanen.seda.queue.event.MessageType;
/**
* @author mkuokkanen
*/
public class OpOutEventHandler implements EventHandler<Message> {
private static Logger logger = LoggerFactory.getLogger(OpOutEventHandler.class);
private final SessionManager sessionManager;
public OpOutEventHandler(SessionManager sessionManager) {
this.sessionManager = checkNotNull(sessionManager);
}
@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 OUT_BROADCAST:
doBroadcast(event);
break;
default:
logger.error("Unknown event type {}!", type);
break;
}
}
@SuppressWarnings("unchecked")
private void doBroadcast(Message event) {
int count = event.asBroadcastResponse.keyCount.get();
logger.debug("got broadcast message with {} key-value pairs.", count);
// create list
JSONArray list = new JSONArray();
for (int i = 0; i < count; i++) {
JSONObject elem = new JSONObject();
elem.put("key", event.asBroadcastResponse.key[i].get());
elem.put("value", event.asBroadcastResponse.value[i].get());
list.add(elem);
}
// add it to root
JSONObject root = new JSONObject();
root.put("keyvalues", list);
sessionManager.sendAll(root.toJSONString());
}
}