package dnars.siebog; import java.io.Serializable; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import dnars.siebog.annotations.BeliefAdded; import dnars.siebog.annotations.BeliefUpdated; public class EventParser implements Serializable { private static final long serialVersionUID = 1L; public static class ParsedMethod implements Serializable { private static final long serialVersionUID = 1L; Method ref; String subj; String copula; String pred; String truth; } private List<ParsedMethod> added; private List<ParsedMethod> updated; public EventParser(DNarsAgent agent) { added = new ArrayList<>(); updated = new ArrayList<>(); parse(agent); } public List<ParsedMethod> getAdded() { return added; } public List<ParsedMethod> getUpdated() { return updated; } private void parse(DNarsAgent agent) { for (Method m : agent.getClass().getMethods()) { if (m.isAnnotationPresent(BeliefAdded.class)) { checkArgs(m); parseBeliefAdded(m); } else if (m.isAnnotationPresent(BeliefUpdated.class)) { checkArgs(m); parseBeliefUpdated(m); } } } private void checkArgs(Method m) { Class<?>[] types = m.getParameterTypes(); if (m.getParameterCount() != 1 || !types[0].equals(List.class)) { throw new IllegalStateException("Method " + m.getName() + " should only receive an array of Statement objects."); } } private void parseBeliefAdded(Method m) { ParsedMethod pm = new ParsedMethod(); pm.ref = m; BeliefAdded ann = m.getAnnotation(BeliefAdded.class); pm.subj = ann.subj(); pm.copula = ann.copula(); pm.pred = ann.pred(); pm.truth = ann.truth(); added.add(pm); } private void parseBeliefUpdated(Method m) { ParsedMethod pm = new ParsedMethod(); pm.ref = m; BeliefUpdated ann = m.getAnnotation(BeliefUpdated.class); pm.subj = ann.subj(); pm.copula = ann.copula(); pm.pred = ann.pred(); pm.truth = ann.truth(); updated.add(pm); } }