package org.sef4j.springmsg.websocket;
import java.io.IOException;
import org.sef4j.core.api.EventSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.socket.TextMessage;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonTokenId;
/**
* <PRE> JSonMessageToEventSender
* WSMessageHandler +-----------+ EventSender<T>
* sendEvent(TextMessage json) | | sendEvent(T)
* ---> +-----------+ ---->
* |
* \/ jsonToObjects()
* JsonFactory
* </PRE>
*
* @param <T>
*/
public class JSonMessageToEventSender<T> { // implements EventSender<TextMessage,T> {
private static final Logger LOG = LoggerFactory.getLogger(JSonMessageToEventSender.class);
protected EventSender<T> target;
private JsonFactory jsonFactory;
private Class<T> messageClass;
private int messageIgnoredCount;
// ------------------------------------------------------------------------
public JSonMessageToEventSender(EventSender<T> target, JsonFactory jsonFactory, Class<T> messageClass) {
this.target = target;
this.jsonFactory = jsonFactory;
this.messageClass = messageClass;
}
// ------------------------------------------------------------------------
public void setTarget(EventSender<T> target) {
this.target = target;
}
public void sendEvent(TextMessage jsonEvent) {
EventSender<T> tmpTarget = target;
if (tmpTarget == null) {
messageIgnoredCount++;
return;
}
String json = jsonEvent.getPayload();
JsonParser parser;
try {
parser = jsonFactory.createParser(json);
} catch (JsonParseException ex) {
throw new RuntimeException("Failed to parse received message as json: '" + json + "'", ex);
} catch (IOException ex) {
throw new RuntimeException("should not occur", ex);
}
if (JsonTokenId.ID_START_ARRAY == parser.getCurrentTokenId()) {
// TODO ... read an array of object
throw new UnsupportedOperationException("NOT IMPLEMENTED YET ... read json array of " + messageClass);
} else {
T event;
try {
event = (T) parser.readValueAs(messageClass);
} catch (IOException ex) {
throw new RuntimeException("Failed to read mesage as json object " + messageClass + ": '" + json + "'", ex);
}
tmpTarget.sendEvent(event);
}
}
}