/*********************************************************************** * * $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 * */ /* * ResponsePanel.java * * Created on 02 June 2003, 03:09 */ package org.owasp.webscarab.ui.swing; import javax.swing.event.ChangeListener; import javax.swing.event.ChangeEvent; import javax.swing.SwingUtilities; import org.owasp.webscarab.model.Response; import org.owasp.webscarab.ui.swing.editors.TextPanel; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.FileInputStream; import java.io.IOException; import javax.swing.JFrame; import javax.swing.JButton; /** * * @author rdawes */ public class ResponsePanel extends javax.swing.JPanel { /** * */ private static final long serialVersionUID = 4667896968499809048L; private boolean[] _upToDate; private boolean _editable = false; private boolean _modified = false; private int _selected = 0; private Response _response = null; private MessagePanel _messagePanel; private TextPanel _textPanel; private static int _preferred = -1; /** Creates new form ResponsePanel */ public ResponsePanel() { initComponents(); _messagePanel = new MessagePanel(); parsedPanel.remove(messagePanelPlaceHolder); // copy and paste the constraints for the placeholder from initcomponents java.awt.GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; parsedPanel.add(_messagePanel, gridBagConstraints); _textPanel = new TextPanel(); displayTabbedPane.add("Raw", _textPanel); setEditable(false); _upToDate = new boolean[displayTabbedPane.getTabCount()]; invalidatePanels(); updateComponents(_editable); displayTabbedPane.getModel().addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { updateResponse(_selected); _selected = displayTabbedPane.getSelectedIndex(); _preferred = _selected; if (_selected >= 0) { updatePanel(_selected); } } }); if (_preferred > -1 && _preferred < displayTabbedPane.getTabCount()) displayTabbedPane.setSelectedIndex(_preferred); } private void invalidatePanels() { for (int i=0; i<_upToDate.length; i++) { _upToDate[i] = false; } } private void updateResponse(int panel) { if (! _editable || panel < 0) { return; } if (displayTabbedPane.getTitleAt(panel).equals("Parsed")) {// parsed text if (_messagePanel.isModified()) { _response = (Response) _messagePanel.getMessage(); _modified = true; invalidatePanels(); } if (_response == null) { _response = new Response(); } // if _modified _response.setStatus(statusTextField.getText()); _response.setMessage(messageTextField.getText()); _response.setVersion(versionTextField.getText()); } else if (displayTabbedPane.getTitleAt(panel).equals("Raw")) { // raw text if (_textPanel.isModified()) { try { Response r = new Response(); r.parse(new String(_textPanel.getBytes())); _response = r; } catch (Exception e) { System.err.println("Error parsing the rawTextArea, abandoning changes : " + e); } _modified = true; invalidatePanels(); } } _upToDate[panel] = true; } public boolean isModified() { return _modified; } private void updatePanel(int panel) { if (!_upToDate[panel]) { if (displayTabbedPane.getTitleAt(panel).equals("Parsed")) {// parsed text _messagePanel.setMessage(_response); if (_response != null) { statusTextField.setText(_response.getStatus()); messageTextField.setText(_response.getMessage()); versionTextField.setText(_response.getVersion()); } else { statusTextField.setText(""); messageTextField.setText(""); versionTextField.setText(""); } } else if (displayTabbedPane.getTitleAt(panel).equals("Raw")) { // raw text if (_response != null) { _textPanel.setText(null, _response.toString("\n")); } else { _textPanel.setText(null, ""); } } _upToDate[panel] = true; } } public void updateComponents(boolean editable) { java.awt.Color color; if (editable) { color = new java.awt.Color(255, 255, 255); } else { color = new java.awt.Color(204, 204, 204); } statusTextField.setEditable(editable); messageTextField.setEditable(editable); versionTextField.setEditable(editable); statusTextField.setBackground(color); messageTextField.setBackground(color); versionTextField.setBackground(color); } public void setEditable(boolean editable) { _editable = editable; _textPanel.setEditable(editable); _messagePanel.setEditable(editable); } public void setResponse(Response response) { _modified = false; if (response!= null) { _response = new Response(response); } else { _response = null; } invalidatePanels(); if (SwingUtilities.isEventDispatchThread()) { updatePanel(displayTabbedPane.getSelectedIndex()); } else { SwingUtilities.invokeLater(new Runnable() { public void run() { updatePanel(displayTabbedPane.getSelectedIndex()); } }); } } public Response getResponse() { if (_editable) { int panel = displayTabbedPane.getSelectedIndex(); updateResponse(panel); } return _response; } public void selectPanel(String title) { for (int i=0; i<displayTabbedPane.getTabCount(); i++) { String tab = displayTabbedPane.getTitleAt(i); int selected = displayTabbedPane.getSelectedIndex(); if (tab != null && tab.equalsIgnoreCase(title) && i != selected) { displayTabbedPane.setSelectedIndex(i); return; } } } /** 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; displayTabbedPane = new javax.swing.JTabbedPane(); parsedPanel = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); statusTextField = new javax.swing.JTextField(); jLabel4 = new javax.swing.JLabel(); messageTextField = new javax.swing.JTextField(); messagePanelPlaceHolder = new javax.swing.JPanel(); jLabel5 = new javax.swing.JLabel(); versionTextField = new javax.swing.JTextField(); setLayout(new java.awt.BorderLayout()); parsedPanel.setLayout(new java.awt.GridBagLayout()); jLabel3.setLabelFor(statusTextField); jLabel3.setText("Status"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; parsedPanel.add(jLabel3, gridBagConstraints); statusTextField.setEditable(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; parsedPanel.add(statusTextField, gridBagConstraints); jLabel4.setLabelFor(messageTextField); jLabel4.setText("Message"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; parsedPanel.add(jLabel4, gridBagConstraints); messageTextField.setEditable(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); gridBagConstraints.weightx = 1.0; parsedPanel.add(messageTextField, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; parsedPanel.add(messagePanelPlaceHolder, gridBagConstraints); jLabel5.setLabelFor(messageTextField); jLabel5.setText("Version"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; parsedPanel.add(jLabel5, gridBagConstraints); versionTextField.setBackground(new java.awt.Color(204, 204, 204)); versionTextField.setEditable(false); versionTextField.setMinimumSize(new java.awt.Dimension(65, 19)); versionTextField.setPreferredSize(new java.awt.Dimension(65, 19)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; parsedPanel.add(versionTextField, gridBagConstraints); displayTabbedPane.addTab("Parsed", parsedPanel); add(displayTabbedPane, java.awt.BorderLayout.CENTER); }//GEN-END:initComponents public static void main(String[] args) { final JFrame top = new JFrame("Response Panel"); top.getContentPane().setLayout(new java.awt.BorderLayout()); top.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { System.exit(0); } }); final ResponsePanel rp = new ResponsePanel(); rp.setEditable(false); top.getContentPane().add(rp); top.setBounds(100,100,800,600); top.setVisible(true); if (args.length == 0) { JButton button = new JButton("NEXT"); final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); top.getContentPane().add(button, java.awt.BorderLayout.SOUTH); button.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { loadResponse(top, rp, br); } }); loadResponse(top, rp, br); } else if (args.length == 1) { loadResponse(top, rp, args[0]); } } private static void loadResponse(JFrame top, ResponsePanel rp, String file) { Response response = new Response(); try { FileInputStream fis = new FileInputStream(file); response.read(fis); response.flushContentStream(); fis.close(); } catch (IOException ioe) { System.err.println(file + ": IOException: " + ioe.getMessage()); } rp.setResponse(response); top.setTitle(file); } private static void loadResponse(JFrame top, ResponsePanel rp, BufferedReader br) { try { String file = br.readLine(); if (file == null) { System.exit(0); } loadResponse(top, rp, file); } catch (IOException ioe) { System.err.println("IOException: " + ioe.getMessage()); } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTabbedPane displayTabbedPane; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JPanel messagePanelPlaceHolder; private javax.swing.JTextField messageTextField; private javax.swing.JPanel parsedPanel; private javax.swing.JTextField statusTextField; private javax.swing.JTextField versionTextField; // End of variables declaration//GEN-END:variables }