mstover1    02/05/16 09:41:30

  Modified:    src/org/apache/jmeter/protocol/http/sampler HTTPSampler.java
               src_1/org/apache/jmeter/assertions AssertionResult.java
               src_1/org/apache/jmeter/gui GuiPackage.java MainFrame.java
               src_1/org/apache/jmeter/gui/action Start.java
               src_1/org/apache/jmeter/protocol/ftp/config FtpConfig.java
               src_1/org/apache/jmeter/protocol/ftp/sampler FTPSampler.java
               src_1/org/apache/jmeter/protocol/http/proxy Proxy.java
               src_1/org/apache/jmeter/protocol/http/sampler
                        HTTPSampler.java HTTPSamplerFull.java
               src_1/org/apache/jmeter/reporters ResultCollector.java
               src_1/org/apache/jmeter/samplers SampleResult.java
               src_1/org/apache/jmeter/save SaveService.java
               src_1/org/apache/jmeter/threads/gui ThreadGroupGui.java
               src_1/org/apache/jmeter/visualizers
                        ViewResultsFullVisualizer.java
  Added:       src_1/org/apache/jmeter/gui/util
                        NumberFieldErrorListener.java
  Removed:     src_1/org/apache/jmeter/configuration
                        SampleResultBuilder.java
                        SampleResultSAXHandler.java
  Log:
  All sorts of cosmetic improvements and refactoring
  
  Revision  Changes    Path
  1.37      +14 -14    
jakarta-jmeter/src/org/apache/jmeter/protocol/http/sampler/HTTPSampler.java
  
  Index: HTTPSampler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src/org/apache/jmeter/protocol/http/sampler/HTTPSampler.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- HTTPSampler.java  10 May 2002 13:00:10 -0000      1.36
  +++ HTTPSampler.java  16 May 2002 16:41:29 -0000      1.37
  @@ -82,8 +82,8 @@
    *  HTTP requests, including cookies and authentication.
    *
    *@author     Michael Stover
  - *@created    $Date: 2002/05/10 13:00:10 $
  - *@version    $Revision: 1.36 $
  + *@created    $Date: 2002/05/16 16:41:29 $
  + *@version    $Revision: 1.37 $
    */
   public class HTTPSampler implements Sampler
   {
  @@ -559,27 +559,27 @@
        protected byte[] getResponseHeaders(HttpURLConnection conn, 
                        SampleResult res) throws IOException
        {
  -             ByteArrayOutputStream bytes = new ByteArrayOutputStream();
  -             bytes.write("HTTP/1.1 ".getBytes("8859_1"));
  -             
bytes.write(Integer.toString(conn.getResponseCode()).getBytes("8859_1"));
  -             bytes.write(" ".getBytes("8859_1"));
  -             bytes.write(conn.getResponseMessage().getBytes("8859_1"));
  -             bytes.write("\n".getBytes("8859_1"));
  +             StringBuffer header = new StringBuffer();
  +             header.append("HTTP/1.1 ");
  +             header.append(conn.getResponseCode());
  +             header.append(" ");
  +             header.append(conn.getResponseMessage());
  +             header.append("\n");
                HashMap hValues = new HashMap(20);
                for (int i = 1; conn.getHeaderFieldKey(i) != null; i++)
                {
                        hValues.put(conn.getHeaderFieldKey(i), conn.getHeaderField(i));
                        
if(!conn.getHeaderFieldKey(i).equalsIgnoreCase("transfer-encoding"))
                        {
  -                             
bytes.write(conn.getHeaderFieldKey(i).getBytes("8859_1"));
  -                             bytes.write(": ".getBytes("8859_1"));
  -                             bytes.write(conn.getHeaderField(i).getBytes("8859_1"));
  -                             bytes.write("\n".getBytes("8859_1"));
  +                             header.append(conn.getHeaderFieldKey(i));
  +                             header.append(": ");
  +                             header.append(conn.getHeaderField(i));
  +                             header.append("\n");
                        }
                }
  -             bytes.write("\n".getBytes("8859_1"));
  +             header.append("\n");
                res.putValue(Sampler.HEADER, hValues);
  -             return bytes.toByteArray();
  +             return header.toString().getBytes("8859_1");
        }
   
   }
  
  
  
  1.4       +1 -3      
