/***********************************************************************
*
* $CVSHeader$
*
* This file is part of WebScarab, an Open Web Application Security
* Project utility. For details, please see http://www.owasp.org/
*
* Copyright (c) 2002 - 2004 Rogan Dawes
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Getting Source
* ==============
*
* Source for this application is maintained at Sourceforge.net, a
* repository for free software projects.
*
* For details, please see http://www.sourceforge.net/projects/owasp
*
*/
/*
* $Id: BeanShellPanel.java,v 1.5 2005/05/18 15:23:31 rogan Exp $
* ProxyUI.java
*
* Created on February 17, 2003, 9:05 PM
*/
package org.owasp.webscarab.plugin.proxy.swing;
import bsh.EvalError;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import org.owasp.webscarab.plugin.proxy.BeanShell;
import org.owasp.webscarab.plugin.proxy.BeanShellUI;
import org.owasp.webscarab.util.swing.DocumentOutputStream;
import java.io.PrintStream;
import java.util.logging.Logger;
import javax.swing.JPanel;
/**
*
* @author rdawes
*/
public class BeanShellPanel extends javax.swing.JPanel implements ProxyPluginUI, BeanShellUI {
/**
*
*/
private static final long serialVersionUID = 5073008807690179538L;
private BeanShell _beanShell;
private Logger _logger = Logger.getLogger(this.getClass().getName());
private DocumentOutputStream _dos;
private PrintStream _docStream;
/** Creates new form ManualEditPanel */
public BeanShellPanel(BeanShell beanShell) {
_beanShell = beanShell;
initComponents();
scriptTextArea.registerKeyboardAction(new AutoIndentAction(), KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), JComponent.WHEN_FOCUSED);
configure();
_beanShell.setUI(this);
}
public String getPluginName() {
return new String("Bean Shell");
}
public void configure() {
boolean enabled = _beanShell.getEnabled();
enableCheckBox.setSelected(enabled);
scriptTextArea.setEnabled(enabled);
scriptTextArea.setText(_beanShell.getScript());
commitButton.setEnabled(enabled);
_dos = new DocumentOutputStream(10240);
_docStream = new PrintStream(_dos);
logTextArea.setDocument(_dos.getDocument());
}
/** 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;
jSplitPane1 = new javax.swing.JSplitPane();
scriptPanel = new javax.swing.JPanel();
enableCheckBox = new javax.swing.JCheckBox();
jScrollPane1 = new javax.swing.JScrollPane();
scriptTextArea = new javax.swing.JTextArea();
commitButton = new javax.swing.JButton();
jPanel1 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
logTextArea = new javax.swing.JTextArea();
setLayout(new java.awt.BorderLayout());
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setResizeWeight(0.8);
scriptPanel.setLayout(new java.awt.GridBagLayout());
enableCheckBox.setText("Enabled : ");
enableCheckBox.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING);
enableCheckBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
enableCheckBoxActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
scriptPanel.add(enableCheckBox, gridBagConstraints);
scriptTextArea.setFont(new java.awt.Font("Monospaced", 0, 14));
scriptTextArea.setMargin(new java.awt.Insets(5, 5, 5, 5));
jScrollPane1.setViewportView(scriptTextArea);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
scriptPanel.add(jScrollPane1, gridBagConstraints);
commitButton.setText("Commit");
commitButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
commitButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
scriptPanel.add(commitButton, gridBagConstraints);
jSplitPane1.setLeftComponent(scriptPanel);
jPanel1.setLayout(new java.awt.BorderLayout());
logTextArea.setBackground(new java.awt.Color(204, 204, 204));
logTextArea.setEditable(false);
jScrollPane2.setViewportView(logTextArea);
jPanel1.add(jScrollPane2, java.awt.BorderLayout.CENTER);
jSplitPane1.setRightComponent(jPanel1);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
}//GEN-END:initComponents
private void commitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_commitButtonActionPerformed
try {
_beanShell.setScript(scriptTextArea.getText());
} catch (EvalError ee) {
_logger.severe("Script error: " + ee);
}
}//GEN-LAST:event_commitButtonActionPerformed
private void enableCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enableCheckBoxActionPerformed
boolean enabled = enableCheckBox.isSelected();
_beanShell.setEnabled(enabled);
scriptTextArea.setEnabled(enabled);
commitButton.setEnabled(enabled);
}//GEN-LAST:event_enableCheckBoxActionPerformed
public JPanel getPanel() {
return this;
}
public PrintStream getErr() {
return _docStream;
}
public PrintStream getOut() {
return _docStream;
}
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
commitButton.setEnabled(enabled);
enableCheckBox.setEnabled(enabled);
scriptTextArea.setEnabled(enabled && enableCheckBox.isSelected());
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton commitButton;
private javax.swing.JCheckBox enableCheckBox;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JTextArea logTextArea;
private javax.swing.JPanel scriptPanel;
private javax.swing.JTextArea scriptTextArea;
// End of variables declaration//GEN-END:variables
private static class AutoIndentAction extends AbstractAction {
/**
*
*/
private static final long serialVersionUID = 4742439629762409215L;
public void actionPerformed(ActionEvent ae) {
JTextArea comp = (JTextArea)ae.getSource();
Document doc = comp.getDocument();
if(!comp.isEditable())
return;
try {
int line = comp.getLineOfOffset(comp.getCaretPosition());
int start = comp.getLineStartOffset(line);
int end = comp.getLineEndOffset(line);
String str = doc.getText(start, end - start - 1);
String whiteSpace = getLeadingWhiteSpace(str);
doc.insertString(comp.getCaretPosition(), '\n' + whiteSpace, null);
} catch(BadLocationException ex) {
try {
doc.insertString(comp.getCaretPosition(), "\n", null);
} catch(BadLocationException ignore) {
// ignore
}
}
}
/**
* Returns leading white space characters in the specified string.
*/
private String getLeadingWhiteSpace(String str) {
return str.substring(0, getLeadingWhiteSpaceWidth(str));
}
/**
* Returns the number of leading white space characters in the specified string.
*/
private int getLeadingWhiteSpaceWidth(String str) {
int whitespace = 0;
while(whitespace<str.length()) {
char ch = str.charAt(whitespace);
if(ch==' ' || ch=='\t')
whitespace++;
else
break;
}
return whitespace;
}
}
}