package sushi.query; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import sushi.event.SushiEvent; import sushi.monitoring.QueryMonitoringPoint; import sushi.notification.SushiNotificationForQuery; import sushi.notification.SushiNotificationRuleForQuery; import sushi.process.SushiProcessInstance; import sushi.util.SetUtil; import com.espertech.esper.client.EventBean; import com.espertech.esper.client.UpdateListener; import com.espertech.esper.event.xml.XMLEventBean; public class SushiLiveQueryListener implements UpdateListener { private List<String> log; protected SushiQuery query; public SushiLiveQueryListener(SushiQuery liveQuery) { this.query = liveQuery; //call UpdateListener? } public void update(EventBean[] newData, EventBean[] oldData) { if(newData[0].getUnderlying() instanceof SushiEvent){ SushiEvent event = (SushiEvent) newData[0].getUnderlying(); } System.out.println("Event received: " + newData[0].getUnderlying()); query.addEntryToLog("Event received: " + newData[0].getUnderlying()); //trigger notification for (SushiNotificationRuleForQuery notificationRule : query.findNotificationForQuery()) { notificationRule.trigger(newData[0].getUnderlying().toString()); } //trigger monitoringPoints List<SushiProcessInstance> instances = getInstances(newData); for (QueryMonitoringPoint point : QueryMonitoringPoint.findByQuery(query)){ for (SushiProcessInstance instance : instances) point.trigger(instance); } } private List<SushiProcessInstance> getInstances(EventBean[] newData) { List<SushiProcessInstance> instances = new ArrayList<SushiProcessInstance>(); Set<Integer> processInstances = new HashSet<Integer>(); List<Set<Integer>> processInstancesList = new ArrayList<Set<Integer>>(); if(newData[0].getUnderlying() instanceof HashMap){ //ProcessInstance fuer Events ermitteln HashMap event = (HashMap) newData[0].getUnderlying(); for(Object value : event.values()){ if(value instanceof XMLEventBean){ XMLEventBean bean = (XMLEventBean) value; if(bean.get("ProcessInstances") != null){ processInstancesList.add(new HashSet<Integer>((List<Integer>) bean.get("ProcessInstances"))); } } } processInstances = SetUtil.intersection(processInstancesList); } if(newData[0] instanceof XMLEventBean){ XMLEventBean bean = (XMLEventBean) newData[0]; if(bean.get("ProcessInstances") != null){ processInstancesList.add(new HashSet<Integer>((List<Integer>) bean.get("ProcessInstances"))); } processInstances = SetUtil.intersection(processInstancesList); } for (int instanceID : processInstances) { instances.add(SushiProcessInstance.findByID(instanceID)); } return instances; } public String getLog() { StringBuffer logString = new StringBuffer(); for (String string : query.getLog()) { logString.append(string + System.getProperty("line.separator")); } return logString.toString(); } public int getNumberOfLogEntries() { return query.getLog().size(); } }