mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-04 23:55:26 +02:00
[195285] more changes for mount path mapper
This commit is contained in:
parent
42324f2e58
commit
1305fc2295
6 changed files with 85 additions and 32 deletions
|
@ -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:
|
||||
* <ul>
|
||||
* <li>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).
|
||||
* <li>If port-forwarding is used then a port could be used to qualify the temp file path.
|
||||
* <li>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.
|
||||
* </ul>
|
||||
*
|
||||
*
|
||||
* 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);
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Reference in a new issue