From 19c1d8e46905f7f81c3ab0d3aad4fd2ebaeca5df Mon Sep 17 00:00:00 2001 From: David McKnight Date: Mon, 5 Nov 2007 14:58:34 +0000 Subject: [PATCH] [207178] use array of fileTypes for multi queries, instead of just one --- .../dstore/files/DStoreFileService.java | 51 ++++++++++++++---- .../dstore/AbstractDStoreService.java | 22 ++++---- .../services/files/AbstractFileService.java | 4 +- .../rse/services/files/IFileService.java | 9 ++-- .../FileServiceSubSystem.java | 14 ++--- .../core/subsystems/IRemoteFileSubSystem.java | 53 +++++++++++-------- .../core/subsystems/RemoteFileSubSystem.java | 6 +-- .../FileSubsystemConsistencyTestCase.java | 8 ++- 8 files changed, 109 insertions(+), 58 deletions(-) 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 76c240c9a5f..d7a410cb348 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 @@ -1071,7 +1071,14 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer { DataElement[] subjects = getSubjectsFor(remoteParents, names); - dsQueryCommandMulti(subjects, null, IUniversalDataStoreConstants.C_QUERY_GET_REMOTE_OBJECT, monitor); + // construct default array of commands + String[] queryStrings = new String[remoteParents.length]; + for (int i = 0; i < queryStrings.length; i++) + { + queryStrings[i] = IUniversalDataStoreConstants.C_QUERY_GET_REMOTE_OBJECT; + } + + dsQueryCommandMulti(subjects, null, queryStrings, monitor); return convertToHostFiles(subjects, "*"); //$NON-NLS-1$ } @@ -1561,11 +1568,11 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer case IFileServiceConstants.FILE_TYPE_FILES: queryString = IUniversalDataStoreConstants.C_QUERY_VIEW_FILES; break; - + case IFileServiceConstants.FILE_TYPE_FOLDERS: queryString = IUniversalDataStoreConstants.C_QUERY_VIEW_FOLDERS; - break; - + break; + case IFileServiceConstants.FILE_TYPE_FILES_AND_FOLDERS: default: queryString = IUniversalDataStoreConstants.C_QUERY_VIEW_ALL; @@ -1573,6 +1580,30 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer } return queryString; } + + private String[] getQueryStrings(int[] fileTypes) + { + String[] queryStrings = new String[fileTypes.length]; + for (int i = 0; i < fileTypes.length; i++) + { + switch (fileTypes[i]) + { + case IFileServiceConstants.FILE_TYPE_FILES: + queryStrings[i] = IUniversalDataStoreConstants.C_QUERY_VIEW_FILES; + break; + + case IFileServiceConstants.FILE_TYPE_FOLDERS: + queryStrings[i] = IUniversalDataStoreConstants.C_QUERY_VIEW_FOLDERS; + break; + + case IFileServiceConstants.FILE_TYPE_FILES_AND_FOLDERS: + default: + queryStrings[i] = IUniversalDataStoreConstants.C_QUERY_VIEW_ALL; + break; + } + } + return queryStrings; + } public IHostFile[] list(String remoteParent, String fileFilter, int fileType, IProgressMonitor monitor) { @@ -1582,12 +1613,12 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer public IHostFile[] listMulti(String[] remoteParents, - String[] fileFilters, int fileType, IProgressMonitor monitor) + String[] fileFilters, int[] fileTypes, IProgressMonitor monitor) throws SystemMessageException { - String queryString = getQueryString(fileType); + String[] queryStrings = getQueryStrings(fileTypes); - return fetchMulti(remoteParents, fileFilters, queryString, monitor); + return fetchMulti(remoteParents, fileFilters, queryStrings, monitor); } protected String[] getPathsFor(String[] remoteParents, String[] remoteFiles) @@ -1688,11 +1719,11 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer * * @param remoteParents the parents to query * @param fileFilters the filters for each parent to query - * @param queryType the type of query (files, folders, both, etc) + * @param queryTypes the type of queries (for each parent) - files, folders, both, etc * @param monitor the progress monitor * @return the results */ - protected IHostFile[] fetchMulti(String[] remoteParents, String[] fileFilters, String queryType, IProgressMonitor monitor) + protected IHostFile[] fetchMulti(String[] remoteParents, String[] fileFilters, String[] queryTypes, IProgressMonitor monitor) { DataStore ds = getDataStore(); if (ds == null) @@ -1720,7 +1751,7 @@ public class DStoreFileService extends AbstractDStoreService implements IFileSer argses[i] = args; } - List consolidatedResults = dsQueryCommandMulti(subjects, argses, queryType, monitor); + List consolidatedResults = dsQueryCommandMulti(subjects, argses, queryTypes, monitor); List convertedResults = new ArrayList(); for (int r = 0; r < consolidatedResults.size(); r++) { diff --git a/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/services/dstore/AbstractDStoreService.java b/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/services/dstore/AbstractDStoreService.java index c39cab262c5..555222043d9 100644 --- a/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/services/dstore/AbstractDStoreService.java +++ b/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/services/dstore/AbstractDStoreService.java @@ -90,12 +90,12 @@ public abstract class AbstractDStoreService implements IDStoreService } /** - * query - * @param subject - * @param args - * @param command + * query the the remote system + * @param subject the subject of the query + * @param args the arguments for the query + * @param command the query command * @param monitor - * @return + * @return the array of results */ protected DataElement[] dsQueryCommand(DataElement subject, ArrayList args, String command, IProgressMonitor monitor) { @@ -146,20 +146,20 @@ public abstract class AbstractDStoreService implements IDStoreService return new DataElement[0]; } - protected List dsQueryCommandMulti(DataElement[] subjects, String command, IProgressMonitor monitor) + protected List dsQueryCommandMulti(DataElement[] subjects, String[] commands, IProgressMonitor monitor) { - return dsQueryCommandMulti(subjects, null, command, monitor); + return dsQueryCommandMulti(subjects, null, commands, monitor); } /** * Query multiple subjects in one shot * @param subjects the subjects to query - * @param command the query command - * @param args args for the command - may be null + * @param commands the query commands + * @param argses arguments for the command - may be null * @param monitor the progress monitor * @return a list of DataElement[]s containing the results of each query */ - protected List dsQueryCommandMulti(DataElement[] subjects, ArrayList[] argses, String command, IProgressMonitor monitor) + protected List dsQueryCommandMulti(DataElement[] subjects, ArrayList[] argses, String[] commands, IProgressMonitor monitor) { List statuses = new ArrayList(); DataStore ds = getDataStore(); @@ -170,7 +170,7 @@ public abstract class AbstractDStoreService implements IDStoreService { DataElement subject = subjects[i]; - DataElement queryCmd = getCommandDescriptor(subject, command); + DataElement queryCmd = getCommandDescriptor(subject, commands[i]); if (queryCmd != null && ds != null) { DataElement status = null; diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/files/AbstractFileService.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/files/AbstractFileService.java index e17e80353fe..266c8bfd82a 100644 --- a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/files/AbstractFileService.java +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/files/AbstractFileService.java @@ -52,13 +52,13 @@ public abstract class AbstractFileService implements IFileService } public IHostFile[] listMulti(String[] remoteParents, - String[] fileFilters, int fileType, IProgressMonitor monitor) + String[] fileFilters, int fileTypes[], IProgressMonitor monitor) throws SystemMessageException { List files = new ArrayList(); for (int i = 0; i < remoteParents.length; i++) { - IHostFile[] result = list(remoteParents[i], fileFilters[i], fileType, monitor); + IHostFile[] result = list(remoteParents[i], fileFilters[i], fileTypes[i], monitor); for (int j = 0; j < result.length; j++) { files.add(result[j]); diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/files/IFileService.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/files/IFileService.java index 7d2556fbfa5..4247644527a 100644 --- a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/files/IFileService.java +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/files/IFileService.java @@ -182,14 +182,17 @@ public interface IFileService extends IService * system from which to retrieve the collective child list. * @param fileFilters - a set of strings that can be used to filter the children. Only * those files matching the filter corresponding to it's remoteParent make it into the list. The interface - * does not dictate where the filtering occurs. - * @param fileType - indicates whether to query files, folders, both or some other type + * does not dictate where the filtering occurs. For each remoteParent, there must be a corresponding + * fileFilter. + * @param fileTypes - indicates whether to query files, folders, both or some other type. For + * each remoteParent, there must be a corresponding fileType. + * For the default list of available file types see IFileServiceContants * @param monitor the monitor for this potentially long running operation * @return the collective list of host files that reside in each of the remoteParents with it's corresponding filter. * @throws SystemMessageException if an error occurs. * Typically this would be one of those in the RemoteFileException family. */ - public IHostFile[] listMulti(String[] remoteParents, String[] fileFilters, int fileType, IProgressMonitor monitor) throws SystemMessageException; + public IHostFile[] listMulti(String[] remoteParents, String[] fileFilters, int[] fileTypes, IProgressMonitor monitor) throws SystemMessageException; /** diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java index 964a80b2d63..8fd9239ee79 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java @@ -371,10 +371,10 @@ public final class FileServiceSubSystem extends RemoteFileSubSystem implements I * by the given file name filter. It can be null for no subsetting. * @param parents The parent folders to list folders and files in * @param fileNameFilters The name patterns to subset the file list by, or null to return all files. - * @param fileType - indicates whether to query files, folders, both or some other type + * @param fileTypes - indicates whether to query files, folders, both or some other type * @param monitor the progress monitor */ - public IRemoteFile[] listMulti(IRemoteFile[] parents, String[] fileNameFilters, int fileType, IProgressMonitor monitor) throws SystemMessageException + public IRemoteFile[] listMulti(IRemoteFile[] parents, String[] fileNameFilters, int[] fileTypes, IProgressMonitor monitor) throws SystemMessageException { String[] parentPaths = new String[parents.length]; for (int i = 0; i < parents.length; i++) @@ -382,7 +382,7 @@ public final class FileServiceSubSystem extends RemoteFileSubSystem implements I parentPaths[i] = parents[i].getAbsolutePath(); } - IHostFile[] results = getFileService().listMulti(parentPaths, fileNameFilters, fileType, monitor); + IHostFile[] results = getFileService().listMulti(parentPaths, fileNameFilters, fileTypes, monitor); RemoteFileContext context = getDefaultContext(); IRemoteFile[] farr = getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, null, results); @@ -418,15 +418,15 @@ public final class FileServiceSubSystem extends RemoteFileSubSystem implements I /** - * Return a list of remote folders and files in the given folder. + * Return a list of remote folders and/or files in the given folder. *

- * The files part of the list is subsetted by the given file name filter. - * It can be null for no subsetting. + * The files part of the list is filtered by the given file name filter. + * It can be null for no filtering. * This version is called by RemoteFileSubSystemImpl's resolveFilterString(s). * @param parent The parent folder to list folders and files in * @param fileNameFilter The name pattern to subset the file list by, or null to return all files. * @param context The holder of state information - * @param fileType the type of file to query + * @param fileType indicates whether to filter files, folders, both or something else * @param monitor the progress monitor */ public IRemoteFile[] list(IRemoteFile parent, String fileNameFilter, IRemoteFileContext context, int fileType, IProgressMonitor monitor) throws SystemMessageException diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/IRemoteFileSubSystem.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/IRemoteFileSubSystem.java index 1a95155b380..d1f3c99a321 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/IRemoteFileSubSystem.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/IRemoteFileSubSystem.java @@ -109,60 +109,71 @@ public interface IRemoteFileSubSystem extends ISubSystem { /** - * Return a list of all remote folders and files in the given folder. The list is not subsetted. - * @param parents The parent folders to list folders and files in - * @param fileType - indicates whether to query files, folders, both or some other type + * Return a list of all remote folders and/or files in the given folders. This list is not filtered. + * + * @param parents The parent folders to list folders and/or files in + * @param fileTypes - indicates whether to query files, folders, both or some other type. There + * should be exactly one fileType specified per parent. + * For the default list of available file types see IFileServiceContants * @param monitor the progress monitor */ - public IRemoteFile[] listMulti(IRemoteFile[] parents, int fileType, IProgressMonitor monitor) throws SystemMessageException; + public IRemoteFile[] listMulti(IRemoteFile[] parents, int[] fileTypes, IProgressMonitor monitor) throws SystemMessageException; /** - * Return a list of remote folders and files in the given folder. Only file names are subsettable - * by the given file name filter. It can be null for no subsetting. + * Return a list of remote folders and/or files in the given folder. Only file names are filtered + * by the given file name filters. It can be null for no sub-setting. + * * @param parents The parent folders to list folders and files in - * @param fileNameFilters The name patterns to subset the file list by, or null to return all files. - * @param fileType - indicates whether to query files, folders, both or some other type + * @param fileNameFilters The name patterns to subset the file list by, or null to return all files. + * There should be exactly one fileNameFilter per parent. + * @param fileTypes - indicates whether to query files, folders, both or some other type. There + * should be exactly one fileType specified per parent. + * For the default list of available file types see IFileServiceContants * @param monitor the progress monitor */ - public IRemoteFile[] listMulti(IRemoteFile[] parents, String[] fileNameFilters, int fileType, IProgressMonitor monitor) throws SystemMessageException; + public IRemoteFile[] listMulti(IRemoteFile[] parents, String[] fileNameFilters, int[] fileTypes, IProgressMonitor monitor) throws SystemMessageException; /** - * Return a list of all remote folders and files in the given folder. The list is not subsetted. - * @param parent The parent folder to list folders and files in + * Return a list of all remote folders and/or files in the given folder. The list is not filtered. + * + * @param parent The parent folder to list folders and/or files in * @param monitor the progress monitor */ public IRemoteFile[] list(IRemoteFile parent, IProgressMonitor monitor) throws SystemMessageException; /** - * Return a list of all remote folders and files in the given folder. The list is not subsetted. + * Return a list of all remote folders and/or files in the given folder. The list is not filtered. + * * @param parent The parent folder to list folders and files in - * @param fileType - indicates whether to query files, folders, both or some other type + * @param fileType - indicates whether to query files, folders, both or some other type. + * For the default list of available file types see IFileServiceContants * @param monitor the progress monitor */ public IRemoteFile[] list(IRemoteFile parent, int fileType, IProgressMonitor monitor) throws SystemMessageException; /** - * Return a list of remote folders and files in the given folder. Only file names are subsettable - * by the given file name filter. It can be null for no subsetting. + * Return a list of remote folders and/or files in the given folder. Only file names are filtered + * by the given file name filter. It can be null for no filtering. + * * @param parent The parent folder to list folders and files in * @param fileNameFilter The name pattern to subset the file list by, or null to return all files. - * @param fileType - indicates whether to query files, folders, both or some other type + * @param fileType - indicates whether to query files, folders, both or some other type. + * For the default list of available file types see IFileServiceContants * @param monitor the progress monitor */ public IRemoteFile[] list(IRemoteFile parent, String fileNameFilter, int fileType, IProgressMonitor monitor) throws SystemMessageException; /** - * Return a list of remote folders and files in the given folder. - *

- * The files part of the list is subsetted by the given file name filter. - * It can be null for no subsetting. - * This version is called by RemoteFileSubSystemImpl's resolveFilterString(s). + * Return a list of remote folders and/or files in the given folder. The files part of the list is filtered + * by the given file name filter. It can be null for no filtering. + * * @param parent The parent folder to list folders and files in * @param fileNameFilter The name pattern to subset the file list by, or null to return all files. * @param context The holder of state information * - indicates whether to query files, folders, both or some other type * @param fileType - indicates whether to query files, folders, both or some other type + * For the default list of available file types see IFileServiceContants * @param monitor the progress monitor */ 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 81430700381..f023a99c609 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 @@ -867,10 +867,10 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi /** * Return a list of all remote folders and files in the given folder. The list is not subsetted. * @param parents The parent folders to list folders and files in - * @param fileType - indicates whether to query files, folders, both or some other type + * @param fileTypes - indicates whether to query files, folders, both or some other type * @param monitor the progress monitor */ - public IRemoteFile[] listMulti(IRemoteFile[] parents, int fileType, IProgressMonitor monitor) throws SystemMessageException + public IRemoteFile[] listMulti(IRemoteFile[] parents, int[] fileTypes, IProgressMonitor monitor) throws SystemMessageException { String[] fileNameFilters = new String[parents.length]; for (int i = 0; i < parents.length; i++) @@ -878,7 +878,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi fileNameFilters[i] = "*"; // default filter //$NON-NLS-1$ } - return listMulti(parents, fileNameFilters, fileType, monitor); + return listMulti(parents, fileNameFilters, fileTypes, monitor); } /** diff --git a/rse/tests/org.eclipse.rse.tests/src/org/eclipse/rse/tests/subsystems/files/FileSubsystemConsistencyTestCase.java b/rse/tests/org.eclipse.rse.tests/src/org/eclipse/rse/tests/subsystems/files/FileSubsystemConsistencyTestCase.java index 606b97b6d9e..470de6fe99d 100644 --- a/rse/tests/org.eclipse.rse.tests/src/org/eclipse/rse/tests/subsystems/files/FileSubsystemConsistencyTestCase.java +++ b/rse/tests/org.eclipse.rse.tests/src/org/eclipse/rse/tests/subsystems/files/FileSubsystemConsistencyTestCase.java @@ -357,7 +357,13 @@ public class FileSubsystemConsistencyTestCase extends RSEBaseConnectionTestCase long t3 = System.currentTimeMillis(); try { - results = ss.listMulti(remoteFiles, IFileServiceConstants.FILE_TYPE_FILES_AND_FOLDERS, new NullProgressMonitor()); + int[] types = new int[remoteFiles.length]; + for (int t = 0; t < remoteFiles.length; t++) + { + types[t] = IFileServiceConstants.FILE_TYPE_FILES_AND_FOLDERS; + } + + results = ss.listMulti(remoteFiles, types, new NullProgressMonitor()); } catch (Exception e){ exception = e;