package com.google.code.joto.ui.conv;
import java.awt.Component;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import com.google.code.joto.ObjectToCodeGenerator;
import com.google.code.joto.eventrecorder.RecordEventData;
import com.google.code.joto.eventrecorder.RecordEventStore;
import com.google.code.joto.eventrecorder.RecordEventSummary;
import com.google.code.joto.eventrecorder.processor.DispatcherRecordEventsProcessor;
import com.google.code.joto.eventrecorder.processor.RecordEventsProcessorFactory;
import com.google.code.joto.eventrecorder.processor.impl.ObjToCodeRecordEventsProcessor;
import com.google.code.joto.eventrecorder.processor.impl.XStreamFormatterRecordEventsProcessor;
import com.google.code.joto.eventrecorder.spy.awtspy.AWTRecordEventWriterSpy;
import com.google.code.joto.eventrecorder.spy.calls.MethodCallEventUtils;
import com.google.code.joto.eventrecorder.spy.calls.MethodCallToCodeRecordEventsProcessor;
import com.google.code.joto.eventrecorder.spy.calls.ObjectReplacementMap;
import com.google.code.joto.eventrecorder.spy.log.Log4jEventData;
import com.google.code.joto.eventrecorder.spy.log.Log4jToCodeRecordEventsProcessor;
import com.google.code.joto.eventrecorder.spy.log.LogbackEventData;
import com.google.code.joto.eventrecorder.spy.log.LogbackToCodeRecordEventsProcessor;
import com.google.code.joto.ui.JotoContext;
import com.google.code.joto.ui.table.AbstractRecordEventTableModel;
import com.google.code.joto.ui.table.RecordEventTablePane;
import com.thoughtworks.xstream.XStream;
/**
* Swing panel for selecting RecordEvent in table,
* and show pluggeable representations as Xml / JavaCode / JUnit / ...
*/
public class RecordEventsTableAndConvertersPanel {
private JotoContext context;
private JSplitPane splitPane;
private RecordEventTablePane recordEventTablePane;
/**
* contains child component for displaying selected RecordEvent as Text.
* predefined tabs:
* <ul>
* <li>XStream dump (RecordEvent ObjectData -> Xml)</li>
* <li>Joto Reverse for Java code construction (RecordEvent ObjectData -> Java "new/call" code)</li>
*/
private JTabbedPane selectionTabbedPane;
/** downcast helper... currently redundant with selectionTabbedPane! */
private List<RecordEventsConverterTextPanel> selectedEventConverterTextPanes =
new ArrayList<RecordEventsConverterTextPanel>();
// -------------------------------------------------------------------------
public RecordEventsTableAndConvertersPanel(JotoContext context, AbstractRecordEventTableModel recordEventTableModel) {
this.context = context;
this.recordEventTablePane = new RecordEventTablePane(recordEventTableModel);
this.selectionTabbedPane = new JTabbedPane();
this.splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
recordEventTablePane.getJComponent(), selectionTabbedPane);
splitPane.setDividerLocation(0.4);
AWTRecordEventWriterSpy.setIgnoreComponentAwtEventSpy(splitPane);
recordEventTablePane.getRecordEventTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
onRecordEventSelectionChanged(e);
}
});
// predefined text converters:
addDefaultXmlTextPanelConverter();
addDefaultJavaConverterTextPanel();
}
public void addTextPanelConverter(String name, RecordEventsConverterTextPanel comp) {
selectionTabbedPane.add(name, comp.getJComponent());
selectedEventConverterTextPanes.add(comp);
}
public void removeTextPanelConverter(String name) {
int tabLen = selectionTabbedPane.getTabCount();
Component comp = null;
for (int i = 0; i < tabLen; i++) {
String n = selectionTabbedPane.getTitleAt(i);
if (n != null && n.equals(name)) {
comp = selectionTabbedPane.getTabComponentAt(i);
selectionTabbedPane.remove(i);
break;
}
}
RecordEventsConverterTextPanel foundTextPane = null;
for(RecordEventsConverterTextPanel elt : selectedEventConverterTextPanes) {
if (elt.getJComponent() == comp) {
foundTextPane = elt;
break;
}
}
selectedEventConverterTextPanes.remove(foundTextPane);
}
public void addDefaultXmlTextPanelConverter() {
// Xml XStream text converter
RecordEventsProcessorFactory<PrintStream> eventConverterFactory =
new XStreamFormatterRecordEventsProcessor.Factory(new XStream());
RecordEventsConverterTextPanel comp =
new RecordEventsConverterTextPanel(eventConverterFactory);
addTextPanelConverter("xml", comp);
}
public void addDefaultJavaConverterTextPanel() {
// Reverse Java "new/call" text converter
ObjectToCodeGenerator objToCode = new ObjectToCodeGenerator(context.getConfig());
RecordEventsProcessorFactory<PrintStream> objConverterFactory =
new ObjToCodeRecordEventsProcessor.Factory(objToCode);
ObjectReplacementMap objectReplacementMap = context.getObjReplMap();
RecordEventsProcessorFactory<PrintStream> methCallConverterFactory =
new MethodCallToCodeRecordEventsProcessor.Factory(
objToCode, objectReplacementMap);
RecordEventsProcessorFactory<PrintStream> logbackToCommentConverterFactory =
new LogbackToCodeRecordEventsProcessor.Factory(true);
RecordEventsProcessorFactory<PrintStream> log4jToCommentConverterFactory =
new Log4jToCodeRecordEventsProcessor.Factory(true);
Map<String,RecordEventsProcessorFactory<PrintStream>> eventTypeToFactory =
new HashMap<String,RecordEventsProcessorFactory<PrintStream>>();
eventTypeToFactory.put("testObj", objConverterFactory);
eventTypeToFactory.put(MethodCallEventUtils.METHODCALL_EVENT_TYPE, methCallConverterFactory);
eventTypeToFactory.put(LogbackEventData.EVENT_TYPE, logbackToCommentConverterFactory);
eventTypeToFactory.put(Log4jEventData.EVENT_TYPE, log4jToCommentConverterFactory);
RecordEventsProcessorFactory<PrintStream> dispatcherConverterFactory =
new DispatcherRecordEventsProcessor.Factory<PrintStream>(
eventTypeToFactory, objConverterFactory);
RecordEventsConverterTextPanel comp =
new RecordEventsConverterTextPanel(dispatcherConverterFactory);
addTextPanelConverter("java", comp);
}
//-------------------------------------------------------------------------
public JComponent getJComponent() {
return splitPane;
}
// -------------------------------------------------------------------------
private void onRecordEventSelectionChanged(ListSelectionEvent e) {
List<RecordEventSummary> selectedRows = recordEventTablePane.getSelectedEventRows();
List<RecordEventData> selectedEventDataList = new ArrayList<RecordEventData>();
RecordEventStore eventStore = context.getEventStore();
for (RecordEventSummary eventRow : selectedRows) {
RecordEventData eventData = eventStore.getEventData(eventRow);
selectedEventDataList.add(eventData);
}
// display event data list in detailed tabbed pane
for(RecordEventsConverterTextPanel comp : selectedEventConverterTextPanes) {
comp.setRecordEventDataList(selectedEventDataList);
}
}
}