From 9ca712e072f4c5c8e49e4ffd3a99d0c2901ab149 Mon Sep 17 00:00:00 2001 From: David McKnight Date: Mon, 16 Jul 2007 17:55:14 +0000 Subject: [PATCH] [196211] Kevin's patch for Move a folder to a directory that contains a folder by that name errors --- .../miners/UniversalFileSystemMiner.java | 4 +- .../dstore/files/DStoreFileService.java | 64 +++++++++++++------ .../local/files/LocalFileService.java | 23 ++++--- 3 files changed, 61 insertions(+), 30 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/dstore/universal/miners/UniversalFileSystemMiner.java b/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/dstore/universal/miners/UniversalFileSystemMiner.java index 503b85e4352..a4af6ab4064 100644 --- a/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/dstore/universal/miners/UniversalFileSystemMiner.java +++ b/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/dstore/universal/miners/UniversalFileSystemMiner.java @@ -18,6 +18,7 @@ * Xuan Chen (IBM) - [189681] [dstore][linux] Refresh Folder in My Home messes up Refresh in Root * Xuan Chen (IBM) - [191280] [dstore] Expand fails for folder "/folk" with 3361 children * Kevin Doyle (IBM) - [195709] Windows Copying doesn't work when path contains space + * Kevin Doyle (IBM) - [196211] DStore Move tries rename if that fails copy/delete *******************************************************************************/ package org.eclipse.rse.dstore.universal.miners; @@ -962,8 +963,7 @@ public class UniversalFileSystemMiner extends Miner { public DataElement handleRename(DataElement subject, DataElement status) { File fileoldname = new File(subject.getAttribute(DE.A_VALUE) + File.separatorChar + subject.getName()); - File filerename = new File(subject.getAttribute(DE.A_VALUE) - + File.separatorChar + subject.getAttribute(DE.A_SOURCE)); + File filerename = new File(subject.getAttribute(DE.A_SOURCE)); // System.out.println(ArchiveHandlerManager.isVirtual(fileoldname // .getAbsolutePath())); diff --git a/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/internal/services/dstore/files/DStoreFileService.java b/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/internal/services/dstore/files/DStoreFileService.java index 2d6da492b6e..7a1af4ba35f 100644 --- a/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/internal/services/dstore/files/DStoreFileService.java +++ b/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/internal/services/dstore/files/DStoreFileService.java @@ -960,9 +960,21 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer public boolean rename(String remoteParent, String oldName, String newName, IProgressMonitor monitor) throws SystemMessageException { - String remotePath = remoteParent + getSeparator(remoteParent) + oldName; - DataElement de = getElementFor(remotePath); - de.setAttribute(DE.A_SOURCE, newName); + String oldPath, newPath = null; + // if remoteParent is null or empty then we are doing a move + if (remoteParent == null || remoteParent == "") //$NON-NLS-1$ + { + oldPath = oldName; + newPath = newName; + } + else + { + oldPath = remoteParent + getSeparator(remoteParent) + oldName; + newPath = remoteParent + getSeparator(remoteParent) + newName; + } + + DataElement de = getElementFor(oldPath); + de.setAttribute(DE.A_SOURCE, newPath); DataElement status = dsStatusCommand(de, IUniversalDataStoreConstants.C_RENAME, monitor); @@ -983,26 +995,42 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer return retVal; } + protected boolean moveByCopy(String srcParent, String srcName, String tgtParent, String tgtName, IProgressMonitor monitor) throws SystemMessageException + { + if (copy(srcParent, srcName, tgtParent, tgtName, monitor)) + { + return delete(srcParent, srcName, monitor); + } + return false; + } + public boolean move(String srcParent, String srcName, String tgtParent, String tgtName, IProgressMonitor monitor) throws SystemMessageException { -// String src = srcParent + getSeparator(srcParent) + srcName; -// String tgt = tgtParent + getSeparator(tgtParent) + tgtName; -// boolean isVirtual = ArchiveHandlerManager.isVirtual(src) || ArchiveHandlerManager.isVirtual(tgt); - //if (isVirtual || isArchive) + String src = srcParent + getSeparator(srcParent) + srcName; + String tgt = tgtParent + getSeparator(tgtParent) + tgtName; + boolean isVirtual = ArchiveHandlerManager.isVirtual(src) || ArchiveHandlerManager.isVirtual(tgt); + boolean isArchive = ArchiveHandlerManager.getInstance().isRegisteredArchive(tgt); + if (isVirtual || isArchive) { - if (copy(srcParent, srcName, tgtParent, tgtName, monitor)) + return moveByCopy(srcParent, srcName, tgtParent, tgtName, monitor); + } + else + { + boolean movedOk = false; + try { - try - { - delete(srcParent, srcName, monitor); - } - catch (Exception e) - { - return false; - } - return true; + movedOk = rename("", src, tgt, monitor); //$NON-NLS-1$ } - return false; + catch (SystemMessageException e) + { + return moveByCopy(srcParent, srcName, tgtParent, tgtName, monitor); + } + // movedOk should never be false otherwise the last DataElement status was null + if (!movedOk) + { + movedOk = moveByCopy(srcParent, srcName, tgtParent, tgtName, monitor); + } + return movedOk; } /* diff --git a/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalFileService.java b/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalFileService.java index 05797a943ca..ed7c65ab44b 100644 --- a/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalFileService.java +++ b/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/files/LocalFileService.java @@ -17,6 +17,7 @@ * Kevin Doyle (IBM) - [182221] Throwing Proper Exceptions on create file/folder * Xuan Chen (IBM) - Fix 189487 - copy and paste a folder did not work - workbench hang * David McKnight (IBM) - [192705] Exception needs to be thrown when rename fails + * Kevin Doyle (IBM) - [196211] Move a folder to a directory that contains a folder by that name errors ********************************************************************************/ package org.eclipse.rse.internal.services.local.files; @@ -1047,28 +1048,30 @@ public class LocalFileService extends AbstractFileService implements IFileServic { File sourceFolderOrFile = new File(srcParent, srcName); File targetFolder = new File(tgtParent, tgtName); + boolean movedOk = false; boolean sourceIsVirtual = ArchiveHandlerManager.isVirtual(sourceFolderOrFile.getAbsolutePath()); boolean targetIsVirtual = ArchiveHandlerManager.isVirtual(targetFolder.getAbsolutePath()); boolean targetIsArchive = ArchiveHandlerManager.getInstance().isArchive(targetFolder); - if (sourceIsVirtual || targetIsVirtual || targetIsArchive) + if (!sourceIsVirtual && !targetIsVirtual && !targetIsArchive) /* DKM * we shouldn't be moving archives like virtuals *|| ArchiveHandlerManager.getInstance().isRegisteredArchive(newName) * */ - { - if (copy(srcParent, srcName, tgtParent, tgtName, monitor)) - { - return delete(srcParent, srcName, monitor); - } - else return false; - } - else { File fileToMove = new File(srcParent, srcName); File newFile = new File(tgtParent, tgtName); - return fileToMove.renameTo(newFile); + movedOk = fileToMove.renameTo(newFile); } + + if (!movedOk) + { + if (copy(srcParent, srcName, tgtParent, tgtName, monitor)) + { + movedOk = delete(srcParent, srcName, monitor); + } + } + return movedOk; }