diff options
Diffstat (limited to 'rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java')
-rw-r--r-- | rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java | 1229 |
1 files changed, 0 insertions, 1229 deletions
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 deleted file mode 100644 index 0d77291d3..000000000 --- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java +++ /dev/null @@ -1,1229 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2008 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Initial Contributors: - * The following IBM employees contributed to the Remote System Explorer - * component that contains this file: David McKnight, Kushal Munir, - * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson, - * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. - * - * Contributors: - * Martin Oberhuber (Wind River) - Fix 158534 - NPE in upload/download after conflict - * Martin Oberhuber (Wind River) - Fix 162962 - recursive removeCachedRemoteFile() - * Martin Oberhuber (Wind River) - [168596] FileServiceSubSystem.isCaseSensitive() - * Martin Oberhuber (Wind River) - [177523] Unify singleton getter methods - * Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API - * Martin Oberhuber (Wind River) - [183824] Forward SystemMessageException from IRemoteFileSubsystem - * Javier Montalvo Orus (Symbian) - [199773] Default file transfer mode is ignored for some file types - * David McKnight (IBM) - [207095] Implicit connect on getRemoteFileObject - * David McKnight (IBM) - [207100] fire event after upload and download - * David McKnight (IBM) - [207178] changing list APIs for file service and subsystems - * David McKnight (IBM) - [162195] new APIs for upload multi and download multi - * David McKnight (IBM) - [203114] don't treat XML files specially (no hidden prefs for bin vs text) - * David McKnight (IBM) - [209552] API changes to use multiple and getting rid of deprecated - * Kevin Doyle (IBM) - [208778] [efs][api] RSEFileStore#getOutputStream() does not support EFS#APPEND - * David McKnight (IBM) - [209704] added supportsEncodingConversion() - * David Dykstal (IBM) - [197036] pulling up subsystem switch logic - * David Dykstal (IBM) - [217556] remove service subsystem types - * Martin Oberhuber (Wind River) - [219098][api] FileServiceSubSystem should not be final - * David McKnight (IBM) - [216252] [api][nls] Resource Strings specific to subsystems should be moved from rse.ui into files.ui / shells.ui / processes.ui where possible - * Martin Oberhuber (Wind River) - [220020][api][breaking] SystemFileTransferModeRegistry should be internal - * David McKnight (IBM) - [220547] [api][breaking] SimpleSystemMessage needs to specify a message id and some messages should be shared - * Kevin Doyle (IBM) - [224162] SystemEditableRemoteFile.saveAs does not work because FileServiceSubSytem.upload does invalid check - * Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading - * David Dykstal (IBM) - [221211] fix IFileService API for batch operations - * Martin Oberhuber (Wind River) - [221211] Fix markStale() for delete() operation with exceptions - * David Dykstal (IBM) - [230821] fix IRemoteFileSubSystem API to be consistent with IFileService - * Martin Oberhuber (Wind River) - [234038] Mark IRemoteFile stale when changing permissions - * Martin Oberhuber (Wind River) - [235360][ftp][ssh][local] Return proper "Root" IHostFile - * David McKnight (IBM) - [223461] [Refresh][api] Refresh expanded folder under filter refreshes Filter - * Martin Oberhuber (Wind River) - [240704] Protect against illegal API use of getRemoteFileObject() with relative path as name - * Martin Oberhuber (Wind River) - [234026] Clarify IFileService#createFolder() Javadocs - *******************************************************************************/ - -package org.eclipse.rse.subsystems.files.core.servicesubsystem; - -import java.io.File; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.Status; -import org.eclipse.osgi.util.NLS; -import org.eclipse.rse.core.RSECorePlugin; -import org.eclipse.rse.core.events.ISystemRemoteChangeEvents; -import org.eclipse.rse.core.events.SystemRemoteChangeEvent; -import org.eclipse.rse.core.model.IHost; -import org.eclipse.rse.core.model.ISystemRegistry; -import org.eclipse.rse.core.subsystems.IConnectorService; -import org.eclipse.rse.core.subsystems.ISubSystemConfiguration; -import org.eclipse.rse.core.subsystems.RemoteChildrenContentsType; -import org.eclipse.rse.internal.subsystems.files.core.Activator; -import org.eclipse.rse.internal.subsystems.files.core.ISystemFileMessageIds; -import org.eclipse.rse.internal.subsystems.files.core.SystemFileResources; -import org.eclipse.rse.services.clientserver.PathUtility; -import org.eclipse.rse.services.clientserver.SystemSearchString; -import org.eclipse.rse.services.clientserver.archiveutils.AbsoluteVirtualPath; -import org.eclipse.rse.services.clientserver.archiveutils.ArchiveHandlerManager; -import org.eclipse.rse.services.clientserver.messages.CommonMessages; -import org.eclipse.rse.services.clientserver.messages.ICommonMessageIds; -import org.eclipse.rse.services.clientserver.messages.SimpleSystemMessage; -import org.eclipse.rse.services.clientserver.messages.SystemElementNotFoundException; -import org.eclipse.rse.services.clientserver.messages.SystemMessage; -import org.eclipse.rse.services.clientserver.messages.SystemMessageException; -import org.eclipse.rse.services.files.IFileService; -import org.eclipse.rse.services.files.IHostFile; -import org.eclipse.rse.services.search.IHostSearchResultConfiguration; -import org.eclipse.rse.services.search.IHostSearchResultSet; -import org.eclipse.rse.services.search.ISearchService; -import org.eclipse.rse.subsystems.files.core.ILanguageUtilityFactory; -import org.eclipse.rse.subsystems.files.core.model.RemoteFileUtility; -import org.eclipse.rse.subsystems.files.core.subsystems.IHostFileToRemoteFileAdapter; -import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile; -import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileContext; -import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem; -import org.eclipse.rse.subsystems.files.core.subsystems.RemoteFileContext; -import org.eclipse.rse.subsystems.files.core.subsystems.RemoteFileSubSystem; -import org.eclipse.rse.ui.SystemBasePlugin; - -/** - * Generic Subsystem implementation for remote files. - * - * Clients may instantiate this class from their subsystem configurations. - * <p> - * Extending (overriding) this class is discouraged: configuration of the subsystem - * behavior should be done by providing a custom {@link IFileService} implementation - * wherever possible. - */ -public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileServiceSubSystem -{ - - protected ILanguageUtilityFactory _languageUtilityFactory; - protected IFileService _hostFileService; - protected ISearchService _hostSearchService; - protected IHostFileToRemoteFileAdapter _hostFileToRemoteFileAdapter; - protected IRemoteFile _userHome; - public FileServiceSubSystem(IHost host, IConnectorService connectorService, IFileService hostFileService, IHostFileToRemoteFileAdapter fileAdapter, ISearchService searchService) - { - super(host, connectorService); - _hostFileService = hostFileService; - _hostFileToRemoteFileAdapter = fileAdapter; - _hostSearchService = searchService; - - } - - /* (non-Javadoc) - * @see org.eclipse.rse.subsystems.files.core.subsystems.RemoteFileSubSystem#isCaseSensitive() - */ - public boolean isCaseSensitive() { - return getFileService().isCaseSensitive(); - } - - public IRemoteFileContext getContextFor(IRemoteFile file) - { - return getContext(file); - } - - public IRemoteFileContext getTheDefaultContext() - { - return getDefaultContextNoFilterString(); - } - - public IFileService getFileService() - { - return _hostFileService; - } - - public void setFileService(IFileService service) - { - _hostFileService = service; - } - - public ISearchService getSearchService() - { - return _hostSearchService; - } - - public void setSearchService(ISearchService service) - { - _hostSearchService = service; - } - - public IHostFileToRemoteFileAdapter getHostFileToRemoteFileAdapter() - { - return _hostFileToRemoteFileAdapter; - } - - public void setHostFileToRemoteFileAdapter(IHostFileToRemoteFileAdapter hostFileAdapter) - { - _hostFileToRemoteFileAdapter = hostFileAdapter; - } - - /** - * Constructs an IRemoteFile object given - * an unqualified file or folder name and its parent folder object. - * @param parent Folder containing the folder or file - * @param folderOrFileName Un-qualified folder or file name - * @param monitor the progress monitor - * @return an IRemoteFile object for the file. - * @see IRemoteFile - */ - public IRemoteFile getRemoteFileObject(IRemoteFile parent, String folderOrFileName, IProgressMonitor monitor) throws SystemMessageException - { - // Consistency would be totally messed up if folderOrFileName were a relative path - // Because IHostFiles would be incorrectly generated, getParent() would return wrong results etc - assert folderOrFileName.indexOf(getSeparator())<0; - // for bug 207095, implicit connect if the connection is not connected - checkIsConnected(monitor); - - String fullPath = parent.getAbsolutePath() + getSeparator() + folderOrFileName; - IRemoteFile file = getCachedRemoteFile(fullPath); - if (file != null && !file.isStale()) - { - return file; - } - // Fallback in case of incorrect API usage - // TODO remove this in next release for Performance, - // since it is just for bad clients using the API incorrectly - if (folderOrFileName.indexOf(getSeparator()) >= 0) { - try { - throw new IllegalArgumentException("getRemoteFileObject: folderOrFileName must not be a relative path"); //$NON-NLS-1$ - } catch (IllegalArgumentException e) { - Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Illegal API use: " + e.getLocalizedMessage(), e)); //$NON-NLS-1$ - } - return getRemoteFileObject(fullPath, monitor); - } - - IHostFile node = getFile(parent.getAbsolutePath(), folderOrFileName, monitor); - return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), parent, node); - } - - - - /** - * Constructs and returns an IRemoteFile object given a fully-qualified - * file or folder name. - * @param folderOrFileName Fully qualified folder or file name - * @param monitor the progress monitor - * @return The constructed IRemoteFile - * @see IRemoteFile - */ - public IRemoteFile getRemoteFileObject(String folderOrFileName, IProgressMonitor monitor) throws SystemMessageException - { - - String fofName = folderOrFileName; - if (folderOrFileName.length() > 1) - { - fofName = ArchiveHandlerManager.cleanUpVirtualPath(folderOrFileName); - } - IRemoteFile file = getCachedRemoteFile(fofName); - if (file != null && !file.isStale()) { - return file; - } - - // for bug 207095, implicit connect if the connection is not connected - checkIsConnected(monitor); - - if (fofName.endsWith(ArchiveHandlerManager.VIRTUAL_SEPARATOR)) - { - fofName = fofName.substring(0, fofName.length() - ArchiveHandlerManager.VIRTUAL_SEPARATOR.length()); - } - - int j = fofName.indexOf(ArchiveHandlerManager.VIRTUAL_SEPARATOR); - if (j == -1) - { - if (fofName.equals("/")) //$NON-NLS-1$ - { - try - { - return listRoots(null)[0]; - } - catch (Exception e) - { - - } - } - - if (fofName.equals(".")) { //$NON-NLS-1$ - IRemoteFile userHome = getUserHome(); - if (userHome == null){ - - // with 207095, it's possible that we could be trying to get user home when not connected - SystemMessage msg = new SimpleSystemMessage(Activator.PLUGIN_ID, - ICommonMessageIds.MSG_ERROR_UNEXPECTED, - IStatus.ERROR, - CommonMessages.MSG_ERROR_UNEXPECTED); - throw new SystemMessageException(msg); - } - return userHome; - } - - String sep = PathUtility.getSeparator(folderOrFileName); - if (fofName.endsWith(sep)) - { - fofName = fofName.substring(0, fofName.length() - sep.length()); - } - - if (fofName.endsWith(":")) //$NON-NLS-1$ - { - try - { - IHostFile[] roots = getRoots(null); - for (int i = 0; i < roots.length; i++) - if (roots[i].getAbsolutePath().toLowerCase().startsWith(fofName.toLowerCase())) - return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), null, roots[i]); - } - catch (InterruptedException e) - { - } - return null; - } - - int lastSep = fofName.lastIndexOf(sep); - - if (lastSep > -1) - { - String parentPath = fofName.substring(0, lastSep); - - - if (parentPath.length() == 0) parentPath = "/"; //$NON-NLS-1$ - String name = fofName.substring(lastSep + 1, fofName.length()); - - IHostFile node = getFile(parentPath, name, monitor); - if (node != null) - { - IRemoteFile parent = null; - if (!node.isRoot()) - { - //parent = getRemoteFileObject(parentPath); - } - return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), parent, node); - } - } - return null; - } - else - { - AbsoluteVirtualPath avp = new AbsoluteVirtualPath(fofName); - IHostFile node = getFile(avp.getPath(), avp.getName(), null); - if (node != null) - { - return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), null, node); - } - else return null; - } - } - - - - - - /** - * @return The IRemoteFile that is the user's home directory on this remote file system. - * The remote file system is assumed to have a concept of a home directory. - */ - protected IRemoteFile getUserHome() - { - if (_userHome != null) - { - return _userHome; - } - IRemoteFile root = getCachedRemoteFile("."); //$NON-NLS-1$ - if (root != null && !root.isStale()) { - return root; - } - IHostFile userHome = getFileService().getUserHome(); - // with 207095, it's possible that user is not connected, and that userHome is null - if (userHome == null) { - return null; - } - - IRemoteFile parent = null; - if (!".".equals(userHome.getParentPath())) //$NON-NLS-1$ - { - //note: parent path can be "null" if userHome is a Root - try - { - //parent = getRemoteFileObject(userHome.getParentPath()); - } - catch (Exception e) - { - } - } - root = getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), parent, userHome); - cacheRemoteFile(root, "."); //$NON-NLS-1$ - _userHome = root; - return root; - } - - /** - * Return a list of children from the given parent path in service layer format. - * Was unified from the previous methods getFolders(), getFiles() and getFilesAndFolders() - * in RSE 3.0 - * @since 3.0 - */ - protected IHostFile[] internalList(String parentPath, String fileNameFilter, int fileType, IProgressMonitor monitor) throws SystemMessageException - { - return getFileService().list(parentPath, fileNameFilter, fileType, monitor); - } - - protected IHostFile getFile(String parentPath, String fileName, IProgressMonitor monitor) throws SystemMessageException - { - return getFileService().getFile(parentPath, fileName, monitor); - } - - protected IHostFile[] getRoots(IProgressMonitor monitor) throws InterruptedException, SystemMessageException - { - return getFileService().getRoots(monitor); - } - - public IRemoteFile[] getRemoteFileObjects(String[] folderOrFileNames, - IProgressMonitor monitor) throws SystemMessageException - { - // for bug 207095, implicit connect if the connection is not connected - checkIsConnected(monitor); - - String[] parentPaths = new String[folderOrFileNames.length]; - String[] names = new String[folderOrFileNames.length]; - String sep = null; - for (int i = 0; i < folderOrFileNames.length; i++) - { - String fofName = folderOrFileNames[i]; - if (sep == null) - sep = PathUtility.getSeparator(fofName); - - String parentPath = null; - String name = null; - int lastSep = fofName.lastIndexOf(sep); - - if (lastSep > -1) - { - parentPath = fofName.substring(0, lastSep); - - if (parentPath.length() == 0) parentPath = "/"; //$NON-NLS-1$ - name = fofName.substring(lastSep + 1, fofName.length()); - } - - parentPaths[i] = parentPath; - names[i] = name; - } - - RemoteFileContext context = getDefaultContext(); - List hostFiles = new ArrayList(10); - getFileService().getFileMultiple(parentPaths, names, hostFiles, monitor); - IHostFile[] nodes = new IHostFile[hostFiles.size()]; - hostFiles.toArray(nodes); - return getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, null, nodes); - } - - - /** - * {@inheritDoc} - * @since 3.0 - */ - public IRemoteFile[] listMultiple(IRemoteFile[] parents, String[] fileNameFilters, int[] fileTypes, IProgressMonitor monitor) throws SystemMessageException - { - String[] parentPaths = new String[parents.length]; - for (int i = 0; i < parents.length; i++) - { - parentPaths[i] = parents[i].getAbsolutePath(); - } - - List hostFiles = new ArrayList(10); - - // query children via the service - getFileService().listMultiple(parentPaths, fileNameFilters, fileTypes, hostFiles, monitor); - RemoteFileContext context = getDefaultContext(); - - IHostFile[] results = (IHostFile[])hostFiles.toArray(new IHostFile[hostFiles.size()]); - - // convert the IHostFiles into AbstractRemoteFiles - AbstractRemoteFile[] farr = getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, null, results); - - // cache the results corresponding to each parent under each parent - for (int i = 0; i < parents.length; i++) - { - IRemoteFile parent = parents[i]; - String parentPath = parentPaths[i]; - String filter = fileNameFilters[i]; - - List underParent = new ArrayList(); - // what files are under this one? - for (int j = 0; j < farr.length; j++) - { - IRemoteFile child = farr[j]; - String childParentPath = child.getParentPath(); - - if (parentPath.equals(childParentPath)) - { - underParent.add(child); - } - } - - // update the parent with it's latest properties - // null is passed for the second argument because we currently don't get the parent in our results query - updateRemoteFile(parent, null, monitor); - - if (underParent.size() > 0) - { - Object[] qresults = underParent.toArray(); - parent.setContents(RemoteChildrenContentsType.getInstance(), filter, qresults); - } - } - - return farr; - } - - - /** - * {@inheritDoc} - * @since 3.0 - */ - public IRemoteFile[] listMultiple(IRemoteFile[] parents, String[] fileNameFilters, int fileType, IProgressMonitor monitor) throws SystemMessageException - { - String[] parentPaths = new String[parents.length]; - for (int i = 0; i < parents.length; i++) - { - parentPaths[i] = parents[i].getAbsolutePath(); - } - - - List hostFiles = new ArrayList(10); - // query children via the service - getFileService().listMultiple(parentPaths, fileNameFilters, fileType, hostFiles, monitor); - RemoteFileContext context = getDefaultContext(); - - IHostFile[] results = (IHostFile[])hostFiles.toArray(new IHostFile[hostFiles.size()]); - - // convert the IHostFiles into AbstractRemoteFiles - AbstractRemoteFile[] farr = getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, null, results); - - // cache the results corresponding to each parent under each parent - for (int i = 0; i < parents.length; i++) - { - IRemoteFile parent = parents[i]; - String parentPath = parentPaths[i]; - String filter = fileNameFilters[i]; - - List underParent = new ArrayList(); - // what files are under this one? - for (int j = 0; j < farr.length; j++) - { - AbstractRemoteFile child = farr[j]; - String childParentPath = child.getParentPath(); - - if (parentPath.equals(childParentPath)) - { - underParent.add(child); - } - } - - // update the parent with it's latest properties - // null is passed for the second argument because we currently don't get the parent in our results query - updateRemoteFile(parent, null, monitor); - - if (underParent.size() > 0) - { - Object[] qresults = underParent.toArray(); - parent.setContents(RemoteChildrenContentsType.getInstance(), filter, qresults); - } - } - - return farr; - } - - - /** - * {@inheritDoc} - * @since 3.0 - */ - public IRemoteFile[] list(IRemoteFile parent, String fileNameFilter, IRemoteFileContext context, int fileType, IProgressMonitor monitor) throws SystemMessageException - { - String parentPath = null; - if (parent != null) { - parentPath = parent.getAbsolutePath(); - } else { - parentPath = "/"; //$NON-NLS-1$ - } - - if (parent != null && !parent.canRead()) - { - String msgTxt = NLS.bind(SystemFileResources.MSG_FOLDER_UNREADABLE, parentPath); - SystemMessage msg = new SimpleSystemMessage(Activator.PLUGIN_ID, - ISystemFileMessageIds.MSG_FOLDER_UNREADABLE, - IStatus.INFO, msgTxt); - throw new SystemMessageException(msg); - } - - // query children of the parent - IHostFile[] results = internalList(parentPath, fileNameFilter, fileType, monitor); - - // update the parent with it's latest properties - // null is passed for the second argument because we currently don't get the parent in our results query - updateRemoteFile(parent, null, monitor); - - // convert the IHostFiles to AbstractRemoteFile[] - AbstractRemoteFile[] farr = getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, parent, results); - if (parent != null) - parent.setContents(RemoteChildrenContentsType.getInstance(), fileNameFilter, farr); - return farr; - } - - - - private void updateRemoteFile(IRemoteFile parent, IHostFile newHostParent, IProgressMonitor monitor) throws SystemMessageException - { - // now newHostParent file passed in so we'll assume it wasn't returned and explicitly get it - if (newHostParent == null){ - String parentParentPath = parent.getParentPath(); - if (parentParentPath == null){ - parentParentPath = ""; //$NON-NLS-1$ - } - newHostParent = getFileService().getFile(parentParentPath, parent.getName(), monitor); - } - - if (newHostParent != null){ - IHostFile oldHostParent = parent.getHostFile(); - if (!newHostParent.equals(oldHostParent)){ - ((AbstractRemoteFile)parent).setHostFile(newHostParent); - parent.markStale(false); - } - } - } - - - public IRemoteFile[] listRoots(IRemoteFileContext context, IProgressMonitor monitor) throws InterruptedException - { - IHostFile[] roots = null; - try - { - roots = getRoots(monitor); - } - catch (SystemMessageException e) - { - - } - - IRemoteFile[] results = getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, null, roots); - return results; - } - - protected boolean isBinary(String localEncoding, String hostEncoding, String remotePath) - { - return RemoteFileUtility.getSystemFileTransferModeRegistry().isBinary(remotePath); - } - - protected boolean isBinary(IRemoteFile source) - { - return source.isBinary(); // always use preferences (whether xml or not) - } - - /* - * (non-Javadoc) - * @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem#upload(java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor) - */ - public void upload(String source, String srcEncoding, String remotePath, String rmtEncoding, IProgressMonitor monitor) throws SystemMessageException { - int slashIndex = remotePath.lastIndexOf(getSeparator()); - if (slashIndex > -1) { - String remoteParentPath = remotePath.substring(0, slashIndex); - String remoteFileName = remotePath.substring(slashIndex + 1, remotePath.length()); - boolean isBinary = isBinary(srcEncoding, rmtEncoding, remotePath); - if (ArchiveHandlerManager.isVirtual(remotePath)) - { - AbsoluteVirtualPath avp = new AbsoluteVirtualPath(remotePath); - remoteParentPath = avp.getPath(); - remoteFileName = avp.getName(); - } - getFileService().upload(new File(source), remoteParentPath, remoteFileName, isBinary, srcEncoding, rmtEncoding, monitor); - - // notify that the file was uploaded - ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry(); - sr.fireEvent(new SystemRemoteChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_UPLOADED, remotePath, remoteParentPath, this)); - } - } - - /* - * (non-Javadoc) - * @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem#upload(java.lang.String, org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile, java.lang.String, org.eclipse.core.runtime.IProgressMonitor) - */ - public void upload(String source, IRemoteFile destination, String encoding, IProgressMonitor monitor) throws SystemMessageException - { - String remoteParentPath = destination.getParentPath(); - String remoteFileName = destination.getName(); - String hostEncoding = destination.getEncoding(); - boolean isBinary = isBinary(encoding, hostEncoding, destination.getAbsolutePath()); - - if ((destination.exists() && !destination.canWrite()) || (!destination.exists() && !destination.getParentRemoteFile().canWrite())) - { - String msgTxt = NLS.bind(SystemFileResources.MSG_FILE_CANNOT_BE_SAVED, remoteFileName, getHostName()); - String msgDetails = SystemFileResources.MSG_FILE_CANNOT_BE_SAVED_DETAILS; - - SystemMessage msg = new SimpleSystemMessage(Activator.PLUGIN_ID, - ISystemFileMessageIds.MSG_FILE_CANNOT_BE_SAVED, - IStatus.ERROR, msgTxt, msgDetails); - throw new SystemMessageException(msg); - } - getFileService().upload(new File(source), remoteParentPath, remoteFileName, isBinary, encoding, hostEncoding, monitor); - - // notify that the file was uploaded - ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry(); - sr.fireEvent(new SystemRemoteChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_UPLOADED, destination, destination.getParentRemoteFile(), this)); - } - - /** - * {@inheritDoc} - * @since 3.0 - */ - public void uploadMultiple(String[] sources, String[] srcEncodings, - String[] remotePaths, String[] rmtEncodings, - IProgressMonitor monitor) throws SystemMessageException - { - // create list of stuff - File[] sourceFiles = new File[sources.length]; - boolean[] isBinaries = new boolean[sources.length]; - String[] remoteParentPaths = new String[sources.length]; - String[] remoteFileNames = new String[sources.length]; - - // gather info - for (int i = 0; i < sources.length; i++) - { - sourceFiles[i] = new File(sources[i]); - String remotePath = remotePaths[i]; - int slashIndex = remotePath.lastIndexOf(getSeparator()); - if (slashIndex > -1) { - remoteParentPaths[i] = remotePath.substring(0, slashIndex); - remoteFileNames[i] = remotePath.substring(slashIndex + 1, remotePath.length()); - isBinaries[i] = isBinary(srcEncodings[i], rmtEncodings[i], remotePath); - if (ArchiveHandlerManager.isVirtual(remotePath)) - { - AbsoluteVirtualPath avp = new AbsoluteVirtualPath(remotePath); - remoteParentPaths[i] = avp.getPath(); - remoteFileNames[i] = avp.getName(); - } - } - else // unexpected - { - // throw an exception here - //SystemMessage msg = RSEUIPlugin.getPluginMessage("RSEF5003").makeSubstitution(remoteFileNames[i], getHostName()); //$NON-NLS-1$ - //throw new SystemMessageException(msg); - } - } - - // upload - getFileService().uploadMultiple(sourceFiles, remoteParentPaths, remoteFileNames, isBinaries, srcEncodings, rmtEncodings, monitor); - - // notification - // notify that the file was uploaded - ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry(); - for (int j = 0; j < remotePaths.length; j++) - { - String remotePath = remotePaths[j]; - String remoteParentPath = remoteParentPaths[j]; - sr.fireEvent(new SystemRemoteChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_UPLOADED, remotePath, remoteParentPath, this)); - } - } - - /** - * {@inheritDoc} - * @since 3.0 - */ - public void uploadMultiple(String[] sources, IRemoteFile[] destinations, - String[] encodings, IProgressMonitor monitor) - throws SystemMessageException -{ - // create list of stuff - File[] sourceFiles = new File[sources.length]; - boolean[] isBinaries = new boolean[sources.length]; - String[] remoteParentPaths = new String[sources.length]; - String[] remoteFileNames = new String[sources.length]; - String[] hostEncodings = new String[sources.length]; - - // gather info - for (int i = 0; i < sources.length; i++) - { - sourceFiles[i] = new File(sources[i]); - IRemoteFile destination = destinations[i]; - - remoteParentPaths[i] = destination.getAbsolutePath(); - remoteFileNames[i] = destination.getName(); - - if (!destination.canWrite()) - { - String msgTxt = NLS.bind(SystemFileResources.MSG_FILE_CANNOT_BE_SAVED, remoteFileNames[i], getHostName()); - String msgDetails = SystemFileResources.MSG_FILE_CANNOT_BE_SAVED_DETAILS; - - SystemMessage msg = new SimpleSystemMessage(Activator.PLUGIN_ID, - ISystemFileMessageIds.MSG_FILE_CANNOT_BE_SAVED, - IStatus.ERROR, msgTxt, msgDetails); - throw new SystemMessageException(msg); - } - - hostEncodings[i] = destination.getEncoding(); - isBinaries[i] = isBinary(encodings[i], hostEncodings[i], destination.getAbsolutePath()); - - } - - // upload - getFileService().uploadMultiple(sourceFiles, remoteParentPaths, remoteFileNames, isBinaries, encodings, hostEncodings, monitor); - - // notification - // notify that the file was uploaded - ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry(); - for (int j = 0; j < destinations.length; j++) - { - IRemoteFile destination = destinations[j]; - sr.fireEvent(new SystemRemoteChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_UPLOADED, destination, destination.getParentRemoteFile(), this)); - } - - } - - /* - * (non-Javadoc) - * @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem#download(org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile, java.lang.String, java.lang.String, org.eclipse.core.runtime.IProgressMonitor) - */ - public void download(IRemoteFile file, String localpath, String encoding, IProgressMonitor monitor) throws SystemMessageException - { - //Fixing bug 158534. TODO remove when bug 162688 is fixed. - if (monitor==null) { - monitor = new NullProgressMonitor(); - } - String parentPath = file.getParentPath(); - File localFile = new File(localpath); - - // FIXME why are we using file.getEncoding() instead of the specified encoding? - getFileService().download(parentPath, file.getName(), localFile, isBinary(file), file.getEncoding(), monitor); - if (monitor.isCanceled()) - { - localFile.delete(); - } - else - { - // notify that the file was downloaded - ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry(); - sr.fireEvent(new SystemRemoteChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_DOWNLOADED, file, file.getParentRemoteFile(), this)); - - } - } - - /** - * {@inheritDoc} - * @since 3.0 - */ - public void downloadMultiple(IRemoteFile[] sources, String[] destinations, - String[] encodings, IProgressMonitor monitor) - throws SystemMessageException - { - //Fixing bug 158534. TODO remove when bug 162688 is fixed. - if (monitor==null) { - monitor = new NullProgressMonitor(); - } - - // get arrays of parent paths and local files - String[] parentPaths = new String[sources.length]; - String[] names = new String[sources.length]; - boolean[] isBinaries = new boolean[sources.length]; - File[] localFiles = new File[sources.length]; - - for (int i = 0; i < sources.length; i++) - { - IRemoteFile file = sources[i]; - parentPaths[i] = file.getParentPath(); - names[i] = file.getName(); - isBinaries[i] = isBinary(file); - localFiles[i] = new File(destinations[i]); - } - - getFileService().downloadMultiple(parentPaths, names, localFiles, isBinaries, encodings, monitor); - if (monitor.isCanceled()) - { - for (int d = 0; d < localFiles.length; d++) - { - File f = localFiles[d]; - f.delete(); - } - } - else - { - // notify that the file was downloaded - ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry(); - - for (int r = 0; r < sources.length; r++) - { - IRemoteFile file = sources[r]; - sr.fireEvent(new SystemRemoteChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_DOWNLOADED, file, file.getParentRemoteFile(), this)); - } - } - } - - /** - * {@inheritDoc} - * - * @since 3.0 returns void - */ - public void copy(IRemoteFile sourceFolderOrFile, IRemoteFile targetFolder, String newName, IProgressMonitor monitor) throws SystemMessageException - { - IFileService service = getFileService(); - service.copy(sourceFolderOrFile.getParentPath(), sourceFolderOrFile.getName(), targetFolder.getAbsolutePath(), newName, monitor); - } - - /** - * {@inheritDoc} - * - * @since 3.0 returns void - */ - public void copyBatch(IRemoteFile[] sourceFolderOrFiles, IRemoteFile targetFolder, IProgressMonitor monitor) throws SystemMessageException - { - IFileService service = getFileService(); - String[] sourceParents = new String[sourceFolderOrFiles.length]; - String[] sourceNames = new String[sourceFolderOrFiles.length]; - - for (int i = 0; i < sourceFolderOrFiles.length; i++) - { - sourceParents[i] = sourceFolderOrFiles[i].getParentPath(); - sourceNames[i] = sourceFolderOrFiles[i].getName(); - } - service.copyBatch(sourceParents, sourceNames, targetFolder.getAbsolutePath(), monitor); - } - - public IRemoteFile getParentFolder(IRemoteFile folderOrFile, IProgressMonitor monitor) - { - try - { - return getRemoteFileObject(folderOrFile.getParentPath(), monitor); - } - catch (Exception e) - { - return null; - } - } - - public IRemoteFile createFile(IRemoteFile fileToCreate, IProgressMonitor monitor) throws SystemMessageException - { - IFileService service = getFileService(); - String parent = fileToCreate.getParentPath(); - String name = fileToCreate.getName(); - IHostFile newFile = service.createFile(parent, name, monitor); - return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), fileToCreate.getParentRemoteFile(), newFile); - } - - public IRemoteFile createFolder(IRemoteFile folderToCreate, IProgressMonitor monitor) throws SystemMessageException - { - IFileService service = getFileService(); - String parent = folderToCreate.getParentPath(); - String name = folderToCreate.getName(); - IHostFile newFolder = service.createFolder(parent, name, monitor); - return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), folderToCreate.getParentRemoteFile(), newFolder); - } - - public IRemoteFile createFolders(IRemoteFile folderToCreate, IProgressMonitor monitor) throws SystemMessageException - { - try { - //As per IFileService#createFolder() API Docs, Services *may* create parent folders. - //Therefore, first try this shortcut before actually iterating to create parents. - return createFolder(folderToCreate, monitor); - } catch (SystemMessageException e) { - //Parent did not exist? Need to create parent folders on this Service - IFileService service = getFileService(); - List parents = new ArrayList(); - IRemoteFile parent = folderToCreate; - while (!parent.isRoot()) { - parent = parent.getParentRemoteFile(); - IHostFile parentFile = service.getFile(parent.getParentPath(), parent.getName(), monitor); - if (parentFile.exists()) { - //Update cache with newest info, since we just got it - getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), parent.getParentRemoteFile(), parentFile); - break; - } else { - parents.add(parent); - } - } - if (parents.size()==0) { - //No parents missing -- throw original exception - throw e; - } - for (int i=parents.size()-1; i>=0; i--) { - parent = (IRemoteFile)parents.get(i); - // Remote side will change due to createFolder, so mark it stale - parent.markStale(true, true); - // Create new folder and cache the contents - createFolder(parent, monitor); - } - return createFolder(folderToCreate, monitor); - } - } - - /** - * {@inheritDoc} - * @since 3.0 returns void - */ - public void delete(IRemoteFile folderOrFile, IProgressMonitor monitor) throws SystemMessageException - { - IFileService service = getFileService(); - String parent = folderOrFile.getParentPath(); - String name = folderOrFile.getName(); - try { - service.delete(parent, name, monitor); - } finally { - folderOrFile.markStale(true); - } - } - - /** - * {@inheritDoc} - * @since 3.0 returns void - */ - public void deleteBatch(IRemoteFile[] folderOrFiles, IProgressMonitor monitor) throws SystemMessageException - { - - String[] parents = new String[folderOrFiles.length]; - String[] names = new String[folderOrFiles.length]; - for (int i = 0; i < folderOrFiles.length; i++) - { - parents[i] = folderOrFiles[i].getParentPath(); - names[i] = folderOrFiles[i].getName(); - folderOrFiles[i].markStale(true); - //bug 162962: need to recursively remove children from cache - removeCachedRemoteFile(folderOrFiles[i]); - } - IFileService service = getFileService(); - service.deleteBatch(parents, names, monitor); - } - - /** - * {@inheritDoc} - * @since 3.0 returns void - */ - public void rename(IRemoteFile folderOrFile, String newName, IProgressMonitor monitor) throws SystemMessageException - { - removeCachedRemoteFile(folderOrFile); - IFileService service = getFileService(); - String srcParent = folderOrFile.getParentPath(); - String oldName = folderOrFile.getName(); - String newPath = srcParent + folderOrFile.getSeparator() + newName; - service.rename(srcParent, oldName, newName, monitor); - folderOrFile.getHostFile().renameTo(newPath); - } - - /** - * {@inheritDoc} - * @since 3.0 returns void - */ - public void move(IRemoteFile sourceFolderOrFile, IRemoteFile targetFolder, String newName, IProgressMonitor monitor) throws SystemMessageException - { - IFileService service = getFileService(); - String srcParent = sourceFolderOrFile.getParentPath(); - String srcName = sourceFolderOrFile.getName(); - String tgtParent = targetFolder.getAbsolutePath(); - removeCachedRemoteFile(sourceFolderOrFile); - try { - service.move(srcParent, srcName, tgtParent, newName, monitor); - } finally { - sourceFolderOrFile.markStale(true); - targetFolder.markStale(true); - } - } - - /** - * {@inheritDoc} - * @since 3.0 returns void - */ - public void setLastModified(IRemoteFile folderOrFile, long newDate, IProgressMonitor monitor) throws SystemMessageException - { - String name = folderOrFile.getName(); - String parent = folderOrFile.getParentPath(); - //mark stale regardless of whether the call succeeds or not - folderOrFile.markStale(true); - _hostFileService.setLastModified(parent, name, newDate, monitor); - } - - /** - * {@inheritDoc} - * @since 3.0 returns void - */ - public void setReadOnly(IRemoteFile folderOrFile, boolean readOnly, IProgressMonitor monitor) throws SystemMessageException - { - String name = folderOrFile.getName(); - String parent = folderOrFile.getParentPath(); - //mark stale regardless of whether the call succeeds or not - folderOrFile.markStale(true); - _hostFileService.setReadOnly(parent, name, readOnly, monitor); - } - - public ILanguageUtilityFactory getLanguageUtilityFactory() - { - if (_languageUtilityFactory == null) - { - _languageUtilityFactory = ((IFileServiceSubSystemConfiguration)getParentRemoteFileSubSystemConfiguration()).getLanguageUtilityFactory(this); - } - return _languageUtilityFactory; - } - - public void setLanguageUtilityFactory(ILanguageUtilityFactory factory) - { - _languageUtilityFactory = factory; - } - - public void search(IHostSearchResultConfiguration searchConfig) - { - ISearchService searchService = getSearchService(); - if (searchService != null) - { - SearchJob job = new SearchJob(searchConfig, searchService, getFileService()); - job.schedule(); - } - } - - /** - * {@inheritDoc} - * @see IRemoteFileSubSystem#cancelSearch(IHostSearchResultConfiguration) - */ - public void cancelSearch(IHostSearchResultConfiguration searchConfig) - { - ISearchService searchService = getSearchService(); - if (searchService != null) - { - searchService.cancelSearch(searchConfig, null); - } - } - - public IHostSearchResultConfiguration createSearchConfiguration(IHostSearchResultSet resultSet, Object searchTarget, SystemSearchString searchString) - { - ISearchService searchService = getSearchService(); - if (searchService != null) - { - IFileServiceSubSystemConfiguration factory = (IFileServiceSubSystemConfiguration)getParentRemoteFileSubSystemConfiguration(); - if (factory != null) - { - return factory.createSearchConfiguration(getHost(), resultSet, searchTarget, searchString); - } - } - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.rse.core.subsystems.SubSystem#canSwitchTo(org.eclipse.rse.core.subsystems.ISubSystemConfiguration) - * Overriding the super implementation to return true for any configuration that implements IFileServiceSubSystemConfiguration - */ - public boolean canSwitchTo(ISubSystemConfiguration configuration) { - return (configuration instanceof IFileServiceSubSystemConfiguration); - } - - /* (non-Javadoc) - * @see org.eclipse.rse.core.subsystems.SubSystem#internalSwitchServiceSubSystemConfiguration(org.eclipse.rse.core.subsystems.ISubSystemConfiguration) - * Overriding the super implementation to do switch the file subsystem bits that need to be copied or initialized in a switch - */ - protected void internalSwitchSubSystemConfiguration(ISubSystemConfiguration newConfig) { - if (newConfig instanceof IFileServiceSubSystemConfiguration) { - IHost host = getHost(); - IFileServiceSubSystemConfiguration config = (IFileServiceSubSystemConfiguration) newConfig; - // file subsystem specific bits - _cachedRemoteFiles.clear(); - _languageUtilityFactory = null; - setFileService(config.getFileService(host)); - setHostFileToRemoteFileAdapter(config.getHostFileAdapter()); - setSearchService(config.getSearchService(host)); - } - } - - public Class getServiceType() - { - return IFileService.class; - } - - public void initializeSubSystem(IProgressMonitor monitor) - { - super.initializeSubSystem(monitor); - getFileService().initService(monitor); - } - - public void uninitializeSubSystem(IProgressMonitor monitor) - { - getFileService().uninitService(monitor); - _userHome = null; - super.uninitializeSubSystem(monitor); - } - - /** - * Returns the encoding from the file service being used by this subsystem. - * @see RemoteFileSubSystem#getRemoteEncoding() - */ - public String getRemoteEncoding() { - - try { - - IHost host = getHost(); - - // get the encoding from the host that was not set by the remote system - String encoding = host.getDefaultEncoding(false); - - // get the encoding from the host that was set by querying a remote system - // this allows us to pick up the host encoding that may have been set by another subsystem - if (encoding == null) { - encoding = getFileService().getEncoding(null); - - if (encoding != null) { - host.setDefaultEncoding(encoding, true); - } - } - - if (encoding != null) { - return encoding; - } - else { - return super.getRemoteEncoding(); - } - } - catch (SystemMessageException e) { - SystemBasePlugin.logMessage(e.getSystemMessage()); - } - - return super.getRemoteEncoding(); - } - - /** - * {@inheritDoc} Defers to the file service. The method is basically another - * way to do download. - * - * @see org.eclipse.rse.subsystems.files.core.subsystems.RemoteFileSubSystem#getInputStream(java.lang.String, - * java.lang.String, boolean, - * org.eclipse.core.runtime.IProgressMonitor) - */ - public InputStream getInputStream(String remoteParent, String remoteFile, boolean isBinary, IProgressMonitor monitor) throws SystemMessageException { - return new FileSubSystemInputStream(getFileService().getInputStream(remoteParent, remoteFile, isBinary, monitor), remoteParent, remoteFile, this); - } - - /** - * {@inheritDoc} - * @deprecated Use - * {@link #getOutputStream(String, String, int, IProgressMonitor)} - * instead - */ - public OutputStream getOutputStream(String remoteParent, String remoteFile, boolean isBinary, IProgressMonitor monitor) throws SystemMessageException { - return new FileSubSystemOutputStream(getFileService().getOutputStream(remoteParent, remoteFile, isBinary, monitor), remoteParent, remoteFile, this); - } - - /** - * {@inheritDoc} - * @since 3.0 uses int options argument - */ - public OutputStream getOutputStream(String remoteParent, String remoteFile, int options, IProgressMonitor monitor) throws SystemMessageException { - return new FileSubSystemOutputStream(getFileService().getOutputStream(remoteParent, remoteFile, options, monitor), remoteParent, remoteFile, this); - } - - /** - * {@inheritDoc} Defers to the file service. - * @since 3.0 - */ - public boolean supportsEncodingConversion(){ - return getFileService().supportsEncodingConversion(); - } - -}
\ No newline at end of file |