package org.signalml.app.worker.monitor.messages;
import java.io.IOException;
import java.util.HashMap;
import org.apache.log4j.Logger;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonDeserialize;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.type.TypeReference;
import org.signalml.app.worker.monitor.messages.parsing.MessageTypeDeserializer;
import org.signalml.app.worker.monitor.messages.parsing.MessageTypeSerializer;
@JsonSerialize(using=MessageTypeSerializer.class)
@JsonDeserialize(using=MessageTypeDeserializer.class)
public enum MessageType {
PING("ping", Message.class),
PONG("pong", Message.class),
FIND_EEG_EXPERIMENTS_REQUEST("find_eeg_experiments", FindEEGExperimentsRequest.class),
EEG_EXPERIMENTS_RESPONSE("eeg_experiments", null),
FIND_EEG_AMPLIFIERS_REQUEST("find_eeg_amplifiers", FindEEGAmplifiersRequest.class),
EEG_AMPLIFIERS_RESPONSE("eeg_amplifiers", null),
START_EEG_SIGNAL_REQUEST("start_eeg_signal", StartEEGSignalRequest.class),
START_EEG_SIGNAL_RESPONSE("starting_experiment", StartEEGSignalResponse.class),
KILL_EXPERIMENT_REQUEST("kill_experiment", KillExperimentRequest.class),
GET_EXPERIMENT_CONTACT_REQUEST("get_experiment_contact", GetExperimentContactRequest.class),
GET_EXPERIMENT_CONTACT_RESPONSE("experiment_contact", GetExperimentContactResponse.class),
JOIN_EXPERIMENT_REQUEST("join_experiment", JoinExperimentRequest.class),
LEAVE_EXPERIMENT_REQUEST("leave_experiment", LeaveExperimentRequest.class),
REQUEST_OK_RESPONSE("rq_ok", RequestOKResponse.class),
REQUEST_ERROR_RESPONSE("rq_error", RequestErrorResponse.class);
protected static final Logger logger = Logger.getLogger(MessageType.class);
private Class messageClass;
private String messageCode;
private MessageType(String messageCode, Class messageClass) {
this.messageCode = messageCode;
this.messageClass = messageClass;
}
public String getMessageCode() {
return messageCode;
}
@Override
public String toString() {
return this.messageCode;
}
public static MessageType parseMessageTypeFromMessageCode(String code) {
for (MessageType type: MessageType.values()) {
if (type.getMessageCode().equalsIgnoreCase(code)) {
return type;
}
}
return null;
}
public static MessageType parseMessageTypeFromResponse(String response) {
ObjectMapper mapper = new ObjectMapper();
try {
HashMap<String,Object> map = mapper.readValue(response.getBytes(), new TypeReference<HashMap<String, Object>>() {});
String msgTypeCode = (String) map.get("type");
return MessageType.parseMessageTypeFromMessageCode(msgTypeCode);
} catch (JsonParseException e) {
logger.error("", e);
} catch (JsonMappingException e) {
logger.error("", e);
} catch (IOException e) {
logger.error("", e);
}
return null;
}
public Class getMessageClass() {
return messageClass;
}
public void setMessageClass(Class messageClass) {
this.messageClass = messageClass;
}
}