diff --git a/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPHostFile.java b/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPHostFile.java index 30746a06f54..a4b94245311 100644 --- a/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPHostFile.java +++ b/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPHostFile.java @@ -16,7 +16,8 @@ * Javier Montalvo Orus (Symbian) - Fixing 161211 - Cannot expand /pub folder as * anonymous on ftp.wacom.com * Javier Montalvo Orus (Symbian) - Fixing 161238 - [ftp] connections to VMS servers are not usable - * Javier Montalvo Orus (Symbian) - Fixing 176216 - [api] FTP sould provide API to allow clients register their own FTPListingParser + * Javier Montalvo Orus (Symbian) - Fixing 176216 - [api] FTP sould provide API to allow clients register their own FTPListingParser + * Javier Montalvo Orus (Symbian) - [197758] Unix symbolic links are not classified as file vs. folder ********************************************************************************/ package org.eclipse.rse.internal.services.files.ftp; @@ -34,6 +35,7 @@ public class FTPHostFile implements IHostFile private String _name; private String _parentPath; private boolean _isDirectory; + private boolean _isLink; private boolean _isArchive; private long _lastModified; private long _size; @@ -65,6 +67,7 @@ public class FTPHostFile implements IHostFile _name = ftpFile.getName(); _isDirectory = ftpFile.isDirectory(); + _isLink = ftpFile.isSymbolicLink(); _lastModified = ftpFile.getTimestamp().getTimeInMillis(); _size = ftpFile.getSize(); _isArchive = internalIsArchive(); @@ -92,6 +95,11 @@ public class FTPHostFile implements IHostFile return !(_isDirectory || _isRoot); } + public boolean isSymbolicLink() + { + return _isLink; + } + public String getName() { return _name; @@ -234,4 +242,9 @@ public class FTPHostFile implements IHostFile && !ArchiveHandlerManager.isVirtual(getAbsolutePath()); } + public void setIsDirectory(boolean isDirectory) + { + _isDirectory = isDirectory; + } + } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPService.java b/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPService.java index 5cec9689dd3..8826da827a4 100644 --- a/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPService.java +++ b/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPService.java @@ -49,6 +49,8 @@ * Javier Montalvo Orus (Symbian) - [191048] Remote files locally listed and being removed by other users should be reported as missing * Javier Montalvo Orus (Symbian) - [195677] Rename fails on WFTPD-2.03 * Javier Montalvo Orus (Symbian) - [197105] Directory listing fails on Solaris when special devices are in a directory + * Javier Montalvo Orus (Symbian) - [197758] Unix symbolic links are not classified as file vs. folder + * Javier Montalvo Orus (Symbian) - [198182] FTP export problem: RSEF8057E: Error occurred while exporting FILENAME: Operation failed. File system input or output error ********************************************************************************/ package org.eclipse.rse.internal.services.files.ftp; @@ -57,6 +59,7 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -71,6 +74,7 @@ import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.rse.core.model.IPropertySet; import org.eclipse.rse.internal.services.files.ftp.parser.IFTPClientConfigFactory; @@ -394,7 +398,7 @@ public class FTPService extends AbstractFileService implements IFileService, IFT { if (monitor!=null){ if (monitor.isCanceled()) { - return null; + throw new RemoteFileCancelledException(); } } @@ -465,7 +469,7 @@ public class FTPService extends AbstractFileService implements IFileService, IFT { if (monitor!=null){ if (monitor.isCanceled()) { - return null; + throw new RemoteFileCancelledException(); } } @@ -509,8 +513,17 @@ public class FTPService extends AbstractFileService implements IFileService, IFT _ftpLoggingOutputStream.write(rawListLine.getBytes()); FTPHostFile f = new FTPHostFile(parentPath, _ftpFiles[i]); + String name = f.getName(); + + if(f.isSymbolicLink()) { + if(name.indexOf('.')==-1) { + //modify FTPHostFile to be shown as a folder + f.setIsDirectory(true); + } + } + if (isRightType(fileType,f)) { - String name = f.getName(); + if (name.equals(".") || name.equals("..")) { //$NON-NLS-1$ //$NON-NLS-2$ //Never return the default directory names continue; @@ -562,9 +575,12 @@ public class FTPService extends AbstractFileService implements IFileService, IFT if (monitor!=null){ if (monitor.isCanceled()) { - return false; + throw new RemoteFileCancelledException(); } } + else{ + monitor = new NullProgressMonitor(); + } if(_commandMutex.waitForLock(monitor, Long.MAX_VALUE)) { @@ -674,22 +690,12 @@ public class FTPService extends AbstractFileService implements IFileService, IFT if (monitor!=null){ if (monitor.isCanceled()) { - return false; + throw new RemoteFileCancelledException(); } } IHostFile remoteHostFile = getFile(remoteParent,remoteFile,null); - if(remoteHostFile == null) - { - return false; - } - - if(!remoteHostFile.exists()) - { - throw new RemoteFileIOException(new Exception(FTPServiceResources.FTPService_FTP_File_Service_Not_Found)); - } - if(_commandMutex.waitForLock(monitor, Long.MAX_VALUE)) { try @@ -703,21 +709,22 @@ public class FTPService extends AbstractFileService implements IFileService, IFT ftpClient.changeWorkingDirectory(remoteParent); setFileType(isBinary); - if (!localFile.exists()) - { - File localParentFile = localFile.getParentFile(); - if (!localParentFile.exists()) - { - localParentFile.mkdirs(); - } - localFile.createNewFile(); - } - output = new FileOutputStream(localFile); input = ftpClient.retrieveFileStream(remoteFile); if(input != null) { + if (!localFile.exists()) + { + File localParentFile = localFile.getParentFile(); + if (!localParentFile.exists()) + { + localParentFile.mkdirs(); + } + localFile.createNewFile(); + } + + output = new FileOutputStream(localFile); progressMonitor.init(0, remoteFile, localFile.getName(), remoteHostFile.getSize()); byte[] buffer = new byte[4096]; int readCount; @@ -740,12 +747,22 @@ public class FTPService extends AbstractFileService implements IFileService, IFT output.close(); ftpClient.completePendingCommand(); + + } + else + { + throw new RemoteFileIOException(new Exception(ftpClient.getReplyString())); } } - catch (Exception e) + catch (FileNotFoundException e) { throw new RemoteFileIOException(e); - } finally + } + catch (IOException e) + { + throw new RemoteFileIOException(e); + } + finally { _commandMutex.release(); } diff --git a/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPServiceResources.java b/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPServiceResources.java index 1651bff4d6a..1f879deb5e9 100644 --- a/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPServiceResources.java +++ b/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPServiceResources.java @@ -12,7 +12,6 @@ * * Contributors: * Javier Montalvo Orus (Symbian) - Added Externalized Strings - * Javier Montalvo Orus (Symbian) - [191048] Remote files locally listed and being removed by other users should be reported as missing ********************************************************************************/ package org.eclipse.rse.internal.services.files.ftp; @@ -29,7 +28,6 @@ public class FTPServiceResources extends NLS public static String FTP_File_Service_Monitor_Format; public static String FTP_File_Service_Name; public static String FTP_File_Service_Description; - public static String FTPService_FTP_File_Service_Not_Found; static { // load message values from bundle file diff --git a/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPServiceResources.properties b/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPServiceResources.properties index 29cf3284d6c..0951680193b 100644 --- a/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPServiceResources.properties +++ b/rse/plugins/org.eclipse.rse.services.files.ftp/src/org/eclipse/rse/internal/services/files/ftp/FTPServiceResources.properties @@ -12,7 +12,6 @@ # # Contributors: # Javier Montalvo Orus (Symbian) - Added Externalized Strings -# Javier Montalvo Orus (Symbian) - [191048] Remote files locally listed and being removed by other users should be reported as missing ################################################################################ # NLS_MESSAGEFORMAT_VAR @@ -24,5 +23,4 @@ FTP_File_Service_Deleting_Task=Deleting FTP_File_Service_Copy_Not_Supported=FTP copy not supported, use move instead FTP_File_Service_Listing_Job=Listing files... FTP_File_Service_Listing_Job_Success=Success -FTPService_FTP_File_Service_Not_Found=File not found FTP_File_Service_Monitor_Format={0,number,integer} KB of {1,number,integer} KB complete ({2,number,percent})