Java tutorial
/*********************************************************************** * * $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 * */ /* * SessionIDPanel.java * * Created on 16 November 2003, 08:21 */ package org.owasp.webscarab.plugin.sessionid.swing; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.math.BigInteger; import java.net.MalformedURLException; import java.text.ParseException; import java.util.Date; import java.util.Map; import java.util.HashMap; import java.util.logging.Logger; import java.util.regex.PatternSyntaxException; import javax.swing.JFileChooser; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.table.AbstractTableModel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.Action; import javax.swing.DefaultListModel; import javax.swing.JOptionPane; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.StandardXYItemRenderer; import org.jfree.data.DomainOrder; import org.jfree.data.general.AbstractSeriesDataset; import org.jfree.data.xy.XYDataset; import org.owasp.webscarab.model.ConversationID; import org.owasp.webscarab.model.HttpUrl; import org.owasp.webscarab.model.Preferences; import org.owasp.webscarab.model.Request; import org.owasp.webscarab.model.Response; import org.owasp.webscarab.plugin.sessionid.SessionID; import org.owasp.webscarab.plugin.sessionid.SessionIDAnalysis; import org.owasp.webscarab.plugin.sessionid.SessionIDListener; import org.owasp.webscarab.plugin.sessionid.SessionIDModel; import org.owasp.webscarab.ui.swing.ConversationListModel; import org.owasp.webscarab.ui.swing.ConversationRenderer; import org.owasp.webscarab.ui.swing.DateRenderer; import org.owasp.webscarab.ui.swing.RequestPanel; import org.owasp.webscarab.ui.swing.ResponsePanel; import org.owasp.webscarab.ui.swing.SwingPluginUI; import org.owasp.webscarab.util.swing.ColumnDataModel; import org.owasp.webscarab.util.swing.ListComboBoxModel; import org.owasp.webscarab.util.swing.SwingWorker; import org.owasp.webscarab.util.swing.TableSorter; /** * * @author rdawes */ public class SessionIDPanel extends JPanel implements SwingPluginUI, SessionIDListener { /** * */ private static final long serialVersionUID = -6717611035456089823L; private static final ColumnDataModel[] CDM = new ColumnDataModel[0]; private final RequestPanel _requestPanel; private final ResponsePanel _responsePanel; private JFreeChart _chart = null; private String _key = null; private SessionIDAnalysis _sa; private SessionIDDataset _sidd; private SessionIDTableModel _tableModel; private ConversationListModel _conversationList; private Map<String, ColumnDataModel<ConversationID>> _conversationColumns = new HashMap<String, ColumnDataModel<ConversationID>>(); private Map<String, ColumnDataModel<HttpUrl>> _urlColumns = new HashMap<String, ColumnDataModel<HttpUrl>>(); private DefaultListModel _sessionIDNames = new DefaultListModel(); private SessionIDModel _model; private Logger _logger = Logger.getLogger(this.getClass().getName()); /** Creates new form SessionIDPanel */ public SessionIDPanel(SessionIDAnalysis sa) { _sa = sa; _model = _sa.getModel(); initComponents(); mainTabbedPane.getModel().addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { mainTabbedPaneStateChanged(e); } }); _requestPanel = new RequestPanel(); _requestPanel.setBorder(new TitledBorder("Request")); _requestPanel.setEditable(true); _requestPanel.setRequest(null); _responsePanel = new ResponsePanel(); _responsePanel.setBorder(new TitledBorder("Response")); conversationSplitPane.setTopComponent(_requestPanel); conversationSplitPane.setBottomComponent(_responsePanel); _sessionIDNames.clear(); for (int i = 0; i < _model.getSessionIDNameCount(); i++) { _sessionIDNames.addElement(_model.getSessionIDName(i)); } requestComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Object o = requestComboBox.getSelectedItem(); if (o instanceof ConversationID) { ConversationID id = (ConversationID) o; Request r = _model.getRequest(id); _requestPanel.setEditable(true); _requestPanel.setRequest(r); _responsePanel.setEditable(false); _responsePanel.setResponse(null); } } }); _tableModel = new SessionIDTableModel(); _sidd = new SessionIDDataset(); _sidd.fireDatasetChanged(); _tableModel.fireTableDataChanged(); nameComboBox.setModel(new ListComboBoxModel(_sessionIDNames)); _model.addModelListener(this); idTable.setModel(new TableSorter(_tableModel, idTable.getTableHeader())); idTable.setDefaultRenderer(Date.class, new DateRenderer()); _conversationList = new ConversationListModel(_model.getConversationModel()); requestComboBox.setModel(new ListComboBoxModel(_conversationList)); requestComboBox.setRenderer(new ConversationRenderer(_model.getConversationModel())); createColumns(); } private void createColumns() { ColumnDataModel<ConversationID> ccdm = new ColumnDataModel<ConversationID>("Cookie", String.class) { public Object getValue(ConversationID key) { if (_model == null) return null; return _model.getRequestCookies(key); } }; _conversationColumns.put("COOKIE", ccdm); ccdm = new ColumnDataModel<ConversationID>("Set-Cookie", String.class) { public Object getValue(ConversationID key) { if (_model == null) return null; return _model.getResponseCookies(key); } }; _conversationColumns.put("SET-COOKIE", ccdm); ColumnDataModel<HttpUrl> ucdm = new ColumnDataModel<HttpUrl>("Set-Cookie", String.class) { public Object getValue(HttpUrl key) { if (_model == null) return null; String value = _model.getResponseCookies(key); return Boolean.valueOf(value != null); } }; _urlColumns.put("SET-COOKIE", ucdm); } /** 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; mainTabbedPane = new javax.swing.JTabbedPane(); collectionPanel = new javax.swing.JPanel(); specPanel = new javax.swing.JPanel(); nameLabel = new javax.swing.JLabel(); nameTextField = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); regexTextField = new javax.swing.JTextField(); bodyCheckBox = new javax.swing.JCheckBox(); conversationPanel = new javax.swing.JPanel(); conversationSplitPane = new javax.swing.JSplitPane(); actionPanel = new javax.swing.JPanel(); testButton = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); sampleSpinner = new javax.swing.JSpinner(); fetchButton = new javax.swing.JButton(); historyPanel = new javax.swing.JPanel(); requestComboBox = new javax.swing.JComboBox(); jLabel9 = new javax.swing.JLabel(); analysisPanel = new javax.swing.JPanel(); jPanel1 = new javax.swing.JPanel(); jLabel8 = new javax.swing.JLabel(); nameComboBox = new javax.swing.JComboBox(); jPanel2 = new javax.swing.JPanel(); clearButton = new javax.swing.JButton(); exportButton = new javax.swing.JButton(); jPanel3 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); idTable = new javax.swing.JTable(); jPanel4 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); minTextField = new javax.swing.JTextField(); maxTextField = new javax.swing.JTextField(); jLabel5 = new javax.swing.JLabel(); rangeTextField = new javax.swing.JTextField(); visualisationPanel = new javax.swing.JPanel(); setLayout(new java.awt.BorderLayout()); collectionPanel.setLayout(new java.awt.GridBagLayout()); specPanel.setLayout(new java.awt.GridBagLayout()); specPanel.setToolTipText("Provide a name and regex to match a sessionid in the Location or body"); nameLabel.setText("Name"); nameLabel.setEnabled(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); specPanel.add(nameLabel, gridBagConstraints); nameTextField.setEnabled(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; specPanel.add(nameTextField, gridBagConstraints); jLabel2.setText("Regex"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); specPanel.add(jLabel2, gridBagConstraints); regexTextField.setToolTipText("The string enclosed in brackets is used as the session id"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; specPanel.add(regexTextField, gridBagConstraints); bodyCheckBox.setText("From message body"); bodyCheckBox.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING); bodyCheckBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bodyCheckBoxActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; specPanel.add(bodyCheckBox, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; collectionPanel.add(specPanel, gridBagConstraints); conversationPanel.setLayout(new java.awt.BorderLayout()); conversationSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); conversationSplitPane.setResizeWeight(0.5); conversationPanel.add(conversationSplitPane, java.awt.BorderLayout.CENTER); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; collectionPanel.add(conversationPanel, gridBagConstraints); testButton.setText("Test"); testButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { testButtonActionPerformed(evt); } }); actionPanel.add(testButton); jLabel3.setText("Samples"); actionPanel.add(jLabel3); sampleSpinner.setMinimumSize(new java.awt.Dimension(61, 24)); sampleSpinner.setPreferredSize(new java.awt.Dimension(61, 24)); actionPanel.add(sampleSpinner); fetchButton.setText("Fetch"); fetchButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { fetchButtonActionPerformed(evt); } }); actionPanel.add(fetchButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.weightx = 0.5; collectionPanel.add(actionPanel, gridBagConstraints); historyPanel.setLayout(new java.awt.GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; historyPanel.add(requestComboBox, gridBagConstraints); jLabel9.setText("Previous Requests :"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); historyPanel.add(jLabel9, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; collectionPanel.add(historyPanel, gridBagConstraints); mainTabbedPane.addTab("Collection", collectionPanel); analysisPanel.setLayout(new java.awt.BorderLayout()); jPanel1.setLayout(new java.awt.BorderLayout()); jLabel8.setText("Session Identifier : "); jPanel1.add(jLabel8, java.awt.BorderLayout.WEST); nameComboBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { nameComboBoxActionPerformed(evt); } }); jPanel1.add(nameComboBox, java.awt.BorderLayout.CENTER); analysisPanel.add(jPanel1, java.awt.BorderLayout.NORTH); clearButton.setText("Clear"); clearButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { clearButtonActionPerformed(evt); } }); jPanel2.add(clearButton); exportButton.setText("Export"); exportButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { exportButtonActionPerformed(evt); } }); jPanel2.add(exportButton); analysisPanel.add(jPanel2, java.awt.BorderLayout.SOUTH); jPanel3.setLayout(new java.awt.BorderLayout()); idTable.setModel(new javax.swing.table.DefaultTableModel(new Object[][] { }, new String[] { })); jScrollPane1.setViewportView(idTable); jPanel3.add(jScrollPane1, java.awt.BorderLayout.CENTER); jPanel4.setLayout(new java.awt.GridBagLayout()); jLabel1.setText("Minimum : "); jPanel4.add(jLabel1, new java.awt.GridBagConstraints()); jLabel4.setText("Maximum : "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; jPanel4.add(jLabel4, gridBagConstraints); minTextField.setEditable(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; jPanel4.add(minTextField, gridBagConstraints); maxTextField.setEditable(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; jPanel4.add(maxTextField, gridBagConstraints); jLabel5.setText("Range : "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; jPanel4.add(jLabel5, gridBagConstraints); rangeTextField.setEditable(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; jPanel4.add(rangeTextField, gridBagConstraints); jPanel3.add(jPanel4, java.awt.BorderLayout.SOUTH); analysisPanel.add(jPanel3, java.awt.BorderLayout.CENTER); mainTabbedPane.addTab("Analysis", analysisPanel); mainTabbedPane.addTab("Visualisation", visualisationPanel); add(mainTabbedPane, java.awt.BorderLayout.CENTER); } // </editor-fold>//GEN-END:initComponents private void exportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportButtonActionPerformed if (_key == null) { JOptionPane.showMessageDialog(null, "Please select the Session ID to export, using the drop down list", "Error", JOptionPane.ERROR_MESSAGE); return; } JFileChooser jfc = new JFileChooser(Preferences.getPreference("WebScarab.DefaultDirectory")); jfc.setDialogTitle("Select a directory to write the sessionids into"); int returnVal = jfc.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { final File file = jfc.getSelectedFile(); try { _sa.exportIDSToCSV(_key, file); } catch (IOException ioe) { JOptionPane.showMessageDialog(null, new String[] { "Error exporting session identifiers", ioe.getMessage() }, "Error", JOptionPane.ERROR_MESSAGE); } } File dir = jfc.getCurrentDirectory(); if (dir != null) Preferences.setPreference("WebScarab.DefaultDirectory", dir.getAbsolutePath()); }//GEN-LAST:event_exportButtonActionPerformed private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearButtonActionPerformed if (_key == null) { JOptionPane.showMessageDialog(null, "Please select the Session ID to clear, using the drop down list", "Error", JOptionPane.ERROR_MESSAGE); return; } _sa.clearSessionIDs(_key); }//GEN-LAST:event_clearButtonActionPerformed private void bodyCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bodyCheckBoxActionPerformed nameLabel.setEnabled(bodyCheckBox.isSelected()); nameTextField.setEnabled(bodyCheckBox.isSelected()); if (!bodyCheckBox.isSelected()) nameTextField.setText(""); }//GEN-LAST:event_bodyCheckBoxActionPerformed private void testButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_testButtonActionPerformed try { final Request request = _requestPanel.getRequest(); if (request == null) { return; } testButton.setEnabled(false); final Component parent = this; new SwingWorker() { public Object construct() { try { _sa.setRequest(request); _sa.fetchResponse(); return _sa.getResponse(); } catch (IOException ioe) { return ioe; } } //Runs on the event-dispatching thread. public void finished() { Object obj = getValue(); if (obj instanceof Response) { Response response = (Response) getValue(); if (response != null) { _responsePanel.setResponse(response); String name = nameTextField.getText(); String regex = regexTextField.getText(); try { Map<String, SessionID> ids = _sa.getIDsFromResponse(response, name, regex); String[] keys = ids.keySet().toArray(new String[0]); for (int i = 0; i < keys.length; i++) { SessionID id = ids.get(keys[i]); keys[i] = keys[i] + " = " + id.getValue(); } if (keys.length == 0) keys = new String[] { "No session identifiers found!" }; JOptionPane.showMessageDialog(parent, keys, "Extracted Sessionids", JOptionPane.INFORMATION_MESSAGE); } catch (PatternSyntaxException pse) { JOptionPane.showMessageDialog(parent, pse.getMessage(), "Patter Syntax Exception", JOptionPane.WARNING_MESSAGE); } } } else if (obj instanceof Exception) { JOptionPane.showMessageDialog(null, new String[] { "Error fetching response: ", obj.toString() }, "Error", JOptionPane.ERROR_MESSAGE); _logger.severe("Exception fetching response: " + obj); } testButton.setEnabled(true); } }.start(); } catch (MalformedURLException mue) { JOptionPane.showMessageDialog(this, new String[] { "The URL requested is malformed", mue.getMessage() }, "Malformed URL", JOptionPane.ERROR_MESSAGE); } catch (ParseException pe) { JOptionPane.showMessageDialog(this, new String[] { "The request is malformed", pe.getMessage() }, "Malformed Request", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_testButtonActionPerformed private void mainTabbedPaneStateChanged(ChangeEvent evt) { int selected = mainTabbedPane.getSelectedIndex(); if (mainTabbedPane.getTitleAt(selected).equals("Visualisation")) { if (_chart == null) { // subject to race condition! new SwingWorker() { public Object construct() { return createChart(_sidd); } public void finished() { _chart = (JFreeChart) get(); /* ineffective! WHY?! FIXME!! _chart.getXYPlot().getDomainAxis().setAutoRange(true); _chart.getXYPlot().getDomainAxis().setAutoTickUnitSelection(true); _chart.getXYPlot().getDomainAxis().setTickLabelsVisible(true); */ visualisationPanel.add(new ChartPanel(_chart, 900, 500, 600, 400, 1280, 1024, true, true, true, false, true, true)); visualisationPanel.doLayout(); } }.start(); } } } private JFreeChart createChart(XYDataset data) { ValueAxis timeAxis = new DateAxis("Date/Time"); timeAxis.setLowerMargin(0.02); // reduce the default margins on the time axis timeAxis.setUpperMargin(0.02); NumberAxis valueAxis = new NumberAxis("Value"); valueAxis.setAutoRangeIncludesZero(false); // override default XYPlot plot = new XYPlot(data, timeAxis, valueAxis, null); plot.setRenderer(new StandardXYItemRenderer(StandardXYItemRenderer.SHAPES, null, null)); JFreeChart chart = new JFreeChart("Cookie values over time", JFreeChart.DEFAULT_TITLE_FONT, plot, false); return chart; } private void nameComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nameComboBoxActionPerformed _key = (String) nameComboBox.getSelectedItem(); _tableModel.fireTableDataChanged(); _sidd.fireDatasetChanged(); updateStats(); }//GEN-LAST:event_nameComboBoxActionPerformed private void fetchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fetchButtonActionPerformed try { Request request = _requestPanel.getRequest(); if (request == null) { _logger.warning("Request was null in fetch request"); return; } String name = nameTextField.getText(); String regex = regexTextField.getText(); int count = ((Integer) sampleSpinner.getValue()).intValue(); try { _sa.fetch(request, name, regex, count); } catch (PatternSyntaxException pse) { JOptionPane.showMessageDialog(this, pse.getMessage(), "Pattern Syntax Exception", JOptionPane.WARNING_MESSAGE); } } catch (MalformedURLException mue) { JOptionPane.showMessageDialog(this, new String[] { "The URL requested is malformed", mue.getMessage() }, "Malformed URL", JOptionPane.ERROR_MESSAGE); } catch (ParseException pe) { JOptionPane.showMessageDialog(this, new String[] { "The request is malformed", pe.getMessage() }, "Malformed Request", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_fetchButtonActionPerformed public void sessionIDAdded(final String key, final int index) { if (SwingUtilities.isEventDispatchThread()) { if (index == 0) { _sessionIDNames.addElement(key); } if (key.equals(_key)) { _sidd.fireDatasetChanged(); _tableModel.fireTableRowsInserted(index, index); } } else { SwingUtilities.invokeLater(new Runnable() { public void run() { sessionIDAdded(key, index); } }); } } public void sessionIDsChanged() { if (SwingUtilities.isEventDispatchThread()) { _key = null; _sessionIDNames.clear(); int count = _model.getSessionIDNameCount(); for (int i = 0; i < count; i++) { _sessionIDNames.addElement(_model.getSessionIDName(i)); } _sidd.fireDatasetChanged(); _tableModel.fireTableDataChanged(); updateStats(); } else { SwingUtilities.invokeLater(new Runnable() { public void run() { sessionIDsChanged(); } }); } } private void updateStats() { if (_key == null) { maxTextField.setText(""); minTextField.setText(""); rangeTextField.setText(""); return; } BigInteger min = _model.getMinimumValue(_key); BigInteger max = _model.getMaximumValue(_key); if (min != null) { minTextField.setText(min.toString()); } else { minTextField.setText(""); } if (max != null) { maxTextField.setText(max.toString()); } else { maxTextField.setText(""); } if (min != null && max != null) { BigInteger range = max.subtract(min); rangeTextField.setText(Float.toString(range.floatValue())); } else { rangeTextField.setText(""); } } public void calculatorChanged(final String key) { if (key.equals(_key)) { if (SwingUtilities.isEventDispatchThread()) { _sidd.fireDatasetChanged(); _tableModel.fireTableDataChanged(); updateStats(); } else { SwingUtilities.invokeLater(new Runnable() { public void run() { calculatorChanged(key); } }); } } } public JPanel getPanel() { return this; } public String getPluginName() { return "SessionID Analysis"; } public Action[] getConversationActions() { return null; } public Action[] getUrlActions() { return null; } public void setEnabled(final boolean enabled) { if (SwingUtilities.isEventDispatchThread()) { mainTabbedPane.setEnabled(enabled); testButton.setEnabled(enabled); fetchButton.setEnabled(enabled); // FIXME do the rest } else { SwingUtilities.invokeLater(new Runnable() { public void run() { setEnabled(enabled); } }); } } public ColumnDataModel<ConversationID>[] getConversationColumns() { return (ColumnDataModel<ConversationID>[]) _conversationColumns.values().toArray(CDM); } public ColumnDataModel<HttpUrl>[] getUrlColumns() { return (ColumnDataModel<HttpUrl>[]) _urlColumns.values().toArray(CDM); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel actionPanel; private javax.swing.JPanel analysisPanel; private javax.swing.JCheckBox bodyCheckBox; private javax.swing.JButton clearButton; private javax.swing.JPanel collectionPanel; private javax.swing.JPanel conversationPanel; private javax.swing.JSplitPane conversationSplitPane; private javax.swing.JButton exportButton; private javax.swing.JButton fetchButton; private javax.swing.JPanel historyPanel; private javax.swing.JTable idTable; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel9; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTabbedPane mainTabbedPane; private javax.swing.JTextField maxTextField; private javax.swing.JTextField minTextField; private javax.swing.JComboBox nameComboBox; private javax.swing.JLabel nameLabel; private javax.swing.JTextField nameTextField; private javax.swing.JTextField rangeTextField; private javax.swing.JTextField regexTextField; private javax.swing.JComboBox requestComboBox; private javax.swing.JSpinner sampleSpinner; private javax.swing.JPanel specPanel; private javax.swing.JButton testButton; private javax.swing.JPanel visualisationPanel; // End of variables declaration//GEN-END:variables private class SessionIDDataset extends AbstractSeriesDataset implements XYDataset { /** * */ private static final long serialVersionUID = -8276132180435935115L; public int getSeriesCount() { if (_key == null) return 0; return 1; } public String getSeriesName(int param) { return "Cookie value"; } public int getItemCount(int series) { if (_key == null) return 0; return _model.getSessionIDCount(_key); } public double getXValue(int series, int item) { SessionID id = _model.getSessionIDAt(_key, item); return id.getDate().getTime(); } public double getYValue(int series, int item) { SessionID id = _model.getSessionIDAt(_key, item); BigInteger bi = _model.getSessionIDValue(_key, id); if (bi == null) { return 0; } else { return bi.doubleValue(); } } public void calculatorChanged(String key) { if (key.equals(_key)) fireDatasetChanged(); } public void sessionIDAdded(String key, int index) { if (key.equals(_key)) fireDatasetChanged(); } public void fireDatasetChanged() { super.fireDatasetChanged(); } public Comparable getSeriesKey(int series) { return _key; } public DomainOrder getDomainOrder() { return DomainOrder.NONE; } public Number getX(int series, int item) { SessionID id = _model.getSessionIDAt(_key, item); return new Long(id.getDate().getTime()); } public Number getY(int series, int item) { return new Double(getYValue(series, item)); } } public class SessionIDTableModel extends AbstractTableModel { /** * */ private static final long serialVersionUID = 1799339015349456174L; private String[] _columnNames = new String[] { "Date", "Value", "Numeric", "Difference" }; private Class<?>[] _columnClass = new Class[] { Date.class, String.class, BigInteger.class, BigInteger.class }; public int getColumnCount() { return _columnNames.length; } public int getRowCount() { if (_key == null) return 0; return _model.getSessionIDCount(_key); } public Object getValueAt(int rowIndex, int columnIndex) { if (_key == null) return null; SessionID id = _model.getSessionIDAt(_key, rowIndex); switch (columnIndex) { case 0: return id.getDate(); case 1: return id.getValue(); case 2: return _model.getSessionIDValue(_key, id); case 3: if (rowIndex == 0) { return null; } else { SessionID prev = _model.getSessionIDAt(_key, rowIndex - 1); BigInteger prevValue = _model.getSessionIDValue(_key, prev); BigInteger now = _model.getSessionIDValue(_key, id); if (now != null && prevValue != null) { return now.subtract(prevValue); } else { return null; } } default: return null; } } public String getColumnName(int columnIndex) { return _columnNames[columnIndex]; } public Class<?> getColumnClass(int columnIndex) { return _columnClass[columnIndex]; } } }