package org.erlide.runtime.internal;
import org.erlide.runtime.api.IOtpNodeProxy;
import org.erlide.runtime.events.ErlEvent;
import com.ericsson.otp.erlang.OtpErlangAtom;
import com.ericsson.otp.erlang.OtpErlangObject;
import com.ericsson.otp.erlang.OtpErlangPid;
import com.ericsson.otp.erlang.OtpErlangTuple;
public class EventParser {
public ErlEvent parse(final OtpErlangObject msg, final IOtpNodeProxy runtime) {
if (msg == null) {
return null;
}
final String topic = getEventTopic(msg);
if (topic == null) {
return null;
}
final OtpErlangObject event = getEventData(msg);
final OtpErlangPid sender = getEventSender(msg);
return new ErlEvent(topic, runtime, event, sender);
}
public boolean isEventMessage(final OtpErlangObject msg) {
try {
final OtpErlangTuple tmsg = (OtpErlangTuple) msg;
final OtpErlangObject el0 = tmsg.elementAt(0);
return ((OtpErlangAtom) el0).atomValue().equals("event") && tmsg.arity() == 4;
} catch (final Exception e) {
return false;
}
}
private OtpErlangPid getEventSender(final OtpErlangObject msg) {
final OtpErlangTuple tmsg = (OtpErlangTuple) msg;
return (OtpErlangPid) tmsg.elementAt(3);
}
private OtpErlangObject getEventData(final OtpErlangObject msg) {
final OtpErlangTuple tmsg = (OtpErlangTuple) msg;
return tmsg.elementAt(2);
}
private String getEventTopic(final OtpErlangObject msg) {
final OtpErlangTuple tmsg = (OtpErlangTuple) msg;
final Object el0 = tmsg.elementAt(1);
final OtpErlangAtom a = (OtpErlangAtom) el0;
return a.atomValue();
}
}