jakarta-jmeter/src_1/org/apache/jmeter/assertions/AssertionResult.java
  
  Index: AssertionResult.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/assertions/AssertionResult.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AssertionResult.java      29 Apr 2002 17:08:06 -0000      1.3
  +++ AssertionResult.java      16 May 2002 16:41:29 -0000      1.4
  @@ -68,16 +68,14 @@
    * @version 1.0
    */
   
  -public class AssertionResult extends DefaultConfiguration implements Serializable {
  +public class AssertionResult implements Serializable {
   
  -     public final static String TAG_NAME = "assertionResult";
        private boolean failure;
        private boolean error;
        private String failureMessage;
   
        public AssertionResult()
        {
  -             super(TAG_NAME,"org.apache.jmeter.assertion.AssertionResult");
        }
   
        public boolean isFailure()
  
  
  
  1.4       +24 -5     jakarta-jmeter/src_1/org/apache/jmeter/gui/GuiPackage.java
  
  Index: GuiPackage.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/gui/GuiPackage.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- GuiPackage.java   1 May 2002 23:48:51 -0000       1.3
  +++ GuiPackage.java   16 May 2002 16:41:29 -0000      1.4
  @@ -54,12 +54,14 @@
    */
    package org.apache.jmeter.gui;
   
  -import java.awt.*;
  -import javax.swing.*;
  +import java.awt.event.ActionEvent;
   
  -import org.apache.jmeter.gui.tree.*;
  -import org.apache.jmeter.util.ListedHashTree;
   import org.apache.jmeter.exceptions.IllegalUserActionException;
  +import org.apache.jmeter.gui.action.ActionRouter;
  +import org.apache.jmeter.gui.tree.JMeterTreeListener;
  +import org.apache.jmeter.gui.tree.JMeterTreeModel;
  +import org.apache.jmeter.testelement.TestListener;
  +import org.apache.jmeter.util.ListedHashTree;
   
   /**
    * Title:        JMeter
  @@ -70,7 +72,7 @@
    * @version 1.0
    */
   
  -public class GuiPackage
  +public class GuiPackage implements TestListener
   {
   
        private static GuiPackage guiPack;
  @@ -94,6 +96,23 @@
                        guiPack.setTreeModel(treeModel);
                }
                return guiPack;
  +     }
  +     
  +     public void testStarted(String host)
  +     {
  +     }
  +     
  +     public void testStarted()
  +     {
  +     }
  +     
  +     public void testEnded()
  +     {
  +             ActionRouter.getInstance().actionPerformed(new 
ActionEvent(this,1,"stop"));
  +     }
  +     
  +     public void testEnded(String host)
  +     {               
        }
   
        public void addSubTree(ListedHashTree subTree) throws 
IllegalUserActionException
  
  
  
  1.3       +25 -6     jakarta-jmeter/src_1/org/apache/jmeter/gui/MainFrame.java
  
  Index: MainFrame.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/gui/MainFrame.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- MainFrame.java    29 Apr 2002 17:08:08 -0000      1.2
  +++ MainFrame.java    16 May 2002 16:41:29 -0000      1.3
  @@ -60,23 +60,29 @@
   import org.apache.jmeter.gui.action.ActionRouter;
   import org.apache.jmeter.gui.tree.*;
   import org.apache.jmeter.gui.util.JMeterMenuBar;
  +import org.apache.jmeter.util.JMeterUtils;
  +import org.apache.jmeter.gui.action.Start;
   /****************************************
    * Title: JMeter Description: Copyright: Copyright (c) 2000 Company: Apache
    *
    *@author    Michael Stover
  - *@created   $Date: 2002/04/29 17:08:08 $
  + *@created   $Date: 2002/05/16 16:41:29 $
    *@version   1.0
    ***************************************/
   
   public class MainFrame extends JFrame
   {
  -     JPanel all, mainPanel, toolPanel;
  +     JPanel all, mainPanel;
  +     Box toolPanel;
        JScrollPane treePanel;
        JMeterMenuBar menuBar;
        JTree tree;
        TreeModel treeModel;
        ActionListener actionHandler;
        JMeterTreeListener treeListener;
  +     ImageIcon runningIcon = JMeterUtils.getImage("thread.enabled.gif");
  +     ImageIcon stoppedIcon = JMeterUtils.getImage("thread.disabled.gif");
  +     JButton runningIndicator;
        private boolean running;
   
        /****************************************
  @@ -89,6 +95,9 @@
        public MainFrame(ActionListener actionHandler, TreeModel treeModel, 
JMeterTreeListener
                        treeListener)
        {
  +             runningIndicator = new JButton(stoppedIcon);
  +             runningIndicator.setMargin(new Insets(0,0,0,0));
  +             runningIndicator.setBorder(BorderFactory.createEmptyBorder());
                this.treeListener = treeListener;
                this.actionHandler = actionHandler;
                this.treeModel = treeModel;
  @@ -240,6 +249,14 @@
         ***************************************/
        public void setRunning(boolean newRunning)
        {
  +             if(newRunning)
  +             {
  +                     runningIndicator.setIcon(runningIcon);
  +             }
  +             else
  +             {
  +                     runningIndicator.setIcon(stoppedIcon);
  +             }
                running = newRunning;
                this.menuBar.setEnabled(newRunning);
        }
  @@ -295,8 +312,10 @@
   
        private void createToolBar()
        {
  -             toolPanel = new JPanel();
  -             toolPanel.add(Box.createHorizontalGlue());
  +             toolPanel = new Box(BoxLayout.X_AXIS);
  +             toolPanel.add(Box.createRigidArea(new Dimension(10,15)));
  +             toolPanel.add(Box.createGlue());
  +             toolPanel.add(runningIndicator);
        }
   
        private void createTreePanel()
  @@ -326,8 +345,8 @@
         * !ToDo (Class description)
         *
         *@author    $Author: mstover1 $
  -      *@created   $Date: 2002/04/29 17:08:08 $
  -      *@version   $Revision: 1.2 $
  +      *@created   $Date: 2002/05/16 16:41:29 $
  +      *@version   $Revision: 1.3 $
         ***************************************/
        private class WindowHappenings extends WindowAdapter
        {
  
  
  
  1.4       +4 -2      jakarta-jmeter/src_1/org/apache/jmeter/gui/action/Start.java
  
  Index: Start.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/gui/action/Start.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Start.java        2 May 2002 22:54:58 -0000       1.3
  +++ Start.java        16 May 2002 16:41:29 -0000      1.4
  @@ -109,6 +109,7 @@
                        convertSubTree(tree.get(item));
                        TestElement testElement = item.createTestElement();
                        tree.replace(item,testElement);
  +                     
                }
        }
   
  @@ -120,11 +121,11 @@
         ***************************************/
        public void doAction(ActionEvent e)
        {
  -             if(engine == null)
  +             if(engine == null && e.getActionCommand().equals("start"))
                {
                        startEngine();
                }
  -             else
  +             else if(e.getActionCommand().equals("stop"))
                {
                        engine.stopTest();
                        GuiPackage.getInstance().getMainFrame().setRunning(false);
  @@ -143,6 +144,7 @@
                engine = new StandardJMeterEngine();
                ListedHashTree testTree = gui.getTreeModel().getTestPlan();
                convertSubTree(testTree);
  +             testTree.add(testTree.getArray()[0],gui);
                engine.configure(testTree);
                gui.getMainFrame().setRunning(true);
                engine.runTest();
  
  
  
  1.1                  
jakarta-jmeter/src_1/org/apache/jmeter/gui/util/NumberFieldErrorListener.java
  
  Index: NumberFieldErrorListener.java
  ===================================================================
  package org.apache.jmeter.gui.util;
  
  import java.awt.event.*;
  import javax.swing.*;
  import javax.swing.text.JTextComponent;
  import java.awt.Component;
  import java.awt.TextComponent;
  
  /**
   * @author mstover
   *
   * To change this generated comment edit the template variable "typecomment":
   * Window>Preferences>Java>Templates.
   */
  public class NumberFieldErrorListener extends FocusAdapter {
        
        private static NumberFieldErrorListener listener = new 
NumberFieldErrorListener();
        
        public static NumberFieldErrorListener getNumberFieldErrorListener()
        {
                return listener;
        }
        
        /****************************************
         * !ToDo (Method description)
         *
         *@param e  !ToDo (Parameter description)
         ***************************************/
        public void focusLost(FocusEvent e)
        {
                Component source = (Component)e.getSource();
                String text = "";
                if(source instanceof JTextComponent)
                {
                        text = ((JTextComponent)source).getText();
                }
                else if(source instanceof TextComponent)
                {
                        text = ((TextComponent)source).getText();
                }
                try
                {
                        Integer.parseInt(text);
                }
                catch(NumberFormatException nfe)
                {
                        JOptionPane.showMessageDialog(source, "You must enter a valid 
number",
                                                "Invalid data", 
JOptionPane.WARNING_MESSAGE);
                        new FocusRequester(source);
                }               
        }
  
  }
  
  
  
  1.3       +5 -6      
jakarta-jmeter/src_1/org/apache/jmeter/protocol/ftp/config/FtpConfig.java
  
  Index: FtpConfig.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/protocol/ftp/config/FtpConfig.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- FtpConfig.java    29 Apr 2002 17:08:09 -0000      1.2
  +++ FtpConfig.java    16 May 2002 16:41:29 -0000      1.3
  @@ -55,6 +55,7 @@
    package org.apache.jmeter.protocol.ftp.config;
   
   import org.apache.jmeter.config.*;
  +import org.apache.jmeter.protocol.ftp.sampler.FTPSampler;
   import org.apache.jmeter.util.JMeterUtils;
   import java.util.Collection;
   import java.io.*;
  @@ -70,8 +71,6 @@
   
   public class FtpConfig extends ConfigTestElement implements Serializable
   {
  -     public static final String SERVER = "server";
  -     public static final String FILENAME = "filename";
   
        public FtpConfig()
        {
  @@ -91,19 +90,19 @@
   
        public void setServer(String newServer)
        {
  -             this.setProperty(SERVER,newServer);
  +             this.setProperty(FTPSampler.SERVER,newServer);
        }
        public String getServer()
        {
  -             return (String)this.getProperty(SERVER);
  +             return (String)this.getProperty(FTPSampler.SERVER);
        }
        public void setFilename(String newFilename)
        {
  -             this.setProperty(FILENAME,newFilename);
  +             this.setProperty(FTPSampler.FILENAME,newFilename);
        }
        public String getFilename()
        {
  -             return (String)this.getProperty(FILENAME);
  +             return (String)this.getProperty(FTPSampler.FILENAME);
        }
   
         /**
  
  
  
  1.5       +49 -12    
jakarta-jmeter/src_1/org/apache/jmeter/protocol/ftp/sampler/FTPSampler.java
  
  Index: FTPSampler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/protocol/ftp/sampler/FTPSampler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FTPSampler.java   29 Apr 2002 17:08:10 -0000      1.4
  +++ FTPSampler.java   16 May 2002 16:41:29 -0000      1.5
  @@ -68,8 +68,8 @@
    *  A sampler which understands FTP file requests
    *
    *@author     $Author: mstover1 $
  - *@created    $Date: 2002/04/29 17:08:10 $
  - *@version    $Revision: 1.4 $
  + *@created    $Date: 2002/05/16 16:41:29 $
  + *@version    $Revision: 1.5 $
    ***********************************************************/
   
   public class FTPSampler extends AbstractSampler
  @@ -86,7 +86,49 @@
   
        public void addCustomTestElement(TestElement element)
        {
  +             if(element instanceof FtpConfig || element instanceof LoginConfig)
  +             {
  +                     mergeIn(element);
  +             }
  +     }
  +     
  +     public String getUsername()
  +     {
  +             return getPropertyAsString(LoginConfig.USERNAME);
  +     }
  +     
  +     public String getPassword()
  +     {
  +             return getPropertyAsString(LoginConfig.PASSWORD);
  +     }
  +     
  +     public void setServer(String newServer)
  +     {
  +             this.setProperty(SERVER,newServer);
  +     }
  +     public String getServer()
  +     {
  +             return (String)this.getProperty(SERVER);
  +     }
  +     public void setFilename(String newFilename)
  +     {
  +             this.setProperty(FILENAME,newFilename);
  +     }
  +     public String getFilename()
  +     {
  +             return (String)this.getProperty(FILENAME);
        }
  +     
  +     /**
  +       * Returns a formatted string label describing this sampler
  +       * Example output:
  +       *      ftp://ftp.nowhere.com/pub/README.txt
  +       *
  +       * @return a formatted string label describing this sampler
  +       */
  +      public String getLabel() {
  +               return ("ftp://"; + this.getServer() + "/" + this.getFilename());
  +      }
   
        /************************************************************
         *  !ToDo (Method description)
  @@ -101,21 +143,16 @@
                ResultSet rs = null;
                Statement stmt = null;
                  boolean isSuccessful = false;
  -             FtpConfig ftpConfig = (FtpConfig)e.getConfigElement(FtpConfig.class);
  -               res.setSampleLabel(ftpConfig.getLabel());
  -               LoginConfig loginConfig = 
(LoginConfig)e.getConfigElement(LoginConfig.class);
  +             //FtpConfig ftpConfig = (FtpConfig)e.getConfigElement(FtpConfig.class);
  +               res.setSampleLabel(getLabel());
  +               //LoginConfig loginConfig = 
(LoginConfig)e.getConfigElement(LoginConfig.class);
                long start = System.currentTimeMillis();
                try
                {
  -                             // removed the next two lines - System.out.println is 
a resource DOG, and putting this in the middle
  -                             // of a timed operation skews the results big time. -- 
jkb
  -//                   System.out.println("Connecting to "+ftpConfig.getServer()+" 
trying to get "+ftpConfig.getFilename());
  -//                   System.out.println("Username = "+loginConfig.getUsername());
                        FtpClient ftp = new FtpClient();
  -                     ftp.connect(ftpConfig.getServer(), loginConfig.getUsername(),
  -                                     loginConfig.getPassword());
  +                     ftp.connect(getServer(), getUsername(),getPassword());
                        ftp.setPassive(true); // this should probably come from the 
setup dialog
  -                     String s = ftp.get(ftpConfig.getFilename());
  +                     String s = ftp.get(getFilename());
                        res.setResponseData(s.getBytes());
                                // set the response code here somewhere
                        ftp.disconnect();
  
  
  
  1.7       +1 -1      
jakarta-jmeter/src_1/org/apache/jmeter/protocol/http/proxy/Proxy.java
  
  Index: Proxy.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/protocol/http/proxy/Proxy.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Proxy.java        13 May 2002 12:19:14 -0000      1.6
  +++ Proxy.java        16 May 2002 16:41:29 -0000      1.7
  @@ -147,7 +147,7 @@
                        byte[] serverResponse = sampler.sample().getResponseData();
                        writeToClient(serverResponse,
                                new 
BufferedOutputStream(ClientSocket.getOutputStream()));
  -                     //headers.removeHeaderNamed("cookie");
  +                     headers.removeHeaderNamed("cookie");
                        target.deliverSampler(sampler,new TestElement[]{headers});
                } catch (UnknownHostException uhe) {
                        System.out.println("Server Not Found.");
  
  
  
  1.8       +7 -14     
jakarta-jmeter/src_1/org/apache/jmeter/protocol/http/sampler/HTTPSampler.java
  
  Index: HTTPSampler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/protocol/http/sampler/HTTPSampler.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- HTTPSampler.java  13 May 2002 12:19:14 -0000      1.7
  +++ HTTPSampler.java  16 May 2002 16:41:30 -0000      1.8
  @@ -80,8 +80,8 @@
    * HTTP requests, including cookies and authentication.
    *
    *@author    Michael Stover
  - *@created   $Date: 2002/05/13 12:19:14 $
  - *@version   $Revision: 1.7 $
  + *@created   $Date: 2002/05/16 16:41:30 $
  + *@version   $Revision: 1.8 $
    ***************************************/
   public class HTTPSampler extends AbstractSampler
   {
  @@ -455,14 +455,8 @@
                headerBuf.append(" ");
                headerBuf.append(conn.getResponseMessage());
                headerBuf.append("\n");
  -             DefaultConfiguration headers = new 
DefaultConfiguration(HTTPSampler.HEADERS,
  -                             
"org.apache.jmeter.protocol.http.samplers.HTTPSampler");
                for(int i = 1; conn.getHeaderFieldKey(i) != null; i++)
                {
  -                     DefaultConfiguration header = new 
DefaultConfiguration(HTTPSampler.HEADER,
  -                                     
"org.apache.jmeter.protocol.http.samplers.HTTPSampler");
  -                     header.setAttribute("name",conn.getHeaderFieldKey(i));
  -                     header.setValue(conn.getHeaderField(i));
                        
if(!conn.getHeaderFieldKey(i).equalsIgnoreCase("transfer-encoding"))
                        {
                                headerBuf.append(conn.getHeaderFieldKey(i));
  @@ -472,8 +466,6 @@
                        }
                }
                headerBuf.append("\n");
  -             //headerBytes.close();
  -             res.addChild(headers);
                return headerBuf.toString().getBytes("8859_1");
        }
   
  @@ -627,10 +619,10 @@
                        }
                }
                URL newUrl = new URL(loc);
  -             this.setDomain(newUrl.getHost());
  -             this.setPath(newUrl.getFile());
  -             this.setArguments(new Arguments());
  -             this.setMethod(HTTPSampler.GET);
  +             urlConfig.setDomain(newUrl.getHost());
  +             urlConfig.setPath(newUrl.getFile());
  +             urlConfig.setArguments(new Arguments());
  +             urlConfig.setMethod(HTTPSampler.GET);
        }
   
        /****************************************
  @@ -742,6 +734,7 @@
                System.arraycopy(ret,0,complete,head.length,ret.length);
                res.setResponseData(complete);
                res.setSuccessful(true);
  +             res.setDataType(res.TEXT);
                return time;
        }
   
  
  
  
  1.7       +2 -1      
jakarta-jmeter/src_1/org/apache/jmeter/protocol/http/sampler/HTTPSamplerFull.java
  
  Index: HTTPSamplerFull.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/protocol/http/sampler/HTTPSamplerFull.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- HTTPSamplerFull.java      29 Apr 2002 17:08:12 -0000      1.6
  +++ HTTPSamplerFull.java      16 May 2002 16:41:30 -0000      1.7
  @@ -82,7 +82,7 @@
    *
    * @author   Khor Soon Hin
    * @version  1.0
  - * @created  $Date: 2002/04/29 17:08:12 $
  + * @created  $Date: 2002/05/16 16:41:30 $
    */
   public class HTTPSamplerFull extends HTTPSampler
   {
  @@ -342,6 +342,7 @@
         UrlConfig urlConfig = new UrlConfig();
         urlConfig.setMethod(HTTPSampler.GET);
         HttpURLConnection conn = null;
  +      res.setSamplerData(urlConfig);
         try
         {
          conn = setupConnection(url, urlConfig);
  
  
  
  1.10      +17 -14    
jakarta-jmeter/src_1/org/apache/jmeter/reporters/ResultCollector.java
  
  Index: ResultCollector.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/reporters/ResultCollector.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ResultCollector.java      2 May 2002 23:18:24 -0000       1.9
  +++ ResultCollector.java      16 May 2002 16:41:30 -0000      1.10
  @@ -64,14 +64,14 @@
   import org.xml.sax.SAXException;
   import org.apache.jmeter.exceptions.*;
   import org.apache.jmeter.testelement.TestListener;
  -import org.apache.jmeter.configuration.SampleResultBuilder;
   import org.apache.jmeter.util.TextFile;
  +import org.apache.jmeter.save.SaveService;
   
   /**
    *  Title: Description: Copyright: Copyright (c) 2001 Company:
    *
    *@author     Michael Stover
  - *@created    $Date: 2002/05/02 23:18:24 $
  + *@created    $Date: 2002/05/16 16:41:30 $
    *@version    1.0
    */
   
  @@ -148,12 +148,15 @@
        public void loadExistingFile()
                throws SAXException, IOException, ConfigurationException {
                        inLoading = true;
  +             if(new File(filename).exists())
  +             {
                        clear();
  -             try {
  -                     Configuration savedSamples = getConfiguration(filename);
  -                     readSamples(savedSamples);
  -             } catch(Exception e) {
  -                     e.printStackTrace();
  +                     try {
  +                             Configuration savedSamples = 
getConfiguration(filename);
  +                             readSamples(savedSamples);
  +                     } catch(Exception e) {
  +                             e.printStackTrace();
  +                     }
                }
                inLoading = false;
        }
  @@ -220,7 +223,7 @@
                        IOException,ConfigurationException
        {
                ByteArrayOutputStream tempOut = new ByteArrayOutputStream();
  -             serializer.serialize(tempOut, result);
  +             serializer.serialize(tempOut, 
SaveService.getConfiguration(result,true));
                String serVer = tempOut.toString();
                return 
serVer.substring(serVer.indexOf(System.getProperty("line.separator")));
        }
  @@ -236,7 +239,7 @@
                Configuration[] samples = testResults.getChildren();
                for(int i = 0; i < samples.length; i++)
                {
  -                     SampleResult result = (SampleResult)samples[i];
  +                     SampleResult result = SaveService.getSampleResult(samples[i]);
                        sendToVisualizer(result);
                        recordResult(result);
                }
  @@ -251,7 +254,7 @@
        private Configuration getConfiguration(String filename) throws SAXException,
                        IOException,ConfigurationException
        {
  -             SampleResultBuilder builder = new SampleResultBuilder();
  +             DefaultConfigurationBuilder builder = new 
DefaultConfigurationBuilder();
                return builder.buildFromFile(filename);
        }
   
  @@ -387,7 +390,7 @@
                }
                catch(Exception err)
                {
  -                     //err.printStackTrace(); //should throw exception back to 
caller
  +                     err.printStackTrace(); //should throw exception back to caller
                }
        }
   
  @@ -417,10 +420,10 @@
        
        private synchronized boolean isResultMarked(SampleResult res)
        {
  -             boolean marked;
  -             if(!(marked = 
res.getAttributeAsBoolean(ResultCollector.COLLECTED,false)))
  +             boolean marked = res.isMarked();
  +             if(!marked)
                {
  -                     res.setAttribute(ResultCollector.COLLECTED,"true");
  +                     res.setMarked();
                }
                return marked;
        }
  
  
  
  1.8       +50 -88    
jakarta-jmeter/src_1/org/apache/jmeter/samplers/SampleResult.java
  
  Index: SampleResult.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/samplers/SampleResult.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SampleResult.java 13 May 2002 12:19:14 -0000      1.7
  +++ SampleResult.java 16 May 2002 16:41:30 -0000      1.8
  @@ -67,10 +67,10 @@
    *  sample of an entry.
    *
    *@author     $Author: mstover1 $
  - *@created    $Date: 2002/05/13 12:19:14 $
  - *@version    $Revision: 1.7 $
  + *@created    $Date: 2002/05/16 16:41:30 $
  + *@version    $Revision: 1.8 $
    */
  -public class SampleResult extends DefaultConfiguration implements Serializable
  +public class SampleResult implements Serializable
   {
        //public final static String URL = "sampler.url";
   
  @@ -78,6 +78,18 @@
        public final static String TEXT = "text";
        public final static String BINARY = "bin";
        private byte[] responseData;
  +     private String responseCode;
  +     private String label;
  +     private TestElement samplerData;
  +     private String threadName;
  +     private String responseMessage;
  +     private long timeStamp = 0;
  +     private List assertionResults = new ArrayList();
  +     private List subResults = new ArrayList();
  +     private String dataType;
  +     private boolean success;
  +     private boolean mark = false;
  +     
   
        Map map;
        long time;
  @@ -118,91 +130,88 @@
         */
        public SampleResult()
        {
  -             super(TAG_NAME,"org.apache.jmeter.samplers.SampleResult");
                map = new HashMap();
                time = 0;
        }
        
  +     public void setMarked()
  +     {
  +             mark = true;
  +     }
  +     
  +     public boolean isMarked()
  +     {
  +             return mark;
  +     }       
  +     
        public String getResponseCode()
        {
  -             return getAttribute(RESPONSE_CODE,"");
  +             return responseCode;
        }
        
        public void setResponseCode(String code)
        {
  -             setAttribute(RESPONSE_CODE,code);
  +             responseCode = code;
        }
        
        public String getResponseMessage()
        {
  -             return getAttribute(RESPONSE_MESSAGE,"");
  +             return responseMessage;
        }
        
        public void setResponseMessage(String msg)
        {
  -             setAttribute(RESPONSE_MESSAGE,msg);
  +             responseMessage = msg;
        }
        
        public String getThreadName()
        {
  -             return getAttribute(THREAD_NAME,"");
  +             return threadName;
        }
        
        public void setThreadName(String threadName)
        {
  -             setAttribute(THREAD_NAME,threadName);
  +             this.threadName = threadName;
        }
        
        public long getTimeStamp()
        {
  -             return getAttributeAsLong(TIME_STAMP,0L);
  +             return timeStamp;
        }
        
        public void setTimeStamp(long timeStamp)
        {
  -             setAttribute(TIME_STAMP,""+timeStamp);
  +             this.timeStamp = timeStamp;
        }
   
        public String getSampleLabel()
        {
  -             return getAttribute(SAMPLE_LABEL,"Display name of SampleResult not 
set");
  +             return label;
        }
   
        public void setSampleLabel(String label)
        {
  -             setAttribute(SAMPLE_LABEL,label);
  +             this.label = label;
        }
   
        public void addAssertionResult(AssertionResult assertResult)
        {
  -             addChild(assertResult);
  +             assertionResults.add(assertResult);
        }
   
        public AssertionResult[] getAssertionResults()
        {
  -             Configuration[] subs = getChildren(AssertionResult.TAG_NAME);
  -             AssertionResult[] subResults = new AssertionResult[subs.length];
  -             for(int i = 0;i < subs.length;i++)
  -             {
  -                     subResults[i] = (AssertionResult)subs[i];
  -             }
  -             return subResults;
  +             return (AssertionResult[])assertionResults.toArray(new 
AssertionResult[0]);
        }
   
        public void addSubResult(SampleResult subResult)
        {
  -             addChild(subResult);
  +             subResults.add(subResult);
        }
   
        public SampleResult[] getSubResults()
        {
  -             Configuration[] subs = getChildren(SampleResult.TAG_NAME);
  -             SampleResult[] subResults = new SampleResult[subs.length];
  -             for(int i = 0;i < subs.length;i++)
  -             {
  -                     subResults[i] = (SampleResult)subs[i];
  -             }
  -             return subResults;
  +             return (SampleResult[])subResults.toArray(new SampleResult[0]);
        }
   
        /**
  @@ -222,7 +231,7 @@
         */
        public void setTime(long t)
        {
  -             setAttribute(TOTAL_TIME, "" + t);
  +             time = t;
        }
   
        /**
  @@ -238,26 +247,7 @@
                addChild(responseChild);*/
        }
   
  -     /**
  -      *  Gets the hexString attribute of the SampleResult object
  -      *
  -      *@param  bytes  Description of the Parameter
  -      *@return        The hexString value
  -      */
  -     private String getHexString(byte[] bytes)
  -     {
  -             StringBuffer hex = new StringBuffer();
  -             for(int i = 0; i < bytes.length; i++)
  -             {
  -                     String hexString = Integer.toHexString((int)bytes[i]);
  -                     if(hexString.length() == 1)
  -                     {
  -                             hex.append("0");
  -                     }
  -                     hex.append(hexString);
  -             }
  -             return hex.toString();
  -     }
  +     
   
   
        /**
  @@ -278,22 +268,14 @@
                return bytes.toByteArray();*/
        }
   
  -     public void setSamplerData(Sampler s)
  +     public void setSamplerData(TestElement s)
        {
  -             
this.addChild(SaveService.getConfigForTestElement((String)s.getProperty(TestElement.NAME),
  -                             s));
  +             samplerData = s;
        }
   
  -     public Sampler getSamplerData()
  +     public TestElement getSamplerData()
        {
  -             try
  -             {
  -                     return 
(Sampler)SaveService.createTestElement(getChild("testelement"));
  -             }
  -             catch(Exception e)
  -             {
  -                     return null;
  -             }
  +             return samplerData;
        }
   
        /**
  @@ -303,7 +285,7 @@
         */
        public long getTime()
        {
  -             return getAttributeAsLong(TOTAL_TIME,0L);
  +             return time;
        }
   
        /**
  @@ -313,17 +295,17 @@
         */
        public boolean isSuccessful()
        {
  -             return getAttributeAsBoolean(SUCCESS,true);
  +             return success;
        }
        
        public void setDataType(String dataType)
        {
  -             setAttribute(DATA_TYPE,dataType);
  +             this.dataType = dataType;
        }
        
        public String getDataType()
        {
  -             return getAttribute(DATA_TYPE,TEXT);
  +             return dataType;
        }
   
        /**
  @@ -333,27 +315,7 @@
         */
        public void setSuccessful(boolean success)
        {
  -             setAttribute(SUCCESS, "" + success);
  -     }
  -
  -     /**
  -      *  Get an array of all the names
  -      *
  -      *@return    !ToDo (Return description)
  -      */
  -     public String[] getNames()
  -     {
  -             return (String[])map.keySet().toArray(new String[0]);
  -     }
  -
  -     /**
  -      *  Remove a key-value pair.
  -      *
  -      *@param  key  !ToDo (Parameter description)
  -      */
  -     public void remove(String key)
  -     {
  -             map.remove(key);
  +             this.success = success;
        }
   
        /**
  
  
  
  1.4       +106 -0    jakarta-jmeter/src_1/org/apache/jmeter/save/SaveService.java
  
  Index: SaveService.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/save/SaveService.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SaveService.java  13 May 2002 12:19:14 -0000      1.3
  +++ SaveService.java  16 May 2002 16:41:30 -0000      1.4
  @@ -3,9 +3,11 @@
   import org.apache.avalon.framework.configuration.*;
   import org.apache.jmeter.util.ListedHashTree;
   import org.apache.jmeter.testelement.TestElement;
  +import org.apache.jmeter.assertions.AssertionResult;
   import java.util.*;
   import java.io.*;
   import org.xml.sax.SAXException;
  +import org.apache.jmeter.samplers.SampleResult;
   /**
    * <p>Title: </p>
    * <p>Description: </p>
  @@ -17,6 +19,19 @@
   
   public class SaveService
   {
  +     private static final String ASSERTION_RESULT_TAG_NAME = "assertionResult";
  +     private static final String SAMPLE_RESULT_TAG_NAME = "sampleResult";
  +     private static final String TIME = "time";
  +     private static final String LABEL = "label";
  +     private static final String RESPONSE_CODE = "responseCode";
  +     private static final String RESPONSE_MESSAGE = "responseMessage";
  +     private static final String THREAD_NAME = "threadName";
  +     private static final String DATA_TYPE = "dataType";
  +     private static final String TIME_STAMP = "timeStamp";
  +     private static final String BINARY = "binary";
  +     private static final String FAILURE_MESSAGE = "failureMessage";
  +     private static final String ERROR = "error";
  +     private static final String FAILURE = "failure";
   
        public SaveService()
        {
  @@ -41,6 +56,30 @@
                        throw new IOException("Problem using Avalon Configuration 
tools");
                }
        }
  +     
  +     public static SampleResult getSampleResult(Configuration config)
  +     {
  +             SampleResult result = new SampleResult();
  +             result.setThreadName(config.getAttribute(THREAD_NAME,""));
  +             result.setDataType(config.getAttribute(DATA_TYPE,""));
  +             result.setResponseCode(config.getAttribute(RESPONSE_CODE,""));
  +             result.setResponseMessage(config.getAttribute(RESPONSE_MESSAGE,""));
  +             result.setTime(config.getAttributeAsLong(TIME,0L));
  +             result.setTimeStamp(config.getAttributeAsLong(TIME_STAMP,0L));
  +             result.setSampleLabel(config.getAttribute(LABEL,""));
  +             result.setResponseData(getBinaryData(config.getChild(BINARY)));
  +             Configuration[] subResults = 
config.getChildren(SAMPLE_RESULT_TAG_NAME);
  +             for(int i = 0;i < subResults.length;i++)
  +             {
  +                     result.addSubResult(getSampleResult(subResults[i]));
  +             }
  +             Configuration[] assResults = 
config.getChildren(ASSERTION_RESULT_TAG_NAME);
  +             for(int i = 0;i < assResults.length;i++)
  +             {
  +                     result.addAssertionResult(getAssertionResult(assResults[i]));
  +             }
  +             return result;
  +     }
   
        private static List getConfigsFromTree(ListedHashTree subTree)
        {
  @@ -60,6 +99,73 @@
                        configs.add(config);
                }
                return configs;
  +     }
  +     
  +     public static Configuration getConfiguration(byte[] bin)
  +     {
  +             DefaultConfiguration config = new DefaultConfiguration(BINARY,"JMeter 
Save Service");
  +             try {
  +                     config.setValue(new String(bin,"utf-8"));
  +             } catch(UnsupportedEncodingException e) {
  +                     e.printStackTrace();
  +             }
  +             return config;
  +     }
  +     
  +     public static byte[] getBinaryData(Configuration config)
  +     {
  +             try {
  +                     return config.getValue("").getBytes("utf-8");
  +             } catch(UnsupportedEncodingException e) {
  +                     return new byte[0];
  +             }
  +     }
  +     
  +     public static AssertionResult getAssertionResult(Configuration config)
  +     {
  +             AssertionResult result = new AssertionResult();
  +             result.setError(config.getAttributeAsBoolean(ERROR,false));
  +             result.setFailure(config.getAttributeAsBoolean(FAILURE,false));
  +             result.setFailureMessage(config.getAttribute(FAILURE_MESSAGE,""));
  +             return result;          
  +     }
  +     
  +     public static Configuration getConfiguration(AssertionResult assResult)
  +     {
  +             DefaultConfiguration config = new 
DefaultConfiguration(ASSERTION_RESULT_TAG_NAME,
  +                             "JMeter Save Service");
  +             config.setAttribute(FAILURE_MESSAGE,assResult.getFailureMessage());
  +             config.setAttribute(ERROR,""+assResult.isError());
  +             config.setAttribute(FAILURE,""+assResult.isFailure());
  +             return config;          
  +     }
  +     
  +     public static Configuration getConfiguration(SampleResult result,boolean 
funcTest)
  +     {
  +             DefaultConfiguration config = new 
DefaultConfiguration(SAMPLE_RESULT_TAG_NAME,"JMeter Save Service");
  +             config.setAttribute(TIME,""+result.getTime());
  +             config.setAttribute(LABEL,result.getSampleLabel());
  +             config.setAttribute(RESPONSE_CODE,result.getResponseCode());
  +             config.setAttribute(RESPONSE_MESSAGE,result.getResponseMessage());
  +             config.setAttribute(THREAD_NAME,result.getThreadName());
  +             config.setAttribute(DATA_TYPE,result.getDataType());
  +             config.setAttribute(TIME_STAMP,""+result.getTimeStamp());
  +             config.addChild(getConfigForTestElement(null,result.getSamplerData()));
  +             SampleResult[] subResults = result.getSubResults();
  +             for(int i = 0;i < subResults.length;i++)
  +             {
  +                     config.addChild(getConfiguration(subResults[i],funcTest));
  +             }
  +             if(funcTest)
  +             {
  +                     AssertionResult[] assResults = result.getAssertionResults();
  +                     for(int i = 0;i < assResults.length;i++)
  +                     {
  +                             config.addChild(getConfiguration(assResults[i]));
  +                     }
  +                     config.addChild(getConfiguration(result.getResponseData()));
  +             }
  +             return config;          
        }
   
        public static Configuration getConfigForTestElement(String named,TestElement 
item)
  
  
  
  1.6       +5 -69     
jakarta-jmeter/src_1/org/apache/jmeter/threads/gui/ThreadGroupGui.java
  
  Index: ThreadGroupGui.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/threads/gui/ThreadGroupGui.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ThreadGroupGui.java       29 Apr 2002 17:08:14 -0000      1.5
  +++ ThreadGroupGui.java       16 May 2002 16:41:30 -0000      1.6
  @@ -66,6 +66,7 @@
   import org.apache.jmeter.gui.util.FocusRequester;
   import org.apache.jmeter.gui.util.MenuFactory;
   import org.apache.jmeter.gui.util.VerticalLayout;
  +import org.apache.jmeter.gui.util.NumberFieldErrorListener;
   import org.apache.jmeter.testelement.TestElement;
   import org.apache.jmeter.threads.ThreadGroup;
   import org.apache.jmeter.util.JMeterUtils;
  @@ -74,12 +75,11 @@
    * Title: JMeter Description: Copyright: Copyright (c) 2000 Company: Apache
    *
    *@author    Michael Stover
  - *@created   $Date: 2002/04/29 17:08:14 $
  + *@created   $Date: 2002/05/16 16:41:30 $
    *@version   1.0
    ***************************************/
   
  -public class ThreadGroupGui extends JPanel implements KeyListener,
  -             JMeterGUIComponent
  +public class ThreadGroupGui extends JPanel implements JMeterGUIComponent
   {
        LoopControlPanel loopPanel;
   
  @@ -192,63 +192,6 @@
        }
   
        /****************************************
  -      * !ToDo (Method description)
  -      *
  -      *@param e  !ToDo (Parameter description)
  -      ***************************************/
  -     public void keyReleased(KeyEvent e)
  -     {
  -             String field = e.getComponent().getName();
  -             if(field.equals(THREAD_NAME))
  -             {
  -                     try
  -                     {
  -                             Integer.parseInt(threadInput.getText());
  -                     }
  -                     catch(NumberFormatException nfe)
  -                     {
  -                             if(threadInput.getText().length() > 0)
  -                             {
  -                                     JOptionPane.showMessageDialog(this, "You must 
enter a valid number",
  -                                                     "Invalid data", 
JOptionPane.WARNING_MESSAGE);
  -
  -                                     // Right now, the cleanest thing to do is 
simply clear the
  -                                     // entire text field. We do not want to set 
the text to
  -                                     // the default because that would be confusing 
to the user.
  -                                     // For example, the user typed "5t" instead of 
"56". After
  -                                     // the user closes the error dialog, the text 
would change
  -                                     // from "5t" to "1".  A litle confusing. If 
anything, it
  -                                     // should display just "5". Future 
enhancement...
  -                                     threadInput.setText("");
  -                             }
  -                     }
  -             }
  -             else if(field.equals(RAMP_NAME))
  -             {
  -                     try
  -                     {
  -                             Integer.parseInt(rampInput.getText());
  -                     }
  -                     catch(NumberFormatException nfe)
  -                     {
  -                             if(rampInput.getText().length() > 0)
  -                             {
  -                                     JOptionPane.showMessageDialog(this, "You must 
enter a valid number",
  -                                                     "Invalid data", 
JOptionPane.WARNING_MESSAGE);
  -                                     rampInput.setText("");
  -                             }
  -                     }
  -             }
  -     }
  -
  -     /****************************************
  -      * !ToDo (Method description)
  -      *
  -      *@param e  !ToDo (Parameter description)
  -      ***************************************/
  -     public void keyTyped(KeyEvent e) { }
  -
  -     /****************************************
         * !ToDoo (Method description)
         *
         *@return   !ToDo (Return description)
  @@ -258,13 +201,6 @@
                return JMeterUtils.getResString("ThreadGroup");
        }
   
  -     /****************************************
  -      * !ToDo (Method description)
  -      *
  -      *@param e  !ToDo (Parameter description)
  -      ***************************************/
  -     public void keyPressed(KeyEvent e) { }
  -
        private void init()
        {
                this.setLayout(new VerticalLayout(5, VerticalLayout.LEFT, 
VerticalLayout.TOP));
  @@ -299,7 +235,7 @@
                threadPanel.add(threadLabel);
                threadInput = new JTextField(5);
                threadInput.setText("1");
  -             threadInput.addKeyListener(this);
  +             
threadInput.addFocusListener(NumberFieldErrorListener.getNumberFieldErrorListener());
                threadInput.setName(THREAD_NAME);
                threadPanel.add(threadInput);
                threadPropsPanel.add(threadPanel);
  @@ -312,7 +248,7 @@
                rampInput = new JTextField(5);
                rampInput.setText("1");
                rampInput.setName(RAMP_NAME);
  -             rampInput.addKeyListener(this);
  +             
rampInput.addFocusListener(NumberFieldErrorListener.getNumberFieldErrorListener());
                rampPanel.add(rampInput);
                threadPropsPanel.add(rampPanel);
   
  
  
  
  1.8       +7 -2      
jakarta-jmeter/src_1/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
  
  Index: ViewResultsFullVisualizer.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src_1/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ViewResultsFullVisualizer.java    2 May 2002 22:55:00 -0000       1.7
  +++ ViewResultsFullVisualizer.java    16 May 2002 16:41:30 -0000      1.8
  @@ -55,6 +55,7 @@
   package org.apache.jmeter.visualizers;
   import java.awt.*;
   import java.awt.event.*;
  +import java.io.UnsupportedEncodingException;
   import java.util.*;
   import javax.swing.*;
   import javax.swing.event.*;
  @@ -79,7 +80,7 @@
    *
    *@author    Khor Soon Hin
    *@created   2001/07/25
  - *@version   $Revision: 1.7 $ $Date: 2002/05/02 22:55:00 $
  + *@version   $Revision: 1.8 $ $Date: 2002/05/16 16:41:30 $
    ***************************************/
   public class ViewResultsFullVisualizer extends ViewResultsVisualizer implements
                TreeSelectionListener
  @@ -272,7 +273,11 @@
                                ImageIcon icon = null;
                                                                                  
if(res.getDataType().equals(SampleResult.TEXT))
                                                                                  {
  -                                                                                    
  response = new String(responseBytes);
  +                                                                                    
  try {
  +                                                                                    
         response = new String(responseBytes,"utf-8");
  +                                                                                    
 } catch(UnsupportedEncodingException err) {
  +                                                                                    
         response = new String(responseBytes);
  +                                                                                    
 }
                                                                                  }
                                                                                  else
                                                                                  {
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to