package org.sef4j.springmsg.websocket; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Collection; import org.sef4j.core.api.EventSender; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketSession; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; /** * EventSEnder adapter for sending spring WebSocketMessage Json message to WebSocketSession * <PRE> * JsonWSMessageEventSender WebSocketSession * sendEvent(Object) +---------------+ sendMessage(json) +-------+ * ---> | | -------> | | * +---------------+ +-------+ * | * \/ json=eventToMessage(cObject) * JSonFactory * +-------+ * | | * +-------+ * </PRE> */ public class JsonWSMessageEventSender implements EventSender<Object> { private WebSocketSession wsSession; private JsonFactory jsonFactory; // ------------------------------------------------------------------------ public JsonWSMessageEventSender(WebSocketSession wsSession, JsonFactory jsonFactory) { this.wsSession = wsSession; this.jsonFactory = jsonFactory; } // ------------------------------------------------------------------------ @Override public void sendEvent(Object event) { WebSocketMessage<?> message = eventToMessage(event); try { wsSession.sendMessage(message); } catch (IOException ex) { throw new RuntimeException("Failed to send message for event", ex); } } @Override public void sendEvents(Collection<Object> events) { WebSocketMessage<?> message = eventsToMessage(events); try { wsSession.sendMessage(message); } catch (IOException ex) { throw new RuntimeException("Failed to send message for event", ex); } } protected WebSocketMessage<?> eventToMessage(Object event) { ByteArrayOutputStream bout = new ByteArrayOutputStream(); JsonGenerator jsonGenerator = createJsonGenerator(bout); try { jsonGenerator.writeObject(event); } catch (IOException ex) { throw new RuntimeException("should not occur", ex); } WebSocketMessage<?> message = new TextMessage(bout.toByteArray()); return message; } protected WebSocketMessage<?> eventsToMessage(Collection<Object> events) { ByteArrayOutputStream bout = new ByteArrayOutputStream(); JsonGenerator jsonGenerator = createJsonGenerator(bout); for(Object event : events) { try { jsonGenerator.writeObject(event); } catch (IOException ex) { throw new RuntimeException("should not occur", ex); } } WebSocketMessage<?> message = new TextMessage(bout.toByteArray()); return message; } protected JsonGenerator createJsonGenerator(ByteArrayOutputStream bout) { try { JsonGenerator res = jsonFactory.createGenerator(bout); return res; } catch (IOException ex) { throw new RuntimeException("should not occur", ex); } } // ------------------------------------------------------------------------ @Override public String toString() { return "JsonWSMessageEventSender [wsSession=" + wsSession + "]"; } }