Author: sebb
Date: Sat Apr 28 03:36:46 2007
New Revision: 533328

URL: http://svn.apache.org/viewvc?view=rev&rev=533328
Log:
Bug 42223 - Add ability to upload files via FTP

Removed:
    
jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/sampler/FtpClient.java
    
jakarta/jmeter/branches/rel-2-2/xdocs/images/screenshots/ftptest/ftp-request.gif
Modified:
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_CN.properties
    
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties
    
jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/config/gui/FtpConfigGui.java
    
jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/sampler/FTPSampler.java
    jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
    
jakarta/jmeter/branches/rel-2-2/xdocs/images/screenshots/ftptest/ftp-request.png
    jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages.properties
 Sat Apr 28 03:36:46 2007
@@ -175,7 +175,6 @@
 field_name=Field name
 file=File
 file_already_in_use=That file is already in use
-file_to_retrieve=File to Retrieve From Server\:
 file_visualizer_append=Append to Existing Data File
 file_visualizer_auto_flush=Automatically Flush After Each Data Sample
 file_visualizer_browse=Browse...
@@ -198,8 +197,14 @@
 foreach_use_separator=Add "_" before number ?
 format=Number format
 fr=French
+ftp_binary_mode=Use Binary mode ?
+ftp_get=get(RETR)
+ftp_local_file=Local File:
+ftp_remote_file=Remote File:
 ftp_sample_title=FTP Request Defaults
+ftp_save_response_data=Save File in Response ?
 ftp_testing_title=FTP Request
+ftp_put=put(STOR)
 function_dialog_menu_item=Function Helper Dialog
 function_helper_title=Function Helper
 function_name_param=Name of variable in which to store the result

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_de.properties
 Sat Apr 28 03:36:46 2007
@@ -45,7 +45,6 @@
 file_already_in_use=Die Datei ist bereits ge\u00F6ffnet
 file=Datei
 filename=Dateiname
-file_to_retrieve=Dateien die vom Server geholt werden sollen\:
 file_visualizer_append=Anh\u00E4ngen an eine existierende Daten Datei
 file_visualizer_auto_flush=automatischer Flush nach jedem Daten Sample
 file_visualizer_browse=Datei laden...

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_es.properties
 Sat Apr 28 03:36:46 2007
@@ -143,7 +143,6 @@
 field_name=Nombre de campo
 file=Archivo
 file_already_in_use=Ese archivo est\u00E1 en uso
-file_to_retrieve=Archivo a recuperar del servidor\:
 file_visualizer_append=A\u00F1adir a archivo de datos existente
 file_visualizer_auto_flush=Hacer flush autom\u00E1ticamente despu\u00E9s de 
cada muestra de datos
 file_visualizer_browse=Navegar...

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_fr.properties
 Sat Apr 28 03:36:46 2007
@@ -112,7 +112,6 @@
 field_name=Nom du Champs
 file=Fichier
 file_already_in_use=Ce fichier est d\u00E9j\u00E0 utilis\u00E9
-file_to_retrieve=Fichier \u00E0 R\u00E9cup\u00E9rer du Serveur\:
 file_visualizer_append=Concat\u00E9ner au Fichier de Donn\u00E9es Existant
 file_visualizer_auto_flush=Vider Automatiquement Apr\u00E8s Chaque Echantillon 
de Donn\u00E9es
 file_visualizer_browse=Parcourir...

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_ja.properties
 Sat Apr 28 03:36:46 2007
@@ -106,7 +106,6 @@
 field_name=\u30D5\u30A3\u30FC\u30EB\u30C9\u540D
 file=\u30D5\u30A1\u30A4\u30EB
 
file_already_in_use=\u305D\u306E\u30D5\u30A1\u30A4\u30EB\u306F\u3059\u3067\u306B\u4F7F\u7528\u4E2D\u3067\u3059\u3002
-file_to_retrieve=\u30B5\u30FC\u30D0\u304B\u3089\u7E70\u308A\u8FD4\u3057\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3059\u308B\u30D5\u30A1\u30A4\u30EB\:
 
file_visualizer_append=\u65E2\u306B\u5B58\u5728\u3059\u308B\u30C7\u30FC\u30BF\u30D5\u30A1\u30A4\u30EB\u3078\u8FFD\u52A0
 
