diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/ISystemMountPathMapper.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/ISystemMountPathMapper.java
index a1414059d07..1627bbed8a1 100644
--- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/ISystemMountPathMapper.java
+++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/ISystemMountPathMapper.java
@@ -22,18 +22,22 @@ import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
* This interface is used to provide a common way of mapping mounted resources to the temp files project.
* Since local (or remote) mounts can change or be removed (i.e. disconnected) this provides a way for a vendor to
* remap a particular resource if the vendor software is able to determine the new mount location.
+ *
+ * There are a number of use cases where a customized workspace mapping would be desirable:
+ *
+ * - Two connections to the same host using different user IDs for each connection. In that case, it may make
+ * sense to store the temp files differently for each connection (for example, qualified by user ID).
+ *
- If port-forwarding is used then a port could be used to qualify the temp file path.
+ *
- If the remote path contains invalid characters for the local file system, then the temp file mapping could
+ * be made such that invalid characters ( e.g. :<>?* on Windows) translate to a sequence of valid characters on the client.
+ *
+ *
+ *
* Implementors of this interface should register their mappers via the mountPathMappers extension point.
*/
public interface ISystemMountPathMapper
{
- /**
- * Indicates whether this mapper handles remapping of the specified resource
- * @param hostname the remote host
- * @param remotePath the remote path as seen by the file subsystem
- * @return whether this mapper handles remapping of the specified remote resource
- */
- public boolean handlesMappingFor(String hostname, String remotePath);
/**
* Returns the qualified workspace path for a replica of this mounted file. Since the
@@ -72,4 +76,29 @@ public interface ISystemMountPathMapper
* @return the local system path that represents the mounted file
*/
public String getMountedMappingFor(String hostname, String remotePath);
+
+ /**
+ * Indicates whether this mapper handles remapping of the specified resource. If more than one mount
+ * path mapper returns true for this, then the getPriority() method will be used to determine precedence.
+ * @param hostname the remote host
+ * @param remotePath the remote path as seen by the file subsystem
+ * @param subsystem the remote file subsystem
+ * @return whether this mapper handles remapping of the specified remote resource
+ */
+ public boolean handlesMappingFor(String hostname, String remotePath, IRemoteFileSubSystem subsystem);
+
+
+ /**
+ *
+ * Returns the priority of this mount path mapper. This is used to determine which mount
+ * path mapper to use when more than one are applicable. The lower the return value, the
+ * higher priority.
+ *
+ * @param hostname the host name for the file system
+ * @param remotePath the path on the remote file system
+ * @param subsystem the subsystem used to retrieve files
+ *
+ * @return the priority, where the lower in value, the higher the priority.
+ */
+ int getPriority(String hostname, String remotePath, IRemoteFileSubSystem subsystem);
}
\ No newline at end of file
diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java
index 2d4ee47ee3a..3adf4a4b482 100644
--- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java
+++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemEditableRemoteFile.java
@@ -947,7 +947,7 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP
//DKM && subsystem.getHost().getSystemType().isLocal()
)
{
- String result = SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath);
+ String result = SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath, subsystem);
if (!result.equals(hostname))
{
_isRemoteFileMounted = true;
diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemUniversalTempFileListener.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemUniversalTempFileListener.java
index bfb16ed687b..760eddd6912 100644
--- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemUniversalTempFileListener.java
+++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/SystemUniversalTempFileListener.java
@@ -151,7 +151,7 @@ public class SystemUniversalTempFileListener extends SystemTempFileListener
{
String mappedHostPath = properties.getResolvedMountedRemoteFilePath();
String mappedHostName = properties.getResolvedMountedRemoteFileHost();
- String systemRemotePath = SystemRemoteEditManager.getInstance().getMountPathFor(mappedHostName, mappedHostPath);
+ String systemRemotePath = SystemRemoteEditManager.getInstance().getMountPathFor(mappedHostName, mappedHostPath, (IRemoteFileSubSystem)subsystem);
if (systemRemotePath == null)
{
diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/UniversalFileTransferUtility.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/UniversalFileTransferUtility.java
index bb443578479..f5cb3e84cf7 100644
--- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/UniversalFileTransferUtility.java
+++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/resources/UniversalFileTransferUtility.java
@@ -316,6 +316,13 @@ public class UniversalFileTransferUtility
}
}
+ /**
+ * Used for local files - special case!
+ * @param tempFile
+ * @param remoteFile
+ * @param hostname
+ * @param userId
+ */
protected static void setIFileProperties(IFile tempFile, File remoteFile, String hostname, String userId)
{
// set it's properties for use later
@@ -326,10 +333,14 @@ public class UniversalFileTransferUtility
properties.setDirty(false);
String remotePath = remoteFile.getAbsolutePath();
-
- // String subSystemId = registry.getAbsoluteNameForSubSystem(subSystem);
- // properties.setRemoteFileSubSystem(subSystemId);
properties.setRemoteFilePath(remotePath);
+ try
+ {
+ properties.setEncoding(tempFile.getCharset());
+ }
+ catch (CoreException e){
+ }
+
// get the modified timestamp from the File, not the IFile
// for some reason, the modified timestamp from the IFile does not always return
@@ -337,11 +348,11 @@ public class UniversalFileTransferUtility
// cached value and that might be the cause of the problem.
properties.setDownloadFileTimeStamp(tempFile.getLocation().toFile().lastModified());
- boolean isMounted = isRemoteFileMounted(hostname, remotePath);
+ boolean isMounted = isRemoteFileMounted(hostname, remotePath, null); // no subsystem
properties.setRemoteFileMounted(isMounted);
if (isMounted)
{
- String actualRemoteHost = getActualHostFor(hostname, remotePath);
+ String actualRemoteHost = getActualHostFor(hostname, remotePath, null); // no subsystem
String actualRemotePath = getWorkspaceRemotePath(hostname, remotePath, null); // no subsystem
properties.setResolvedMountedRemoteFileHost(actualRemoteHost);
properties.setResolvedMountedRemoteFilePath(actualRemotePath);
@@ -2271,20 +2282,20 @@ public class UniversalFileTransferUtility
}
- public static String getActualHostFor(ISubSystem subsystem, String remotePath)
+ public static String getActualHostFor(IRemoteFileSubSystem subsystem, String remotePath)
{
String hostname = subsystem.getHost().getHostName();
if (subsystem.getHost().getSystemType().isLocal())
{
- String result = SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath);
+ String result = SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath, subsystem);
return result;
}
return hostname;
}
- public static String getActualHostFor(String hostname, String remotePath)
+ public static String getActualHostFor(String hostname, String remotePath, IRemoteFileSubSystem subsystem)
{
- return SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath);
+ return SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath, subsystem);
}
private static void refreshResourceInWorkspace(IResource parent)
@@ -2310,7 +2321,7 @@ public class UniversalFileTransferUtility
String hostname = subsystem.getHost().getHostName();
if (subsystem.getHost().getSystemType().isLocal())
{
- String result = SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath);
+ String result = SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath, (IRemoteFileSubSystem)subsystem);
if (!result.equals(hostname))
{
return true;
@@ -2319,9 +2330,9 @@ public class UniversalFileTransferUtility
return false;
}
- protected static boolean isRemoteFileMounted(String hostname, String remotePath)
+ protected static boolean isRemoteFileMounted(String hostname, String remotePath, IRemoteFileSubSystem subsystem)
{
- String result = SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath);
+ String result = SystemRemoteEditManager.getInstance().getActualHostFor(hostname, remotePath, subsystem);
if (!result.equals(hostname)) {
return true;
diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/resources/DefaultMountPathMapper.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/resources/DefaultMountPathMapper.java
index 1e07a62119b..77e14ee92e8 100644
--- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/resources/DefaultMountPathMapper.java
+++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/resources/DefaultMountPathMapper.java
@@ -24,7 +24,7 @@ import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
public class DefaultMountPathMapper implements ISystemMountPathMapper
{
- public boolean handlesMappingFor(String hostname, String remotePath)
+ public boolean handlesMappingFor(String hostname, String remotePath, IRemoteFileSubSystem subsystem)
{
return false;
}
@@ -46,4 +46,9 @@ public class DefaultMountPathMapper implements ISystemMountPathMapper
{
return remotePath;
}
+
+ public int getPriority(String hostname, String remotePath,
+ IRemoteFileSubSystem subsystem) {
+ return Integer.MAX_VALUE;
+ }
}
diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/resources/SystemRemoteEditManager.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/resources/SystemRemoteEditManager.java
index 66003f2b9be..a8d6a9f822d 100644
--- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/resources/SystemRemoteEditManager.java
+++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/resources/SystemRemoteEditManager.java
@@ -96,11 +96,12 @@ public class SystemRemoteEditManager
* the resource is mounted then a mount path mapper has the opportunity to return the actual host.
* @param hostname the system on which a resource is obtained (may contain the file via a mount)
* @param remotePath the path on the host where the resource is obtained
+ * @param subsystem the subsystem
* @return the actual host where the resource exists
*/
- public String getActualHostFor(String hostname, String remotePath)
+ public String getActualHostFor(String hostname, String remotePath, IRemoteFileSubSystem subsystem)
{
- ISystemMountPathMapper mapper = getMountPathMapperFor(hostname, remotePath);
+ ISystemMountPathMapper mapper = getMountPathMapperFor(hostname, remotePath, subsystem);
if (mapper != null)
{
return mapper.getActualHostFor(hostname, remotePath);
@@ -115,12 +116,12 @@ public class SystemRemoteEditManager
* Return the path to use on the system (i.e. Windows) for saving from the workspace to remote
* @param hostname the remote host
* @param remotePath the file path on the remote host
-
+ * @param subsystem the subsystem
* @return the system path
*/
- public String getMountPathFor(String hostname, String remotePath)
+ public String getMountPathFor(String hostname, String remotePath, IRemoteFileSubSystem subsystem)
{
- ISystemMountPathMapper mapper = getMountPathMapperFor(hostname, remotePath);
+ ISystemMountPathMapper mapper = getMountPathMapperFor(hostname, remotePath, subsystem);
if (mapper != null)
{
return mapper.getMountedMappingFor(hostname, remotePath);
@@ -141,7 +142,7 @@ public class SystemRemoteEditManager
*/
public String getWorkspacePathFor(String hostname, String remotePath, IRemoteFileSubSystem subsystem)
{
- ISystemMountPathMapper mapper = getMountPathMapperFor(hostname, remotePath);
+ ISystemMountPathMapper mapper = getMountPathMapperFor(hostname, remotePath, subsystem);
if (mapper != null)
{
return mapper.getWorkspaceMappingFor(hostname, remotePath, subsystem);
@@ -156,22 +157,29 @@ public class SystemRemoteEditManager
* Return the appropriate registered mapper for a host & path
* @param hostname
* @param remotePath
+ * @param subsystem
* @return appropriate mapper
*/
- public ISystemMountPathMapper getMountPathMapperFor(String hostname, String remotePath)
+ public ISystemMountPathMapper getMountPathMapperFor(String hostname, String remotePath, IRemoteFileSubSystem subsystem)
{
+ ISystemMountPathMapper result = null;
for (int i = 0; i < _mountPathMappers.size(); i++)
{
ISystemMountPathMapper mapper = (ISystemMountPathMapper) _mountPathMappers.get(i);
if (mapper != null)
{
- if (mapper.handlesMappingFor(hostname, remotePath))
+ if (mapper.handlesMappingFor(hostname, remotePath, subsystem))
{
- return mapper;
+ if (result == null) {
+ result = mapper;
+ }
+ else if (mapper.getPriority(hostname, remotePath, subsystem) < result.getPriority(hostname, remotePath, subsystem)){
+ result = mapper;
+ }
}
}
}
- return null;
+ return result;
}
protected void registerMountPathMappers()