package dnars.siebog;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import dnars.base.Statement;
import dnars.base.StatementParser;
import dnars.events.EventPayload;
import dnars.events.EventPayload.Type;
import dnars.siebog.EventParser.ParsedMethod;
public class EventHandler implements Serializable {
private static final long serialVersionUID = 1L;
private DNarsAgent agent;
private EventParser parser;
public EventHandler(DNarsAgent agent) {
this.agent = agent;
this.parser = new EventParser(agent);
}
public void handle(EventPayload[] events) {
List<Statement> added = new ArrayList<>();
List<Statement> updated = new ArrayList<>();
split(events, added, updated);
notify(added, parser.getAdded());
notify(updated, parser.getUpdated());
}
private void split(EventPayload[] events, List<Statement> added, List<Statement> updated) {
for (EventPayload ev : events) {
if (ev.getType() == Type.ADDED) {
added.add(StatementParser.apply(ev.getStatement()));
} else {
updated.add(StatementParser.apply(ev.getStatement()));
}
}
}
private void notify(List<Statement> statements, List<ParsedMethod> added) {
try {
for (ParsedMethod m : added) {
List<Statement> st = getMatches(m, statements);
if (st.size() > 0) {
m.ref.invoke(agent, st);
}
}
} catch (Exception ex) {
throw new IllegalStateException(ex);
}
}
private List<Statement> getMatches(ParsedMethod m, List<Statement> statements) {
List<Statement> result = new ArrayList<>();
for (Statement st : statements) {
if (st.subj().toString().matches(m.subj) && st.copula().matches(m.copula)
&& st.pred().toString().matches(m.pred)
&& st.truth().toString().matches(m.truth)) {
result.add(st);
}
}
return result;
}
}