From 60c390b79e44a3a2efafa1687ad59d675b8cf33a Mon Sep 17 00:00:00 2001 From: Kushal Munir < kmunir@ca.ibm.com> Date: Thu, 2 Nov 2006 02:51:05 +0000 Subject: [PATCH] Bug 161936: [dstore-win] Cannot create remote file --- .../files/ui/wizards/SystemNewFileWizard.java | 23 +++++++++- .../core/subsystems/RemoteFileSubSystem.java | 44 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/wizards/SystemNewFileWizard.java b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/wizards/SystemNewFileWizard.java index 72ed3396c59..d84b8b19533 100644 --- a/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/wizards/SystemNewFileWizard.java +++ b/rse/plugins/org.eclipse.rse.files.ui/src/org/eclipse/rse/files/ui/wizards/SystemNewFileWizard.java @@ -236,9 +236,28 @@ public class SystemNewFileWizard */ protected boolean meetsFilterCriteria(ISystemFilterReference selectedFilterRef, IRemoteFile parentFolder, String newAbsName) { - boolean meets = false; IRemoteFileSubSystem parentSubSystem = (IRemoteFileSubSystem)selectedFilterRef.getSubSystem(); - meets = parentSubSystem.doesFilterMatch(selectedFilterRef.getReferencedFilter(),newAbsName); + + ISystemFilter filter = selectedFilterRef.getReferencedFilter(); + + // if the filter is "*", this represents the Drives filter on Windows + // we can not create a file directly under it since it doesn't actually represent a container + // if we create a new file or folder by right clicking on this filter, the parent folder defaults to the first drive + // that shows up when this filter is resolved. Hence we ignore this filter from the filter matching criteria + String[] strings = filter.getFilterStrings(); + + if (strings != null) { + + for (int idx = 0; idx < strings.length; idx++) { + + if (strings[idx].equals("*")) { + return true; + } + } + } + + boolean meets = parentSubSystem.doesFilterMatch(filter, newAbsName); + if (!meets) { SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.FILEMSG_CREATE_RESOURCE_NOTVISIBLE); diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystem.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystem.java index 9821f8f7c52..e0586e5149a 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystem.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystem.java @@ -32,9 +32,12 @@ import java.util.List; import java.util.Vector; import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Path; import org.eclipse.rse.core.SystemBasePlugin; +import org.eclipse.rse.core.filters.ISystemFilter; import org.eclipse.rse.core.filters.ISystemFilterReference; import org.eclipse.rse.core.filters.ISystemFilterString; import org.eclipse.rse.core.model.IHost; @@ -271,6 +274,46 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi // ------------------------- // Filter Testing Methods... // ------------------------- + + /** + * @see org.eclipse.rse.core.subsystems.SubSystem#doesFilterMatch(org.eclipse.rse.core.filters.ISystemFilter, java.lang.String) + */ + public boolean doesFilterMatch(ISystemFilter filter, String remoteObjectAbsoluteName) { + + if (filter.isPromptable() || !doesFilterTypeMatch(filter, remoteObjectAbsoluteName)) { + return false; + } + + boolean would = false; + + String[] strings = filter.getFilterStrings(); + + if (strings != null) { + + for (int idx = 0; !would && (idx < strings.length); idx++) { + + // for "Drives" filter on Windows, only return match if the absolute path is a drive letter + if (strings[idx].equals("*")) { + IPath path = new Path(remoteObjectAbsoluteName); + + if (path.segmentCount() == 0) { + return true; + } + else { + return false; + } + } + else if (strings[idx].equals("./*")) { + would = true; + } + else { + would = doesFilterStringMatch(strings[idx], remoteObjectAbsoluteName, filter.areStringsCaseSensitive()); + } + } + } + + return would; + } /** * Return true if the given remote object name will pass the filtering criteria for @@ -340,6 +383,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi else return true; } + /** * Return true if the given filter string lists the contents of the given remote object. * For example, if given a folder, return true if the given filter string