file_visualizer_auto_flush=\u5404\u30C7\u30FC\u30BF\u3092\u30B5\u30F3\u30D7\u30EA\u30F3\u30B0\u3057\u305F\u3042\u3068\u306B\u81EA\u52D5\u7684\u306B\u66F8\u51FA\u3057
 file_visualizer_browse=\u53C2\u7167...

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_no.properties
 Sat Apr 28 03:36:46 2007
@@ -31,7 +31,6 @@
 exit=Avslutt
 expiration=Utl\u00F8per
 file=Fil
-file_to_retrieve=Fil \u00E5 hente fra server\:
 file_visualizer_append=Legg til en eksisterende fil
 file_visualizer_auto_flush=Automatisk t\u00F8mming etter hver m\u00E5ledata
 file_visualizer_browse=Bla gjennom...

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_CN.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_CN.properties?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_CN.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_CN.properties
 Sat Apr 28 03:36:46 2007
@@ -100,7 +100,6 @@
 field_name=\u5B57\u6BB5\u540D\u6210
 file=\u6587\u4EF6
 file_already_in_use=\u6587\u4EF6\u6B63\u5728\u4F7F\u7528
-file_to_retrieve=\u8981\u4ECE\u670D\u52A1\u5668\u83B7\u53D6\u7684\u7684\u6587\u4EF6\uFF1A
 
file_visualizer_append=\u6DFB\u52A0\u5230\u5DF2\u7ECF\u5B58\u5728\u7684\u6570\u636E\u6587\u4EF6
 
file_visualizer_auto_flush=\u5728\u6BCF\u6B21\u6570\u636E\u53D6\u6837\u540E\u81EA\u52A8\u66F4\u65B0
 file_visualizer_browse=\u6D4F\u89C8...

Modified: 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/resources/messages_zh_TW.properties
 Sat Apr 28 03:36:46 2007
@@ -143,7 +143,6 @@
 field_name=\u6B04\u4F4D\u540D\u7A31
 file=\u6A94\u6848
 file_already_in_use=\u6A94\u6848\u5DF2\u5728\u4F7F\u7528\u4E2D
-file_to_retrieve=\u8981\u53D6\u5F97\u7684\u6A94\u6848\uFF1A
 file_visualizer_append=\u52A0\u5165\u65E2\u6709\u7684\u6A94\u6848
 file_visualizer_auto_flush=\u53D6\u5F97\u6BCF\u8CC7\u6599\u5F8C\u81EA\u52D5 
Flush
 file_visualizer_browse=\u700F\u89BD

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/config/gui/FtpConfigGui.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/config/gui/FtpConfigGui.java?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/config/gui/FtpConfigGui.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/config/gui/FtpConfigGui.java
 Sat Apr 28 03:36:46 2007
@@ -20,31 +20,39 @@
 
 import java.awt.BorderLayout;
 
+import javax.swing.ButtonGroup;
+import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
+import javax.swing.JRadioButton;
 import javax.swing.JTextField;
 
 import org.apache.jmeter.config.ConfigTestElement;
 import org.apache.jmeter.config.gui.AbstractConfigGui;
+import org.apache.jmeter.gui.util.HorizontalPanel;
 import org.apache.jmeter.gui.util.VerticalPanel;
 import org.apache.jmeter.protocol.ftp.sampler.FTPSampler;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.util.JMeterUtils;
 
