From df8126c8aaec94ccd0e6ecafa409fb72c70d1a7e Mon Sep 17 00:00:00 2001 From: David McKnight Date: Fri, 13 Feb 2009 17:20:23 +0000 Subject: [PATCH] [264607] Unable to delete a broken symlink --- .../ui/view/SystemViewRemoteFileAdapter.java | 11 ++++++++++- .../miners/filesystem/DeleteThread.java | 18 +++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) 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 3b5b05f1b12..044dcaa14ac 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 @@ -60,6 +60,7 @@ * David McKnight (IBM) - [251860] Rename a file/folder to a hidden file causes problems * David McKnight (IBM) - [261019] New File/Folder actions available in Work Offline mode * David McKnight (IBM) - [254769] Don't get latest file when opening a file always + * David McKnight (IBM) - [264607] Unable to delete a broken symlink *******************************************************************************/ package org.eclipse.rse.internal.files.ui.view; @@ -2736,7 +2737,15 @@ public class SystemViewRemoteFileAdapter { IRemoteFile file = (IRemoteFile) element; boolean offline = file.getParentRemoteFileSubSystem().isOffline(); - return !file.isRoot() && file.canRead() && !offline; + + if (offline || file.isRoot()){ + return false; + } + else { + // for deletion, you need write access to the containing directory + IRemoteFile parentFile = file.getParentRemoteFile(); + return parentFile.canWrite(); + } } diff --git a/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/internal/dstore/universal/miners/filesystem/DeleteThread.java b/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/internal/dstore/universal/miners/filesystem/DeleteThread.java index a2440e04f2a..1c2ea4c0e81 100644 --- a/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/internal/dstore/universal/miners/filesystem/DeleteThread.java +++ b/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/internal/dstore/universal/miners/filesystem/DeleteThread.java @@ -13,6 +13,7 @@ * Xuan Chen (IBM) - [209827] Update DStore command implementation to enable cancelation of archive operations * Noriaki Takatsu (IBM) - [220126] [dstore][api][breaking] Single process server for multiple clients * Martin Oberhuber (Wind River) - [199854][api] Improve error reporting for archive handlers + * David McKnight (IBM) - [264607] Unable to delete a broken symlink *******************************************************************************/ package org.eclipse.rse.internal.dstore.universal.miners.filesystem; @@ -126,7 +127,22 @@ public class DeleteThread extends SecuredThread implements ICancellableHandler { File deleteObj = new File(subject.getAttribute(DE.A_VALUE) + File.separatorChar + subject.getName()); DataElement deObj = null; - if (!deleteObj.exists()) { + + boolean exists = deleteObj.exists(); + if (!exists){ + // special case for broken symbolic link + String attributes = subject.getSource(); + String classification = "file"; //$NON-NLS-1$ + String[] str = attributes.split("\\"+IServiceConstants.TOKEN_SEPARATOR); //$NON-NLS-1$ + if (str.length > 11){ // 11 is classification index + classification = str[11]; + } + if (classification.startsWith("broken symbolic link")){ //$NON-NLS-1$ + exists = true; + } + } + + if (!exists) { thisStatus.setAttribute(DE.A_SOURCE, IServiceConstants.FAILED_WITH_DOES_NOT_EXIST + "|" + deleteObj.getAbsolutePath()); //$NON-NLS-1$ UniversalServerUtilities.logError(CLASSNAME, "The object to delete does not exist", null, _dataStore); //$NON-NLS-1$