You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by Sanjiva Weerawarana <sa...@opensource.lk> on 2005/09/17 05:34:32 UTC
Re: svn commit: r289655 [1/2] - in
/webservices/axis2/trunk/java/modules: core/src/org/apache/axis2/util/
tool/src/org/apache/axis2/tool/tracer/
Cool! Glad to have this on board :).
Stefano, FYI: Axis tcpmon was an improvement of tcptunnel .. a program I
wrote in mid 90s to help me read mail from multiple machines at home
(over a dialup connection .. basically cheap connection sharing /
routing). I added an AWT gui to that when doing Apache SOAP in 99/00.
The tcptunnel tool is still distributed as part of Apache SOAP. (Its all
of 2 classes .. see [1] TcpTunnel.java and TcpTunnelGui.java. (It could
run without the GUI .. which is what I originally wrote to tunnel SMTP
and POP.)
Dims, now that we're doing this, why don't we move this to ws-commons?
Also, the name HTTPTracer isn't accurate .. it can of course be used to
trace any TCP stream, including POP and SMTP :).
Sanjiva.
[1]
http://cvs.apache.org/viewcvs.cgi/ws-soap/java/src/org/apache/soap/util/net/
On Fri, 2005-09-16 at 21:30 +0000, dims@apache.org wrote:
> Author: dims
> Date: Fri Sep 16 14:30:29 2005
> New Revision: 289655
>
> URL: http://svn.apache.org/viewcvs?rev=289655&view=rev
> Log:
> tcpmon should not be in core, it is a tool. Hence morphing tcpmon to HTTPTracer (courtesy of stefano - http://simile.mit.edu/httptracer/index.html).
>
> Here's some additional info from Stefano.
> ===========================================================================
> Davanum Srinivas wrote:
> > Hi Stefano,
> >
> > Can we "borrow" the code back? We're cutting Axis 1.3 and sounds like
> > a good thing to update tcpmon :)
>
> Absolutely. I just added a few minor things:
>
> 1) refactored a little (to avoid having 20 classes in one file)
>
> 2) change the name (tcpmon is misleading, IMO)
>
> 3) added the build file and all that stuff
>
> 4) added timing of responses (that needs work).
>
> the code is still licensed under the AL 2.0, so do whatever you want
> with it :-)
>
> > -- dims
> >
> > PS: FYI, despite your ample warnings, i quit my day job and am knee
> > deep in web services (http://wso2.com)
>
> Well, good luck :-)
> ===========================================================================
>
> --
> Stefano.
>
>
> Added:
> webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/
> webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/AdminPane.java
> webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Connection.java
> webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/HTTPTracer.java
> webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Listener.java
> webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/SlowLinkSimulator.java
> webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/SocketRR.java
> webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/SocketWaiter.java
> webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/httptracer.properties
> Removed:
> webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/util/tcpmon.java
> webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/util/tcpmon.properties
>
> Added: webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/AdminPane.java
> URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/AdminPane.java?rev=289655&view=auto
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/AdminPane.java (added)
> +++ webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/AdminPane.java Fri Sep 16 14:30:29 2005
> @@ -0,0 +1,625 @@
> +/*
> + * Copyright 2004,2005 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +
> +package org.apache.axis2.tool.tracer;
> +
> +import javax.swing.Box;
> +import javax.swing.ButtonGroup;
> +import javax.swing.JButton;
> +import javax.swing.JCheckBox;
> +import javax.swing.JLabel;
> +import javax.swing.JPanel;
> +import javax.swing.JRadioButton;
> +import javax.swing.JScrollPane;
> +import javax.swing.JTabbedPane;
> +import javax.swing.JTextField;
> +import javax.swing.border.TitledBorder;
> +import javax.swing.text.AttributeSet;
> +import javax.swing.text.BadLocationException;
> +import javax.swing.text.Document;
> +import javax.swing.text.PlainDocument;
> +import java.awt.BorderLayout;
> +import java.awt.Color;
> +import java.awt.Dimension;
> +import java.awt.GridBagConstraints;
> +import java.awt.GridBagLayout;
> +import java.awt.event.ActionEvent;
> +import java.awt.event.ActionListener;
> +
> +/**
> + * this is the admin page
> + */
> +class AdminPane extends JPanel {
> +
> + /**
> + * Field listenerButton, proxyButton
> + */
> + public JRadioButton listenerButton, proxyButton;
> +
> + /**
> + * Field hostLabel, tportLabel
> + */
> + public JLabel hostLabel, tportLabel;
> +
> + /**
> + * Field port
> + */
> + public NumberField port;
> +
> + /**
> + * Field host
> + */
> + public HostnameField host;
> +
> + /**
> + * Field tport
> + */
> + public NumberField tport;
> +
> + /**
> + * Field noteb
> + */
> + public JTabbedPane noteb;
> +
> + /**
> + * Field HTTPProxyBox
> + */
> + public JCheckBox HTTPProxyBox;
> +
> + /**
> + * Field HTTPProxyHost
> + */
> + public HostnameField HTTPProxyHost;
> +
> + /**
> + * Field HTTPProxyPort
> + */
> + public NumberField HTTPProxyPort;
> +
> + /**
> + * Field HTTPProxyHostLabel, HTTPProxyPortLabel
> + */
> + public JLabel HTTPProxyHostLabel, HTTPProxyPortLabel;
> +
> + /**
> + * Field delayTimeLabel, delayBytesLabel
> + */
> + public JLabel delayTimeLabel, delayBytesLabel;
> +
> + /**
> + * Field delayTime, delayBytes
> + */
> + public NumberField delayTime, delayBytes;
> +
> + /**
> + * Field delayBox
> + */
> + public JCheckBox delayBox;
> +
> + /**
> + * Constructor AdminPage
> + *
> + * @param notebook
> + * @param name
> + */
> + public AdminPane(JTabbedPane notebook, String name) {
> + JPanel mainPane = null;
> + JButton addButton = null;
> + this.setLayout(new BorderLayout());
> + noteb = notebook;
> + GridBagLayout layout = new GridBagLayout();
> + GridBagConstraints c = new GridBagConstraints();
> + mainPane = new JPanel(layout);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + mainPane.add(new JLabel(HTTPTracer.getMessage("newTCP00",
> + "Create a new HTTP tracer...")
> + + " "), c);
> +
> + // Add some blank space
> + mainPane.add(Box.createRigidArea(new Dimension(1, 5)), c);
> +
> + // The listener info
> + // /////////////////////////////////////////////////////////////////
> + JPanel tmpPanel = new JPanel(new GridBagLayout());
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = 1;
> + tmpPanel.add(new JLabel(HTTPTracer.getMessage("listenPort00",
> + "Listen Port #")
> + + " "), c);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + tmpPanel.add(port = new NumberField(4), c);
> + mainPane.add(tmpPanel, c);
> + mainPane.add(Box.createRigidArea(new Dimension(1, 5)), c);
> +
> + // Group for the radio buttons
> + ButtonGroup btns = new ButtonGroup();
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + mainPane.add(new JLabel(HTTPTracer.getMessage("actAs00", "Act as a...")), c);
> +
> + // Target Host/Port section
> + // /////////////////////////////////////////////////////////////////
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + final String listener = HTTPTracer.getMessage("listener00", "Listener");
> + mainPane.add(listenerButton = new JRadioButton(listener), c);
> + btns.add(listenerButton);
> + listenerButton.setSelected(true);
> + listenerButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (listener.equals(event.getActionCommand())) {
> + boolean state = listenerButton.isSelected();
> + tport.setEnabled(state);
> + host.setEnabled(state);
> + hostLabel.setForeground(state
> + ? Color.black
> + : Color.gray);
> + tportLabel.setForeground(state
> + ? Color.black
> + : Color.gray);
> + }
> + }
> + });
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = 1;
> + mainPane.add(Box.createRigidArea(new Dimension(25, 0)));
> + mainPane.add(hostLabel =
> + new JLabel(HTTPTracer.getMessage("targetHostname00",
> + "Target Hostname")
> + + " "), c);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + host = new HostnameField(30);
> + mainPane.add(host, c);
> + host.setText(HTTPTracer.DEFAULT_HOST);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = 1;
> + mainPane.add(Box.createRigidArea(new Dimension(25, 0)));
> + mainPane.add(tportLabel =
> + new JLabel(HTTPTracer.getMessage("targetPort00", "Target Port #")
> + + " "), c);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + tport = new NumberField(4);
> + mainPane.add(tport, c);
> + tport.setValue(HTTPTracer.DEFAULT_PORT);
> +
> + // Act as proxy section
> + // /////////////////////////////////////////////////////////////////
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + final String proxy = HTTPTracer.getMessage("proxy00", "Proxy");
> + mainPane.add(proxyButton = new JRadioButton(proxy), c);
> + btns.add(proxyButton);
> + proxyButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (proxy.equals(event.getActionCommand())) {
> + boolean state = proxyButton.isSelected();
> + tport.setEnabled(!state);
> + host.setEnabled(!state);
> + hostLabel.setForeground(state
> + ? Color.gray
> + : Color.black);
> + tportLabel.setForeground(state
> + ? Color.gray
> + : Color.black);
> + }
> + }
> + });
> +
> + // Spacer
> + // ///////////////////////////////////////////////////////////////
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + mainPane.add(Box.createRigidArea(new Dimension(1, 10)), c);
> +
> + // Options section
> + // /////////////////////////////////////////////////////////////////
> + JPanel opts = new JPanel(new GridBagLayout());
> + opts.setBorder(new TitledBorder(HTTPTracer.getMessage("options00",
> + "Options")));
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + mainPane.add(opts, c);
> +
> + // HTTP Proxy Support section
> + // /////////////////////////////////////////////////////////////////
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + final String proxySupport = HTTPTracer.getMessage("proxySupport00",
> + "HTTP Proxy Support");
> + opts.add(HTTPProxyBox = new JCheckBox(proxySupport), c);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = 1;
> + opts.add(HTTPProxyHostLabel =
> + new JLabel(HTTPTracer.getMessage("hostname00", "Hostname") + " "),
> + c);
> + HTTPProxyHostLabel.setForeground(Color.gray);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + opts.add(HTTPProxyHost = new HostnameField(30), c);
> + HTTPProxyHost.setEnabled(false);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = 1;
> + opts.add(HTTPProxyPortLabel =
> + new JLabel(HTTPTracer.getMessage("port00", "Port #") + " "), c);
> + HTTPProxyPortLabel.setForeground(Color.gray);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + opts.add(HTTPProxyPort = new NumberField(4), c);
> + HTTPProxyPort.setEnabled(false);
> + HTTPProxyBox.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (proxySupport.equals(event.getActionCommand())) {
> + boolean b = HTTPProxyBox.isSelected();
> + Color color = b
> + ? Color.black
> + : Color.gray;
> + HTTPProxyHost.setEnabled(b);
> + HTTPProxyPort.setEnabled(b);
> + HTTPProxyHostLabel.setForeground(color);
> + HTTPProxyPortLabel.setForeground(color);
> + }
> + }
> + });
> +
> + // Set default proxy values...
> + String tmp = System.getProperty("http.proxyHost");
> + if ((tmp != null) && tmp.equals("")) {
> + tmp = null;
> + }
> + HTTPProxyBox.setSelected(tmp != null);
> + HTTPProxyHost.setEnabled(tmp != null);
> + HTTPProxyPort.setEnabled(tmp != null);
> + HTTPProxyHostLabel.setForeground((tmp != null)
> + ? Color.black
> + : Color.gray);
> + HTTPProxyPortLabel.setForeground((tmp != null)
> + ? Color.black
> + : Color.gray);
> + if (tmp != null) {
> + HTTPProxyBox.setSelected(true);
> + HTTPProxyHost.setText(tmp);
> + tmp = System.getProperty("http.proxyPort");
> + if ((tmp != null) && tmp.equals("")) {
> + tmp = null;
> + }
> + if (tmp == null) {
> + tmp = "80";
> + }
> + HTTPProxyPort.setText(tmp);
> + }
> +
> + // add byte delay fields
> + opts.add(Box.createRigidArea(new Dimension(1, 10)), c);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + final String delaySupport = HTTPTracer.getMessage("delay00",
> + "Simulate Slow Connection");
> + opts.add(delayBox = new JCheckBox(delaySupport), c);
> +
> + // bytes per pause
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = 1;
> + delayBytesLabel = new JLabel(HTTPTracer.getMessage("delay01",
> + "Bytes per Pause"));
> + opts.add(delayBytesLabel, c);
> + delayBytesLabel.setForeground(Color.gray);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + opts.add(delayBytes = new NumberField(6), c);
> + delayBytes.setEnabled(false);
> +
> + // delay interval
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = 1;
> + delayTimeLabel = new JLabel(HTTPTracer.getMessage("delay02",
> + "Delay in Milliseconds"));
> + opts.add(delayTimeLabel, c);
> + delayTimeLabel.setForeground(Color.gray);
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + opts.add(delayTime = new NumberField(6), c);
> + delayTime.setEnabled(false);
> +
> + // enabler callback
> + delayBox.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (delaySupport.equals(event.getActionCommand())) {
> + boolean b = delayBox.isSelected();
> + Color color = b
> + ? Color.black
> + : Color.gray;
> + delayBytes.setEnabled(b);
> + delayTime.setEnabled(b);
> + delayBytesLabel.setForeground(color);
> + delayTimeLabel.setForeground(color);
> + }
> + }
> + });
> +
> + // Spacer
> + // ////////////////////////////////////////////////////////////////
> + mainPane.add(Box.createRigidArea(new Dimension(1, 10)), c);
> +
> + // ADD Button
> + // /////////////////////////////////////////////////////////////////
> + c.anchor = GridBagConstraints.WEST;
> + c.gridwidth = GridBagConstraints.REMAINDER;
> + final String add = HTTPTracer.getMessage("add00", "Add");
> + mainPane.add(addButton = new JButton(add), c);
> + this.add(new JScrollPane(mainPane), BorderLayout.CENTER);
> +
> + // addButton.setEnabled( false );
> + addButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (add.equals(event.getActionCommand())) {
> + String text;
> + Listener l = null;
> + int lPort;
> + lPort = port.getValue(0);
> + if (lPort == 0) {
> +
> + // no port, button does nothing
> + return;
> + }
> + String tHost = host.getText();
> + int tPort = 0;
> + tPort = tport.getValue(0);
> + SlowLinkSimulator slowLink = null;
> + if (delayBox.isSelected()) {
> + int bytes = delayBytes.getValue(0);
> + int time = delayTime.getValue(0);
> + slowLink = new SlowLinkSimulator(bytes, time);
> + }
> + try {
> + l = new Listener(noteb, null, lPort, tHost, tPort,
> + proxyButton.isSelected(),
> + slowLink);
> + } catch (Exception e) {
> + e.printStackTrace();
> + }
> +
> + // Pick-up the HTTP Proxy settings
> + // /////////////////////////////////////////////////
> + text = HTTPProxyHost.getText();
> + if ("".equals(text)) {
> + text = null;
> + }
> + l.HTTPProxyHost = text;
> + text = HTTPProxyPort.getText();
> + int proxyPort = HTTPProxyPort.getValue(-1);
> + if (proxyPort != -1) {
> + l.HTTPProxyPort = Integer.parseInt(text);
> + }
> +
> + // reset the port
> + port.setText(null);
> + }
> + }
> + });
> + notebook.addTab(name, this);
> + notebook.repaint();
> + notebook.setSelectedIndex(notebook.getTabCount() - 1);
> + }
> +
> + /**
> + * a text field with a restricted set of characters
> + */
> + static class RestrictedTextField extends JTextField {
> + /**
> + * Field validText
> + */
> + protected String validText;
> +
> + /**
> + * Constructor RestrictedTextField
> + *
> + * @param validText
> + */
> + public RestrictedTextField(String validText) {
> + setValidText(validText);
> + }
> +
> + /**
> + * Constructor RestrictedTextField
> + *
> + * @param columns
> + * @param validText
> + */
> + public RestrictedTextField(int columns, String validText) {
> + super(columns);
> + setValidText(validText);
> + }
> +
> + /**
> + * Constructor RestrictedTextField
> + *
> + * @param text
> + * @param validText
> + */
> + public RestrictedTextField(String text, String validText) {
> + super(text);
> + setValidText(validText);
> + }
> +
> + /**
> + * Constructor RestrictedTextField
> + *
> + * @param text
> + * @param columns
> + * @param validText
> + */
> + public RestrictedTextField(String text, int columns, String validText) {
> + super(text, columns);
> + setValidText(validText);
> + }
> +
> + /**
> + * Method setValidText
> + *
> + * @param validText
> + */
> + private void setValidText(String validText) {
> + this.validText = validText;
> + }
> +
> + /**
> + * fascinatingly, this method is called in the super() constructor,
> + * meaning before we are fully initialized. C++ doesnt actually permit
> + * such a situation, but java clearly does...
> + *
> + * @return a new document
> + */
> + public Document createDefaultModel() {
> + return new RestrictedDocument();
> + }
> +
> + /**
> + * this class strips out invaid chars
> + */
> + class RestrictedDocument extends PlainDocument {
> + /**
> + * Constructs a plain text document. A default model using
> + * <code>GapContent</code> is constructed and set.
> + */
> + public RestrictedDocument() {
> + }
> +
> + /**
> + * add a string; only those chars in the valid text list are allowed
> + *
> + * @param offset
> + * @param string
> + * @param attributes
> + * @throws BadLocationException
> + */
> + public void insertString(int offset,
> + String string,
> + AttributeSet attributes)
> + throws BadLocationException {
> + if (string == null) {
> + return;
> + }
> + int len = string.length();
> + StringBuffer buffer = new StringBuffer(string.length());
> + for (int i = 0; i < len; i++) {
> + char ch = string.charAt(i);
> + if (validText.indexOf(ch) >= 0) {
> + buffer.append(ch);
> + }
> + }
> + super.insertString(offset, new String(buffer), attributes);
> + }
> + } // end class NumericDocument
> + }
> +
> + /**
> + * because we cant use Java1.4's JFormattedTextField, here is
> + * a class that accepts numbers only
> + */
> + static class NumberField extends RestrictedTextField {
> + /**
> + * Field VALID_TEXT
> + */
> + private static final String VALID_TEXT = "0123456789";
> +
> + /**
> + * Constructs a new <code>TextField</code>. A default model is created,
> + * the initial string is <code>null</code>,
> + * and the number of columns is set to 0.
> + */
> + public NumberField() {
> + super(VALID_TEXT);
> + }
> +
> + /**
> + * Constructs a new empty <code>TextField</code> with the specified
> + * number of columns.
> + * A default model is created and the initial string is set to
> + * <code>null</code>.
> + *
> + * @param columns the number of columns to use to calculate
> + * the preferred width; if columns is set to zero, the
> + * preferred width will be whatever naturally results from
> + * the component implementation
> + */
> + public NumberField(int columns) {
> + super(columns, VALID_TEXT);
> + }
> +
> + /**
> + * get the int value of a field, any invalid (non int) field returns
> + * the default
> + *
> + * @param def default value
> + * @return the field contents
> + */
> + public int getValue(int def) {
> + int result = def;
> + String text = getText();
> + if ((text != null) && (text.length() != 0)) {
> + try {
> + result = Integer.parseInt(text);
> + } catch (NumberFormatException e) {
> + }
> + }
> + return result;
> + }
> +
> + /**
> + * set the text to a numeric value
> + *
> + * @param value number to assign
> + */
> + public void setValue(int value) {
> + setText(Integer.toString(value));
> + }
> + } // end class NumericTextField
> +
> + /**
> + * hostname fields
> + */
> + static class HostnameField extends RestrictedTextField {
> +
> + // list of valid chars in a hostname
> +
> + /**
> + * Field VALID_TEXT
> + */
> + private static final String VALID_TEXT =
> + "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWZYZ-.";
> +
> + /**
> + * Constructor HostnameField
> + *
> + * @param columns
> + */
> + public HostnameField(int columns) {
> + super(columns, VALID_TEXT);
> + }
> +
> + /**
> + * Constructor HostnameField
> + */
> + public HostnameField() {
> + super(VALID_TEXT);
> + }
> + }
> +}
> +
>
> Added: webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Connection.java
> URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Connection.java?rev=289655&view=auto
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Connection.java (added)
> +++ webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Connection.java Fri Sep 16 14:30:29 2005
> @@ -0,0 +1,505 @@
> +/*
> + * Copyright 2004,2005 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +
> +package org.apache.axis2.tool.tracer;
> +
> +import javax.swing.JScrollPane;
> +import javax.swing.JTextArea;
> +import javax.swing.ListSelectionModel;
> +import java.io.InputStream;
> +import java.io.OutputStream;
> +import java.io.PrintWriter;
> +import java.io.StringWriter;
> +import java.net.Socket;
> +import java.net.URL;
> +import java.text.DateFormat;
> +import java.text.SimpleDateFormat;
> +import java.util.Date;
> +
> +/**
> + * a connection listens to a single current connection
> + */
> +class Connection extends Thread {
> +
> + /**
> + * Field listener
> + */
> + Listener listener;
> +
> + /**
> + * Field active
> + */
> + boolean active;
> +
> + /**
> + * Field fromHost
> + */
> + String fromHost;
> +
> + /**
> + * Field time
> + */
> + String time;
> +
> + /**
> + * Field elapsed time
> + */
> + long elapsedTime;
> +
> + /**
> + * Field inputText
> + */
> + JTextArea inputText = null;
> +
> + /**
> + * Field inputScroll
> + */
> + JScrollPane inputScroll = null;
> +
> + /**
> + * Field outputText
> + */
> + JTextArea outputText = null;
> +
> + /**
> + * Field outputScroll
> + */
> + JScrollPane outputScroll = null;
> +
> + /**
> + * Field inSocket
> + */
> + Socket inSocket = null;
> +
> + /**
> + * Field outSocket
> + */
> + Socket outSocket = null;
> +
> + /**
> + * Field clientThread
> + */
> + Thread clientThread = null;
> +
> + /**
> + * Field serverThread
> + */
> + Thread serverThread = null;
> +
> + /**
> + * Field rr1
> + */
> + SocketRR rr1 = null;
> +
> + /**
> + * Field rr2
> + */
> + SocketRR rr2 = null;
> +
> + /**
> + * Field inputStream
> + */
> + InputStream inputStream = null;
> +
> + /**
> + * Field HTTPProxyHost
> + */
> + String HTTPProxyHost = null;
> +
> + /**
> + * Field HTTPProxyPort
> + */
> + int HTTPProxyPort = 80;
> +
> + /**
> + * Field slowLink
> + */
> + private SlowLinkSimulator slowLink;
> +
> + /**
> + * Constructor Connection
> + *
> + * @param l
> + */
> + public Connection(Listener l) {
> + listener = l;
> + HTTPProxyHost = l.HTTPProxyHost;
> + HTTPProxyPort = l.HTTPProxyPort;
> + slowLink = l.slowLink;
> + }
> +
> + /**
> + * Constructor Connection
> + *
> + * @param l
> + * @param s
> + */
> + public Connection(Listener l, Socket s) {
> + this(l);
> + inSocket = s;
> + start();
> + }
> +
> + /**
> + * Constructor Connection
> + *
> + * @param l
> + * @param in
> + */
> + public Connection(Listener l, InputStream in) {
> + this(l);
> + inputStream = in;
> + start();
> + }
> +
> + /**
> + * Method run
> + */
> + public void run() {
> + try {
> + active = true;
> + HTTPProxyHost = System.getProperty("http.proxyHost");
> + if ((HTTPProxyHost != null) && HTTPProxyHost.equals("")) {
> + HTTPProxyHost = null;
> + }
> + if (HTTPProxyHost != null) {
> + String tmp = System.getProperty("http.proxyPort");
> + if ((tmp != null) && tmp.equals("")) {
> + tmp = null;
> + }
> + if (tmp == null) {
> + HTTPProxyPort = 80;
> + } else {
> + HTTPProxyPort = Integer.parseInt(tmp);
> + }
> + }
> + if (inSocket != null) {
> + fromHost = (inSocket.getInetAddress()).getHostName();
> + } else {
> + fromHost = "resend";
> + }
> + String dateformat = HTTPTracer.getMessage("dateformat00", "yyyy-MM-dd HH:mm:ss");
> + DateFormat df = new SimpleDateFormat(dateformat);
> + time = df.format(new Date());
> + int count = listener.connections.size();
> + listener.tableModel.insertRow(count + 1,
> + new Object[]{
> + HTTPTracer.getMessage("active00","Active"),
> + time,
> + fromHost,
> + listener.hostField.getText(),
> + ""});
> + listener.connections.add(this);
> + inputText = new JTextArea(null, null, 20, 80);
> + inputScroll = new JScrollPane(inputText);
> + outputText = new JTextArea(null, null, 20, 80);
> + outputScroll = new JScrollPane(outputText);
> + ListSelectionModel lsm = listener.connectionTable.getSelectionModel();
> + if ((count == 0) || (lsm.getLeadSelectionIndex() == 0)) {
> + listener.outPane.setVisible(false);
> + int divLoc = listener.outPane.getDividerLocation();
> + listener.setLeft(inputScroll);
> + listener.setRight(outputScroll);
> + listener.removeButton.setEnabled(false);
> + listener.removeAllButton.setEnabled(true);
> + listener.saveButton.setEnabled(true);
> + listener.resendButton.setEnabled(true);
> + listener.outPane.setDividerLocation(divLoc);
> + listener.outPane.setVisible(true);
> + }
> + String targetHost = listener.hostField.getText();
> + int targetPort = Integer.parseInt(listener.tPortField.getText());
> + int listenPort = Integer.parseInt(listener.portField.getText());
> + InputStream tmpIn1 = inputStream;
> + OutputStream tmpOut1 = null;
> + InputStream tmpIn2 = null;
> + OutputStream tmpOut2 = null;
> + if (tmpIn1 == null) {
> + tmpIn1 = inSocket.getInputStream();
> + }
> + if (inSocket != null) {
> + tmpOut1 = inSocket.getOutputStream();
> + }
> + String bufferedData = null;
> + StringBuffer buf = null;
> + int index = listener.connections.indexOf(this);
> + if (listener.isProxyBox.isSelected() || (HTTPProxyHost != null)) {
> +
> + // Check if we're a proxy
> + byte[] b = new byte[1];
> + buf = new StringBuffer();
> + String s;
> + for (; ;) {
> + int len;
> + len = tmpIn1.read(b, 0, 1);
> + if (len == -1) {
> + break;
> + }
> + s = new String(b);
> + buf.append(s);
> + if (b[0] != '\n') {
> + continue;
> + }
> + break;
> + }
> + bufferedData = buf.toString();
> + inputText.append(bufferedData);
> + if (bufferedData.startsWith("GET ")
> + || bufferedData.startsWith("POST ")
> + || bufferedData.startsWith("PUT ")
> + || bufferedData.startsWith("DELETE ")) {
> + int start, end;
> + URL url;
> + start = bufferedData.indexOf(' ') + 1;
> + while (bufferedData.charAt(start) == ' ') {
> + start++;
> + }
> + end = bufferedData.indexOf(' ', start);
> + String urlString = bufferedData.substring(start, end);
> + if (urlString.charAt(0) == '/') {
> + urlString = urlString.substring(1);
> + }
> + if (listener.isProxyBox.isSelected()) {
> + url = new URL(urlString);
> + targetHost = url.getHost();
> + targetPort = url.getPort();
> + if (targetPort == -1) {
> + targetPort = 80;
> + }
> + listener.tableModel.setValueAt(targetHost,
> + index + 1,
> + HTTPTracer.OUTHOST_COLUMN);
> + bufferedData = bufferedData.substring(0, start)
> + + url.getFile()
> + + bufferedData.substring(end);
> + } else {
> + url = new URL("http://" + targetHost + ":"
> + + targetPort + "/" + urlString);
> + listener.tableModel.setValueAt(targetHost,
> + index + 1,
> + HTTPTracer.OUTHOST_COLUMN);
> + bufferedData = bufferedData.substring(0, start)
> + + url.toExternalForm()
> + + bufferedData.substring(end);
> + targetHost = HTTPProxyHost;
> + targetPort = HTTPProxyPort;
> + }
> + }
> + } else {
> +
> + //
> + // Change Host: header to point to correct host
> + //
> + byte[] b1 = new byte[1];
> + buf = new StringBuffer();
> + String s1;
> + String lastLine = null;
> + for (; ;) {
> + int len;
> + len = tmpIn1.read(b1, 0, 1);
> + if (len == -1) {
> + break;
> + }
> + s1 = new String(b1);
> + buf.append(s1);
> + if (b1[0] != '\n') {
> + continue;
> + }
> +
> + // we have a complete line
> + String line = buf.toString();
> + buf.setLength(0);
> +
> + // check to see if we have found Host: header
> + if (line.startsWith("Host: ")) {
> +
> + // we need to update the hostname to target host
> + String newHost = "Host: " + targetHost + ":"
> + + listenPort + "\r\n";
> + bufferedData = bufferedData.concat(newHost);
> + break;
> + }
> +
> + // add it to our headers so far
> + if (bufferedData == null) {
> + bufferedData = line;
> + } else {
> + bufferedData = bufferedData.concat(line);
> + }
> +
> + // failsafe
> + if (line.equals("\r\n")) {
> + break;
> + }
> + if ("\n".equals(lastLine) && line.equals("\n")) {
> + break;
> + }
> + lastLine = line;
> + }
> + if (bufferedData != null) {
> + inputText.append(bufferedData);
> + int idx = (bufferedData.length() < 50)
> + ? bufferedData.length()
> + : 50;
> + s1 = bufferedData.substring(0, idx);
> + int i = s1.indexOf('\n');
> + if (i > 0) {
> + s1 = s1.substring(0, i - 1);
> + }
> + s1 = s1 + " "
> + + " ";
> + s1 = s1.substring(0, 51);
> + listener.tableModel.setValueAt(s1, index + 1,
> + HTTPTracer.REQ_COLUMN);
> + }
> + }
> + if (targetPort == -1) {
> + targetPort = 80;
> + }
> + outSocket = new Socket(targetHost, targetPort);
> + tmpIn2 = outSocket.getInputStream();
> + tmpOut2 = outSocket.getOutputStream();
> + if (bufferedData != null) {
> + byte[] b = bufferedData.getBytes();
> + tmpOut2.write(b);
> + slowLink.pump(b.length);
> + }
> + boolean format = listener.xmlFormatBox.isSelected();
> +
> + // this is the channel to the endpoint
> + rr1 = new SocketRR(this, inSocket, tmpIn1, outSocket, tmpOut2,
> + inputText, format, listener.tableModel,
> + index + 1, "request:", slowLink);
> +
> + // create the response slow link from the inbound slow link
> + SlowLinkSimulator responseLink =
> + new SlowLinkSimulator(slowLink);
> +
> + // this is the channel from the endpoint
> + rr2 = new SocketRR(this, outSocket, tmpIn2, inSocket, tmpOut1,
> + outputText, format, null, 0, "response:",
> + responseLink);
> +
> + while ((rr1 != null) || (rr2 != null)) {
> +
> + if (rr2 != null) {
> + listener.tableModel.setValueAt(rr2.getElapsed(), 1 + index, HTTPTracer.ELAPSED_COLUMN);
> + }
> +
> + // Only loop as long as the connection to the target
> + // machine is available - once that's gone we can stop.
> + // The old way, loop until both are closed, left us
> + // looping forever since no one closed the 1st one.
> +
> + if ((null != rr1) && rr1.isDone()) {
> + if ((index >= 0) && (rr2 != null)) {
> + listener.tableModel.setValueAt(
> + HTTPTracer.getMessage("resp00", "Resp"), 1 + index,
> + HTTPTracer.STATE_COLUMN);
> + }
> + rr1 = null;
> + }
> +
> + if ((null != rr2) && rr2.isDone()) {
> + if ((index >= 0) && (rr1 != null)) {
> + listener.tableModel.setValueAt(
> + HTTPTracer.getMessage("req00", "Req"), 1 + index,
> + HTTPTracer.STATE_COLUMN);
> + }
> + rr2 = null;
> + }
> +
> + synchronized (this) {
> + this.wait(100); // Safety just incase we're not told to wake up.
> + }
> + }
> +
> + active = false;
> +
> + if (index >= 0) {
> + listener.tableModel.setValueAt(
> + HTTPTracer.getMessage("done00", "Done"),
> + 1 + index, HTTPTracer.STATE_COLUMN);
> + }
> +
> + } catch (Exception e) {
> + StringWriter st = new StringWriter();
> + PrintWriter wr = new PrintWriter(st);
> + int index = listener.connections.indexOf(this);
> + if (index >= 0) {
> + listener.tableModel.setValueAt(
> + HTTPTracer.getMessage("error00", "Error"), 1 + index,
> + HTTPTracer.STATE_COLUMN);
> + }
> + e.printStackTrace(wr);
> + wr.close();
> + if (outputText != null) {
> + outputText.append(st.toString());
> + } else {
> + // something went wrong before we had the output area
> + System.out.println(st.toString());
> + }
> + halt();
> + }
> + }
> +
> + /**
> + * Method wakeUp
> + */
> + synchronized void wakeUp() {
> + this.notifyAll();
> + }
> +
> + /**
> + * Method halt
> + */
> + public void halt() {
> + try {
> + if (rr1 != null) {
> + rr1.halt();
> + }
> + if (rr2 != null) {
> + rr2.halt();
> + }
> + if (inSocket != null) {
> + inSocket.close();
> + }
> + inSocket = null;
> + if (outSocket != null) {
> + outSocket.close();
> + }
> + outSocket = null;
> + } catch (Exception e) {
> + e.printStackTrace();
> + }
> + }
> +
> + /**
> + * Method remove
> + */
> + public void remove() {
> + int index = -1;
> + try {
> + halt();
> + index = listener.connections.indexOf(this);
> + listener.tableModel.removeRow(index + 1);
> + listener.connections.remove(index);
> + } catch (Exception e) {
> + System.err.println("index:=" + index + this);
> + e.printStackTrace();
> + }
> + }
> +}
>
> Added: webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/HTTPTracer.java
> URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/HTTPTracer.java?rev=289655&view=auto
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/HTTPTracer.java (added)
> +++ webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/HTTPTracer.java Fri Sep 16 14:30:29 2005
> @@ -0,0 +1,218 @@
> +/*
> + * Copyright 2004,2005 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +
> +package org.apache.axis2.tool.tracer;
> +
> +import javax.swing.JFrame;
> +import javax.swing.JTabbedPane;
> +import javax.swing.UIManager;
> +import javax.swing.UnsupportedLookAndFeelException;
> +import java.util.ResourceBundle;
> +
> +/**
> + * Proxy that sniffs and shows HTTP messages and responses, both SOAP and plain HTTP.
> + *
> + * @author Doug Davis
> + * @author Steve Loughran
> + * @author Stefano Mazzocchi
> + */
> +
> +public class HTTPTracer extends JFrame {
> +
> + /**
> + * Field notebook
> + */
> + private JTabbedPane notebook = null;
> +
> + /**
> + * Field STATE_COLUMN
> + */
> + static final int STATE_COLUMN = 0;
> +
> + /**
> + * Field OUTHOST_COLUMN
> + */
> + static final int OUTHOST_COLUMN = 3;
> +
> + /**
> + * Field REQ_COLUMN
> + */
> + static final int REQ_COLUMN = 4;
> +
> + /**
> + * Field ELAPSED_COLUMN
> + */
> + static final int ELAPSED_COLUMN = 5;
> +
> + /**
> + * Field DEFAULT_HOST
> + */
> + static final String DEFAULT_HOST = "127.0.0.1";
> +
> + /**
> + * Field DEFAULT_PORT
> + */
> + static final int DEFAULT_PORT = 8888;
> +
> + /**
> + * Constructor
> + *
> + * @param listenPort
> + * @param targetHost
> + * @param targetPort
> + * @param embedded
> + */
> + public HTTPTracer(int listenPort, String targetHost, int targetPort, boolean embedded) {
> + super(getMessage("httptracer00","HTTPTracer"));
> + notebook = new JTabbedPane();
> + this.getContentPane().add(notebook);
> + new AdminPane(notebook, getMessage("admin00", "Admin"));
> + if (listenPort != 0) {
> + Listener l = null;
> + if (targetHost == null) {
> + l = new Listener(notebook, null, listenPort, targetHost, targetPort, true, null);
> + } else {
> + l = new Listener(notebook, null, listenPort, targetHost, targetPort, false, null);
> + }
> + notebook.setSelectedIndex(1);
> + l.HTTPProxyHost = System.getProperty("http.proxyHost");
> + if ((l.HTTPProxyHost != null) && l.HTTPProxyHost.equals("")) {
> + l.HTTPProxyHost = null;
> + }
> + if (l.HTTPProxyHost != null) {
> + String tmp = System.getProperty("http.proxyPort");
> + if ((tmp != null) && tmp.equals("")) {
> + tmp = null;
> + }
> + if (tmp == null) {
> + l.HTTPProxyPort = 80;
> + } else {
> + l.HTTPProxyPort = Integer.parseInt(tmp);
> + }
> + }
> + }
> + if (!embedded) {
> + this.setDefaultCloseOperation(EXIT_ON_CLOSE);
> + }
> + this.pack();
> + this.setSize(1000, 700);
> + this.setVisible(true);
> + }
> +
> + /**
> + * Constructor
> + *
> + * @param listenPort
> + * @param targetHost
> + * @param targetPort
> + */
> + public HTTPTracer(int listenPort, String targetHost, int targetPort) {
> + this(listenPort, targetHost, targetPort, false);
> + }
> +
> + /**
> + * set up the L&F
> + *
> + * @param nativeLookAndFeel
> + * @throws Exception
> + */
> + private static void setupLookAndFeel(boolean nativeLookAndFeel) throws Exception {
> + String classname = UIManager.getCrossPlatformLookAndFeelClassName();
> + if (nativeLookAndFeel) {
> + classname = UIManager.getSystemLookAndFeelClassName();
> + }
> + String lafProperty = System.getProperty("httptracer.laf", "");
> + if (lafProperty.length() > 0) {
> + classname = lafProperty;
> + }
> + try {
> + UIManager.setLookAndFeel(classname);
> + } catch (ClassNotFoundException e) {
> + e.printStackTrace();
> + } catch (InstantiationException e) {
> + e.printStackTrace();
> + } catch (IllegalAccessException e) {
> + e.printStackTrace();
> + } catch (UnsupportedLookAndFeelException e) {
> + e.printStackTrace();
> + }
> + }
> +
> + /**
> + * this is our main method
> + *
> + * @param args
> + */
> + public static void main(String[] args) {
> + try {
> +
> + // switch between swing L&F here
> + setupLookAndFeel(true);
> + if (args.length == 3) {
> + int p1 = Integer.parseInt(args[0]);
> + int p2 = Integer.parseInt(args[2]);
> + new HTTPTracer(p1, args[1], p2);
> + } else if (args.length == 1) {
> + int p1 = Integer.parseInt(args[0]);
> + new HTTPTracer(p1, null, 0);
> + } else if (args.length != 0) {
> + System.err.println(
> + getMessage("usage00", "Usage:")
> + + " HTTPTracer [listenPort targetHost targetPort]\n");
> + } else {
> + new HTTPTracer(0, null, 0);
> + }
> + } catch (Throwable exp) {
> + exp.printStackTrace();
> + }
> + }
> +
> + /**
> + * Field messages
> + */
> + private static ResourceBundle messages = null;
> +
> + /**
> + * Get the message with the given key. There are no arguments for this message.
> + *
> + * @param key
> + * @param defaultMsg
> + * @return string
> + */
> + public static String getMessage(String key, String defaultMsg) {
> + try {
> + if (messages == null) {
> + initializeMessages();
> + }
> + return messages.getString(key);
> + } catch (Throwable t) {
> +
> + // If there is any problem whatsoever getting the internationalized
> + // message, return the default.
> + return defaultMsg;
> + }
> + }
> +
> + /**
> + * Load the resource bundle messages from the properties file. This is ONLY done when it is
> + * needed. If no messages are printed (for example, only Wsdl2java is being run in non-
> + * verbose mode) then there is no need to read the properties file.
> + */
> + private static void initializeMessages() {
> + messages = ResourceBundle.getBundle("org.apache.axis2.tool.tracer.httptracer");
> + }
> +
> +}
>
> Added: webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Listener.java
> URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Listener.java?rev=289655&view=auto
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Listener.java (added)
> +++ webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/Listener.java Fri Sep 16 14:30:29 2005
> @@ -0,0 +1,692 @@
> +/*
> + * Copyright 2004,2005 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +
> +package org.apache.axis2.tool.tracer;
> +
> +import javax.swing.BorderFactory;
> +import javax.swing.Box;
> +import javax.swing.BoxLayout;
> +import javax.swing.JButton;
> +import javax.swing.JCheckBox;
> +import javax.swing.JFileChooser;
> +import javax.swing.JLabel;
> +import javax.swing.JPanel;
> +import javax.swing.JScrollPane;
> +import javax.swing.JSplitPane;
> +import javax.swing.JTabbedPane;
> +import javax.swing.JTable;
> +import javax.swing.JTextField;
> +import javax.swing.ListSelectionModel;
> +import javax.swing.SwingConstants;
> +import javax.swing.event.ChangeEvent;
> +import javax.swing.event.ListSelectionEvent;
> +import javax.swing.event.ListSelectionListener;
> +import javax.swing.plaf.basic.BasicButtonListener;
> +import javax.swing.table.DefaultTableModel;
> +import javax.swing.table.TableColumn;
> +import java.awt.BorderLayout;
> +import java.awt.Component;
> +import java.awt.Dimension;
> +import java.awt.event.ActionEvent;
> +import java.awt.event.ActionListener;
> +import java.io.ByteArrayInputStream;
> +import java.io.File;
> +import java.io.FileOutputStream;
> +import java.io.InputStream;
> +import java.net.ServerSocket;
> +import java.net.Socket;
> +import java.util.Iterator;
> +import java.util.Vector;
> +
> +/**
> + * this is one of the tabbed panels that acts as the actual proxy
> + */
> +class Listener extends JPanel {
> +
> + /**
> + * Field inputSocket
> + */
> + public Socket inputSocket = null;
> +
> + /**
> + * Field outputSocket
> + */
> + public Socket outputSocket = null;
> +
> + /**
> + * Field portField
> + */
> + public JTextField portField = null;
> +
> + /**
> + * Field hostField
> + */
> + public JTextField hostField = null;
> +
> + /**
> + * Field tPortField
> + */
> + public JTextField tPortField = null;
> +
> + /**
> + * Field isProxyBox
> + */
> + public JCheckBox isProxyBox = null;
> +
> + /**
> + * Field stopButton
> + */
> + public JButton stopButton = null;
> +
> + /**
> + * Field removeButton
> + */
> + public JButton removeButton = null;
> +
> + /**
> + * Field removeAllButton
> + */
> + public JButton removeAllButton = null;
> +
> + /**
> + * Field xmlFormatBox
> + */
> + public JCheckBox xmlFormatBox = null;
> +
> + /**
> + * Field saveButton
> + */
> + public JButton saveButton = null;
> +
> + /**
> + * Field resendButton
> + */
> + public JButton resendButton = null;
> +
> + /**
> + * Field switchButton
> + */
> + public JButton switchButton = null;
> +
> + /**
> + * Field closeButton
> + */
> + public JButton closeButton = null;
> +
> + /**
> + * Field connectionTable
> + */
> + public JTable connectionTable = null;
> +
> + /**
> + * Field tableModel
> + */
> + public DefaultTableModel tableModel = null;
> +
> + /**
> + * Field outPane
> + */
> + public JSplitPane outPane = null;
> +
> + /**
> + * Field sSocket
> + */
> + public ServerSocket sSocket = null;
> +
> + /**
> + * Field sw
> + */
> + public SocketWaiter sw = null;
> +
> + /**
> + * Field leftPanel
> + */
> + public JPanel leftPanel = null;
> +
> + /**
> + * Field rightPanel
> + */
> + public JPanel rightPanel = null;
> +
> + /**
> + * Field notebook
> + */
> + public JTabbedPane notebook = null;
> +
> + /**
> + * Field HTTPProxyHost
> + */
> + public String HTTPProxyHost = null;
> +
> + /**
> + * Field HTTPProxyPort
> + */
> + public int HTTPProxyPort = 80;
> +
> + /**
> + * Field delayBytes
> + */
> + public int delayBytes = 0;
> +
> + /**
> + * Field delayTime
> + */
> + public int delayTime = 0;
> +
> + /**
> + * Field slowLink
> + */
> + public SlowLinkSimulator slowLink;
> +
> + /**
> + * Field connections
> + */
> + public final Vector connections = new Vector();
> +
> + /**
> + * create a listener
> + *
> + * @param _notebook
> + * @param name
> + * @param listenPort
> + * @param host
> + * @param targetPort
> + * @param isProxy
> + * @param slowLink optional reference to a slow connection
> + */
> + public Listener(JTabbedPane _notebook, String name, int listenPort,
> + String host, int targetPort, boolean isProxy,
> + SlowLinkSimulator slowLink) {
> + notebook = _notebook;
> + if (name == null) {
> + name = HTTPTracer.getMessage("port01", "Port") + " " + listenPort;
> + }
> +
> + // set the slow link to the passed down link
> + if (slowLink != null) {
> + this.slowLink = slowLink;
> + } else {
> +
> + // or make up a no-op one.
> + this.slowLink = new SlowLinkSimulator(0, 0);
> + }
> + this.setLayout(new BorderLayout());
> +
> + // 1st component is just a row of labels and 1-line entry fields
> + // ///////////////////////////////////////////////////////////////////
> + JPanel top = new JPanel();
> + top.setLayout(new BoxLayout(top, BoxLayout.X_AXIS));
> + top.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
> + final String start = HTTPTracer.getMessage("start00", "Start");
> + top.add(stopButton = new JButton(start));
> + top.add(Box.createRigidArea(new Dimension(5, 0)));
> + top.add(new JLabel(" "
> + + HTTPTracer.getMessage("listenPort01", "Listen Port:")
> + + " ", SwingConstants.RIGHT));
> + top.add(portField = new JTextField("" + listenPort, 4));
> + top.add(new JLabel(" " + HTTPTracer.getMessage("host00", "Host:"),
> + SwingConstants.RIGHT));
> + top.add(hostField = new JTextField(host, 30));
> + top.add(new JLabel(" " + HTTPTracer.getMessage("port02", "Port:") + " ",
> + SwingConstants.RIGHT));
> + top.add(tPortField = new JTextField("" + targetPort, 4));
> + top.add(Box.createRigidArea(new Dimension(5, 0)));
> + top.add(isProxyBox = new JCheckBox(HTTPTracer.getMessage("proxy00", "Proxy")));
> + isProxyBox.addChangeListener(new BasicButtonListener(isProxyBox) {
> + public void stateChanged(ChangeEvent event) {
> + JCheckBox box = (JCheckBox) event.getSource();
> + boolean state = box.isSelected();
> + tPortField.setEnabled(!state);
> + hostField.setEnabled(!state);
> + }
> + });
> + isProxyBox.setSelected(isProxy);
> + portField.setEditable(false);
> + portField.setMaximumSize(new Dimension(50, Short.MAX_VALUE));
> + hostField.setEditable(false);
> + hostField.setMaximumSize(new Dimension(85, Short.MAX_VALUE));
> + tPortField.setEditable(false);
> + tPortField.setMaximumSize(new Dimension(50, Short.MAX_VALUE));
> + stopButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (HTTPTracer.getMessage("stop00",
> + "Stop").equals(event.getActionCommand())) {
> + stop();
> + }
> + if (start.equals(event.getActionCommand())) {
> + start();
> + }
> + }
> + });
> + this.add(top, BorderLayout.NORTH);
> +
> + // 2nd component is a split pane with a table on the top
> + // and the request/response text areas on the bottom
> + // ///////////////////////////////////////////////////////////////////
> + tableModel = new DefaultTableModel(new String[]{
> + HTTPTracer.getMessage("state00", "State"),
> + HTTPTracer.getMessage("time00", "Time"),
> + HTTPTracer.getMessage("requestHost00", "Request Host"),
> + HTTPTracer.getMessage("targetHost", "Target Host"),
> + HTTPTracer.getMessage("request00", "Request..."),
> + HTTPTracer.getMessage("elapsed00", "Elapsed Time")}, 0);
> + tableModel.addRow(new Object[]{"---",
> + HTTPTracer.getMessage("mostRecent00",
> + "Most Recent"),
> + "---", "---", "---", "---"});
> + connectionTable = new JTable(1, 2);
> + connectionTable.setModel(tableModel);
> + connectionTable.setSelectionMode(
> + ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
> +
> + // Reduce the STATE column and increase the REQ column
> + TableColumn col;
> + col = connectionTable.getColumnModel().getColumn(HTTPTracer.STATE_COLUMN);
> + col.setMaxWidth(col.getPreferredWidth() / 2);
> + col = connectionTable.getColumnModel().getColumn(HTTPTracer.REQ_COLUMN);
> + col.setPreferredWidth(col.getPreferredWidth() * 2);
> + ListSelectionModel sel = connectionTable.getSelectionModel();
> + sel.addListSelectionListener(new ListSelectionListener() {
> + public void valueChanged(ListSelectionEvent event) {
> + if (event.getValueIsAdjusting()) {
> + return;
> + }
> + ListSelectionModel m =
> + (ListSelectionModel) event.getSource();
> + int divLoc = outPane.getDividerLocation();
> + if (m.isSelectionEmpty()) {
> + setLeft(
> + new JLabel(
> + " "
> + +
> + HTTPTracer.getMessage("wait00",
> + "Waiting for Connection...")));
> + setRight(new JLabel(""));
> + removeButton.setEnabled(false);
> + removeAllButton.setEnabled(false);
> + saveButton.setEnabled(false);
> + resendButton.setEnabled(false);
> + } else {
> + int row = m.getLeadSelectionIndex();
> + if (row == 0) {
> + if (connections.size() == 0) {
> + setLeft(
> + new JLabel(
> + " "
> + +
> + HTTPTracer.getMessage("wait00",
> + "Waiting for connection...")));
> + setRight(new JLabel(""));
> + removeButton.setEnabled(false);
> + removeAllButton.setEnabled(false);
> + saveButton.setEnabled(false);
> + resendButton.setEnabled(false);
> + } else {
> + Connection conn =
> + (Connection) connections.lastElement();
> + setLeft(conn.inputScroll);
> + setRight(conn.outputScroll);
> + removeButton.setEnabled(false);
> + removeAllButton.setEnabled(true);
> + saveButton.setEnabled(true);
> + resendButton.setEnabled(true);
> + }
> + } else {
> + Connection conn = (Connection) connections.get(row
> + - 1);
> + setLeft(conn.inputScroll);
> + setRight(conn.outputScroll);
> + removeButton.setEnabled(true);
> + removeAllButton.setEnabled(true);
> + saveButton.setEnabled(true);
> + resendButton.setEnabled(true);
> + }
> + }
> + outPane.setDividerLocation(divLoc);
> + }
> + });
> + JPanel tablePane = new JPanel();
> + tablePane.setLayout(new BorderLayout());
> + JScrollPane tableScrollPane = new JScrollPane(connectionTable);
> + tablePane.add(tableScrollPane, BorderLayout.CENTER);
> + JPanel buttons = new JPanel();
> + buttons.setLayout(new BoxLayout(buttons, BoxLayout.X_AXIS));
> + buttons.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
> + final String removeSelected = HTTPTracer.getMessage("removeSelected00",
> + "Remove Selected");
> + buttons.add(removeButton = new JButton(removeSelected));
> + buttons.add(Box.createRigidArea(new Dimension(5, 0)));
> + final String removeAll = HTTPTracer.getMessage("removeAll00", "Remove All");
> + buttons.add(removeAllButton = new JButton(removeAll));
> + tablePane.add(buttons, BorderLayout.SOUTH);
> + removeButton.setEnabled(false);
> + removeButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (removeSelected.equals(event.getActionCommand())) {
> + remove();
> + }
> + }
> + });
> + removeAllButton.setEnabled(false);
> + removeAllButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (removeAll.equals(event.getActionCommand())) {
> + removeAll();
> + }
> + }
> + });
> +
> + // Add Response Section
> + // ///////////////////////////////////////////////////////////////////
> + JPanel pane2 = new JPanel();
> + pane2.setLayout(new BorderLayout());
> + leftPanel = new JPanel();
> + leftPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
> + leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
> + leftPanel.add(new JLabel(" "
> + + HTTPTracer.getMessage("request01", "Request")));
> + leftPanel.add(new JLabel(" "
> + + HTTPTracer.getMessage("wait01",
> + "Waiting for connection")));
> + rightPanel = new JPanel();
> + rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
> + rightPanel.add(new JLabel(" "
> + + HTTPTracer.getMessage("response00", "Response")));
> + rightPanel.add(new JLabel(""));
> + outPane = new JSplitPane(0, leftPanel, rightPanel);
> + outPane.setDividerSize(4);
> + pane2.add(outPane, BorderLayout.CENTER);
> + JPanel bottomButtons = new JPanel();
> + bottomButtons.setLayout(new BoxLayout(bottomButtons,
> + BoxLayout.X_AXIS));
> + bottomButtons.setBorder(BorderFactory.createEmptyBorder(5, 5, 5,
> + 5));
> + bottomButtons.add(
> + xmlFormatBox =
> + new JCheckBox(HTTPTracer.getMessage("xmlFormat00", "XML Format")));
> + bottomButtons.add(Box.createRigidArea(new Dimension(5, 0)));
> + final String save = HTTPTracer.getMessage("save00", "Save");
> + bottomButtons.add(saveButton = new JButton(save));
> + bottomButtons.add(Box.createRigidArea(new Dimension(5, 0)));
> + final String resend = HTTPTracer.getMessage("resend00", "Resend");
> + bottomButtons.add(resendButton = new JButton(resend));
> + bottomButtons.add(Box.createRigidArea(new Dimension(5, 0)));
> + final String switchStr = HTTPTracer.getMessage("switch00", "Switch Layout");
> + bottomButtons.add(switchButton = new JButton(switchStr));
> + bottomButtons.add(Box.createHorizontalGlue());
> + final String close = HTTPTracer.getMessage("close00", "Close");
> + bottomButtons.add(closeButton = new JButton(close));
> + pane2.add(bottomButtons, BorderLayout.SOUTH);
> + saveButton.setEnabled(false);
> + saveButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (save.equals(event.getActionCommand())) {
> + save();
> + }
> + }
> + });
> + resendButton.setEnabled(false);
> + resendButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (resend.equals(event.getActionCommand())) {
> + resend();
> + }
> + }
> + });
> + switchButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (switchStr.equals(event.getActionCommand())) {
> + int v = outPane.getOrientation();
> + if (v == 0) {
> +
> + // top/bottom
> + outPane.setOrientation(1);
> + } else {
> +
> + // left/right
> + outPane.setOrientation(0);
> + }
> + outPane.setDividerLocation(0.5);
> + }
> + }
> + });
> + closeButton.addActionListener(new ActionListener() {
> + public void actionPerformed(ActionEvent event) {
> + if (close.equals(event.getActionCommand())) {
> + close();
> + }
> + }
> + });
> + JSplitPane pane1 = new JSplitPane(0);
> + pane1.setDividerSize(4);
> + pane1.setTopComponent(tablePane);
> + pane1.setBottomComponent(pane2);
> + pane1.setDividerLocation(150);
> + this.add(pane1, BorderLayout.CENTER);
> +
> + //
> + // //////////////////////////////////////////////////////////////////
> + sel.setSelectionInterval(0, 0);
> + outPane.setDividerLocation(150);
> + notebook.addTab(name, this);
> + start();
> + }
> +
> + /**
> + * Method setLeft
> + *
> + * @param left
> + */
> + public void setLeft(Component left) {
> + leftPanel.removeAll();
> + leftPanel.add(left);
> + }
> +
> + /**
> + * Method setRight
> + *
> + * @param right
> + */
> + public void setRight(Component right) {
> + rightPanel.removeAll();
> + rightPanel.add(right);
> + }
> +
> + /**
> + * Method start
> + */
> + public void start() {
> + int port = Integer.parseInt(portField.getText());
> + portField.setText("" + port);
> + int i = notebook.indexOfComponent(this);
> + notebook.setTitleAt(i, HTTPTracer.getMessage("port01", "Port") + " " + port);
> + int tmp = Integer.parseInt(tPortField.getText());
> + tPortField.setText("" + tmp);
> + sw = new SocketWaiter(this, port);
> + stopButton.setText(HTTPTracer.getMessage("stop00", "Stop"));
> + portField.setEditable(false);
> + hostField.setEditable(false);
> + tPortField.setEditable(false);
> + isProxyBox.setEnabled(false);
> + }
> +
> + /**
> + * Method close
> + */
> + public void close() {
> + stop();
> + notebook.remove(this);
> + }
> +
> + /**
> + * Method stop
> + */
> + public void stop() {
> + try {
> + for (int i = 0; i < connections.size(); i++) {
> + Connection conn = (Connection) connections.get(i);
> + conn.halt();
> + }
> + sw.halt();
> + stopButton.setText(HTTPTracer.getMessage("start00", "Start"));
> + portField.setEditable(true);
> + hostField.setEditable(true);
> + tPortField.setEditable(true);
> + isProxyBox.setEnabled(true);
> + } catch (Exception e) {
> + e.printStackTrace();
> + }
> + }
> +
> + /**
> + * Method remove
> + */
> + public void remove() {
> + ListSelectionModel lsm = connectionTable.getSelectionModel();
> + int bot = lsm.getMinSelectionIndex();
> + int top = lsm.getMaxSelectionIndex();
> + for (int i = top; i >= bot; i--) {
> + ((Connection) connections.get(i - 1)).remove();
> + }
> + if (bot > connections.size()) {
> + bot = connections.size();
> + }
> + lsm.setSelectionInterval(bot, bot);
> + }
> +
> + /**
> + * Method removeAll
> + */
> + public void removeAll() {
> + ListSelectionModel lsm = connectionTable.getSelectionModel();
> + lsm.clearSelection();
> + while (connections.size() > 0) {
> + ((Connection) connections.get(0)).remove();
> + }
> + lsm.setSelectionInterval(0, 0);
> + }
> +
> + /**
> + * Method save
> + */
> + public void save() {
> + JFileChooser dialog = new JFileChooser(".");
> + int rc = dialog.showSaveDialog(this);
> + if (rc == JFileChooser.APPROVE_OPTION) {
> + try {
> + File file = dialog.getSelectedFile();
> + FileOutputStream out = new FileOutputStream(file);
> + ListSelectionModel lsm =
> + connectionTable.getSelectionModel();
> + rc = lsm.getLeadSelectionIndex();
> + int n = 0;
> + for (Iterator i = connections.iterator(); i.hasNext();
> + n++) {
> + Connection conn = (Connection) i.next();
> + if (lsm.isSelectedIndex(n + 1)
> + || (!(i.hasNext())
> + && (lsm.getLeadSelectionIndex() == 0))) {
> + rc = Integer.parseInt(portField.getText());
> + out.write("\n==============\n".getBytes());
> + out.write(((HTTPTracer.getMessage("listenPort01",
> + "Listen Port:")
> + + " " + rc + "\n")).getBytes());
> + out.write((HTTPTracer.getMessage("targetHost01",
> + "Target Host:")
> + + " " + hostField.getText()
> + + "\n").getBytes());
> + rc = Integer.parseInt(tPortField.getText());
> + out.write(((HTTPTracer.getMessage("targetPort01",
> + "Target Port:")
> + + " " + rc + "\n")).getBytes());
> + out.write((("==== "
> + + HTTPTracer.getMessage("request01", "Request")
> + + " ====\n")).getBytes());
> + out.write(conn.inputText.getText().getBytes());
> + out.write((("==== "
> + + HTTPTracer.getMessage("response00", "Response")
> + + " ====\n")).getBytes());
> + out.write(conn.outputText.getText().getBytes());
> + out.write("\n==============\n".getBytes());
> + }
> + }
> + out.close();
> + } catch (Exception e) {
> + e.printStackTrace();
> + }
> + }
> + }
> +
> + /**
> + * Method resend
> + */
> + public void resend() {
> + int rc;
> + try {
> + ListSelectionModel lsm = connectionTable.getSelectionModel();
> + rc = lsm.getLeadSelectionIndex();
> + if (rc == 0) {
> + rc = connections.size();
> + }
> + Connection conn = (Connection) connections.get(rc - 1);
> + if (rc > 0) {
> + lsm.clearSelection();
> + lsm.setSelectionInterval(0, 0);
> + }
> + InputStream in = null;
> + String text = conn.inputText.getText();
> +
> + // Fix Content-Length HTTP headers
> + if (text.startsWith("POST ") || text.startsWith("GET ")) {
> +
> + // System.err.println("IN CL" );
> + int pos1, pos2, pos3;
> + String headers;
> + pos3 = text.indexOf("\n\n");
> + if (pos3 == -1) {
> + pos3 = text.indexOf("\r\n\r\n");
> + if (pos3 != -1) {
> + pos3 = pos3 + 4;
> + }
> + } else {
> + pos3 += 2;
> + }
> + headers = text.substring(0, pos3);
> + pos1 = headers.indexOf("Content-Length:");
> +
> + // System.err.println("pos1: " + pos1 );
> + // System.err.println("pos3: " + pos3 );
> + if (pos1 != -1) {
> + int newLen = text.length() - pos3;
> + pos2 = headers.indexOf("\n", pos1);
> + System.err.println("CL: " + newLen);
> + System.err.println("Hdrs: '" + headers + "'");
> + System.err.println("subTEXT: '"
> + + text.substring(pos3, pos3 + newLen)
> + + "'");
> + text = headers.substring(0, pos1) + "Content-Length: "
> + + newLen + "\n" + headers.substring(pos2 + 1)
> + + text.substring(pos3);
> + System.err.println("\nTEXT: '" + text + "'");
> + }
> + }
> + in = new ByteArrayInputStream(text.getBytes());
> + new Connection(this, in);
> + } catch (Exception e) {
> + e.printStackTrace();
> + }
> + }
> +}
>
> Added: webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/SlowLinkSimulator.java
> URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/SlowLinkSimulator.java?rev=289655&view=auto
> ==============================================================================
> --- webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/SlowLinkSimulator.java (added)
> +++ webservices/axis2/trunk/java/modules/tool/src/org/apache/axis2/tool/tracer/SlowLinkSimulator.java Fri Sep 16 14:30:29 2005
> @@ -0,0 +1,124 @@
> +/*
> + * Copyright 2004,2005 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +
> +package org.apache.axis2.tool.tracer;
> +
> +/**
> + * class to simulate slow connections by slowing down the system
> + */
> +class SlowLinkSimulator {
> +
> + /**
> + * Field delayBytes
> + */
> + private int delayBytes;
> +
> + /**
> + * Field delayTime
> + */
> + private int delayTime;
> +
> + /**
> + * Field currentBytes
> + */
> + private int currentBytes;
> +
> + /**
> + * Field totalBytes
> + */
> + private int totalBytes;
> +
> + /**
> + * construct
> + *
> + * @param delayBytes bytes per delay; set to 0 for no delay
> + * @param delayTime delay time per delay in milliseconds
> + */
> + public SlowLinkSimulator(int delayBytes, int delayTime) {
> + this.delayBytes = delayBytes;
> + this.delayTime = delayTime;
> + }
> +
> + /**
> + * construct by copying delay bytes and time, but not current
> + * count of bytes
> + *
> + * @param that source of data
> + */
> + public SlowLinkSimulator(SlowLinkSimulator that) {
> + this.delayBytes = that.delayBytes;
> + this.delayTime = that.delayTime;
> + }
> +
> + /**
> + * how many bytes have gone past?
> + *
> + * @return integer
> + */
> + public int getTotalBytes() {
> + return totalBytes;
> + }
> +
> + /**
> + * log #of bytes pumped. Will pause when necessary. This method is not
> + * synchronized
> + *
> + * @param bytes
> + */
> + public void pump(int bytes) {
> + totalBytes += bytes;
> + if (delayBytes == 0) {
> +
> + // when not delaying, we are just a byte counter
> + return;
> + }
> + currentBytes += bytes;
> + if (currentBytes > delayBytes) {
> +
> + // we have overshot. lets find out how far
> + int delaysize = currentBytes / delayBytes;
> + long delay = delaysize * (long) delayTime;
> +
> + // move byte counter down to the remainder of bytes
> + currentBytes = currentBytes % delayBytes;
> +
> + // now wait
> + try {
> + Thread.sleep(delay);
> + } catch (InterruptedException e) {
> + ; // ignore the exception
> + }
> + }
> + }
> +
> + /**
> + * get the current byte count
> + *
> + * @return integer
> + */
> + public int getCurrentBytes() {
> + return currentBytes;
> + }
> +
> + /**
> + * set the current byte count
> + *
> + * @param currentBytes
> + */
> + public void setCurrentBytes(int currentBytes) {
> + this.currentBytes = currentBytes;
> + }
> +}
>
>