-/**
- * @version $Revision$ last updated $Date$
- */
 public class FtpConfigGui extends AbstractConfigGui {
-       private final static String SERVER = "server";
-
-       private final static String FILENAME = "filename";
 
        private JTextField server;
 
-       private JTextField filename;
+       private JTextField remoteFile;
+
+       private JTextField localFile;
 
+       private JCheckBox binaryMode;
+       
+       private JCheckBox saveResponseData;
+       
        private boolean displayName = true;
 
+       private JRadioButton getBox;
+
+       private JRadioButton putBox;
+
        public FtpConfigGui() {
                this(true);
        }
@@ -55,13 +63,18 @@
        }
 
        public String getLabelResource() {
-               return "ftp_sample_title";
+               return "ftp_sample_title"; // $NON-NLS-1$
        }
 
        public void configure(TestElement element) {
                super.configure(element);
+               // Note: the element is a ConfigTestElement, so cannot use 
FTPSampler access methods
                server.setText(element.getPropertyAsString(FTPSampler.SERVER));
-               
filename.setText(element.getPropertyAsString(FTPSampler.FILENAME));
+               
remoteFile.setText(element.getPropertyAsString(FTPSampler.REMOTE_FILENAME));
+               
localFile.setText(element.getPropertyAsString(FTPSampler.LOCAL_FILENAME));
+               
binaryMode.setSelected(element.getPropertyAsBoolean(FTPSampler.BINARY_MODE, 
false));
+               
saveResponseData.setSelected(element.getPropertyAsBoolean(FTPSampler.SAVE_RESPONSE,
 false));
+               
putBox.setSelected(element.getPropertyAsBoolean(FTPSampler.UPLOAD_FILE,false));
        }
 
        public TestElement createTestElement() {
@@ -77,15 +90,19 @@
         */
        public void modifyTestElement(TestElement element) {
                configureTestElement(element);
-               element.setProperty(FTPSampler.SERVER, server.getText());
-               element.setProperty(FTPSampler.FILENAME, filename.getText());
+               // Note: the element is a ConfigTestElement, so cannot use 
FTPSampler access methods
+               element.setProperty(FTPSampler.SERVER,server.getText());
+               
element.setProperty(FTPSampler.REMOTE_FILENAME,remoteFile.getText());
+               
element.setProperty(FTPSampler.LOCAL_FILENAME,localFile.getText());
+               
element.setProperty(FTPSampler.BINARY_MODE,binaryMode.isSelected());
+               element.setProperty(FTPSampler.SAVE_RESPONSE, 
saveResponseData.isSelected());
+               element.setProperty(FTPSampler.UPLOAD_FILE,putBox.isSelected());
        }
 
        private JPanel createServerPanel() {
                JLabel label = new JLabel(JMeterUtils.getResString("server"));
 
                server = new JTextField(10);
-               server.setName(SERVER);
                label.setLabelFor(server);
 
                JPanel serverPanel = new JPanel(new BorderLayout(5, 0));
@@ -94,19 +111,52 @@
                return serverPanel;
        }
 
-       private JPanel createFilenamePanel() {
-               JLabel label = new 
JLabel(JMeterUtils.getResString("file_to_retrieve"));
+       private JPanel createLocalFilenamePanel() {
+               JLabel label = new 
JLabel(JMeterUtils.getResString("ftp_local_file"));
 
-               filename = new JTextField(10);
-               filename.setName(FILENAME);
-               label.setLabelFor(filename);
+               localFile = new JTextField(10);
+               label.setLabelFor(localFile);
 
                JPanel filenamePanel = new JPanel(new BorderLayout(5, 0));
                filenamePanel.add(label, BorderLayout.WEST);
-               filenamePanel.add(filename, BorderLayout.CENTER);
+               filenamePanel.add(localFile, BorderLayout.CENTER);
                return filenamePanel;
        }
 
+       private JPanel createRemoteFilenamePanel() {
+               JLabel label = new 
JLabel(JMeterUtils.getResString("ftp_remote_file"));
+
+               remoteFile = new JTextField(10);
+               label.setLabelFor(remoteFile);
+
+               JPanel filenamePanel = new JPanel(new BorderLayout(5, 0));
+               filenamePanel.add(label, BorderLayout.WEST);
+               filenamePanel.add(remoteFile, BorderLayout.CENTER);
+               return filenamePanel;
+       }
+
+       private JPanel createOptionsPanel(){
+
+               ButtonGroup group = new ButtonGroup();
+
+               getBox = new JRadioButton(JMeterUtils.getResString("ftp_get"));
+               group.add(getBox);
+               getBox.setSelected(true);
+
+               putBox = new JRadioButton(JMeterUtils.getResString("ftp_put"));
+               group.add(putBox);
+
+               binaryMode = new 
JCheckBox(JMeterUtils.getResString("ftp_binary_mode"));
+               saveResponseData = new 
JCheckBox(JMeterUtils.getResString("ftp_save_response_data"));
+               
+               
+               JPanel optionsPanel = new HorizontalPanel();
+               optionsPanel.add(getBox);
+               optionsPanel.add(putBox);
+               optionsPanel.add(binaryMode);
+               optionsPanel.add(saveResponseData);
+               return optionsPanel;            
+       }
        private void init() {
                setLayout(new BorderLayout(0, 5));
 
@@ -117,10 +167,10 @@
 
                // MAIN PANEL
                VerticalPanel mainPanel = new VerticalPanel();
-
-               // LOOP
                mainPanel.add(createServerPanel());
-               mainPanel.add(createFilenamePanel());
+               mainPanel.add(createRemoteFilenamePanel());
+               mainPanel.add(createLocalFilenamePanel());
+               mainPanel.add(createOptionsPanel());
 
                add(mainPanel, BorderLayout.CENTER);
        }

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/sampler/FTPSampler.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/sampler/FTPSampler.java?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/sampler/FTPSampler.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/ftp/org/apache/jmeter/protocol/ftp/sampler/FTPSampler.java
 Sat Apr 28 03:36:46 2007
@@ -18,6 +18,20 @@
 
 package org.apache.jmeter.protocol.ftp.sampler;
 
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.output.NullOutputStream;
+import org.apache.commons.io.output.TeeOutputStream;
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPReply;
 import org.apache.jmeter.config.ConfigTestElement;
 import org.apache.jmeter.samplers.AbstractSampler;
 import org.apache.jmeter.samplers.Entry;
@@ -30,7 +44,20 @@
 public class FTPSampler extends AbstractSampler {
        public final static String SERVER = "FTPSampler.server"; // $NON-NLS-1$
 
-       public final static String FILENAME = "FTPSampler.filename"; // 
$NON-NLS-1$
+       // N.B. Originally there was only one filename, and only get(RETR) was 
supported
+       // To maintain backwards compatibility, the property name needs to 
remain the same
+       public final static String REMOTE_FILENAME = "FTPSampler.filename"; // 
$NON-NLS-1$
+       
+       public final static String LOCAL_FILENAME = "FTPSampler.localfilename"; 
// $NON-NLS-1$
+
+       // Use binary mode file transfer?
+       public final static String BINARY_MODE = "FTPSampler.binarymode"; // 
$NON-NLS-1$
+
+       // Are we uploading?
+       public final static String UPLOAD_FILE = "FTPSampler.upload"; // 
$NON-NLS-1$
+       
+       // Should the file data be saved in the response?
+       public final static String SAVE_RESPONSE = "FTPSampler.saveresponse"; 
// $NON-NLS-1$
 
        public FTPSampler() {
        }
@@ -51,14 +78,27 @@
                return getPropertyAsString(SERVER);
        }
 
-       public void setFilename(String newFilename) {
-               this.setProperty(FILENAME, newFilename);
+       public String getRemoteFilename() {
+               return getPropertyAsString(REMOTE_FILENAME);
        }
 
-       public String getFilename() {
-               return getPropertyAsString(FILENAME);
+       public String getLocalFilename() {
+               return getPropertyAsString(LOCAL_FILENAME);
        }
 
+       public boolean isBinaryMode(){
+               return getPropertyAsBoolean(BINARY_MODE,false);
+       }
+
+       public boolean isSaveResponse(){
+               return getPropertyAsBoolean(SAVE_RESPONSE,false);
+       }
+
+       public boolean isUpload(){
+               return getPropertyAsBoolean(UPLOAD_FILE,false);
+       }
+
+       
        /**
         * Returns a formatted string label describing this sampler Example 
output:
         * ftp://ftp.nowhere.com/pub/README.txt
@@ -66,45 +106,106 @@
         * @return a formatted string label describing this sampler
         */
        public String getLabel() {
-               return ("ftp://"; + this.getServer() + "/" + 
this.getFilename()); // $NON-NLS-1$ $NON-NLS-2$
+               return ("ftp://"; + getServer() + "/" + getRemoteFilename() // 
$NON-NLS-1$ $NON-NLS-2$
+                               + (isBinaryMode() ? " (Binary) " : " (Ascii) ") 
   // $NON-NLS-1$ $NON-NLS-2$
+                               + (isUpload() ? " <- " : " -> ")                
   // $NON-NLS-1$ $NON-NLS-2$
+                               + getLocalFilename());
        }
 
        public SampleResult sample(Entry e) {
                SampleResult res = new SampleResult();
-               boolean isSuccessful = false;
-               // FtpConfig ftpConfig = 
(FtpConfig)e.getConfigElement(FtpConfig.class);
+               res.setSuccessful(false);
+               String remote = getRemoteFilename();
+               String local = getLocalFilename();
+               boolean binaryTransfer = isBinaryMode();
                res.setSampleLabel(getName());
         res.setSamplerData(getLabel());
-               // LoginConfig loginConfig =
-               // (LoginConfig)e.getConfigElement(LoginConfig.class);
-               res.sampleStart();
-        FtpClient ftp = new FtpClient();
+        InputStream input = null;
+        OutputStream output = null;
+
+        res.sampleStart();
+        FTPClient ftp = new FTPClient();
                try {
-                       ftp.connect(getServer(), getUsername(), getPassword());
-                       ftp.setPassive(true);// should probably come from the 
setup dialog
-                       String s = ftp.get(getFilename());
-                       res.setResponseData(s.getBytes());
-            res.setResponseCodeOK();
-            res.setResponseMessageOK();
-            ftp.disconnect();            
-                       isSuccessful = true;
-               } catch (java.net.ConnectException ex) {
-                       // java.net.ConnectException -- 502 error code?
-                       // in the future, possibly define and place error codes 
into the
-                       // result so we know exactly what happened.
-                       res.setResponseData(ex.toString().getBytes());
-            res.setResponseMessage(ex.getLocalizedMessage());
-               } catch (Exception ex) {
-                       // general exception
-                       res.setResponseData(ex.toString().getBytes());
-            res.setResponseMessage(ex.getLocalizedMessage());
+                       ftp.connect(getServer());
+                       int reply = ftp.getReplyCode();
+            if (FTPReply.isPositiveCompletion(reply))
+            {
+                   if (ftp.login( getUsername(), getPassword())){
+                       if (binaryTransfer) {
+                           ftp.setFileType(FTP.BINARY_FILE_TYPE);
+                       }
+                                       ftp.enterLocalPassiveMode();// should 
probably come from the setup dialog
+                                       boolean ftpOK=false;
+                           if (isUpload()) {
+                               File infile = new File(local);
+                               input = new FileInputStream(infile);
+                               ftpOK = ftp.storeFile(remote, input);           
                
+                               res.setBytes((int)infile.length());
+                           } else {
+                               final boolean saveResponse = isSaveResponse();
+                               ByteArrayOutputStream baos=null; // No need to 
close this
+                               OutputStream target=null; // No need to close 
this
+                               if (saveResponse){
+                                       baos  = new ByteArrayOutputStream();
+                                       target=baos;
+                               }
+                               if (local.length()>0){
+                                       output=new FileOutputStream(local);
+                                       if (target==null) {
+                                               target=output;
+                                       } else {
+                                               target = new 
TeeOutputStream(output,baos);
+                                       }
+                               }
+                               if (target == null){
+                                       target=new NullOutputStream();
+                               }
+                               input = ftp.retrieveFileStream(remote);
+                               long bytes = IOUtils.copy(input,target);
+                               ftpOK = bytes > 0;
+                                               if (saveResponse){
+                                                       
res.setResponseData(baos.toByteArray());
+                                                       if (!binaryTransfer) {
+                                                           
res.setDataType(SampleResult.TEXT);
+                                                       }
+                               } else {
+                                       res.setBytes((int) bytes);
+                               }
+                           }
+
+                           if (ftpOK) {
+                               res.setResponseCodeOK();
+                                   res.setResponseMessageOK();
+                                       res.setSuccessful(true);
+                           } else {
+                               
res.setResponseCode(Integer.toString(ftp.getReplyCode()));
+                               res.setResponseMessage(ftp.getReplyString());
+                           }
+                   } else {
+                       
res.setResponseCode(Integer.toString(ftp.getReplyCode()));
+                       res.setResponseMessage(ftp.getReplyString());
+                   }
+            } else {
+               res.setResponseCode("501"); // TODO
+               res.setResponseMessage("Could not connect");                    
+               //res.setResponseCode(Integer.toString(ftp.getReplyCode()));
+               res.setResponseMessage(ftp.getReplyString());
+            }
+               } catch (IOException ex) {
+               res.setResponseCode("000"); // TODO
+            res.setResponseMessage(ex.toString());
+        } finally {
+            if (ftp != null && ftp.isConnected()) {
+                try {
+                    ftp.disconnect();
+                } catch (IOException ignored) {
+                }
+            }
+            IOUtils.closeQuietly(input);
+            IOUtils.closeQuietly(output);
         }
 
                res.sampleEnd();
-
-               // Set if we were successful or not
-               res.setSuccessful(isSuccessful);
-
                return res;
        }
 }

Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Sat Apr 28 03:36:46 2007
@@ -41,6 +41,7 @@
 <li>HTTP Proxy supports XML-RPC recording</li>
 <li>__V() function allows support of nested variable references</li>
 <li>LDAP Ext sampler optionally parses result sets and supports secure 
mode</li>
+<li>FTP Sampler supports Ascii/Binary mode and upload</li>
 </ul>
 <p>
 The main bug fixes are:
@@ -135,6 +136,7 @@
 <li>Bug 42158 - Improve support for multipart/form-data requests in HTTP Proxy 
server</li>
 <li>Bug 40369 - LDAP: Stable search results in sampler</li>
 <li>Bug 36755 - Save XML test files with UTF-8 encoding</li>
+<li>Bug 42223 - Add ability to upload files via FTP</li>
 </ul>
 
 <h4>Non-functional improvements:</h4>

Modified: 
jakarta/jmeter/branches/rel-2-2/xdocs/images/screenshots/ftptest/ftp-request.png
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/images/screenshots/ftptest/ftp-request.png?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
Binary files - no diff available.

Modified: 
jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml?view=diff&rev=533328&r1=533327&r2=533328
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml 
(original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/usermanual/component_reference.xml 
Sat Apr 28 03:36:46 2007
@@ -42,19 +42,26 @@
 <description>
        <br>Samplers perform the actual work of JMeter.</br>
 </description>
-<component name="FTP Request" index="&sect-num;.1.1" width="407" height="238" 
screenshot="ftptest/ftp-request.gif">
-<description>This controller lets you send an FTP "retrieve file" request to 
an FTP server.
+<component name="FTP Request" index="&sect-num;.1.1" width="502" height="299" 
screenshot="ftptest/ftp-request.png">
+<description>This controller lets you send an FTP "retrieve file" or "upload 
file" request to an FTP server.
 If you are going to send multiple requests to the same FTP server, consider
 using a <complink name="FTP Request Defaults"/> Configuration
 Element so you do not have to enter the same information for each FTP Request 
Generative
-Controller. </description>
+Controller. When downloading a file, it can be stored on disk (Local File) or 
in the Response Data, or both.</description>
 <properties>
         <property name="Name" required="No">Descriptive name for this 
controller that is shown in the tree.</property>
         <property name="Server Name or IP" required="Yes">Domain name or IP 
address of the FTP server.
 JMeter assumes the FTP server is listening on the default port.</property>
-        <property name="File to Retrieve From Server" required="Yes">Path and 
name of the file to retrieve.</property>
+        <property name="Remote File:" required="Yes">File to retrieve or 
upload.</property>
+        <property name="Local File:" required="Yes, if uploading">File to 
upload, or destination for downloads.</property>
+        <property name="get(RETR) / put(STOR)" required="Yes">Whether to 
retrieve or upload a file.</property>
+        <property name="Use Binary mode ?" required="Yes">Check this to use 
Binary mode (default Ascii)</property>
+        <property name="Save File in Response ?" required="Yes, if 
downloading">
+        Whether to store contents of retrieved file in response data.
+        If the mode is Ascii, then the contents will be visible in the Tree 
View Listener.
+        </property>
         <property name="Username" required="Usually">FTP account 
username.</property>
-        <property name="Password" required="Usually">FTP account 
password.</property>
+        <property name="Password" required="Usually">FTP account password. 
N.B. This will be visible in the test plan.</property>
 </properties>
 <links>
         <link href="test_plan.html#assertions">Assertions</link>



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

Reply via email to