package com.google.code.joto.ui.tree;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.code.joto.eventrecorder.RecordEventSummary;
import com.google.code.joto.eventrecorder.spy.calls.MethodCallEventUtils;
import com.google.code.joto.ui.tree.AggrRecordEventTemplateTreeNodeAST.AbstractAggrEventTreeNode;
import com.google.code.joto.ui.tree.aggrs.IgnoreAggrRecordEventTemplatizer;
import com.google.code.joto.ui.tree.aggrs.MethodCallEventTemplatizer;
import com.google.code.joto.util.PriorityList;
/**
* Dispatcher for AggrRecordEventTemplatizer
*/
public class AggrRecordEventTemplatizerDispatcher implements Serializable {
/** internal for java.io.Serializable */
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(AggrRecordEventTemplatizerDispatcher.class);
/** pluggable dispatcher mecanism for choosing RecordEventTemplatizer per event types */
private Map<String,PriorityList<AggrRecordEventTemplatizer>> eventTypeToTemplatizers =
new HashMap<String,PriorityList<AggrRecordEventTemplatizer>>();
// ------------------------------------------------------------------------
public AggrRecordEventTemplatizerDispatcher() {
addDefaultTemplatizers();
}
// ------------------------------------------------------------------------
public void addDefaultTemplatizers() {
MethodCallEventTemplatizer defaultCallTemplatizer = new MethodCallEventTemplatizer();
addEventTypeTemplatizer(MethodCallEventUtils.METHODCALL_EVENT_TYPE, defaultCallTemplatizer, 10);
}
public void addTemplatizers(AggrRecordEventTemplatizerDispatcher src) {
Map<String, PriorityList<AggrRecordEventTemplatizer>> srcEventTypeToTemplatizers = src.eventTypeToTemplatizers;
for(Map.Entry<String, PriorityList<AggrRecordEventTemplatizer>> e : srcEventTypeToTemplatizers.entrySet()) {
PriorityList<AggrRecordEventTemplatizer> srcLs = e.getValue();
PriorityList<AggrRecordEventTemplatizer> destLs = getAggrTemplatizersForEventType(e.getKey());
destLs.addAllWithPriority(srcLs);
}
}
public void addEventTypeTemplatizer(String eventType, AggrRecordEventTemplatizer templatizer, int priority) {
PriorityList<AggrRecordEventTemplatizer> ls = getAggrTemplatizersForEventType(eventType);
ls.add(templatizer, priority);
}
private PriorityList<AggrRecordEventTemplatizer> getAggrTemplatizersForEventType(String eventType) {
PriorityList<AggrRecordEventTemplatizer> ls = eventTypeToTemplatizers.get(eventType);
if (ls == null) {
ls = new PriorityList<AggrRecordEventTemplatizer>();
eventTypeToTemplatizers.put(eventType, ls);
}
return ls;
}
// ------------------------------------------------------------------------
/**
* main entry point for dispatching RecordEvent to any of the AggrRecordEventTemplatizer
* @param target
* @param event
*/
public AbstractAggrEventTreeNode dispatchAggregateTemplatizedEvent(AggrRecordEventTreeModel target, RecordEventSummary event) {
AbstractAggrEventTreeNode res;
String eventType = event.getEventType();
// find AggrRecordEventTemplatizer for event
AggrRecordEventTemplatizer foundTemplatizer = null;
PriorityList<AggrRecordEventTemplatizer> templatizers = eventTypeToTemplatizers.get(eventType);
if (templatizers != null) {
for(AggrRecordEventTemplatizer e : templatizers) {
if (e.canHandle(target, event)) {
foundTemplatizer = e;
break;
}
}
}
// apply templatizer
if (foundTemplatizer == null) {
log.warn("no templatizer for aggregating event type " + eventType + " .. default NOT IMPLEMENTED YET => ignore event");
// to log once... register the "do-nothing" templatizer...
addEventTypeTemplatizer(eventType, IgnoreAggrRecordEventTemplatizer.getInstance(), 0);
res = null;
} else {
res = foundTemplatizer.aggregateTemplatizedEvent(target, event);
}
return res;
}
}