/*
* ExtensionsPanel.java
*
* Created on 05 December 2005, 08:41
*/
package org.owasp.webscarab.plugin.extensions.swing;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.logging.Logger;
import javax.swing.Action;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.table.TableModel;
import javax.swing.tree.TreePath;
import org.owasp.webscarab.model.ConversationID;
import org.owasp.webscarab.model.HttpUrl;
import org.owasp.webscarab.model.Preferences;
import org.owasp.webscarab.plugin.extensions.Extensions;
import org.owasp.webscarab.plugin.extensions.ExtensionsModel;
import org.owasp.webscarab.ui.swing.ColumnWidthTracker;
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.ui.swing.UrlTreeModelAdapter;
import org.owasp.webscarab.ui.swing.UrlTreeRenderer;
import org.owasp.webscarab.util.swing.ColumnDataModel;
import org.owasp.webscarab.util.swing.SwingWorker;
import org.owasp.webscarab.util.swing.TableSorter;
/**
*
* @author rdawes
*/
public class ExtensionsPanel extends javax.swing.JPanel implements SwingPluginUI {
/**
*
*/
private static final long serialVersionUID = 431458232664764498L;
private Extensions _extensions;
private ExtensionsModel _model;
private Logger _logger = Logger.getLogger(getClass().getName());
/** Creates new form ExtensionsPanel */
public ExtensionsPanel(Extensions extensions) {
_extensions = extensions;
_model = extensions.getModel();
initComponents();
urlTree.setModel(new UrlTreeModelAdapter(_model.getUrlModel()));
urlTree.setRootVisible(false);
urlTree.setShowsRootHandles(true);
urlTree.setCellRenderer(new UrlTreeRenderer());
TableModel tm = new ConversationTableModel(_model.getConversationModel());
TableSorter ts = new TableSorter(tm, conversationTable.getTableHeader());
conversationTable.setModel(ts);
ColumnWidthTracker.getTracker("ConversationTable").addTable(conversationTable);
conversationTable.setDefaultRenderer(Date.class, new DateRenderer());
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
editDialog.setBounds((screenSize.width-300)/2, (screenSize.height-150)/2, 300, 150);
}
/** 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() {
java.awt.GridBagConstraints gridBagConstraints;
editDialog = new javax.swing.JDialog();
tabbedPane = new javax.swing.JTabbedPane();
jScrollPane4 = new javax.swing.JScrollPane();
fileTextArea = new javax.swing.JTextArea();
jScrollPane3 = new javax.swing.JScrollPane();
directoryTextArea = new javax.swing.JTextArea();
jPanel3 = new javax.swing.JPanel();
loadButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
okButton = new javax.swing.JButton();
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
urlTree = new javax.swing.JTree();
jScrollPane2 = new javax.swing.JScrollPane();
conversationTable = new javax.swing.JTable();
controlPanel = new javax.swing.JPanel();
editButton = new javax.swing.JButton();
checkButton = new javax.swing.JButton();
editDialog.setTitle("Extensions");
editDialog.setModal(true);
tabbedPane.setMinimumSize(new java.awt.Dimension(200, 200));
tabbedPane.setPreferredSize(new java.awt.Dimension(200, 200));
jScrollPane4.setViewportView(fileTextArea);
tabbedPane.addTab("File", jScrollPane4);
jScrollPane3.setViewportView(directoryTextArea);
tabbedPane.addTab("Directory", jScrollPane3);
editDialog.getContentPane().add(tabbedPane, java.awt.BorderLayout.CENTER);
loadButton.setText("Load");
loadButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
loadButtonActionPerformed(evt);
}
});
jPanel3.add(loadButton);
cancelButton.setText("Cancel");
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
jPanel3.add(cancelButton);
okButton.setText("Ok");
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
jPanel3.add(okButton);
editDialog.getContentPane().add(jPanel3, java.awt.BorderLayout.SOUTH);
setLayout(new java.awt.BorderLayout());
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setResizeWeight(0.5);
jScrollPane1.setViewportView(urlTree);
jSplitPane1.setLeftComponent(jScrollPane1);
conversationTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
conversationTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
jScrollPane2.setViewportView(conversationTable);
jSplitPane1.setRightComponent(jScrollPane2);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
controlPanel.setLayout(new java.awt.GridBagLayout());
editButton.setText("Edit Extensions");
editButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = 3;
controlPanel.add(editButton, gridBagConstraints);
checkButton.setText("Check");
checkButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkButtonActionPerformed(evt);
}
});
controlPanel.add(checkButton, new java.awt.GridBagConstraints());
add(controlPanel, java.awt.BorderLayout.SOUTH);
}
// </editor-fold>//GEN-END:initComponents
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
_model.setDirectoryExtensions(stringToArray(directoryTextArea.getText()));
_model.setFileExtensions(stringToArray(fileTextArea.getText()));
editDialog.setVisible(false);
}//GEN-LAST:event_okButtonActionPerformed
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
editDialog.setVisible(false);
}//GEN-LAST:event_cancelButtonActionPerformed
private void loadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadButtonActionPerformed
JFileChooser jfc = new JFileChooser(Preferences.getPreference("Extensions.DefaultDirectory"));
jfc.setDialogTitle("Open extension file");
int returnVal = jfc.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File extFile = jfc.getSelectedFile();
try {
String extensions = arrayToString(_extensions.loadStrings(extFile));
if (tabbedPane.getTitleAt(tabbedPane.getSelectedIndex()).equals("File")) {
fileTextArea.setText(extensions);
} else {
directoryTextArea.setText(extensions);
}
} catch (IOException ioe) {
JOptionPane.showMessageDialog(null, new String[] {"Error loading extensions: ", ioe.getMessage()}, "Error", JOptionPane.ERROR_MESSAGE);
}
}
Preferences.setPreference("Extensions.DefaultDirectory", jfc.getCurrentDirectory().getAbsolutePath());
}//GEN-LAST:event_loadButtonActionPerformed
private String arrayToString(String[] strings) {
StringBuffer buff = new StringBuffer();
if (strings == null) return "";
for (int i=0; i<strings.length; i++) {
buff.append(strings[i]).append("\n");
}
return buff.toString();
}
private String[] stringToArray(String string) {
return string.split("\n");
}
private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed
fileTextArea.setText(arrayToString(_model.getFileExtensions()));
directoryTextArea.setText(arrayToString(_model.getDirectoryExtensions()));
editDialog.setVisible(true);
}//GEN-LAST:event_editButtonActionPerformed
private void checkButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkButtonActionPerformed
String action = evt.getActionCommand();
if (action.equals("Stop")) {
_extensions.stopChecks();
return;
}
final TreePath[] selection = urlTree.getSelectionPaths();
if (selection == null || selection.length == 0) return;
if (_extensions.isBusy()) {
showBusyMessage();
return;
}
final HttpUrl[] urls = new HttpUrl[selection.length];
for (int i=0; i<selection.length; i++) {
urls[i] = (HttpUrl) selection[i].getLastPathComponent();
}
checkButton.setText("Stop");
new SwingWorker() {
public Object construct() {
if (urls.length>1) {
_extensions.checkExtensionsFor(urls);
} else {
_extensions.checkExtensionsUnder(urls[0]);
}
return null;
}
public void finished() {
checkButton.setText("Check");
}
}.start();
}//GEN-LAST:event_checkButtonActionPerformed
private void showBusyMessage() {
_logger.warning("Plugin is still busy, please wait");
JOptionPane.showMessageDialog(this, "Plugin is still busy", "Please wait!", JOptionPane.INFORMATION_MESSAGE);
}
public Action[] getConversationActions() {
return null;
}
public ColumnDataModel<ConversationID>[] getConversationColumns() {
return null;
}
public javax.swing.JPanel getPanel() {
return this;
}
public String getPluginName() {
return _extensions.getPluginName();
}
public Action[] getUrlActions() {
return null;
}
public ColumnDataModel<HttpUrl>[] getUrlColumns() {
return null;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancelButton;
private javax.swing.JButton checkButton;
private javax.swing.JPanel controlPanel;
private javax.swing.JTable conversationTable;
private javax.swing.JTextArea directoryTextArea;
private javax.swing.JButton editButton;
private javax.swing.JDialog editDialog;
private javax.swing.JTextArea fileTextArea;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JButton loadButton;
private javax.swing.JButton okButton;
private javax.swing.JTabbedPane tabbedPane;
private javax.swing.JTree urlTree;
// End of variables declaration//GEN-END:variables
}