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());
   }
 }
 /* (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;
 }