/*
* ComparePanel.java
*
* Created on 18 May 2005, 06:15
*/
package org.owasp.webscarab.plugin.compare.swing;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.List;
import javax.swing.Action;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.owasp.webscarab.model.ConversationID;
import org.owasp.webscarab.model.ConversationModel;
import org.owasp.webscarab.model.HttpUrl;
import org.owasp.webscarab.model.Response;
import org.owasp.webscarab.plugin.compare.Compare;
import org.owasp.webscarab.plugin.compare.CompareModel;
import org.owasp.webscarab.ui.swing.ConversationListModel;
import org.owasp.webscarab.ui.swing.ConversationRenderer;
import org.owasp.webscarab.ui.swing.ConversationTableModel;
import org.owasp.webscarab.ui.swing.DateRenderer;
import org.owasp.webscarab.ui.swing.SwingPluginUI;
import org.owasp.webscarab.util.Diff;
import org.owasp.webscarab.util.Diff.Edit;
import org.owasp.webscarab.util.swing.ColumnDataModel;
import org.owasp.webscarab.util.swing.DiffPanel;
import org.owasp.webscarab.util.swing.ListComboBoxModel;
import org.owasp.webscarab.util.swing.SwingWorker;
import org.owasp.webscarab.util.swing.TableSorter;
/**
*
* @author rogan
*/
public class ComparePanel extends javax.swing.JPanel implements SwingPluginUI {
/**
*
*/
private static final long serialVersionUID = -7352280691484196048L;
private Compare _compare;
private CompareModel _model;
private ConversationTableModel _tableModel;
private TableSorter _conversationSorter;
private DiffPanel _diffPanel;
private String _base = null;
/** Creates new form ComparePanel */
public ComparePanel(Compare compare) {
initComponents();
_compare = compare;
_model = _compare.getModel();
baseComboBox.setModel(new ListComboBoxModel(new ConversationListModel(_model.getConversationModel())));
baseComboBox.setRenderer(new ConversationRenderer(_model.getConversationModel()));
_tableModel = new ConversationTableModel(_model.getComparisonModel());
_tableModel.addColumn(new ColumnDataModel<ConversationID>("Distance", Integer.class) {
public Object getValue(ConversationID key) {
if (_model == null) return null;
return _model.getDistance(key);
}
});
conversationTable.setDefaultRenderer(Date.class, new DateRenderer());
_conversationSorter = new TableSorter(_tableModel, conversationTable.getTableHeader());
conversationTable.setModel(_conversationSorter);
_diffPanel = new DiffPanel();
compareSplitPane.setBottomComponent(_diffPanel);
baseComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Object o = baseComboBox.getSelectedItem();
if (o instanceof ConversationID) {
ConversationID id = (ConversationID) o;
ConversationModel cModel = _model.getConversationModel();
Response response = cModel.getResponse(id);
String cType = response.getHeader("Content-Type");
if (cType == null || !cType.startsWith("text")) {
JOptionPane.showMessageDialog(ComparePanel.this, "Selected conversation is not text", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
byte[] content = response.getContent();
if (content == null || content.length == 0) {
JOptionPane.showMessageDialog(ComparePanel.this, "Selected conversation has no content", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
_compare.setBaseConversation(null, id);
_base = new String(content);
}
}
});
conversationTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent evt) {
int selected = conversationTable.getSelectedRow();
_diffPanel.clear();
if (selected == -1) {
return;
}
selected = _conversationSorter.modelIndex(selected);
ConversationModel cmodel = _model.getComparisonModel();
ConversationID id = cmodel.getConversationAt(selected);
Response response = cmodel.getResponse(id);
String contentType = response.getHeader("Content-Type");
if (contentType == null || !contentType.startsWith("text")) {
JOptionPane.showMessageDialog(ComparePanel.this, "Selected conversation is not text", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
byte[] content = response.getContent();
if (content == null || content.length == 0) {
JOptionPane.showMessageDialog(ComparePanel.this, "Selected conversation has no content", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
final String dst = new String(content);
new SwingWorker() {
public Object construct() {
return Diff.getEdits(_base, dst);
}
public void finished() {
@SuppressWarnings("unchecked")
List<Edit> edits = (List<Edit>) get();
_diffPanel.showDifferences(_base, dst, edits);
}
}.start();
}
});
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {
baseComboBox = new javax.swing.JComboBox();
compareSplitPane = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
conversationTable = new javax.swing.JTable();
setLayout(new java.awt.BorderLayout());
baseComboBox.setMaximumSize(null);
add(baseComboBox, java.awt.BorderLayout.NORTH);
compareSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
compareSplitPane.setResizeWeight(0.3);
compareSplitPane.setOneTouchExpandable(true);
conversationTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
}
));
jScrollPane1.setViewportView(conversationTable);
compareSplitPane.setLeftComponent(jScrollPane1);
add(compareSplitPane, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
public Action[] getConversationActions() {
return new Action[0];
}
public ColumnDataModel<ConversationID>[] getConversationColumns() {
return null;
}
public JPanel getPanel() {
return this;
}
public String getPluginName() {
return "Compare";
}
public Action[] getUrlActions() {
return new Action[0];
}
public ColumnDataModel<HttpUrl>[] getUrlColumns() {
return null;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JComboBox baseComboBox;
private javax.swing.JSplitPane compareSplitPane;
private javax.swing.JTable conversationTable;
private javax.swing.JScrollPane jScrollPane1;
// End of variables declaration//GEN-END:variables
}