package sushi.transformation;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import sushi.event.SushiEvent;
import sushi.event.SushiEventType;
import sushi.event.attribute.SushiAttribute;
import sushi.event.attribute.SushiAttributeTypeEnum;
import sushi.event.collection.SushiMapTree;
import sushi.eventhandling.Broker;
import com.espertech.esper.client.EventBean;
import com.espertech.esper.client.UpdateListener;
/**
* Listener for events generated by the data stream management system.
*/
public class TransformationListener implements UpdateListener {
private SushiEventType eventType;
private int numberOfEventsFired;
public TransformationListener(SushiEventType sushiEventType) {
eventType = sushiEventType;
numberOfEventsFired = 0;
}
/**
* Normalizes the transformed events and sends them to the broker.
*
* @see UpdateListener#update(EventBean[], EventBean[])
*/
public void update(EventBean[] newData, EventBean[] oldData) {
Set<Map<String, Serializable>> uniqueEvents = new HashSet<Map<String, Serializable>>();
// create event/attribute values for event type
for (EventBean data : newData) {
System.out.println("Event received: " + data.getUnderlying());
Map<String, Serializable> attributeExpressionsAndValues = (Map<String, Serializable>) data.getUnderlying();
if (!uniqueEvents.contains(attributeExpressionsAndValues)) {
uniqueEvents.add(attributeExpressionsAndValues);
SushiMapTree<String, Serializable> values = new SushiMapTree<String, Serializable>();
for (SushiAttribute attribute : eventType.getRootLevelValueTypes()) {
try {
String attributeExpression = attribute.getAttributeExpression();
Serializable attributeValue = null;
if (attribute.getType() == SushiAttributeTypeEnum.DATE) {
attributeValue = (Date) attributeExpressionsAndValues.get(attributeExpression);
} else if (attribute.getType() == SushiAttributeTypeEnum.INTEGER) {
if (attributeExpressionsAndValues.get(attributeExpression) instanceof Long) {
attributeValue = ((Long) attributeExpressionsAndValues.get(attributeExpression)).intValue();
} else if (attributeExpressionsAndValues.get(attributeExpression) instanceof Double) {
attributeValue = ((Double) attributeExpressionsAndValues.get(attributeExpression)).intValue();
} else {
attributeValue = (Integer) attributeExpressionsAndValues.get(attributeExpression);
}
} else {
attributeValue = attributeExpressionsAndValues.get(attributeExpression).toString();
}
values.put(attributeExpression, attributeValue);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(values.toString());
SushiEvent event = new SushiEvent(eventType, new Date(), values);
Object timestamp = attributeExpressionsAndValues.get("Timestamp");
if (timestamp instanceof Date) {
event.setTimestamp((Date) timestamp);
}
Broker.send(event);
System.out.println("Event created: " + event);
numberOfEventsFired++;
}
}
}
public int getNumberOfEventsFired() {
return numberOfEventsFired;
}
public void setNumberOfEventsFired(int numberOfEventsFired) {
this.numberOfEventsFired = numberOfEventsFired;
}
}