private void recursiveDeleteTree(IPath path, IProgressMonitor monitor, MultiStatus status)
     throws IOException, ParseException {
   try {
     changeCurrentDir(path);
     FTPFile[] ftpFiles = listFiles(path, monitor);
     List<String> dirs = new ArrayList<String>();
     for (FTPFile ftpFile : ftpFiles) {
       String name = ftpFile.getName();
       if (".".equals(name) || "..".equals(name)) { // $NON-NLS-1$ //$NON-NLS-2$
         continue;
       }
       if (ftpFile.isDir()) {
         dirs.add(name);
         continue;
       }
       Policy.checkCanceled(monitor);
       monitor.subTask(path.append(name).toPortableString());
       try {
         ftpClient.delete(name);
       } catch (FTPException e) {
         status.add(
             new Status(
                 IStatus.ERROR,
                 FTPPlugin.PLUGIN_ID,
                 StringUtils.format(
                     Messages.FTPConnectionFileManager_deleting_failed,
                     path.append(name).toPortableString()),
                 e));
       }
       monitor.worked(1);
     }
     for (String name : dirs) {
       monitor.subTask(path.append(name).toPortableString());
       recursiveDeleteTree(path.append(name), monitor, status);
       Policy.checkCanceled(monitor);
       changeCurrentDir(path);
       Policy.checkCanceled(monitor);
       ftpClient.rmdir(name);
       monitor.worked(1);
     }
   } catch (IOException e) {
     throw e;
   } catch (Exception e) {
     status.add(
         new Status(
             IStatus.ERROR,
             FTPPlugin.PLUGIN_ID,
             StringUtils.format(
                 Messages.FTPConnectionFileManager_deleting_failed, path.toPortableString()),
             e));
   }
 }
 private static void fillFileInfo(ExtendedFileInfo fileInfo, FTPFile ftpFile) {
   fileInfo.setExists(true);
   fileInfo.setName(ftpFile.getName());
   fileInfo.setDirectory(ftpFile.isDir());
   fileInfo.setLength(ftpFile.size());
   fileInfo.setLastModified(ftpFile.lastModified() != null ? ftpFile.lastModified().getTime() : 0);
   fileInfo.setOwner(ftpFile.getOwner());
   fileInfo.setGroup(ftpFile.getGroup());
   fileInfo.setPermissions(Policy.permissionsFromString(ftpFile.getPermissions()));
   if (ftpFile.isLink()) {
     fileInfo.setAttribute(EFS.ATTRIBUTE_SYMLINK, true);
     fileInfo.setStringAttribute(EFS.ATTRIBUTE_LINK_TARGET, ftpFile.getLinkedName().trim());
   }
 }
 /** Is this entry refering to a file? */
 public boolean isFile() {
   return !ftpFile.isDir() && !ftpFile.isLink();
 }
 /** Is this entry refering to a (sub-)directory? */
 public boolean isDirectory() {
   return ftpFile.isDir();
 }
  /* (non-Javadoc)
   * @see com.aptana.ide.core.ftp.BaseFTPConnectionFileManager#fetchFiles(org.eclipse.core.runtime.IPath, int, org.eclipse.core.runtime.IProgressMonitor)
   */
  @SuppressWarnings("deprecation")
  @Override
  protected ExtendedFileInfo[] fetchFiles(IPath path, int options, IProgressMonitor monitor)
      throws CoreException, FileNotFoundException {
    monitor = Policy.subMonitorFor(monitor, 1);
    try {
      FTPFile[] ftpFiles = listFiles(path, monitor);
      monitor.beginTask(Messages.FTPConnectionFileManager_gethering_file_details, ftpFiles.length);
      List<ExtendedFileInfo> list = new ArrayList<ExtendedFileInfo>();
      for (FTPFile ftpFile : ftpFiles) {
        if (".".equals(ftpFile.getName())
            || "..".equals(ftpFile.getName())) { // $NON-NLS-1$ //$NON-NLS-2$
          monitor.worked(1);
          continue;
        }
        Date lastModifiedServerInLocalTZ = ftpFile.lastModified();
        if (serverTimeZoneShift != 0 && lastModifiedServerInLocalTZ != null) {
          ftpFile.setLastModified(
              new Date(lastModifiedServerInLocalTZ.getTime() + serverTimeZoneShift));
        }
        if ((options & IExtendedFileStore.DETAILED) != 0) {
          if (!ftpFile.isDir() && ftpFile.lastModified().getSeconds() == 0) {
            if (serverSupportsFeature("MDTM")) { // $NON-NLS-1$
              changeCurrentDir(path);
              Policy.checkCanceled(monitor);
              try {
                Date lastModifiedLocalTZ = ftpClient.modtime(ftpFile.getName());
                if (lastModifiedLocalTZ != null) {
                  ftpFile.setLastModified(lastModifiedLocalTZ);
                }
              } catch (FTPException e) {
              }
            }
          }
        }
        IPath filePath = path.append(ftpFile.getName());
        ftpFileCache.put(filePath, ftpFile);

        ExtendedFileInfo fileInfo = createFileInfo(ftpFile);
        list.add(fileInfo);
        monitor.worked(1);
      }
      return list.toArray(new ExtendedFileInfo[list.size()]);
    } catch (FileNotFoundException e) {
      throw e;
    } catch (OperationCanceledException e) {
      throw e;
    } catch (Exception e) {
      // forces one connection retry
      if (connectionRetryCount < 1) {
        connectionRetryCount++;
        testOrConnect(monitor);
        try {
          return fetchFiles(path, options, monitor);
        } finally {
          connectionRetryCount = 0;
        }
      } else {
        connectionRetryCount = 0;
        throw new CoreException(
            new Status(
                Status.ERROR,
                FTPPlugin.PLUGIN_ID,
                Messages.FTPConnectionFileManager_fetching_directory_failed,
                e));
      }
    } finally {
      monitor.done();
    }
  }
 /* (non-Javadoc)
  * @see com.aptana.ide.core.ftp.BaseFTPConnectionFileManager#fetchFile(org.eclipse.core.runtime.IPath, int, org.eclipse.core.runtime.IProgressMonitor)
  */
 @SuppressWarnings("deprecation")
 @Override
 protected ExtendedFileInfo fetchFile(IPath path, int options, IProgressMonitor monitor)
     throws CoreException, FileNotFoundException {
   try {
     IPath dirPath = path.removeLastSegments(1);
     String name = path.lastSegment();
     FTPFile result = ftpFileCache.get(path);
     if (result == null) {
       FTPFile[] ftpFiles = listFiles(dirPath, monitor);
       for (FTPFile ftpFile : ftpFiles) {
         Date lastModifiedServerInLocalTZ = ftpFile.lastModified();
         if (serverTimeZoneShift != 0 && lastModifiedServerInLocalTZ != null) {
           ftpFile.setLastModified(
               new Date(lastModifiedServerInLocalTZ.getTime() + serverTimeZoneShift));
         }
         if (".".equals(ftpFile.getName())
             || "..".equals(ftpFile.getName())) { // $NON-NLS-1$ //$NON-NLS-2$
           if (Path.ROOT.equals(path) && ".".equals(ftpFile.getName())) { // $NON-NLS-1$
             ftpFile.setName(path.toPortableString());
             ftpFileCache.put(path, ftpFile);
             result = ftpFile;
           }
           continue;
         }
         ftpFileCache.put(dirPath.append(ftpFile.getName()), ftpFile);
         if (name != null && name.equalsIgnoreCase(ftpFile.getName())) {
           result = ftpFile;
         }
       }
     }
     if ((options & IExtendedFileStore.DETAILED) != 0) {
       if (result != null
           && !result.isDir()
           && name != null
           && result.lastModified().getSeconds() == 0) {
         if (serverSupportsFeature("MDTM")) { // $NON-NLS-1$
           changeCurrentDir(dirPath);
           Policy.checkCanceled(monitor);
           try {
             Date lastModifiedLocalTZ = ftpClient.modtime(name);
             if (lastModifiedLocalTZ != null) {
               result.setLastModified(lastModifiedLocalTZ);
             }
           } catch (FTPException e) {
           }
         }
       }
     }
     if (result == null && Path.ROOT.equals(path)) {
       result = new FTPFile(StringUtils.EMPTY, path.toPortableString(), 0, true, new Date(0));
     }
     if (result != null) {
       return createFileInfo(result);
     }
   } catch (FileNotFoundException e) {
     throw e;
   } catch (OperationCanceledException e) {
     throw e;
   } catch (Exception e) {
     // forces one connection retry
     if (connectionRetryCount < 1) {
       connectionRetryCount++;
       testOrConnect(monitor);
       try {
         return fetchFile(path, options, monitor);
       } finally {
         connectionRetryCount = 0;
       }
     } else {
       connectionRetryCount = 0;
       throw new CoreException(
           new Status(
               Status.ERROR,
               FTPPlugin.PLUGIN_ID,
               Messages.FTPConnectionFileManager_fetch_failed,
               e));
     }
   }
   ExtendedFileInfo fileInfo = new ExtendedFileInfo(path.lastSegment());
   fileInfo.setExists(false);
   return fileInfo;
 }