From 1305fc22954ef899b431fcef3406ebfc603f76fe Mon Sep 17 00:00:00 2001 From: David McKnight Date: Thu, 13 Dec 2007 16:10:13 +0000 Subject: [PATCH] [195285] more changes for mount path mapper --- .../ui/resources/ISystemMountPathMapper.java | 43 ++++++++++++++++--- .../resources/SystemEditableRemoteFile.java | 2 +- .../SystemUniversalTempFileListener.java | 2 +- .../UniversalFileTransferUtility.java | 35 +++++++++------ .../ui/resources/DefaultMountPathMapper.java | 7 ++- .../ui/resources/SystemRemoteEditManager.java | 28 +++++++----- 6 files changed, 85 insertions(+), 32 deletions(-) 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: + * + * + * * 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()