/*
* ScriptedPanel.java
*
* Created on 03 January 2005, 07:44
*/
package org.owasp.webscarab.plugin.scripted.swing;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.logging.Logger;
import javax.swing.Action;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import org.owasp.webscarab.model.ConversationID;
import org.owasp.webscarab.model.HttpUrl;
import org.owasp.webscarab.model.Preferences;
import org.owasp.webscarab.plugin.scripted.Scripted;
import org.owasp.webscarab.plugin.scripted.ScriptedUI;
import org.owasp.webscarab.ui.swing.SwingPluginUI;
import org.owasp.webscarab.util.swing.ColumnDataModel;
import org.owasp.webscarab.util.swing.DocumentOutputStream;
/**
*
* @author rogan
*/
public class ScriptedPanel extends javax.swing.JPanel implements ScriptedUI, SwingPluginUI {
/**
*
*/
private static final long serialVersionUID = -5126009853771604406L;
private static Action[] NO_ACTIONS = new Action[0];
private Scripted _scripted = null;
private PrintStream _printStream;
private Logger _logger = Logger.getLogger(getClass().getName());
/** Creates new form ScriptedPanel */
public ScriptedPanel(Scripted scripted) {
initComponents();
_scripted = scripted;
DocumentOutputStream dos = new DocumentOutputStream(10240);
_printStream = new PrintStream(dos);
outputTextArea.setDocument(dos.getDocument());
_scripted.setUI(this);
_scripted.setOut(_printStream);
_scripted.setErr(_printStream);
saveButton.setEnabled(_scripted.getScriptFile() != null);
scriptLanguageTextField.setText(_scripted.getScriptLanguage());
scriptTextPane.setText(_scripted.getScript());
setEnabled(_scripted.isRunning());
}
/** 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.
*/
private void initComponents() {//GEN-BEGIN:initComponents
java.awt.GridBagConstraints gridBagConstraints;
scriptToolBar = new javax.swing.JToolBar();
newButton = new javax.swing.JButton();
loadButton = new javax.swing.JButton();
saveButton = new javax.swing.JButton();
saveAsButton = new javax.swing.JButton();
startButton = new javax.swing.JButton();
stopButton = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
scriptLanguageTextField = new javax.swing.JTextField();
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
scriptTextPane = new javax.swing.JTextPane();
jScrollPane2 = new javax.swing.JScrollPane();
outputTextArea = new javax.swing.JTextArea();
setLayout(new java.awt.BorderLayout());
newButton.setText("New");
newButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
newButtonActionPerformed(evt);
}
});
scriptToolBar.add(newButton);
loadButton.setText("Load");
loadButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
loadButtonActionPerformed(evt);
}
});
scriptToolBar.add(loadButton);
saveButton.setText("Save");
saveButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveButtonActionPerformed(evt);
}
});
scriptToolBar.add(saveButton);
saveAsButton.setText("Save As");
saveAsButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveAsButtonActionPerformed(evt);
}
});
scriptToolBar.add(saveAsButton);
scriptToolBar.addSeparator();
startButton.setText("Start");
startButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
startButtonActionPerformed(evt);
}
});
scriptToolBar.add(startButton);
stopButton.setText("Stop");
stopButton.setEnabled(false);
stopButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
stopButtonActionPerformed(evt);
}
});
scriptToolBar.add(stopButton);
add(scriptToolBar, java.awt.BorderLayout.NORTH);
jPanel1.setLayout(new java.awt.GridBagLayout());
jPanel2.setLayout(new java.awt.GridBagLayout());
jLabel1.setText("Language : ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
jPanel2.add(jLabel1, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
gridBagConstraints.weightx = 1.0;
jPanel2.add(scriptLanguageTextField, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
jPanel1.add(jPanel2, gridBagConstraints);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setResizeWeight(0.7);
jScrollPane1.setMinimumSize(new java.awt.Dimension(400, 100));
jScrollPane1.setPreferredSize(new java.awt.Dimension(400, 100));
scriptTextPane.setFont(new java.awt.Font("Monospaced", 0, 14));
scriptTextPane.setMargin(new java.awt.Insets(5, 5, 5, 5));
jScrollPane1.setViewportView(scriptTextPane);
jSplitPane1.setLeftComponent(jScrollPane1);
jScrollPane2.setMinimumSize(new java.awt.Dimension(400, 64));
jScrollPane2.setPreferredSize(new java.awt.Dimension(400, 64));
outputTextArea.setBackground(new java.awt.Color(204, 204, 204));
outputTextArea.setEditable(false);
outputTextArea.setMargin(new java.awt.Insets(5, 5, 5, 5));
jScrollPane2.setViewportView(outputTextArea);
jSplitPane1.setRightComponent(jScrollPane2);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
jPanel1.add(jSplitPane1, gridBagConstraints);
add(jPanel1, java.awt.BorderLayout.CENTER);
}//GEN-END:initComponents
private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed
_scripted.setScript(scriptLanguageTextField.getText(), scriptTextPane.getText());
try {
_scripted.saveScript(_scripted.getScriptFile());
} catch (IOException ioe) {
JOptionPane.showMessageDialog(null, new String[] {"Error saving script: ", ioe.getMessage()}, "Error", JOptionPane.ERROR_MESSAGE);
_logger.warning("Error saving script: " + ioe.getMessage());
}
}//GEN-LAST:event_saveButtonActionPerformed
private void saveAsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveAsButtonActionPerformed
_scripted.setScript(scriptLanguageTextField.getText(), scriptTextPane.getText());
JFileChooser jfc = new JFileChooser(Preferences.getPreference("Scripted.DefaultDirectory"));
jfc.setDialogTitle("Save as");
int returnVal = jfc.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File script = jfc.getSelectedFile();
try {
_scripted.saveScript(script);
} catch (IOException ioe) {
JOptionPane.showMessageDialog(null, new String[] {"Error saving script: ", ioe.getMessage()}, "Error", JOptionPane.ERROR_MESSAGE);
}
}
Preferences.setPreference("Scripted.DefaultDirectory", jfc.getCurrentDirectory().getAbsolutePath());
}//GEN-LAST:event_saveAsButtonActionPerformed
private void loadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadButtonActionPerformed
JFileChooser jfc = new JFileChooser(Preferences.getPreference("Scripted.DefaultDirectory"));
jfc.setDialogTitle("Load script");
int returnVal = jfc.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File script = jfc.getSelectedFile();
try {
_scripted.loadScript(script);
} catch (IOException ioe) {
JOptionPane.showMessageDialog(null, new String[] {"Error loading script: ", ioe.getMessage()}, "Error", JOptionPane.ERROR_MESSAGE);
}
}
Preferences.setPreference("Scripted.DefaultDirectory", jfc.getCurrentDirectory().getAbsolutePath());
}//GEN-LAST:event_loadButtonActionPerformed
private void newButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newButtonActionPerformed
try {
_scripted.loadScript(null);
} catch (IOException ioe) {} // can't throw an exception here
}//GEN-LAST:event_newButtonActionPerformed
private void stopButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stopButtonActionPerformed
_scripted.stopScript();
}//GEN-LAST:event_stopButtonActionPerformed
private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startButtonActionPerformed
_scripted.setScript(scriptLanguageTextField.getText(), scriptTextPane.getText());
_scripted.runScript();
}//GEN-LAST:event_startButtonActionPerformed
public Action[] getConversationActions() {
return NO_ACTIONS;
}
public ColumnDataModel<ConversationID>[] getConversationColumns() {
return null;
}
public Action[] getUrlActions() {
return NO_ACTIONS;
}
public ColumnDataModel<HttpUrl>[] getUrlColumns() {
return null;
}
public PrintStream getErrorStream() {
return _printStream;
}
public PrintStream getOutputStream() {
return _printStream;
}
public javax.swing.JPanel getPanel() {
return this;
}
public String getPluginName() {
return _scripted.getPluginName();
}
public void scriptError(final String reason, final Throwable error) {
if (SwingUtilities.isEventDispatchThread()) {
// "The application script threw an exception: java.net.ConnectException: Connection refused BSF info: Scripted at line: 0 column: columnNo"
String message = error.getMessage();
try {
int eStart = message.indexOf(":");
int eEnd = message.indexOf("BSF info:");
String info = message.substring(eEnd + 18);
String ex = message.substring(eStart + 2, eEnd - 1);
message = ex + "\n" + info;
} catch (Exception e) {}
JTextArea ta = new JTextArea(message);
ta.setEditable(false);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
ta.setBackground(new java.awt.Color(204,204,204));
JScrollPane sp = new JScrollPane(ta);
sp.setPreferredSize(new java.awt.Dimension(600,300));
sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JOptionPane.showMessageDialog(ScriptedPanel.this, sp, "Script execution error", JOptionPane.ERROR_MESSAGE);
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
scriptError(reason, error);
}
});
}
}
public void scriptStarted() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
startButton.setEnabled(false);
stopButton.setEnabled(true);
scriptTextPane.setEnabled(false);
}
});
}
public void scriptStopped() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
startButton.setEnabled(true);
stopButton.setEnabled(false);
scriptTextPane.setEnabled(true);
}
});
}
public void scriptFileChanged(File file) {
saveButton.setEnabled(file != null);
}
public void scriptChanged(String script) {
if (! scriptTextPane.getText().equals(script)) {
scriptTextPane.setText(script);
scriptTextPane.setCaretPosition(0);
}
}
public void scriptLanguageChanged(String language) {
scriptLanguageTextField.setText(language);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JButton loadButton;
private javax.swing.JButton newButton;
private javax.swing.JTextArea outputTextArea;
private javax.swing.JButton saveAsButton;
private javax.swing.JButton saveButton;
private javax.swing.JTextField scriptLanguageTextField;
private javax.swing.JTextPane scriptTextPane;
private javax.swing.JToolBar scriptToolBar;
private javax.swing.JButton startButton;
private javax.swing.JButton stopButton;
// End of variables declaration//GEN-END:variables
}