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 959dc1d438f..4226cc1cdab 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 @@ -21,6 +21,7 @@ * David McKnight (IBM) - [187130] New Folder/File, Move and Rename should be available for read-only folders * Kevin Doyle (IBM) - [197976] Changing a file to read-only when it is open doesn't update local copy * David McKnight (IBM) - [186363] get rid of obsolete calls to ISubSystem.connect() + * David McKnight (IBM) -[209660] check for changed encoding before using cached file ********************************************************************************/ package org.eclipse.rse.files.ui.resources; @@ -581,8 +582,9 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP } else { + String encoding = properties.getEncoding(); if (properties.getUsedBinaryTransfer() == remoteFile.isBinary() && - properties.getEncoding().equals(remoteFile.getEncoding()) // changed encodings matter too + encoding != null && encoding.equals(remoteFile.getEncoding()) // changed encodings matter too ) { // we already have same file, use the current file @@ -1459,7 +1461,8 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP // if we have an xml file, find the local encoding of the file SystemEncodingUtil util = SystemEncodingUtil.getInstance(); - String encoding = null; + String encoding = remoteFile.getEncoding(); + properties.setEncoding(encoding); String tempPath = file.getLocation().toOSString(); @@ -1473,9 +1476,7 @@ public class SystemEditableRemoteFile implements ISystemEditableRemoteObject, IP throw new CoreException(s); } } - else { - encoding = remoteFile.getEncoding(); - } + try { diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/actions/SystemEditFilesAction.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/actions/SystemEditFilesAction.java index 0959135aa6e..5dcba2d31c1 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/actions/SystemEditFilesAction.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/actions/SystemEditFilesAction.java @@ -12,6 +12,7 @@ * * Contributors: * Martin Oberhuber (Wind River) - [189130] Move SystemIFileProperties from UI to Core + * David McKnight (IBM) -[209660] check for changed encoding before using cached file ********************************************************************************/ package org.eclipse.rse.internal.files.ui.actions; @@ -136,7 +137,12 @@ public class SystemEditFilesAction extends SystemBaseAction { boolean dirty = properties.getDirty(); boolean remoteNewer = (storedModifiedStamp != remoteModifiedStamp); - return (!dirty && !remoteNewer); + + String remoteEncoding = remoteFile.getEncoding(); + String storedEncoding = properties.getEncoding(); + + boolean encodingChanged = storedEncoding == null || !(remoteEncoding.equals(storedEncoding)); + return (!dirty && !remoteNewer && !encodingChanged); } return false; } diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/propertypages/SystemFilePropertyPage.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/propertypages/SystemFilePropertyPage.java index 95cafb9e9ea..8774641f26e 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/propertypages/SystemFilePropertyPage.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/propertypages/SystemFilePropertyPage.java @@ -19,6 +19,7 @@ * David McKnight (IBM) - [173518] [refresh] Read only changes are not shown in RSE until the parent folder is refreshed * Kevin Doyle (IBM) - [197976] Changing a file to read-only when it is open doesn't update local copy * Kevin Doyle (IBM) - [186125] Changing encoding of a file is not reflected when it was opened before + * David McKnight (IBM) - [209660] use parent encoding as default, rather than system encoding ********************************************************************************/ package org.eclipse.rse.internal.files.ui.propertypages; @@ -41,6 +42,7 @@ import org.eclipse.rse.services.clientserver.messages.SystemMessageException; import org.eclipse.rse.services.files.RemoteFileIOException; import org.eclipse.rse.services.files.RemoteFileSecurityException; import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile; +import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem; import org.eclipse.rse.subsystems.files.core.subsystems.IVirtualRemoteFile; import org.eclipse.rse.subsystems.files.core.subsystems.RemoteFileEncodingManager; import org.eclipse.rse.ui.ISystemMessages; @@ -212,13 +214,16 @@ public class SystemFilePropertyPage extends SystemBasePropertyPage } }; - // default encoding field - defaultEncoding = file.getParentRemoteFileSubSystem().getRemoteEncoding(); + // default encoding field + defaultEncoding = file.getParentRemoteFile().getEncoding(); + String defaultEncodingLabel = SystemFileResources.RESID_PP_FILE_ENCODING_DEFAULT_LABEL; int idx = defaultEncodingLabel.indexOf('%'); if (idx != -1) { - defaultEncodingLabel = defaultEncodingLabel.substring(0, idx) + file.getParentRemoteFileSubSystem().getRemoteEncoding() + defaultEncodingLabel.substring(idx+2); + defaultEncodingLabel = defaultEncodingLabel.substring(0, idx) + + defaultEncoding + + defaultEncodingLabel.substring(idx+2); } defaultEncodingButton = SystemWidgetHelpers.createRadioButton(encodingGroup, null, defaultEncodingLabel, SystemFileResources.RESID_PP_FILE_ENCODING_DEFAULT_TOOLTIP); @@ -541,8 +546,23 @@ public class SystemFilePropertyPage extends SystemBasePropertyPage // set the encoding String selectedEncoding = getSelectedEncoding(); + + if (ok && encodingFieldAdded && prevEncoding != null && !prevEncoding.equals(selectedEncoding)) { - RemoteFileEncodingManager.getInstance().setEncoding(getRemoteFile().getParentRemoteFileSubSystem().getHost().getHostName(), getRemoteFile().getAbsolutePath(), selectedEncoding); + IRemoteFile rfile = getRemoteFile(); + IRemoteFileSubSystem subsys = rfile.getParentRemoteFileSubSystem(); + String hostName = subsys.getHost().getHostName(); + + RemoteFileEncodingManager mgr = RemoteFileEncodingManager.getInstance(); + if (defaultEncodingButton.getSelection()) + { + mgr.setEncoding(hostName, rfile.getAbsolutePath(),null); + } + else + { + mgr.setEncoding(hostName, rfile.getAbsolutePath(), getSelectedEncoding()); + } + SystemEditableRemoteFile editable = new SystemEditableRemoteFile(remoteFile); if (editable.checkOpenInEditor() != ISystemEditableRemoteObject.NOT_OPEN) { diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/view/SystemViewRemoteFileAdapter.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/view/SystemViewRemoteFileAdapter.java index 2360dd8014d..01afb2a98fd 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/view/SystemViewRemoteFileAdapter.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/internal/files/ui/view/SystemViewRemoteFileAdapter.java @@ -36,7 +36,8 @@ * Kevin Doyle (IBM) - [186125] Changing encoding of a file is not reflected when it was opened before * David McKnight (IBM) - [208803] add exists() method * David McKnight (IBM) - [209375] download using copyRemoteResourcesToWorkspaceMultiple - * Rupen Mardirossian (IBM) - [208435] added constructor to nested RenameRunnable class to take in names that are previously used as a parameter for multiple renaming instances + * Rupen Mardirossian (IBM) - [208435] added constructor to nested RenameRunnable class to take in names that are previously used as a parameter for multiple renaming instances + * David McKnight (IBM) - [209660] need to check if remote encoding has changed before using cached file ********************************************************************************/ package org.eclipse.rse.internal.files.ui.view; @@ -2972,7 +2973,12 @@ public class SystemViewRemoteFileAdapter boolean dirty = properties.getDirty(); boolean remoteNewer = (storedModifiedStamp != remoteModifiedStamp); - return (!dirty && !remoteNewer); + + String remoteEncoding = remoteFile.getEncoding(); + String storedEncoding = properties.getEncoding(); + + boolean encodingChanged = storedEncoding == null || !(remoteEncoding.equals(storedEncoding)); + return (!dirty && !remoteNewer && !encodingChanged); } return false; } diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFile.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFile.java index 151d462bccb..75669df3ca6 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFile.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFile.java @@ -13,8 +13,9 @@ * * Contributors: * Martin Oberhuber (Wind River) - [177523] Unify singleton getter methods - * David McKnight (IBM) - [173518] [refresh] Read only changes are not shown in RSE until the parent folder is refreshed + * David McKnight (IBM) - [173518] [refresh] Read only changes are not shown in RSE until the parent folder is refreshed * David McKnight (IBM) - [186363] get rid of obsolete calls to ISubSystem.connect() + * David McKnight (IBM) - [209660] use parent encoding as default, rather than system encoding *******************************************************************************/ package org.eclipse.rse.subsystems.files.core.subsystems; @@ -1124,28 +1125,70 @@ public abstract class RemoteFile implements IRemoteFile, IAdaptable, Comparable } - /** - * Returns the encoding of the remote file. Queries {@link RemoteFileEncodingManager} for the encoding of the remote file. - * @return the encoding of the remote file. - * @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile#getEncoding() + + private String getParentPathFor(String path) + { + boolean isUnix = getParentRemoteFileSubSystem().getParentRemoteFileSubSystemConfiguration().isUnixStyle(); + + String separator = getSeparator(); + + if (isUnix && path.equals(separator)) + { + return null; // no parent of root + } + + int lastSep = path.lastIndexOf(separator); + + if (lastSep == 0) // root is the parent (on unix) + { + return separator; + } + else if (lastSep > 0) + { + return path.substring(0, lastSep); + } + else + { + return null; + } + } + + /** + * Returns the encoding of the remote file. If a user specified value does not exist, then we check + * it's ancestry for an encoding. Otherwise the encoding of the parent subsystem is returned. + * @see com.ibm.etools.systems.subsystems.IRemoteFile#getEncoding() */ public String getEncoding() { + String hostName = getParentRemoteFileSubSystem().getHost().getHostName(); + String path = getAbsolutePath(); + String encoding = RemoteFileEncodingManager.getInstance().getEncoding(hostName, path); - String encoding = RemoteFileEncodingManager.getInstance().getEncoding(getHostName(), getAbsolutePath()); - + // ask the parent folder if (encoding == null) { - - if (isRoot()) { - encoding = getParentRemoteFileSubSystem().getRemoteEncoding(); + if (_parentFile != null) + { + encoding = _parentFile.getEncoding(); } - else { - encoding = getParentRemoteFile().getEncoding(); + else + { + + // manually extra parents + String parentPath = getParentPathFor(path); + while (parentPath != null && encoding == null) + { + encoding = RemoteFileEncodingManager.getInstance().getEncoding(hostName, parentPath); + parentPath = getParentPathFor(parentPath); + } + + if (encoding == null) // no encoding found - fall back to system + { + encoding = getParentRemoteFileSubSystem().getRemoteEncoding(); + } } } return encoding; } - /** * Sets the encoding of the remote file. It sets the encoding of the remote file in {@link RemoteFileEncodingManager}. * @param encoding the encoding to be set for the remote file. diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileEncodingManager.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileEncodingManager.java index 4e03a1388cf..7350570d198 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileEncodingManager.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileEncodingManager.java @@ -10,6 +10,7 @@ * * Contributors: * Kushal Munir IBM - Initial creation of this file. + * David McKnight (IBM) [209660] delete encoding mapping when null is specified ********************************************************************************/ package org.eclipse.rse.subsystems.files.core.subsystems; @@ -125,12 +126,23 @@ public class RemoteFileEncodingManager { if (hostMap.containsKey(hostname)) { props = (Properties)(hostMap.get(hostname)); } - else { + else if (encoding != null) + { props = new Properties(); } - - props.setProperty(remotePath, encoding); - hostMap.put(hostname, props); + + if (props != null) + { + if (encoding == null) + { + props.remove(remotePath); + } + else + { + props.setProperty(remotePath, encoding); + hostMap.put(hostname, props); + } + } } }