@Deprecated
  private FTPClient initFtpClientAndLogin() throws SocketException, IOException {
    if (oFtp != null) {
      return oFtp;
    }

    FTPClient oFtp = new FTPClient();

    int iReply;

    oFtp.connect(_sFtpHost);

    iReply = oFtp.getReplyCode();

    if (!FTPReply.isPositiveCompletion(iReply)) {
      log.setError("Could not connect to ftp host" + _sFtpHost);
      return null;
    }

    if (!oFtp.login(_sFtpUserName, _sFtpPassword)) {
      log.error(
          "Could not login with user `" + _sFtpUserName + "` and password `" + _sFtpPassword + "`");
      oFtp.disconnect();
      return null;
    }
    oFtp.enterLocalPassiveMode();
    return oFtp;
  }
 /**
  * The method to download a file and save it onto the local drive of the client in the specified
  * absolut path
  *
  * @param localfilename – the local absolute file name that the file needs to be saved as
  */
 public synchronized boolean downloadFile(String remoteFile, String localfilename) {
   try {
     /*
      * URL url = new URL(this.getRemoteFileUrl(remoteFile));
      * URLConnection urlFtpConnection = url.openConnection();
      * InputStream is = urlFtpConnection.getInputStream();
      * BufferedInputStream bis = new BufferedInputStream(is);
      */
     OutputStream os = new FileOutputStream(localfilename);
     return this.retrieveFile(remoteFile, os);
     /*
      * BufferedOutputStream bos = new BufferedOutputStream(os);
      * byte[] buffer = new byte[1024];
      * int readCount;
      * while ((readCount = bis.read(buffer)) > 0)
      * {
      * bos.write(buffer, 0, readCount);
      * }
      * bos.close();
      * is.close(); // close the FTP inputstream
      * logMessage("File `" + localfilename + "` is downloaded!");
      * bis.close();
      * return true;
      */
   } catch (Exception ex) {
     StringWriter sw0 = new StringWriter();
     PrintWriter p0 = new PrintWriter(sw0, true);
     ex.printStackTrace(p0);
     log.error(sw0.getBuffer().toString());
     log.exception(ex);
     return false;
   }
 }
  /**
   *
   *
   * <pre>
   * <b>Description:</b>
   * Function remove folder from ftp
   * <b>Creation date: </b>02.05.08
   * <b>Modification date: </b>02.05.08
   * </pre>
   *
   * @param String sDirPath � removed directory
   * @author Vitalii Fedorets
   * @return boolean � true if success
   */
  public boolean removeFolder(String sDirPath) throws Exception {
    try {
      File oDir = new File(sDirPath);

      FTPClient oFtp = this.initFtpClientLoginChangeWorkingDirectory(sDirPath);

      oFtp.changeWorkingDirectory(oDir.getParent().replace("\\", "/"));
      int iReply = oFtp.getReplyCode();

      if (!FTPReply.isPositiveCompletion(iReply)) {
        log.setError("Not change work directory to `" + oDir.getParent().replace("\\", "/") + "`");
        oFtp.disconnect();
        return false;
      }

      if (!oFtp.removeDirectory(sDirPath)) {
        log.setError("Could not remove directory `" + sDirPath + "`");
        oFtp.disconnect();
        return false;
      }

      return true;
    } catch (Exception oEx) {
      throw oEx;
    }
  }
  /**
   *
   *
   * <pre>
   * <b>Description:</b>
   * Constructor.
   * </pre>
   *
   * @param String sFtpHost -- name connect ftp host
   * @param String sUserName -- connect user name
   * @param String sPassword -- connect user password
   */
  public FTPHelper(Connection oConn, Logger oLog) {
    this(oConn);
    log = oLog;

    if (LogLevel.getValue(log.getLogLevel()).ordinal() > LogLevel.DEBUG.ordinal()) {
      log.setLogLevel(LogLevel.DEBUG);
    }
  }
  /**
   * Function retrieved file on the remote server NOTE: This function closes output stream after
   * retrieving file content
   *
   * @param fileName
   * @param fileOutput
   * @return
   * @throws SocketException
   * @throws IOException
   */
  public boolean retrieveFile(String fileName, OutputStream fileOutput)
      throws SocketException, IOException {
    boolean fileRetrieved = false;

    connect2Server();

    if (oFtp.isConnected()) {

      try {

        fileRetrieved = oFtp.retrieveFile(fileName, fileOutput);

        if (fileRetrieved) {
          logMessage("File '" + fileName + "' retrieved");
        } else {
          logError(
              "Can't retrieve file "
                  + fileName
                  + " FTP reply code: "
                  + oFtp.getReplyCode()
                  + " Ftp message: "
                  + oFtp.getReplyString());
        }
        fileOutput.close();
      } catch (IOException ioe) {
        log.warning("FTPUtil - retrieveFile(): " + ioe.toString());
        return false;
      }
    }
    this.closeFtpConnection();
    return fileRetrieved;
  }
  /**
   *
   *
   * <pre>
   * <b>Description:</b>
   * Function connect to ftp and get attribute value from xml file by tag name
   * <b>Creation date: </b>02.07.2008
   * <b>Modification date: </b>02.07.2008
   * </pre>
   *
   * @param String sDirPath -- dirrectory where file located
   * @param String sFileName -- XML file name
   * @param String sTag -- searching tag in file
   * @param String sAttribute -- tag attribute
   * @author Oleksii Zozulenko.
   * @return String sAttrValue -- attribute value, or null if error
   * @exception Exception
   */
  public String getXMLAttributeValue(
      String sDirPath, String sFileName, String sTag, String sAttribute) throws Exception {
    try {
      String sAttrValue = null;

      FTPClient oFtp = this.initFtpClientLoginChangeWorkingDirectory(sDirPath);

      ByteArrayOutputStream oBuf = new ByteArrayOutputStream();

      if (!oFtp.retrieveFile(sFileName, oBuf)) {
        log.setError("Could not read file `" + sFileName + "`");
        oFtp.disconnect();
        return null;
      }

      oFtp.disconnect();

      String sBuf = oBuf.toString();

      oBuf.close();

      if (!sBuf.contains(sTag)) {
        log.setError("File `" + sFileName + "` not contains tag `" + sTag + "`");
        return null;
      }

      sBuf = sBuf.substring(sBuf.indexOf(sTag));

      if (!sBuf.contains(sAttribute)) {
        log.setError(
            "File `"
                + sFileName
                + "` not contains tag `"
                + sTag
                + "` with attribute `"
                + sAttribute
                + "`");
        return null;
      }
      sBuf = sBuf.substring(sBuf.indexOf(sAttribute + "=\"") + (sAttribute + "=\"").length());
      sAttrValue = sBuf.substring(0, sBuf.indexOf("\""));

      return sAttrValue;
    } catch (Exception oEx) {
      throw oEx;
    }
  }
  /**
   *
   *
   * <pre>
   * <b>Description:</b>
   * Function create ftp folder
   * <b>Creation date: </b>02.05.08
   * <b>Modification date: </b>02.05.08
   * </pre>
   *
   * @param String sDirName � directory name
   * @author Vitalii Fedorets
   * @return boolean � true if success
   */
  public boolean createFolder(String sDirName) throws Exception {
    try {
      FTPClient oFtp = this.initFtpClientLoginChangeWorkingDirectory(sDirName);

      if (!oFtp.makeDirectory(sDirName)) {
        log.setError("Could not create directory `" + sDirName + "`");
        oFtp.disconnect();
        return false;
      }

      oFtp.disconnect();
      return true;
    } catch (Exception oEx) {
      throw oEx;
    }
  }
  /**
   * @param sDirPath
   * @return
   * @throws SocketException
   * @throws IOException
   */
  private FTPClient initFtpClientLoginChangeWorkingDirectory(String sDirPath)
      throws SocketException, IOException {
    if (oFtp != null) {
      return oFtp;
    }

    oFtp = initFtpClientAndLogin();
    int iReply;
    oFtp.changeWorkingDirectory(sDirPath);
    iReply = oFtp.getReplyCode();

    if (!FTPReply.isPositiveCompletion(iReply)) {
      log.setError("Not change work directory to `" + sDirPath + "`");
      oFtp.disconnect();
      return null;
    }
    return oFtp;
  }
  private synchronized void connect2Server() throws SocketException, IOException {
    if (oFtp == null) {
      this.oFtp = new FTPClient();
    }

    if (log != null) {
      if (LogLevel.getValue(log.getLogLevel()).ordinal() > LogLevel.DEBUG.ordinal()) {
        oFtp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.err)));
      }
    }

    if (_port == 0) {
      oFtp.connect(this._sFtpHost, 21);
    } else {
      oFtp.connect(this._sFtpHost, _port);
    }
    if (!oFtp.login(this._sFtpUserName, this._sFtpPassword)) {
      logError("Can't login to server. FTP responce: " + oFtp.getReplyString());
    }

    oFtp.enterLocalPassiveMode();
  }
  /**
   *
   *
   * <pre>
   * <b>Description:</b>
   * Function check file content on ftp folder
   * <b>Creation date: </b>02.05.08
   * <b>Modification date: </b>02.05.08
   * </pre>
   *
   * @param String sDirPath � directory contains file
   * @param String sFileName � file name
   * @param String sText - text which contains in file
   * @author Vitalii Fedorets
   * @return boolean � true if file contains text
   */
  public boolean checkTextInFile(String sDirPath, String sFileName, String sText) throws Exception {
    try {
      FTPClient oFtp = this.initFtpClientLoginChangeWorkingDirectory(sDirPath);

      ByteArrayOutputStream oBuf = new ByteArrayOutputStream();

      if (!oFtp.retrieveFile(sFileName, oBuf)) {
        log.setError("Could not read file `" + sFileName + "`");
        oFtp.disconnect();
        return false;
      }

      oFtp.disconnect();

      String sBuf = oBuf.toString();

      oBuf.close();

      return sBuf.contains(sText);
    } catch (Exception oEx) {
      throw oEx;
    }
  }
 private void logMessage(String msg) {
   if (this.log != null) {
     log.message(msg);
   }
 }
 private void logError(String err) {
   if (this.log != null) {
     log.error(err);
   }
 }
  /**
   * The method that handles file uploading, this method takes the absolute file path of a local
   * file to be uploaded to the remote FTP server, and the remote file will then be transfered to
   * the FTP server and saved as the relative path name specified in method setRemoteFile
   *
   * @param localfilename – the local absolute file name of the file in local hard drive that needs
   *     to FTP over
   */
  public synchronized boolean uploadFile(String localfilename, String remoteFile) {

    final BufferedInputStream bis;
    try {
      // URL url = new URL(this.getRemoteFileUrl(remoteFile));
      // URLConnection urlFtpConnection = url.openConnection();

      InputStream is = new FileInputStream(localfilename);
      bis = new BufferedInputStream(is);

      connect2Server();

      if (oFtp.isConnected()) {
        String fileExtension = localfilename.substring(localfilename.lastIndexOf(".") + 1);

        String[] fileExtensions = {"png", "gif", "bmp", "jpg", "jpeg", "tiff"};

        // If exporting to .csv or .tsv, add the gid parameter to specify which sheet to export
        if (Arrays.asList(fileExtensions).contains(fileExtension)) {
          oFtp.setFileType(FTP.BINARY_FILE_TYPE);
        }

        // OutputStream os = oFtp.storeFileStream(remoteFile);
        // if (os == null)
        // {
        // logError(oFtp.getReplyString());
        // }
        // BufferedOutputStream bos = new BufferedOutputStream(os);
        // byte[] buffer = new byte[1024];
        // int readCount;
        //
        // while ((readCount = bis.read(buffer)) > 0)
        // {
        // bos.write(buffer);
        // // bos.flush();
        // }
        // bos.close();

        if (!oFtp.storeFile(remoteFile, bis)) {
          logError(
              "Can't upload file "
                  + localfilename
                  + " FTP reply code: "
                  + oFtp.getReplyCode()
                  + " Ftp message: "
                  + oFtp.getReplyString());

          bis.close();
          is.close();

          this.closeFtpConnection();
          return false;
        } else {
          logMessage("File `" + localfilename + "` is uploaded!");
        }
      }

      /*
       * urlFtpConnection.getOutputStream();
       * //
       * log.message("File `" + localfilename + "` is uploaded!");
       */

      bis.close();
      is.close();
      // this.closeFtpConnection();
      return true;
    } catch (Exception ex) {
      StringWriter sw0 = new StringWriter();
      PrintWriter p0 = new PrintWriter(sw0, true);
      ex.printStackTrace(p0);
      log.error(sw0.getBuffer().toString());
      log.exception(ex);

      return false;
    }
  }