package org.kalipo.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.atmosphere.cpr.AtmosphereFramework;
import org.kalipo.domain.Anonymizable;
import org.kalipo.service.util.Asserts;
import org.kalipo.web.rest.KalipoException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.inject.Inject;
/**
* Broadcast events via websockets
*
* Created by damoeb on 10.12.14.
*/
@Service
public class WebSocketService {
private static final Logger log = LoggerFactory.getLogger(WebSocketService.class);
public enum Type {
COMMENT, COMMENT_DELETED, VOTE, STATS
}
@Inject
private AtmosphereFramework atmosphereFramework;
private static ObjectMapper jsonMapper = new ObjectMapper();
public void broadcast(String threadId, Type type, Anonymizable data) throws KalipoException {
try {
Asserts.isNotNull(type, "type");
Asserts.isNotNull(data, "data");
Wrapper wrapper = new Wrapper(type.name(), data);
String url = "/websocket/live/" + threadId;
atmosphereFramework.getBroadcasterFactory().lookup(url, true).broadcast(jsonMapper.writeValueAsString(wrapper));
} catch (Exception e) {
log.warn("Failed broadcasting: " + e.getMessage());
}
}
public static class Wrapper {
private final String type;
private final Object data;
public Wrapper(String type, Object data) {
this.type = type;
this.data = data;
}
public String getType() {
return type;
}
public Object getData() {
return data;
}
}
}