package com.google.code.joto.ui.tree;
import javax.swing.tree.DefaultTreeModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.code.joto.eventrecorder.DefaultRecordEventChangeVisitor;
import com.google.code.joto.eventrecorder.DefaultVisitorRecordEventListener;
import com.google.code.joto.eventrecorder.RecordEventChangeVisitor;
import com.google.code.joto.eventrecorder.RecordEventStoreChange.AddRecordEventStoreEvent;
import com.google.code.joto.eventrecorder.RecordEventSummary;
import com.google.code.joto.ui.JotoContext;
import com.google.code.joto.ui.table.RecordEventSwingRedispatcher;
import com.google.code.joto.ui.tree.AggrRecordEventTemplateTreeNodeAST.RootPackageAggrEventTreeNode;
/**
* a swing TreeModel adapter for aggregating RecordEventTree per template category
*
*/
public class AggrRecordEventTreeModel extends DefaultTreeModel {
/** internal for java.io.Serializable */
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(AggrRecordEventTreeModel.class);
private JotoContext context;
// ... implicit from super: private DefaultRecordEventTemplateTreeNode rootNode;
private RootPackageAggrEventTreeNode rootPackageNode;
private RecordEventChangeVisitor innerRecordEventChangeListener = new InnerRecordEventChangeListener();
/** dispatcher for choosing RecordEventTemplatizer per event types, and build the aggregated TreeNode */
private AggrRecordEventTemplatizerDispatcher eventTemplatizerDispatcher = new AggrRecordEventTemplatizerDispatcher();
// ------------------------------------------------------------------------
public AggrRecordEventTreeModel(JotoContext context) {
super(new RootPackageAggrEventTreeNode(context));
this.rootPackageNode = (RootPackageAggrEventTreeNode) super.getRoot();
rootPackageNode.setInit(this);
this.context = context;
// copy Templatizers settings from context
eventTemplatizerDispatcher.addTemplatizers(context.getConfig().getEventTemplatizerDispatcher());
// subscribe + replay history from first to current event
context.getEventStore().getEventsAndAddEventListener(0,
new RecordEventSwingRedispatcher(new DefaultVisitorRecordEventListener(innerRecordEventChangeListener)));
}
// ------------------------------------------------------------------------
public JotoContext getContext() {
return context;
}
public RootPackageAggrEventTreeNode getRootPackageNode() {
return rootPackageNode;
}
// ------------------------------------------------------------------------
private class InnerRecordEventChangeListener extends DefaultRecordEventChangeVisitor {
@Override
public void caseAddEvent(AddRecordEventStoreEvent addEvent) {
RecordEventSummary event = addEvent.getEventSummary();
try {
eventTemplatizerDispatcher.dispatchAggregateTemplatizedEvent(AggrRecordEventTreeModel.this, event);
} catch(Exception ex) {
log.error("Failed to templatize event " + event + "... ignore it, no rethrow!", ex);
}
}
};
}