From be038e0311430c56bfc9bb298b4be5c341f3fd6e Mon Sep 17 00:00:00 2001 From: Martin Oberhuber < martin.oberhuber@windriver.com> Date: Wed, 26 Sep 2007 13:24:53 +0000 Subject: [PATCH] [204669] Fix ftp path concatenation on systems using backslash separator --- .../files/ui/wizards/SystemNewFileWizard.java | 3 ++- .../services/files/ftp/FTPHostFile.java | 17 +++++++----- .../services/files/ftp/FTPService.java | 16 +++++------ .../connectorservice/FTPConnectorService.java | 22 ++++++++++++--- .../files/ftp/model/FTPRemoteFile.java | 27 +++++++++++++++---- 5 files changed, 60 insertions(+), 25 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/wizards/SystemNewFileWizard.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/wizards/SystemNewFileWizard.java index b538d971177..b627768d254 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/wizards/SystemNewFileWizard.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/wizards/SystemNewFileWizard.java @@ -13,6 +13,7 @@ * Contributors: * Martin Oberhuber (Wind River) - [168975] Move RSE Events API to Core * Rupen Mardirossian (IBM) - [187530] Commented out line 192, in order to stop logging of SystemMessageException + * Martin Oberhuber (Wind River) - [204669] Fix ftp path concatenation on systems using backslash separator ********************************************************************************/ package org.eclipse.rse.internal.files.ui.wizards; @@ -174,7 +175,7 @@ public class SystemNewFileWizard IRemoteFile newFile = null; IProgressMonitor monitor = new NullProgressMonitor(); try { - IRemoteFile newFilePath = rfss.getRemoteFileObject(absName, monitor); + IRemoteFile newFilePath = rfss.getRemoteFileObject(parentFolder, name, monitor); newFile = rfss.createFile(newFilePath, monitor); } catch (RemoteFileIOException exc ) { SystemBasePlugin.logDebugMessage(CLASSNAME+ ":", " Creating remote file "+ absName + " failed with RemoteFileIOException " ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 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 72f59687471..1bea517c0b4 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 @@ -13,12 +13,12 @@ * Contributors: * Michael Berger (IBM) - Fixing 140408 - FTP upload does not work * Javier Montalvo OrĂºs (Symbian) - Migrate to jakarta commons net FTP client - * Javier Montalvo Orus (Symbian) - Fixing 161211 - Cannot expand /pub folder as - * anonymous on ftp.wacom.com + * 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) - [197758] Unix symbolic links are not classified as file vs. folder * Javier Montalvo Orus (Symbian) - [198272] FTP should return classification for symbolic links so they show a link overlay + * Martin Oberhuber (Wind River) - [204669] Fix ftp path concatenation on systems using backslash separator ********************************************************************************/ package org.eclipse.rse.internal.services.files.ftp; @@ -27,6 +27,7 @@ package org.eclipse.rse.internal.services.files.ftp; import java.io.File; import org.apache.commons.net.ftp.FTPFile; +import org.eclipse.rse.services.clientserver.PathUtility; import org.eclipse.rse.services.clientserver.archiveutils.ArchiveHandlerManager; import org.eclipse.rse.services.files.IHostFile; @@ -123,15 +124,19 @@ public class FTPHostFile implements IHostFile if (isRoot() || _parentPath==null) { return getName(); } else { - StringBuffer path = new StringBuffer(getParentPath()); - if (!_parentPath.endsWith("/") && !_parentPath.endsWith("\\"))//$NON-NLS-1$ //$NON-NLS-2$ + String parentPath = getParentPath(); + StringBuffer path = new StringBuffer(parentPath); + if (!parentPath.endsWith("/") && !parentPath.endsWith("\\"))//$NON-NLS-1$ //$NON-NLS-2$ { - path.append('/'); + //TODO IFileService should have a method for this + String sep = PathUtility.getSeparator(parentPath); + if (!parentPath.endsWith(sep)) { + path.append(sep); + } } path.append(getName()); return path.toString(); } - } public long getModifiedDate() 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 82258b92c1e..3dd8470a754 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 @@ -59,6 +59,7 @@ * Martin Oberhuber (Wind River) - [199548] Avoid touching files on setReadOnly() if unnecessary * Javier Montalvo Orus (Symbian) - [199243] Renaming a file in an FTP-based EFS folder hangs all of Eclipse * Martin Oberhuber (Wind River) - [203306] Fix Deadlock comparing two files on FTP + * Martin Oberhuber (Wind River) - [204669] Fix ftp path concatenation on systems using backslash separator ********************************************************************************/ package org.eclipse.rse.internal.services.files.ftp; @@ -93,6 +94,7 @@ import org.eclipse.rse.services.Mutex; import org.eclipse.rse.services.clientserver.FileTypeMatcher; import org.eclipse.rse.services.clientserver.IMatcher; import org.eclipse.rse.services.clientserver.NamePatternMatcher; +import org.eclipse.rse.services.clientserver.PathUtility; import org.eclipse.rse.services.clientserver.messages.SystemMessageException; import org.eclipse.rse.services.files.AbstractFileService; import org.eclipse.rse.services.files.IFileService; @@ -135,7 +137,7 @@ public class FTPService extends AbstractFileService implements IFileService, IFT private static long FTP_STATCACHE_TIMEOUT = 200; //msec - private class FTPBufferedInputStream extends BufferedInputStream { + private static class FTPBufferedInputStream extends BufferedInputStream { private FTPClient client; @@ -379,6 +381,8 @@ public class FTPService extends AbstractFileService implements IFileService, IFT } catch (IOException e) { + } + finally { _ftpClient = null; } @@ -661,15 +665,7 @@ public class FTPService extends AbstractFileService implements IFileService, IFT private char getSeparator() { - char separator = '/'; - - if(_userHome.indexOf('\\')!=-1 && _userHome.indexOf('/')==-1) - { - separator = '\\'; - } - - return separator; - + return PathUtility.getSeparator(_userHome).charAt(0); } /* diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.ftp/src/org/eclipse/rse/internal/subsystems/files/ftp/connectorservice/FTPConnectorService.java b/rse/plugins/org.eclipse.rse.subsystems.files.ftp/src/org/eclipse/rse/internal/subsystems/files/ftp/connectorservice/FTPConnectorService.java index b02d2791cf6..40e41cd18d5 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.ftp/src/org/eclipse/rse/internal/subsystems/files/ftp/connectorservice/FTPConnectorService.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.ftp/src/org/eclipse/rse/internal/subsystems/files/ftp/connectorservice/FTPConnectorService.java @@ -19,7 +19,8 @@ * Javier Montalvo Orus (Symbian) - Fixing 176216 - [api] FTP sould provide API to allow clients register their own FTPListingParser * Javier Montalvo Orus (Symbian) - [187531] Improve exception thrown when Login Failed on FTP * David Dykstal (IBM) - added RESID_FTP_SETTINGS_LABEL - * David McKnight (IBM) - [196632] [ftp] Passive mode setting does not work + * David McKnight (IBM) - [196632] [ftp] Passive mode setting does not work + * Martin Oberhuber (Wind River) - [204669] Fix ftp path concatenation on systems using backslash separator ********************************************************************************/ package org.eclipse.rse.internal.subsystems.files.ftp.connectorservice; @@ -38,6 +39,7 @@ import org.eclipse.rse.internal.services.files.ftp.FTPService; import org.eclipse.rse.internal.subsystems.files.ftp.FTPSubsystemResources; import org.eclipse.rse.internal.subsystems.files.ftp.parser.FTPClientConfigFactory; import org.eclipse.rse.services.files.IFileService; +import org.eclipse.rse.services.files.IHostFile; import org.eclipse.rse.services.files.RemoteFileException; import org.eclipse.rse.ui.subsystems.StandardConnectorService; import org.eclipse.ui.console.ConsolePlugin; @@ -49,7 +51,7 @@ import org.eclipse.ui.console.MessageConsole; public class FTPConnectorService extends StandardConnectorService { protected FTPService _ftpService; - + public FTPConnectorService(IHost host, int port) { super(FTPSubsystemResources.RESID_FTP_CONNECTORSERVICE_NAME,FTPSubsystemResources.RESID_FTP_CONNECTORSERVICE_DESCRIPTION, host, port); @@ -109,7 +111,21 @@ public class FTPConnectorService extends StandardConnectorService } - + + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.AbstractConnectorService#getHomeDirectory() + */ + public String getHomeDirectory() { + if (_ftpService!=null) { + IHostFile f = _ftpService.getUserHome(); + if (f!=null) { + return f.getAbsolutePath(); + } + } + //fallback while not yet connected + return super.getHomeDirectory(); + } + private OutputStream getLoggingStream(String hostName,int portNumber) { MessageConsole messageConsole=null; diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.ftp/src/org/eclipse/rse/internal/subsystems/files/ftp/model/FTPRemoteFile.java b/rse/plugins/org.eclipse.rse.subsystems.files.ftp/src/org/eclipse/rse/internal/subsystems/files/ftp/model/FTPRemoteFile.java index dac6fd0239d..7ff50043ff5 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.ftp/src/org/eclipse/rse/internal/subsystems/files/ftp/model/FTPRemoteFile.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.ftp/src/org/eclipse/rse/internal/subsystems/files/ftp/model/FTPRemoteFile.java @@ -13,12 +13,14 @@ * * Contributors: * Javier Montalvo Orus (Symbian) - [198272] FTP should return classification for symbolic links so they show a link overlay + * Martin Oberhuber (Wind River) - [204669] Fix ftp path concatenation on systems using backslash separator *******************************************************************************/ package org.eclipse.rse.internal.subsystems.files.ftp.model; import org.eclipse.rse.internal.services.files.ftp.FTPHostFile; +import org.eclipse.rse.services.clientserver.PathUtility; import org.eclipse.rse.subsystems.files.core.servicesubsystem.AbstractRemoteFile; import org.eclipse.rse.subsystems.files.core.servicesubsystem.FileServiceSubSystem; import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile; @@ -51,11 +53,26 @@ public class FTPRemoteFile extends AbstractRemoteFile return _ftpHostFile.getClassification(); } + /* (non-Javadoc) + * @see org.eclipse.rse.subsystems.files.core.subsystems.RemoteFile#getSeparator() + */ + public String getSeparator() { + String absPath = getAbsolutePath(); + if (absPath!=null && absPath.length()>1) { + return PathUtility.getSeparator(absPath); + } + String home = getParentRemoteFileSubSystem().getConnectorService().getHomeDirectory(); + if (home!=null && home.length()>1) { + return PathUtility.getSeparator(home); + } + return PathUtility.getSeparator(absPath); + } - - - - - + /* (non-Javadoc) + * @see org.eclipse.rse.subsystems.files.core.subsystems.RemoteFile#getSeparatorChar() + */ + public char getSeparatorChar() { + return getSeparator().charAt(0); + } }