1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-29 20:05:35 +02:00

[218304] Improve deferred adapter loading

This commit is contained in:
Martin Oberhuber 2008-04-10 15:32:51 +00:00
parent bd3364cf4c
commit dc383c52f3
21 changed files with 1280 additions and 1134 deletions

View file

@ -1,15 +1,16 @@
/*******************************************************************************
* Copyright (c) 2006, 2008 Wind River Systems, Inc.
* 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
*
* Contributors:
* Martin Oberhuber (Wind River) - initial API and implementation
* 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
*
* Contributors:
* Martin Oberhuber (Wind River) - initial API and implementation
* David Dykstal (IBM) - [217556] remove service subsystem types
* 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
* David McKnight (IBM) - [220547] [api][breaking] SimpleSystemMessage needs to specify a message id and some messages should be shared
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
*******************************************************************************/
package org.eclipse.rse.examples.daytime.subsystems;
@ -43,8 +44,8 @@ import org.eclipse.rse.ui.model.ISystemRegistryUI;
*/
public class DaytimeSubSystem extends SubSystem {
private IDaytimeService fDaytimeService;
private IDaytimeService fDaytimeService;
public DaytimeSubSystem(IHost host, IConnectorService connectorService, IDaytimeService daytimeService) {
super(host, connectorService);
fDaytimeService = daytimeService;
@ -52,8 +53,9 @@ public class DaytimeSubSystem extends SubSystem {
public void initializeSubSystem(IProgressMonitor monitor) {
//This is called after connect - expand the daytime node.
//May be called in worker thread.
//TODO find a more elegant solution for expanding the item, e.g. use implicit connect like filters
// Always called in worker thread.
super.initializeSubSystem(monitor);
//TODO find a more elegant solution for expanding the item, e.g. use implicit connect like filters
final ISystemRegistryUI sr = RSEUIPlugin.getTheSystemRegistryUI();
final SystemResourceChangeEvent event = new SystemResourceChangeEvent(this, ISystemResourceChangeEvents.EVENT_SELECT_EXPAND, null);
//TODO bug 150919: postEvent() should not be necessary asynchronously
@ -62,15 +64,15 @@ public class DaytimeSubSystem extends SubSystem {
public void run() { sr.postEvent(event); }
});
}
public boolean hasChildren() {
return isConnected();
}
public IDaytimeService getDaytimeService() {
return fDaytimeService;
}
public Object[] getChildren() {
if (isConnected()) {
try {
@ -90,7 +92,7 @@ public class DaytimeSubSystem extends SubSystem {
}
public void uninitializeSubSystem(IProgressMonitor monitor) {
//nothing to do
super.uninitializeSubSystem(monitor);
}
public Class getServiceType() {
@ -99,7 +101,7 @@ public class DaytimeSubSystem extends SubSystem {
public void switchServiceFactory(ISubSystemConfiguration factory) {
// not applicable here
}
}

View file

@ -1,17 +1,18 @@
/********************************************************************************
* Copyright (c) 2006, 2007 IBM Corporation and others. All rights reserved.
* 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
* 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,
* 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) - Adapted original tutorial code to Open RSE.
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package samples.subsystems;
@ -35,7 +36,7 @@ public class DeveloperSubSystem extends SubSystem
{
private TeamResource[] teams; // faked-out master list of teams
private Vector devVector = new Vector(); // faked-out master list of developers
private static int employeeId = 123456; // employee Id factory
private static int employeeId = 123456; // employee Id factory
/**
* @param host
@ -45,23 +46,28 @@ public class DeveloperSubSystem extends SubSystem
super(host, connectorService);
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#initializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
/*
* (non-Javadoc)
* @see SubSystem#initializeSubSystem(IProgressMonitor)
*/
public void initializeSubSystem(IProgressMonitor monitor) {
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.ISubSystem#uninitializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
*/
public void uninitializeSubSystem(IProgressMonitor monitor) {
super.initializeSubSystem(monitor);
}
/*
* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#getObjectWithAbsoluteName(java.lang.String)
* @see ISubSystem#uninitializeSubSystem(IProgressMonitor)
*/
public Object getObjectWithAbsoluteName(String key) throws Exception
public void uninitializeSubSystem(IProgressMonitor monitor) {
super.uninitializeSubSystem(monitor);
}
/*
* (non-Javadoc)
*
* @see SubSystem#getObjectWithAbsoluteName(String, IProgressMonitor)
*/
public Object getObjectWithAbsoluteName(String key, IProgressMonitor monitor) throws Exception
{
// Functional opposite of getAbsoluteName(Object) in our resource adapters
if (key.startsWith("Team_")) //$NON-NLS-1$
@ -78,10 +84,10 @@ public class DeveloperSubSystem extends SubSystem
DeveloperResource[] devrs = getAllDevelopers();
for (int idx=0; idx<devrs.length; idx++)
if (devrs[idx].getId().equals(devrId))
return devrs[idx];
return devrs[idx];
}
// Not a remote object: fall back to return filter reference
return super.getObjectWithAbsoluteName(key);
return super.getObjectWithAbsoluteName(key, monitor);
}
/**
@ -93,15 +99,15 @@ public class DeveloperSubSystem extends SubSystem
*/
protected Object[] internalResolveFilterString(String filterString, IProgressMonitor monitor)
throws java.lang.reflect.InvocationTargetException,
java.lang.InterruptedException
java.lang.InterruptedException
{
int slashIdx = filterString.indexOf('/');
if (slashIdx < 0)
{
// Fake it out for now and return dummy list.
// Fake it out for now and return dummy list.
// In reality, this would communicate with remote server-side code/data.
TeamResource[] allTeams = getAllTeams();
// Now, subset master list, based on filter string...
NamePatternMatcher subsetter = new NamePatternMatcher(filterString);
Vector v = new Vector();
@ -109,7 +115,7 @@ public class DeveloperSubSystem extends SubSystem
{
if (subsetter.matches(allTeams[idx].getName()))
v.addElement(allTeams[idx]);
}
}
TeamResource[] teams = new TeamResource[v.size()];
for (int idx=0; idx<v.size(); idx++)
teams[idx] = (TeamResource)v.elementAt(idx);
@ -134,11 +140,11 @@ public class DeveloperSubSystem extends SubSystem
{
if (subsetter.matches(allDevrs[idx].getName()))
v.addElement(allDevrs[idx]);
}
}
DeveloperResource[] devrs = new DeveloperResource[v.size()];
for (int idx=0; idx<v.size(); idx++)
devrs[idx] = (DeveloperResource)v.elementAt(idx);
return devrs;
return devrs;
}
}
return null;
@ -156,31 +162,31 @@ public class DeveloperSubSystem extends SubSystem
throws java.lang.reflect.InvocationTargetException,
java.lang.InterruptedException
{
// typically we ignore the filter string as it is always "*"
// typically we ignore the filter string as it is always "*"
// until support is added for "quick filters" the user can specify/select
// at the time they expand a remote resource.
TeamResource team = (TeamResource)parent;
return team.getDevelopers();
}
// ------------------
// ------------------
// Our own methods...
// ------------------
/**
* Get the list of all teams. Normally this would involve a trip the server, but we
* fake it out and return a hard-coded local list.
* Get the list of all teams. Normally this would involve a trip the server, but we
* fake it out and return a hard-coded local list.
* @return array of all teams
*/
public TeamResource[] getAllTeams()
{
if (teams == null)
if (teams == null)
teams = createTeams("Team ", 4);
return teams;
return teams;
}
/**
* Get the list of all developers. Normally this would involve a trip the server, but we
* fake it out and return a hard-coded local list.
* Get the list of all developers. Normally this would involve a trip the server, but we
* fake it out and return a hard-coded local list.
* @return array of all developers
*/
public DeveloperResource[] getAllDevelopers()
@ -188,7 +194,7 @@ public class DeveloperSubSystem extends SubSystem
DeveloperResource[] allDevrs = new DeveloperResource[devVector.size()];
for (int idx=0; idx<allDevrs.length; idx++)
allDevrs[idx] = (DeveloperResource)devVector.elementAt(idx);
return allDevrs;
return allDevrs;
}
/*
* Create and return a dummy set of teams

View file

@ -3,13 +3,13 @@
* 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) - [182454] improve getAbsoluteName() documentation
* Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API
@ -19,6 +19,7 @@
* David Dykstal (IBM) - [217556] remove service subsystem types
* Martin Oberhuber (Wind River) - [cleanup] Add API "since" Javadoc tags
* David Dykstal (IBM) - [225089][ssh][shells][api] Canceling connection leads to exception
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.core.subsystems;
@ -40,14 +41,14 @@ import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
/**
* Interface implemented by SubSystem objects.
*
*
* While connections contain information to identify a particular remote system,
* it is the subsystem objects within a connection that contain information
* unique to a particular tool for that remote system, such as the port the tool
* uses and the user ID for making the connection. There are a set of default
* properties, but these can be extended by subsystem providers, by extending
* SubSystem.
*
*
* @noimplement This interface is not intended to be implemented by clients.
* Clients must extend the abstract <code>SubSystem</code> class
* instead.
@ -73,7 +74,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
/**
* Set the connector service for this subsystem
*
*
* @param connectorService connector service object to set
*/
public void setConnectorService(IConnectorService connectorService);
@ -90,14 +91,25 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
public IHost getHost();
/**
* Called on each subsystem associated with a particular {@link IConnectorService} after it connects.
* @param monitor A progress monitor supporting progress reporting and cancellation.
* Called on each subsystem associated with a particular
* {@link IConnectorService} after it connects successfully. This call is
* always made on a background Thread, so it's allowed to be long-running.
*
* @param monitor a progress monitor that can be used to show progress
* during long-running operation. Cancellation is typically not
* supported since it might leave the system in an inconsistent
* state.
*/
public void initializeSubSystem(IProgressMonitor monitor);
/**
* Called on each subsystem associated with a particular {@link IConnectorService} after it disconnects
* @param monitor A progress monitor supporting progress reporting and cancellation.
* Called on each subsystem associated with a particular
* {@link IConnectorService} after it disconnects
*
* @param monitor a progress monitor that can be used to show progress
* during long-running operation. Cancellation is typically not
* supported since it might leave the system in an inconsistent
* state.
*/
public void uninitializeSubSystem(IProgressMonitor monitor);
@ -142,14 +154,14 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
/**
* Check if the subsystem is connected, and connect if it's not.
*
*
* This is a convenience method which first checks whether the subsystem is
* already connected. If not, it automatically checks if it's running on the
* dispatch thread or not, and calls the right <code>connect()</code>
* method as appropriate. It also performs some exception parsing,
* converting Exceptions from connect() into SystemMessageException that can
* be displayed to the user by using a method in it.
*
*
* @throws SystemMessageException in case of an error connecting
* @since org.eclipse.rse.core 3.0
*/
@ -352,7 +364,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
* Return the CacheManager for this subsystem. If the SubSystem returns true for
* supportsCaching() then it must return a valid CacheManager, otherwise it is free
* to return null.
*
*
* @see #supportsCaching()
*/
public ICacheManager getCacheManager();
@ -381,15 +393,15 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
/**
* Synchronously connect to the remote system.
*
*
* Clients are expected to call this method on a background
* thread with an existing progress monitor. A signon prompt
* may optionally be forced even if the password is cached
* in memory or on disk.
*
*
* The framework will take care of switching to the UI thread
* for requesting a password from the user if necessary.
*
*
* @param monitor the progress monitor. Must not be <code>null</code>.
* @param forcePrompt forces the prompt dialog to be displayed
* even if the password is currently in memory.
@ -411,7 +423,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
* <p/>
* Override internalConnect if you want, but by default it calls
* <code>getConnectorService().connect(IProgressMonitor)</code>.
*
*
* @param forcePrompt forces the prompt dialog even if the password is in mem
* @param callback to call after connect is complete.
* May be <code>null</code>.
@ -530,7 +542,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
* @param key Identifies property to set
* @param value Value to set property to
* @return Object interpretable by subsystem. Might be a Boolean, or the might be new value for confirmation.
*
*
* @deprecated this shouldn't be used
*/
public Object setProperty(Object subject, String key, String value) throws Exception;
@ -542,7 +554,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
* @param subject Identifies which object to get the properties of
* @param key Identifies property to get value of
* @return String The value of the requested key.
*
*
* @deprecated this shouldn't be used
*/
public String getProperty(Object subject, String key) throws Exception;
@ -555,7 +567,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
* @param keys Identifies the properties to set
* @param values Values to set properties to. One to one mapping to keys by index number
* @return Object interpretable by subsystem. Might be a Boolean, or the might be new values for confirmation.
*
*
* @deprecated this shouldn't be used
*/
public Object setProperties(Object subject, String[] keys, String[] values) throws Exception;
@ -567,7 +579,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
* @param subject Identifies which object to get the properties of
* @param keys Identifies properties to get value of
* @return The values of the requested keys.
*
*
* @deprecated this shouldn't be used
*/
public String[] getProperties(Object subject, String[] keys) throws Exception;
@ -622,7 +634,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
/**
* Returns the interface type (i.e. a Class object that is an Interface) of
* a service subsystem.
*
*
* @return the service interface on which this service subsystem is
* implemented. If this subsystem is not a service subsystem it must
* return <code>null</code>.
@ -638,7 +650,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
* {@link #canSwitchTo(ISubSystemConfiguration)}. If the configuration is
* not compatible with this subsystem then this must do nothing and must
* answer false to {@link #canSwitchTo(ISubSystemConfiguration)}.
*
*
* @param configuration the configuration to which to switch.
* @since org.eclipse.rse.core 3.0
*/
@ -647,7 +659,7 @@ public interface ISubSystem extends ISystemFilterPoolReferenceManagerProvider, I
/**
* Determine is this subsystem is compatible with this specified
* configuration.
*
*
* @param configuration the configuration which may be switched to
* @return true if the subsystem can switch to this configuration, false
* otherwise. Subsystems which are not service subsystems must

View file

@ -15,13 +15,12 @@
* Martin Oberhuber (Wind River) - [180519][api] declaratively register adapter factories
* Martin Oberhuber (wind River) - [203105] Decouple recursive plugin activation of UI adapters
* 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) - [218304] Improve deferred adapter loading
*******************************************************************************/
package org.eclipse.rse.internal.subsystems.files.core;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.rse.subsystems.files.core.subsystems.RemoteFileEmpty;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
@ -47,20 +46,6 @@ public class Activator extends AbstractUIPlugin {
*/
public void start(BundleContext context) throws Exception {
super.start(context);
// make sure that required adapters factories are loaded
//(will typically activate org.eclipse.rse.files.ui)
//TODO Check that this does not fire up the UI if we want to be headless
//Decouple from the current Thread
new Thread("files.ui adapter loader") { //$NON-NLS-1$
public void run() {
Platform.getAdapterManager().loadAdapter(new RemoteFileEmpty(), "org.eclipse.rse.ui.view.ISystemViewElementAdapter"); //$NON-NLS-1$
}
}.start();
// Others (RemoteSearchResultSet, RemoteSearchResult,
// RemoteFileSystemConfigurationAdapter will be available
// automatically once the plugin is loaded
}
/**

View file

@ -7,10 +7,10 @@
*
* 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,
* 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()
@ -25,15 +25,16 @@
* 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
* 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
* 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
*******************************************************************************/
package org.eclipse.rse.subsystems.files.core.servicesubsystem;
@ -84,16 +85,16 @@ 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
* behavior should be done by providing a custom {@link IFileService} implementation
* wherever possible.
*/
public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileServiceSubSystem
public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileServiceSubSystem
{
protected ILanguageUtilityFactory _languageUtilityFactory;
protected IFileService _hostFileService;
protected ISearchService _hostSearchService;
@ -105,16 +106,16 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
_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);
@ -124,27 +125,27 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
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;
@ -154,43 +155,43 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
_hostFileToRemoteFileAdapter = hostFileAdapter;
}
/**
* Constructs an IRemoteFile object given
* an unqualified file or folder name and its parent folder object.
* 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
public IRemoteFile getRemoteFileObject(IRemoteFile parent, String folderOrFileName, IProgressMonitor monitor) throws SystemMessageException
{
// 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())
if (file != null && !file.isStale())
{
return file;
}
IHostFile node = getFile(parent.getAbsolutePath(), folderOrFileName, monitor);
return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), parent, node);
}
/**
* Constructs and returns an IRemoteFile object given a fully-qualified
* 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
public IRemoteFile getRemoteFileObject(String folderOrFileName, IProgressMonitor monitor) throws SystemMessageException
{
String fofName = folderOrFileName;
@ -202,19 +203,19 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
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$
if (fofName.equals("/")) //$NON-NLS-1$
{
try
{
@ -222,18 +223,18 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
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,
// 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,
IStatus.ERROR,
CommonMessages.MSG_ERROR_UNEXPECTED);
throw new SystemMessageException(msg);
}
@ -260,22 +261,22 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
return null;
}
int lastSep = fofName.lastIndexOf(sep);
if (lastSep > -1)
{
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())
if (!node.isRoot())
{
//parent = getRemoteFileObject(parentPath);
}
@ -304,7 +305,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
* @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()
protected IRemoteFile getUserHome()
{
if (_userHome != null)
{
@ -319,7 +320,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
if (userHome == null) {
return null;
}
IRemoteFile parent = null;
if (!userHome.getParentPath().equals(".")) //$NON-NLS-1$
{
@ -328,7 +329,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
//parent = getRemoteFileObject(userHome.getParentPath());
}
catch (Exception e)
{
{
}
}
root = getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), parent, userHome);
@ -340,53 +341,53 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
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
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;
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)
{
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();
IHostFile[] nodes = getFileService().getFileMultiple(parentPaths, names, monitor);
return getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, null, nodes);
return getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, null, nodes);
}
@ -405,26 +406,26 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
parentPaths[i] = parents[i].getAbsolutePath();
}
IHostFile[] results = getFileService().listMultiple(parentPaths, fileNameFilters, fileTypes, monitor);
RemoteFileContext context = getDefaultContext();
IRemoteFile[] farr = getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, null, results);
// caching
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);
@ -433,7 +434,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
if (underParent.size() > 0)
{
parent.setContents(RemoteChildrenContentsType.getInstance(), filter, underParent.toArray());
}
}
}
return farr;
@ -455,26 +456,26 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
parentPaths[i] = parents[i].getAbsolutePath();
}
IHostFile[] results = getFileService().listMultiple(parentPaths, fileNameFilters, fileType, monitor);
RemoteFileContext context = getDefaultContext();
IRemoteFile[] farr = getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, null, results);
// caching
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);
@ -483,18 +484,18 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
if (underParent.size() > 0)
{
parent.setContents(RemoteChildrenContentsType.getInstance(), filter, underParent.toArray());
}
}
}
return farr;
}
/**
* Return a list of remote folders and/or files in the given folder.
* Return a list of remote folders and/or files in the given folder.
* <p>
* The files part of the list is filtered by the given file name filter.
* It can be null for no filtering.
* 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.
@ -507,20 +508,20 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
String parentPath = null;
if (parent != null) {
parentPath = parent.getAbsolutePath();
} else {
} 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,
SystemMessage msg = new SimpleSystemMessage(Activator.PLUGIN_ID,
ISystemFileMessageIds.MSG_FOLDER_UNREADABLE,
IStatus.INFO, msgTxt);
throw new SystemMessageException(msg);
}
IHostFile[] results = internalList(parentPath, fileNameFilter, fileType, monitor);
IHostFile[] results = internalList(parentPath, fileNameFilter, fileType, monitor);
IRemoteFile[] farr = getHostFileToRemoteFileAdapter().convertToRemoteFiles(this, context, parent, results);
if (parent != null)
@ -529,8 +530,8 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
public IRemoteFile[] listRoots(IRemoteFileContext context, IProgressMonitor monitor) throws InterruptedException
public IRemoteFile[] listRoots(IRemoteFileContext context, IProgressMonitor monitor) throws InterruptedException
{
IHostFile[] roots = null;
try
@ -539,18 +540,18 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
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);
return RemoteFileUtility.getSystemFileTransferModeRegistry().isBinary(remotePath);
}
protected boolean isBinary(IRemoteFile source)
{
return source.isBinary(); // always use preferences (whether xml or not)
@ -573,18 +574,18 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
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
public void upload(String source, IRemoteFile destination, String encoding, IProgressMonitor monitor) throws SystemMessageException
{
String remoteParentPath = destination.getParentPath();
String remoteFileName = destination.getName();
@ -595,29 +596,29 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
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,
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));
}
public void uploadMultiple(String[] sources, String[] srcEncodings,
String[] remotePaths, String[] rmtEncodings,
IProgressMonitor monitor) throws SystemMessageException
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++)
{
@ -636,16 +637,16 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
}
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();
@ -659,43 +660,43 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
public void uploadMultiple(String[] sources, IRemoteFile[] destinations,
String[] encodings, IProgressMonitor monitor)
throws SystemMessageException
{
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,
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();
@ -711,7 +712,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
* (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
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) {
@ -719,7 +720,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
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())
@ -734,22 +735,22 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
}
public void downloadMultiple(IRemoteFile[] sources, String[] destinations,
String[] encodings, IProgressMonitor monitor)
throws SystemMessageException
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];
@ -758,7 +759,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
isBinaries[i] = isBinary(file);
localFiles[i] = new File(destinations[i]);
}
getFileService().downloadMultiple(parentPaths, names, localFiles, isBinaries, encodings, monitor);
if (monitor.isCanceled())
{
@ -772,31 +773,31 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
// 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));
}
}
}
}
/*
* (non-Javadoc)
* @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem#copy(org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile, org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
*/
public boolean copy(IRemoteFile sourceFolderOrFile, IRemoteFile targetFolder, String newName, IProgressMonitor monitor) throws SystemMessageException
public boolean copy(IRemoteFile sourceFolderOrFile, IRemoteFile targetFolder, String newName, IProgressMonitor monitor) throws SystemMessageException
{
IFileService service = getFileService();
return service.copy(sourceFolderOrFile.getParentPath(), sourceFolderOrFile.getName(), targetFolder.getAbsolutePath(), newName, monitor);
}
public boolean copyBatch(IRemoteFile[] sourceFolderOrFiles, IRemoteFile targetFolder, IProgressMonitor monitor) throws SystemMessageException
public boolean 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();
@ -805,7 +806,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
return service.copyBatch(sourceParents, sourceNames, targetFolder.getAbsolutePath(), monitor);
}
public IRemoteFile getParentFolder(IRemoteFile folderOrFile, IProgressMonitor monitor)
public IRemoteFile getParentFolder(IRemoteFile folderOrFile, IProgressMonitor monitor)
{
try
{
@ -817,7 +818,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
}
public IRemoteFile createFile(IRemoteFile fileToCreate, IProgressMonitor monitor) throws SystemMessageException
public IRemoteFile createFile(IRemoteFile fileToCreate, IProgressMonitor monitor) throws SystemMessageException
{
IFileService service = getFileService();
String parent = fileToCreate.getParentPath();
@ -826,7 +827,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), fileToCreate.getParentRemoteFile(), newFile);
}
public IRemoteFile createFolder(IRemoteFile folderToCreate, IProgressMonitor monitor) throws SystemMessageException
public IRemoteFile createFolder(IRemoteFile folderToCreate, IProgressMonitor monitor) throws SystemMessageException
{
IFileService service = getFileService();
String parent = folderToCreate.getParentPath();
@ -835,12 +836,12 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
return getHostFileToRemoteFileAdapter().convertToRemoteFile(this, getDefaultContext(), folderToCreate.getParentRemoteFile(), newFolder);
}
public IRemoteFile createFolders(IRemoteFile folderToCreate, IProgressMonitor monitor) throws SystemMessageException
public IRemoteFile createFolders(IRemoteFile folderToCreate, IProgressMonitor monitor) throws SystemMessageException
{
return createFolder(folderToCreate, monitor);
}
public boolean delete(IRemoteFile folderOrFile, IProgressMonitor monitor) throws SystemMessageException
public boolean delete(IRemoteFile folderOrFile, IProgressMonitor monitor) throws SystemMessageException
{
IFileService service = getFileService();
String parent = folderOrFile.getParentPath();
@ -849,10 +850,10 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
folderOrFile.markStale(true);
return result;
}
public boolean deleteBatch(IRemoteFile[] folderOrFiles, IProgressMonitor monitor) throws SystemMessageException
public boolean 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++)
@ -867,7 +868,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
return service.deleteBatch(parents, names, monitor);
}
public boolean rename(IRemoteFile folderOrFile, String newName, IProgressMonitor monitor) throws SystemMessageException
public boolean rename(IRemoteFile folderOrFile, String newName, IProgressMonitor monitor) throws SystemMessageException
{
removeCachedRemoteFile(folderOrFile);
IFileService service = getFileService();
@ -878,8 +879,8 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
folderOrFile.getHostFile().renameTo(newPath);
return result;
}
public boolean move(IRemoteFile sourceFolderOrFile, IRemoteFile targetFolder, String newName, IProgressMonitor monitor) throws SystemMessageException
public boolean move(IRemoteFile sourceFolderOrFile, IRemoteFile targetFolder, String newName, IProgressMonitor monitor) throws SystemMessageException
{
IFileService service = getFileService();
String srcParent = sourceFolderOrFile.getParentPath();
@ -892,21 +893,21 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
return result;
}
public boolean setLastModified(IRemoteFile folderOrFile, long newDate, IProgressMonitor monitor) throws SystemMessageException
public boolean setLastModified(IRemoteFile folderOrFile, long newDate, IProgressMonitor monitor) throws SystemMessageException
{
String name = folderOrFile.getName();
String parent = folderOrFile.getParentPath();
return _hostFileService.setLastModified(parent, name, newDate, monitor);
}
public boolean setReadOnly(IRemoteFile folderOrFile, boolean readOnly, IProgressMonitor monitor) throws SystemMessageException
public boolean setReadOnly(IRemoteFile folderOrFile, boolean readOnly, IProgressMonitor monitor) throws SystemMessageException
{
String name = folderOrFile.getName();
String parent = folderOrFile.getParentPath();
return _hostFileService.setReadOnly(parent, name, readOnly, monitor);
}
public ILanguageUtilityFactory getLanguageUtilityFactory()
public ILanguageUtilityFactory getLanguageUtilityFactory()
{
if (_languageUtilityFactory == null)
{
@ -914,13 +915,13 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
return _languageUtilityFactory;
}
public void setLanguageUtilityFactory(ILanguageUtilityFactory factory)
{
_languageUtilityFactory = factory;
}
public void search(IHostSearchResultConfiguration searchConfig)
public void search(IHostSearchResultConfiguration searchConfig)
{
ISearchService searchService = getSearchService();
if (searchService != null)
@ -930,7 +931,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
}
}
public void cancelSearch(IHostSearchResultConfiguration searchConfig)
public void cancelSearch(IHostSearchResultConfiguration searchConfig)
{
ISearchService searchService = getSearchService();
if (searchService != null)
@ -938,7 +939,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
searchService.cancelSearch(searchConfig, null);
}
}
public IHostSearchResultConfiguration createSearchConfiguration(IHostSearchResultSet resultSet, Object searchTarget, SystemSearchString searchString)
{
ISearchService searchService = getSearchService();
@ -946,7 +947,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
IFileServiceSubSystemConfiguration factory = (IFileServiceSubSystemConfiguration)getParentRemoteFileSubSystemConfiguration();
if (factory != null)
{
{
return factory.createSearchConfiguration(getHost(), resultSet, searchTarget, searchString);
}
}
@ -982,7 +983,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
{
return IFileService.class;
}
public void initializeSubSystem(IProgressMonitor monitor)
{
super.initializeSubSystem(monitor);
@ -991,9 +992,9 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
public void uninitializeSubSystem(IProgressMonitor monitor)
{
super.uninitializeSubSystem(monitor);
getFileService().uninitService(monitor);
_userHome = null;
super.uninitializeSubSystem(monitor);
}
/**
@ -1003,22 +1004,22 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
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;
}
@ -1029,7 +1030,7 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
catch (SystemMessageException e) {
SystemBasePlugin.logMessage(e.getSystemMessage());
}
return super.getRemoteEncoding();
}
@ -1046,18 +1047,18 @@ public class FileServiceSubSystem extends RemoteFileSubSystem implements IFileSe
* @see org.eclipse.rse.subsystems.files.core.subsystems.RemoteFileSubSystem#getOutputStream(java.lang.String, java.lang.String, boolean, org.eclipse.core.runtime.IProgressMonitor)
*/
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);
return new FileSubSystemOutputStream(getFileService().getOutputStream(remoteParent, remoteFile, isBinary, monitor), remoteParent, remoteFile, this);
}
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);
return new FileSubSystemOutputStream(getFileService().getOutputStream(remoteParent, remoteFile, options, monitor), remoteParent, remoteFile, this);
}
/**
* Defers to the file service.
*/
public boolean supportsEncodingConversion(){
return getFileService().supportsEncodingConversion();
}
}

View file

@ -7,16 +7,16 @@
*
* 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,
* 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 162962 - recursive removeCachedRemoteFile()
* Martin Oberhuber (Wind River) - [168975] Move RSE Events API to Core
* Martin Oberhuber (Wind River) - [182454] improve getAbsoluteName() documentation
* Martin Oberhuber (Wind River) - [183824] Forward SystemMessageException from IRemoteFileSubsystem
* Martin Oberhuber (Wind River) - [186128][refactoring] Move IProgressMonitor last in public base classes
* Martin Oberhuber (Wind River) - [186128][refactoring] Move IProgressMonitor last in public base classes
* Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry
* David McKnight (IBM) - [196664] prevent unnecessary query on the parent
* Rupen Mardirossian (IBM) - [204307] listFolders now deals with a null parameter for fileNameFilter preventing NPE
@ -25,6 +25,7 @@
* David McKnight (IBM) - [211472] [api][breaking] IRemoteObjectResolver.getObjectWithAbsoluteName() needs a progress monitor
* 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
* David McKnight (IBM) - [220547] [api][breaking] SimpleSystemMessage needs to specify a message id and some messages should be shared
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
*******************************************************************************/
package org.eclipse.rse.subsystems.files.core.subsystems;
@ -49,6 +50,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.osgi.util.NLS;
import org.eclipse.rse.core.filters.ISystemFilter;
import org.eclipse.rse.core.filters.ISystemFilterReference;
@ -87,7 +89,7 @@ import org.eclipse.ui.dialogs.PropertyPage;
/**
* Specialization for file subsystem factories.
* It is subclassed via use of a Rose model and MOF/EMF, or better yet
* It is subclassed via use of a Rose model and MOF/EMF, or better yet
* by subclassing {@link FileServiceSubSystem}.
* <p>
* For your convenience, there is built-in name filtering support. To use it,
@ -96,7 +98,7 @@ import org.eclipse.ui.dialogs.PropertyPage;
* <li>{@link #setListValues(int, String)} or {@link #setListValues(int, String, String)} to set the filter criteria
* <li>{@link #accept(String, boolean)} to test a given name for a match
* </ul>
*
*
* <p>This class returns instances of {@link RemoteFile} objects.
*/
@ -115,10 +117,10 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
protected RemoteFileContext DEFAULT_CONTEXT_NOFILTERSTRING = null;
protected ArrayList _searchHistory;
// all created IRemoteFiles mapped in cache to quick retrieval
protected HashMap _cachedRemoteFiles = new HashMap();
/**
* Default constructor. Do not call directly! Rather, use the mof generated factory method to create.
* After instantiation, be sure to call {@link #setSubSystemConfiguration(ISubSystemConfiguration)}.
@ -136,7 +138,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
{
return true;
}
/**
* Return parent subsystem factory, cast to a RemoteFileSubSystemConfiguration
* Assumes {@link #setSubSystemConfiguration(ISubSystemConfiguration)} has already been called.
@ -192,7 +194,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
// --------------------------------
// FILE SYSTEM ATTRIBUTE METHODS...
// --------------------------------
// --------------------------------
/**
* Return in string format the character used to separate folders. Eg, "\" or "/".
* <br>
@ -206,7 +208,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
* Return in character format the character used to separate folders. Eg, "\" or "/"
* <br>
* Shortcut to {@link #getParentRemoteFileSubSystemConfiguration()}.getSeparatorChar()
*/
*/
public char getSeparatorChar()
{
return getParentRemoteFileSubSystemConfiguration().getSeparatorChar();
@ -215,7 +217,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
* Return in string format the character used to separate paths. Eg, ";" or ":"
* <br>
* Shortcut to {@link #getParentRemoteFileSubSystemConfiguration()}.getPathSeparator()
*/
*/
public String getPathSeparator()
{
return getParentRemoteFileSubSystemConfiguration().getPathSeparator();
@ -224,7 +226,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
* Return in char format the character used to separate paths. Eg, ";" or ":"
* <br>
* Shortcut to {@link #getParentRemoteFileSubSystemConfiguration()}.getPathSeparatorChar()
*/
*/
public char getPathSeparatorChar()
{
return getParentRemoteFileSubSystemConfiguration().getPathSeparatorChar();
@ -237,15 +239,15 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
public String getLineSeparator()
{
return getParentRemoteFileSubSystemConfiguration().getLineSeparator();
}
}
// -------------------------------------
// GUI methods
// GUI methods
// -------------------------------------
/**
* Return the single property page to show in the tabbed notebook for the
* for SubSystem property of the parent Connection. Return null if no
* for SubSystem property of the parent Connection. Return null if no
* page is to be contributed for this. You are limited to a single page,
* so you may have to compress. It is recommended you prompt for the port
* if applicable since the common base subsystem property page is not shown
@ -259,28 +261,28 @@ 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("*")) { //$NON-NLS-1$
IPath path = new Path(remoteObjectAbsoluteName);
if (path.segmentCount() == 0) {
return true;
}
@ -296,12 +298,12 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
}
}
}
return would;
}
/**
* Return true if the given remote object name will pass the filtering criteria for
* Return true if the given remote object name will pass the filtering criteria for
* the given filter string.
* <p>
* Subclasses need to override this.
@ -328,24 +330,24 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
String container = rffs.getPath();
if (container == null)
return false;
if (container.equals(".")) //$NON-NLS-1$
{
try
try
{
container = getRemoteFileObject(container, new NullProgressMonitor()).getAbsolutePath();
}
catch (Exception e)
{
}
//return true;
//return true;
}
// DKM - if the filter and the remote object are the same
if (container.equals(remoteObjectAbsoluteName))
return true;
// trick: use filter string code to parse remote absolute name
RemoteFileFilterString rmtName = new RemoteFileFilterString(getParentRemoteFileSubSystemConfiguration(), remoteObjectAbsoluteName);
boolean pathMatch = false;
@ -376,7 +378,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
/**
* 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
* lists the contents of that folder. Used in impact analysis when a remote object is
* lists the contents of that folder. Used in impact analysis when a remote object is
* created, deleted, renamed, copied or moved, so as to establish which filters need to be
* refreshed or collapsed (if the folder is deleted, say).
* <p>
@ -389,11 +391,11 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
{
RemoteFileFilterString rffs = new RemoteFileFilterString(getParentRemoteFileSubSystemConfiguration(), filterString.getString());
String container = rffs.getPath();
if (container == null)
return false;
boolean affected = false;
String remoteObjectContainer = remoteObjectAbsoluteName;
int lastSep = remoteObjectAbsoluteName.lastIndexOf(getSeparator());
if (lastSep != -1)
@ -410,7 +412,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
// "Univ Filter String Testing '" + container + "' versus '" + remoteObjectAbsoluteName + "' => " + affected);
return affected;
}
// -------------------------------
@ -434,15 +436,15 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
throws java.lang.reflect.InvocationTargetException,
java.lang.InterruptedException
{
if (!isConnected()) {
return null;
}
Object[] children = null;
Vector vChildren = new Vector();
Vector vMessages = new Vector();
boolean oneSuccess = false;
boolean success = false;
if (filterStrings == null)
@ -451,27 +453,27 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
System.out.println("connection == "+getHostAliasName()); //$NON-NLS-1$
return null;
}
// TODO - change this to use listMulti to be more efficient
for (int idx=0; idx<filterStrings.length; idx++)
{
{
if (monitor != null)
{
monitor.setTaskName(getResolvingMessage(filterStrings[idx]));
}
children = internalResolveFilterString(filterStrings[idx], monitor);
if (!(children != null && children.length == 1 && children[0] instanceof SystemMessageObject)) {
success = true;
// one has been successful
oneSuccess = true;
}
else {
success = false;
}
// if successful, then add to list
if (children != null && success) {
addResolvedFilterStringObjects(vChildren, children, filterStrings, idx);
@ -481,28 +483,28 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
super.addResolvedFilterStringObjects(vMessages, children, filterStrings, idx);
}
}
if (oneSuccess) {
int nbrChildren = vChildren.size();
children = new Object[nbrChildren];
for (int idx=0; idx<nbrChildren; idx++)
children[idx] = vChildren.elementAt(idx);
}
else {
int nbrMessages = vMessages.size();
children = new Object[nbrMessages];
for (int idx=0; idx<nbrMessages; idx++)
children[idx] = vMessages.elementAt(idx);
children[idx] = vMessages.elementAt(idx);
}
return children;
}
/**
* Overridable parent extension point for adding the results of a filter string
* to the overall list of results.
* to the overall list of results.
* <p>
* Can be used to filter out redundant entries in the concatenated list, if this
* is desired.
@ -591,7 +593,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
}
}
private String fixFilterString(IRemoteFileSubSystemConfiguration rfssf, String filterString)
{
boolean windows = !rfssf.isUnixStyle();
@ -604,10 +606,10 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
else
filterString = filterString.substring(1);
}
return filterString;
}
/**
* Actually resolve an absolute filter string. This is called by the
* run(IProgressMonitor monitor) method, which in turn is called by resolveFilterString.
@ -617,7 +619,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
{
IRemoteFileSubSystemConfiguration rfssf = getParentRemoteFileSubSystemConfiguration();
filterString = fixFilterString(rfssf, filterString);
RemoteFileFilterString fs = new RemoteFileFilterString(rfssf, filterString);
currFilterString = fs;
@ -629,11 +631,11 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
boolean showFiles = fs.getShowFiles();
String path = fs.getPath();
boolean windows = !rfssf.isUnixStyle();
if (windows && (path != null) && !path.endsWith(rfssf.getSeparator()))
path = path + rfssf.getSeparatorChar();
String filter = fs.getFileOrTypes();
String filter = fs.getFileOrTypes();
IRemoteFile parent = null;
try
{
@ -643,9 +645,9 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
{
SystemBasePlugin.logError("RemoteFileSubSystemImpl.logError()", e); //$NON-NLS-1$
}
boolean parentExists = true;
if (parent != null) {
parentExists = parent.exists();
}
@ -660,20 +662,20 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
boolean hasFolderContents = !parent.isStale() && parent.hasContents(RemoteFolderChildrenContentsType.getInstance(), filter);
boolean hasFileAndFolderContents = !parent.isStale() && parent.hasContents(RemoteChildrenContentsType.getInstance(), filter);
if (showDirs && showFiles)
{
if (hasFileAndFolderContents)
{
if (hasFileAndFolderContents)
{
// has everything
}
else if (hasFileContents)
{
// already have the files, now add the folders
list(parent, filter, IFileService.FILE_TYPE_FOLDERS, monitor);
list(parent, filter, IFileService.FILE_TYPE_FOLDERS, monitor);
}
else if (hasFolderContents)
{
// already have the folders, now add the files
list(parent, filter, IFileService.FILE_TYPE_FILES, monitor);
list(parent, filter, IFileService.FILE_TYPE_FILES, monitor);
}
else
{
@ -709,7 +711,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
else if (parent != null && !parentExists) {
children = new SystemMessageObject[1];
String msgTxt = NLS.bind(SystemFileResources.FILEMSG_FILE_NOTFOUND, parent.getAbsolutePath());
SystemMessage msg = new SimpleSystemMessage(Activator.PLUGIN_ID,
SystemMessage msg = new SimpleSystemMessage(Activator.PLUGIN_ID,
ISystemFileMessageIds.FILEMSG_FILE_NOTFOUND,
IStatus.ERROR, msgTxt);
children[0] = new SystemMessageObject(msg, ISystemMessageObject.MSGTYPE_ERROR, null);
@ -822,7 +824,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
}
return internalResolveOneFilterString(parent, fs, true, monitor);
}
catch (SystemMessageException e)
{
SystemMessageObject[] children = new SystemMessageObject[1];
@ -843,7 +845,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
//String path = fs.getPath();
//String filter = fs.getFile();
//System.out.println("...path='"+path+"', filter='"+filter+"', showDirs="+showDirs+", showFiles="+showFiles);
//System.out.println("...toStringNoSwitches='"+filterString+"'");
//System.out.println("...toStringNoSwitches='"+filterString+"'");
Object[] children = null;
if (parent != null)
{
@ -875,7 +877,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
return listRoots(getDefaultContext(), monitor);
}
/**
* 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
@ -889,10 +891,10 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
{
fileNameFilters[i] = "*"; // default filter //$NON-NLS-1$
}
return listMultiple(parents, fileNameFilters, fileTypes, monitor);
}
/**
* 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
@ -906,10 +908,10 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
{
fileNameFilters[i] = "*"; // default filter //$NON-NLS-1$
}
return listMultiple(parents, fileNameFilters, fileType, monitor);
}
/**
* 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
@ -919,7 +921,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
{
return list(parent, IFileService.FILE_TYPE_FILES_AND_FOLDERS, monitor);
}
/**
* 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
@ -932,10 +934,10 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
}
/**
* Return a list of remote folders and files in the given folder.
* Return a list of remote folders and files in the given folder.
* <p>
* The files part of the list is subsetted by the given file name filter. It can be null for no subsetting.
*
*
* @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 the type of file
@ -952,7 +954,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
RemoteFileContext context = new RemoteFileContext(this, parent, filterString);
return list(parent, fileNameFilter, context, fileType, monitor);
}
/**
@ -968,29 +970,29 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
* @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem#getRemoteSearchResultObject(java.lang.String)
*/
public IRemoteSearchResult getRemoteSearchResultObject(String key) throws SystemMessageException {
int idx = key.indexOf(IHostSearchResult.SEARCH_RESULT_DELIMITER);
if (idx != -1) {
String remoteFilePath = key.substring(0, idx);
IRemoteFile remoteFile = getRemoteFileObject(remoteFilePath, new NullProgressMonitor());
if (remoteFile != null) {
int jdx = idx + IHostSearchResult.SEARCH_RESULT_DELIMITER.length() + IHostSearchResult.SEARCH_RESULT_OPEN_DELIMITER.length();
int kdx = key.indexOf(IHostSearchResult.SEARCH_RESULT_INDEX_DELIMITER, jdx);
String searchString = key.substring(jdx, kdx);
Object[] children = remoteFile.getContents(RemoteSearchResultsContentsType.getInstance(), searchString);
if (children != null) {
int ldx = key.indexOf(IHostSearchResult.SEARCH_RESULT_CLOSE_DELIMITER, kdx+1);
int index = Integer.valueOf(key.substring(kdx+1, ldx)).intValue();
if (children.length > index) {
IRemoteSearchResult result = (IRemoteSearchResult)(children[index]);
return result;
@ -1010,8 +1012,8 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
else {
return null;
}
}
}
/**
* <b>Overrideable</b> Override this method to provide optimized implementation
* Given a set of fully qualified file or folder names, return an ISystemResourceSet object for it.
@ -1027,30 +1029,17 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
}
return results;
}
/**
* Return the object within the subsystem that corresponds to
* the specified unique ID.
* Return the object within the subsystem that corresponds to the specified
* unique ID.
*
* For remote files, assuming the key is the absolute path of
* a file, this is simply a wrapper to getRemoteFileObject().
*
* @see SubSystem#getObjectWithAbsoluteName(String)
* @param monitor the progress monitor
* @param key the unique id of the remote object.
* Must not be <code>null</code>.
* @return the remote object instance, or <code>null</code> if no
* object is found with the given id.
* @throws Exception in case an error occurs contacting the remote
* system while retrieving the requested remote object.
* Extenders are encouraged to throw {@link SystemMessageException}
* in order to support good user feedback in case of errors.
* Since exceptions should only occur while retrieving new
* remote objects during startup, clients are typically allowed
* to ignore these exceptions and treat them as if the remote
* object were simply not there.
* For remote files, assuming the key is the absolute path of a file, this
* is simply a wrapper to getRemoteFileObject().
*
* @see SubSystem#getObjectWithAbsoluteName(String, IProgressMonitor)
*/
public Object getObjectWithAbsoluteName(String key, IProgressMonitor monitor) throws Exception
{
@ -1062,9 +1051,9 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
// look to see if there is a search result delimiter
// if not, the key must be for a file
if (key.lastIndexOf(IHostSearchResult.SEARCH_RESULT_DELIMITER) < 0) {
IRemoteFile remoteFile = getRemoteFileObject(key, monitor);
if (remoteFile != null) {
return remoteFile;
}
@ -1084,12 +1073,12 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
@ -1236,18 +1225,22 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
{
}
return rc;
} // end runCmd method
} // end runCmd method
public void initializeSubSystem(IProgressMonitor monitor)
{
super.initializeSubSystem(monitor);
// load UI plugin for adapters right after successful connect
Platform.getAdapterManager().loadAdapter(new RemoteFileEmpty(), "org.eclipse.rse.ui.view.ISystemViewElementAdapter"); //$NON-NLS-1$
getConnectorService().addCommunicationsListener(this);
}
public void uninitializeSubSystem(IProgressMonitor monitor)
{
getConnectorService().removeCommunicationsListener(this);
super.uninitializeSubSystem(monitor);
}
/**
* Store the IRemoteFile in a hashmap to quick subsequent retrieval
* @param file the file
@ -1264,7 +1257,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
_cachedRemoteFiles.put(path, file);
return;
}
// replace file under parent
if (oldFile instanceof RemoteFile) {
RemoteFile roldFile = (RemoteFile)oldFile;
@ -1276,11 +1269,11 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
else if (oldFile != null && oldFile.getParentRemoteFile() != null) {
oldFile.getParentRemoteFile().replaceContent(oldFile, file);
}
// preserve persistent information from old file to new
if (oldFile != null)
oldFile.copyContentsTo(file);
}
_cachedRemoteFiles.put(path, file);
}
@ -1306,7 +1299,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
{
if (_cachedRemoteFiles.size() > 0)
{
path = path.replaceAll("//", "/"); //$NON-NLS-1$ //$NON-NLS-2$
path = path.replaceAll("//", "/"); //$NON-NLS-1$ //$NON-NLS-2$
if (path.endsWith("\\") || (path.endsWith("/") && path.length() > 1)) //$NON-NLS-1$ //$NON-NLS-2$
{
path = path.substring(0, path.length() - 1);
@ -1314,12 +1307,12 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
if (_cachedRemoteFiles.containsKey(path))
{
{return (IRemoteFile)_cachedRemoteFiles.get(path);}
}
}
}
return null;
}
protected void removeCachedRemoteFile(IRemoteFile file)
{
if (file != null)
@ -1353,24 +1346,24 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
_cachedRemoteFiles.remove(file.getAbsolutePath());
}
}
protected void removeCachedRemoteFile(String path)
{
_cachedRemoteFiles.remove(path);
}
public void communicationsStateChange(CommunicationsEvent e)
{
switch (e.getState())
{
case CommunicationsEvent.AFTER_DISCONNECT :
case CommunicationsEvent.AFTER_DISCONNECT :
_cachedRemoteFiles.clear();
// DKM - taking this out because it causes an exception when the event occurs in Modal Context
//ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
//ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
//sr.connectedStatusChange(this, false, true, true);
getConnectorService().removeCommunicationsListener(this);
break;
case CommunicationsEvent.BEFORE_DISCONNECT :
@ -1380,7 +1373,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
break;
}
}
/**
* @see ICommunicationsListener#isPassiveCommunicationsListener()
*/
@ -1393,11 +1386,11 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
* Returns -1 by default. Subclasses should override if necessary.
* @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem#getUnusedPort()
*/
public int getUnusedPort()
public int getUnusedPort()
{
return -1;
}
/**
* Returns the address found by calling <code>InetAddress.getLocalHost()</code>. If that
* call returns the local loopback address, it returns <code>null</code>.
@ -1407,49 +1400,49 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
* @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem#getLocalAddress()
*/
public InetAddress getLocalAddress() {
InetAddress addr = null;
try {
addr = InetAddress.getLocalHost();
}
catch (UnknownHostException e) {
SystemBasePlugin.logError("Error occured trying to get local host address", e); //$NON-NLS-1$
}
// if the address is the loopback address
// if the address is the loopback address
if (addr != null && addr.isLoopbackAddress()) {
return null;
}
return addr;
}
public Object getTargetForFilter(ISystemFilterReference filterRef)
{
String firstFilterString = filterRef.getReferencedFilter().getFilterStrings()[0];
RemoteFileFilterString fs = new RemoteFileFilterString(getParentRemoteFileSubSystemConfiguration(), firstFilterString);
String firstFilterString = filterRef.getReferencedFilter().getFilterStrings()[0];
RemoteFileFilterString fs = new RemoteFileFilterString(getParentRemoteFileSubSystemConfiguration(), firstFilterString);
try
{
// change target to be referenced remote folder
return getRemoteFileObject(fs.getPath(), new NullProgressMonitor());
}
catch (Exception e)
{
{
}
return null;
}
/**
* @deprecated
*/
public void cancelSearch(IHostSearchResultConfiguration searchConfig)
{
// TODO Auto-generated method stub
}
/**
* Returns <code>true</code> by default. Subclasses should override if they do not support encodings.
* @see org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem#supportsEncoding()
@ -1458,7 +1451,7 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
public boolean supportsEncoding() {
return true;
}
/**
* Returns the local platform encoding if the default encoding of the host was not set.
* Subclasses should override to return the actual remote encoding.
@ -1466,16 +1459,16 @@ public abstract class RemoteFileSubSystem extends SubSystem implements IRemoteFi
*/
public String getRemoteEncoding() {
IHost host = getHost();
// get the encoding from the host that was not 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 = host.getDefaultEncoding(true);
}
if (encoding != null) {
return encoding;
}

View file

@ -1,5 +1,5 @@
/********************************************************************************
* Copyright (c) 2006, 2007 IBM Corporation and others. All rights reserved.
* 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
@ -13,13 +13,12 @@
* Contributors:
* Martin Oberhuber (Wind River) - [180519][api] declaratively register rse.processes.ui adapter factories
* Martin Oberhuber (wind River) - [203105] Decouple recursive plugin activation of UI adapters
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.internal.subsystems.processes.core;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.rse.subsystems.processes.core.subsystem.impl.RemoteProcessImpl;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
@ -41,18 +40,6 @@ public class Activator extends AbstractUIPlugin {
public void start(BundleContext context) throws Exception
{
super.start(context);
// make sure that required adapters factories are loaded
//(will typically activate org.eclipse.rse.processes.ui)
//TODO Check that this does not fire up the UI if we want to be headless
//Decouple from the current Thread
new Thread("processes.ui adapter loader") { //$NON-NLS-1$
public void run() {
Platform.getAdapterManager().loadAdapter(new RemoteProcessImpl(null,null),
"org.eclipse.rse.ui.view.ISystemViewElementAdapter"); //$NON-NLS-1$
}
}.start();
//others will be loaded automatically when the processes.ui plugin is activated
}
/**

View file

@ -1,18 +1,19 @@
/********************************************************************************
* Copyright (c) 2006, 2007 IBM Corporation and others. All rights reserved.
* Copyright (c) 2006, 2008s 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
* 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,
* 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) - [182454] improve getAbsoluteName() documentation
* Martin Oberhuber (Wind River) - [186128][refactoring] Move IProgressMonitor last in public base classes
* Martin Oberhuber (Wind River) - [186128][refactoring] Move IProgressMonitor last in public base classes
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.subsystems.processes.core.subsystem.impl;
@ -20,6 +21,7 @@ package org.eclipse.rse.subsystems.processes.core.subsystem.impl;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.core.subsystems.CommunicationsEvent;
import org.eclipse.rse.core.subsystems.ICommunicationsListener;
@ -35,7 +37,7 @@ import org.eclipse.rse.ui.SystemBasePlugin;
/**
* Default implementation of the IRemoteProcessSubSystem interface.
* <p>
* <p>
* Some of the methods are simply convenience methods - these are
* implemented here, whereas the real work takes place in the
* ProcessServiceSubSystem.
@ -44,12 +46,12 @@ import org.eclipse.rse.ui.SystemBasePlugin;
public abstract class RemoteProcessSubSystemImpl extends SubSystem implements
IRemoteProcessSubSystem, ICommunicationsListener
{
public RemoteProcessSubSystemImpl(IHost host, IConnectorService connectorService)
{
super(host, connectorService);
}
/* (non-Javadoc)
* @see org.eclipse.rse.subsystems.processes.core.subsystem.IRemoteProcessSubSystem#getParentRemoteProcessSubSystemConfiguration()
*/
@ -65,7 +67,7 @@ public abstract class RemoteProcessSubSystemImpl extends SubSystem implements
{
return true;
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.ICommunicationsListener#communicationsStateChange(org.eclipse.rse.core.subsystems.CommunicationsEvent)
*/
@ -75,9 +77,9 @@ public abstract class RemoteProcessSubSystemImpl extends SubSystem implements
{
case CommunicationsEvent.BEFORE_CONNECT :
break;
case CommunicationsEvent.AFTER_DISCONNECT :
case CommunicationsEvent.AFTER_DISCONNECT :
getConnectorService().removeCommunicationsListener(this);
break;
case CommunicationsEvent.BEFORE_DISCONNECT :
@ -87,23 +89,27 @@ public abstract class RemoteProcessSubSystemImpl extends SubSystem implements
break;
}
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#initializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
*/
public void initializeSubSystem(IProgressMonitor monitor)
{
getConnectorService().addCommunicationsListener(this);
super.initializeSubSystem(monitor);
// load UI plugin for adapters right after successful connect
Platform.getAdapterManager().loadAdapter(new RemoteProcessImpl(null, null), "org.eclipse.rse.ui.view.ISystemViewElementAdapter"); //$NON-NLS-1$
getConnectorService().addCommunicationsListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#uninitializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
*/
public void uninitializeSubSystem(IProgressMonitor monitor)
{
getConnectorService().removeCommunicationsListener(this);
getConnectorService().removeCommunicationsListener(this);
super.uninitializeSubSystem(monitor);
}
/* (non-Javadoc)
* @see org.eclipse.rse.subsystems.processes.core.subsystem.IRemoteProcessSubSystem#getParentProcess(org.eclipse.rse.subsystems.processes.core.subsystem.IRemoteProcess)
*/
@ -111,7 +117,7 @@ public abstract class RemoteProcessSubSystemImpl extends SubSystem implements
{
return process.getParentRemoteProcess();
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#internalResolveFilterString(org.eclipse.core.runtime.IProgressMonitor, java.lang.String)
*/
@ -122,7 +128,7 @@ public abstract class RemoteProcessSubSystemImpl extends SubSystem implements
if (!isConnected()) {
return null;
}
HostProcessFilterImpl rpf = new HostProcessFilterImpl(filterString);
IRemoteProcessContext context = new RemoteProcessContext(this, null, rpf);
IRemoteProcess[] ps = null;
@ -134,9 +140,9 @@ public abstract class RemoteProcessSubSystemImpl extends SubSystem implements
{
displayAsyncMsg(e);
}
return ps;
return ps;
}
/**
* At this point there is only one root process, the 'init' process with pid 1
*/
@ -161,11 +167,12 @@ public abstract class RemoteProcessSubSystemImpl extends SubSystem implements
{
return true;
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#getObjectWithAbsoluteName(java.lang.String)
/*
* (non-Javadoc)
* @see SubSystem#getObjectWithAbsoluteName(String, IProgressMonitor)
*/
public Object getObjectWithAbsoluteName(String key) throws Exception
public Object getObjectWithAbsoluteName(String key, IProgressMonitor monitor) throws Exception
{
try
{
@ -174,7 +181,7 @@ public abstract class RemoteProcessSubSystemImpl extends SubSystem implements
}
catch (NumberFormatException e)
{
return super.getObjectWithAbsoluteName(key);
return super.getObjectWithAbsoluteName(key, monitor);
}
}
}

View file

@ -1,21 +1,22 @@
/********************************************************************************
* 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
* 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,
* 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) - [182454] improve getAbsoluteName() documentation
* Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API
* David Dykstal (IBM) - [197036] refactored switch configuration
* David Dykstal (IBM) - [217556] remove service subsystem types
* David McKnight (IBM) - [220524] internalSwitchServiceSubSystemConfiguration -> internalSwitchSubSystemConfiguration
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.subsystems.processes.servicesubsystem;
@ -40,18 +41,18 @@ import org.eclipse.rse.subsystems.processes.core.subsystem.impl.RemoteProcessSub
* The subsystem that, coupled with a ProcessService implementation,
* can query and kill remote processes on a remote system.
*/
public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implements IProcessServiceSubSystem
public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implements IProcessServiceSubSystem
{
protected IProcessService _hostProcessService;
protected IHostProcessToRemoteProcessAdapter _hostProcessToRemoteProcessAdapter;
public ProcessServiceSubSystem(IHost host, IConnectorService connectorService, IProcessService hostProcessService, IHostProcessToRemoteProcessAdapter adapter)
{
super(host, connectorService);
_hostProcessService = hostProcessService;
_hostProcessToRemoteProcessAdapter = adapter;
}
/**
* @return the process service associated with this subsystem.
*/
@ -68,7 +69,7 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen
{
_hostProcessService = service;
}
/**
* @return the associated adapter for converting IHostProcess objects to IRemoteProcess objects
*/
@ -76,7 +77,7 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen
{
return _hostProcessToRemoteProcessAdapter;
}
/**
* Sets the associated adapter for converting IHostProcess objects to IRemoteProcess objects
*/
@ -90,7 +91,7 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen
* certain pid.
* @param pid The pid of the process to return
*/
public IRemoteProcess getRemoteProcessObject(long pid) throws SystemMessageException
public IRemoteProcess getRemoteProcessObject(long pid) throws SystemMessageException
{
checkIsConnected(new NullProgressMonitor());
HostProcessFilterImpl rpfs = new HostProcessFilterImpl();
@ -103,7 +104,7 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen
/* (non-Javadoc)
* @see org.eclipse.rse.subsystems.processes.core.subsystem.impl.RemoteProcessSubSystemImpl#getSignalTypes()
*/
public String[] getSignalTypes() throws SystemMessageException
public String[] getSignalTypes() throws SystemMessageException
{
return getProcessService().getSignalTypes();
}
@ -111,7 +112,7 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen
/* (non-Javadoc)
* @see org.eclipse.rse.subsystems.processes.core.subsystem.impl.RemoteProcessSubSystemImpl#kill(org.eclipse.rse.subsystems.processes.core.subsystem.IRemoteProcess, java.lang.String)
*/
public boolean kill(IRemoteProcess process, String signal) throws SystemMessageException
public boolean kill(IRemoteProcess process, String signal) throws SystemMessageException
{
checkIsConnected(new NullProgressMonitor());
return getProcessService().kill(process.getPid(), signal, null);
@ -120,7 +121,7 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen
/* (non-Javadoc)
* @see org.eclipse.rse.subsystems.processes.core.subsystem.impl.RemoteProcessSubSystemImpl#listAllProcesses(org.eclipse.rse.services.clientserver.processes.IHostProcessFilter, org.eclipse.rse.subsystems.processes.core.subsystem.IRemoteProcessContext)
*/
public IRemoteProcess[] listAllProcesses(IHostProcessFilter processFilter, IRemoteProcessContext context, IProgressMonitor monitor) throws InterruptedException, SystemMessageException
public IRemoteProcess[] listAllProcesses(IHostProcessFilter processFilter, IRemoteProcessContext context, IProgressMonitor monitor) throws InterruptedException, SystemMessageException
{
checkIsConnected(monitor);
IHostProcess[] processes = getProcessService().listAllProcesses(processFilter, monitor);
@ -150,21 +151,21 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#internalSwitchSubSystemConfiguration(org.eclipse.rse.core.subsystems.ISubSystemConfiguration)
*/
protected void internalSwitchSubSystemConfiguration(ISubSystemConfiguration configuration)
protected void internalSwitchSubSystemConfiguration(ISubSystemConfiguration configuration)
{
IProcessServiceSubSystemConfiguration config = (IProcessServiceSubSystemConfiguration) configuration;
IHost host = getHost();
setProcessService(config.getProcessService(host));
setHostProcessToRemoteProcessAdapter(config.getHostProcessAdapter());
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#canSwitchTo(org.eclipse.rse.core.subsystems.ISubSystemConfiguration)
*/
public boolean canSwitchTo(ISubSystemConfiguration configuration) {
return configuration instanceof IProcessServiceSubSystemConfiguration;
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.servicesubsystem.ISubSystem#getServiceType()
*/
@ -172,7 +173,7 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen
{
return IProcessService.class;
}
/* (non-Javadoc)
* @see org.eclipse.rse.subsystems.processes.core.subsystem.impl.RemoteProcessSubSystemImpl#initializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
*/
@ -181,14 +182,14 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen
super.initializeSubSystem(monitor);
getProcessService().initService(monitor);
}
/* (non-Javadoc)
* @see org.eclipse.rse.subsystems.processes.core.subsystem.impl.RemoteProcessSubSystemImpl#initializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
*/
public void uninitializeSubSystem(IProgressMonitor monitor)
{
super.uninitializeSubSystem(monitor);
getProcessService().uninitService(monitor);
super.uninitializeSubSystem(monitor);
}
}

View file

@ -1,5 +1,5 @@
/********************************************************************************
* Copyright (c) 2006, 2007 IBM Corporation and others. All rights reserved.
* 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
@ -13,13 +13,12 @@
* Contributors:
* Martin Oberhuber (Wind River) - [180519] declaratively register rse.shells.ui. adapter factories
* Martin Oberhuber (wind River) - [203105] Decouple recursive plugin activation of UI adapters
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.internal.subsystems.shells.core;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.rse.subsystems.shells.core.model.RemoteOutput;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
@ -43,18 +42,6 @@ public class Activator extends AbstractUIPlugin {
*/
public void start(BundleContext context) throws Exception {
super.start(context);
// make sure that required adapters factories are loaded
//(will typically activate org.eclipse.rse.shells.ui)
//TODO Check that this does not fire up the UI if we want to be headless
//Decouple from the current Thread
new Thread("shells.ui adapter loader") { //$NON-NLS-1$
public void run() {
Platform.getAdapterManager().loadAdapter(new RemoteOutput(null,""), "org.eclipse.rse.ui.view.ISystemViewElementAdapter"); //$NON-NLS-1$ //$NON-NLS-2$
}
}.start();
// Others (IRemoteError, ShellServiceSubSystemConfigurationAdapter
// will be available automatically once the shells.ui plugin is loaded
}
/**

View file

@ -7,17 +7,18 @@
*
* 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,
* 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) - [168975] Move RSE Events API to Core
* Martin Oberhuber (Wind River) - [182454] improve getAbsoluteName() documentation
* Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API
* Martin Oberhuber (Wind River) - [186640] Add IRSESystemType.testProperty()
* Martin Oberhuber (Wind River) - [186640] Add IRSESystemType.testProperty()
* Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry
* 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) - [218304] Improve deferred adapter loading
*******************************************************************************/
package org.eclipse.rse.subsystems.shells.core.subsystems;
@ -30,6 +31,7 @@ import java.util.StringTokenizer;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.osgi.util.NLS;
import org.eclipse.rse.core.RSECorePlugin;
import org.eclipse.rse.core.events.ISystemResourceChangeEvents;
@ -43,6 +45,7 @@ import org.eclipse.rse.core.subsystems.CommunicationsEvent;
import org.eclipse.rse.core.subsystems.ICommunicationsListener;
import org.eclipse.rse.core.subsystems.IConnectorService;
import org.eclipse.rse.core.subsystems.IRemoteSystemEnvVar;
import org.eclipse.rse.core.subsystems.ISubSystem;
import org.eclipse.rse.core.subsystems.SubSystem;
import org.eclipse.rse.internal.subsystems.shells.core.ShellStrings;
import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteSystemEnvVar;
@ -50,6 +53,7 @@ import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
import org.eclipse.rse.subsystems.files.core.model.RemoteFileUtility;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile;
import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
import org.eclipse.rse.subsystems.shells.core.model.RemoteOutput;
import org.eclipse.rse.ui.SystemBasePlugin;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
@ -63,7 +67,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
{
private static String COMMAND_SHELLS_MEMENTO = "commandshells"; //$NON-NLS-1$
private static String ENVIRONMENT_VARS = "EnvironmentVariables"; //$NON-NLS-1$
protected ArrayList _cmdShells;
protected IRemoteCommandShell _defaultShell;
@ -76,6 +80,12 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
_cmdShells = new ArrayList();
}
public void initializeSubSystem(IProgressMonitor monitor) {
super.initializeSubSystem(monitor);
// load UI plugin for adapters right after successful connect
Platform.getAdapterManager().loadAdapter(new RemoteOutput(null, ""), "org.eclipse.rse.ui.view.ISystemViewElementAdapter"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Return parent subsystem factory, cast to a RemoteCmdSubSystemConfiguration
*/
@ -87,7 +97,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Long running list processing calls this method to check for a user-cancel
* event. If user did cancel, an exception is thrown.
*
*
* @return true if caller wants to cancel
*/
public boolean checkForCancel(IProgressMonitor monitor)
@ -95,7 +105,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
if ((monitor != null) && monitor.isCanceled())
{
String msgTxt = NLS.bind(ShellStrings.MSG_CONNECT_FAILED, getHostName());
throw new OperationCanceledException(msgTxt);
}
return false;
@ -207,7 +217,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
}
/**
*
*
*/
protected String[] getEnvVarsAsStringArray() {
IPropertySet environmentVariables = getEnvironmentVariables();
@ -303,9 +313,8 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Lists the possible commands for the given context
*
* @param context
* the context for a command
*
* @param context the context for a command
* @return the list of possible commands
*/
public ICandidateCommand[] getCandidateCommands(Object context)
@ -362,7 +371,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
* This default implementation just returns "=" (the only invalid character
* is the = sign.) Subclasses can override this to provide a more
* comprehensive list.
*
*
* @see org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCmdSubSystem#getInvalidEnvironmentVariableNameCharacters()
*/
public String getInvalidEnvironmentVariableNameCharacters()
@ -388,7 +397,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
* Actually resolve an absolute filter string. This is called by the
* run(IProgressMonitor monitor) method, which in turn is called by
* resolveFilterString.
*
*
* @see org.eclipse.rse.core.subsystems.SubSystem#internalResolveFilterString(String,IProgressMonitor)
*/
protected Object[] internalResolveFilterString(String filterString, IProgressMonitor monitor)
@ -413,7 +422,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Get the default running command shell for this command subsystem. If no
* such shell exists or is running, a new one is launched.
*
*
* @return the default running command shell
*/
public IRemoteCommandShell getDefaultShell() throws Exception
@ -432,7 +441,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Get all command shells and transient commands that have been run or are
* running for this command subsystem.
*
*
* @return the list of running command shells and commands
*/
public IRemoteCommandShell[] getShells()
@ -447,7 +456,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Determine whether the command subsystem can run a shell
*
*
* @return whether a shell can be run or not
*/
public boolean canRunShell()
@ -457,7 +466,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Determine whether the command subsystem can run a command
*
*
* @return whether a command can be run or not
*/
public boolean canRunCommand()
@ -466,25 +475,13 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
}
/**
* Return the object within the subsystem that corresponds to the
* specified unique ID.
* For remote command, the key is determined by the command ID
* and the ouput ID.
*
* @param key the unique id of the remote object.
* Must not be <code>null</code>.
* @return the remote object instance, or <code>null</code> if no
* object is found with the given id.
* @throws Exception in case an error occurs contacting the remote
* system while retrieving the requested remote object.
* Extenders are encouraged to throw {@link SystemMessageException}
* in order to support good user feedback in case of errors.
* Since exceptions should only occur while retrieving new
* remote objects during startup, clients are typically allowed
* to ignore these exceptions and treat them as if the remote
* object were simply not there.
* Return the object within the subsystem that corresponds to the specified
* unique ID. For remote command, the key is determined by the command ID
* and the output ID.
*
* @see ISubSystem#getObjectWithAbsoluteName(String, IProgressMonitor)
*/
public Object getObjectWithAbsoluteName(String key) throws Exception
public Object getObjectWithAbsoluteName(String key, IProgressMonitor monitor) throws Exception
{
String cmdKey = key;
String outKey = null;
@ -515,7 +512,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
return theCmd;
}
//fallback to return filter reference or similar
return super.getObjectWithAbsoluteName(key);
return super.getObjectWithAbsoluteName(key, monitor);
}
// called by subsystem on disconnect
@ -585,7 +582,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
{
this.shell = shellWindow;
IRemoteCommandShell[] results = null;
String shellStr = null;
IPropertySet set = getPropertySet("Remote"); //$NON-NLS-1$
if (set != null)
@ -626,7 +623,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
public void cancelAllShells()
{
for (int i = _cmdShells.size() - 1; i >= 0; i--)
{
IRemoteCommandShell cmdShell = (IRemoteCommandShell) _cmdShells.get(i);
@ -650,7 +647,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
Display.getDefault().asyncExec(new Refresh(this));
}
public class Refresh implements Runnable
{
private RemoteCmdSubSystem _ss;
@ -659,7 +656,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
_ss = ss;
}
public void run()
public void run()
{
ISystemRegistry registry = RSECorePlugin.getTheSystemRegistry();
registry.fireEvent(new SystemResourceChangeEvent(_ss, ISystemResourceChangeEvents.EVENT_REFRESH, _ss));
@ -677,14 +674,14 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
_cmdShell = cmdShell;
}
public void run()
public void run()
{
ISystemRegistry registry = RSECorePlugin.getTheSystemRegistry();
registry.fireEvent(new SystemResourceChangeEvent(_cmdShell, ISystemResourceChangeEvents.EVENT_COMMAND_SHELL_REMOVED, null));
registry.fireEvent(new SystemResourceChangeEvent(_ss, ISystemResourceChangeEvents.EVENT_REFRESH, _ss));
}
}
/**
* @see ICommunicationsListener#isPassiveCommunicationsListener()
@ -754,7 +751,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
}
return environmentVariables;
}
public IPropertySet createPropertySet(String name) {
IPropertySet result = null;
if (name.equals(ENVIRONMENT_VARS)) {
@ -768,13 +765,15 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* overridden so that for universal we don't need to do in modal thread
* @deprecated
*
* @deprecated use
* {@link #runCommand(String, Object, boolean, IProgressMonitor)}
*/
public Object[] runCommand(String command, Object context, boolean interpretOutput) throws Exception
{
return internalRunCommand(command, context, interpretOutput, null);
}
/**
* overridden so that for universal we don't need to do in modal thread
*/
@ -785,8 +784,8 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* overridden so that for universal we don't need to do in modal thread
*
* @deprecated
*
* @deprecated use {@link #runShell(Object, IProgressMonitor)}
*/
public IRemoteCommandShell runShell(Object context) throws Exception
{
@ -803,48 +802,49 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
Refresh refreshOnMain = new Refresh(this);
Display.getDefault().asyncExec(refreshOnMain);
return cmdShell;
}
/**
* overridden so that for universal we don't need to do in modal thread
*/
public IRemoteCommandShell runShell(Object context, IProgressMonitor monitor) throws Exception
{
IRemoteCommandShell cmdShell = internalRunShell(context, monitor);
Refresh refreshOnMain = new Refresh(this);
Display.getDefault().asyncExec(refreshOnMain);
return cmdShell;
}
/**
* Execute a remote command. This is only applicable if the subsystem
* factory reports true for supportsCommands().
*
*
* @param command Command to be executed remotely.
* @param context context of a command (i.e. working directory). <code>null</code> is
* valid and means to use the default context.
* @param context context of a command (i.e. working directory).
* <code>null</code> is valid and means to use the default
* context.
* @return Array of objects that are the result of running this command.
* Typically, these are messages logged by the command.
*
* @deprecated
*
* @deprecated use {@link #runCommand(String, Object, IProgressMonitor)}
*/
public Object[] runCommand(String command, Object context) throws Exception
{
return runCommand(command, context, true);
}
/**
* Execute a remote command. This is only applicable if the subsystem
* factory reports true for supportsCommands().
*
*
* @param command Command to be executed remotely.
* @param context context of a command (i.e. working directory). <code>null</code> is
* valid and means to use the default context.
@ -856,8 +856,8 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
return runCommand(command, context, true, monitor);
}
/**
* Send a command as input to a running command shell.
* @param input the command to invoke in the shell.
@ -872,7 +872,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
if (ok)
{
internalSendCommandToShell(input, commandObject, monitor);
}
}
else
SystemBasePlugin.logDebugMessage(this.getClass().getName(),
"in SubSystemImpl.sendCommandToShell: isConnected() returning false!"); //$NON-NLS-1$
@ -880,7 +880,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Cancel a shell or running command.
*
*
* @param commandObject the shell or command to cancel.
*/
public void cancelShell(Object commandObject) throws Exception
@ -914,7 +914,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
"in SubSystemImpl.cancelShell: isConnected() returning false!"); //$NON-NLS-1$
}
}
/**
* Cancel a shell or running command.
* @param commandObject the shell or command to cancel.
@ -925,7 +925,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
boolean ok = true;
if (!isConnected())
ok = promptForPassword();
if (ok)
{
internalCancelShell(commandObject, monitor);
@ -940,7 +940,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Remove and Cancel a shell or running command.
*
*
* @param commandObject the shell or command to cancel.
*/
public void removeShell(Object commandObject) throws Exception
@ -988,14 +988,11 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Creates a new RunCommandJob
*
* @param cmd
* The remote command to run
* @param runContext
* The context in which to run the command
* @param runInterpret
* Whether or not to interpret results of the command as RSE
* objects
*
* @param cmd The remote command to run
* @param runContext The context in which to run the command
* @param runInterpret Whether or not to interpret results of the
* command as RSE objects
*/
public RunCommandJob(String cmd, Object runContext, boolean runInterpret)
{
@ -1032,9 +1029,8 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Creates a new RunShellJob
*
* @param runContext
* the context within which the shell will be ran
*
* @param runContext the context within which the shell will be ran
*/
public RunShellJob(Object runContext)
{
@ -1049,7 +1045,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
int totalWorkUnits = IProgressMonitor.UNKNOWN;
if (!implicitConnect(false, mon, msg, totalWorkUnits)){
String msgTxt = NLS.bind(ShellStrings.MSG_CONNECT_FAILED, getHostName());
throw new Exception(msgTxt);
}
@ -1069,9 +1065,8 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Constructs a new CancelShellJob
*
* @param runContext
* The context for the cancelled shell
*
* @param runContext The context for the cancelled shell
*/
public CancelShellJob(Object runContext)
{
@ -1107,11 +1102,9 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Constructs a new SendCommandToShellJob
*
* @param cmd
* The command to send to the shell
* @param runContext
* The context in which the command is to be run
*
* @param cmd The command to send to the shell
* @param runContext The context in which the command is to be run
*/
public SendCommandToShellJob(String cmd, Object runContext)
{
@ -1130,7 +1123,7 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
if (!implicitConnect(false, mon, msg, totalWorkUnits)){
String msgTxt = NLS.bind(ShellStrings.MSG_CONNECT_FAILED, getHostName());
throw new Exception(msgTxt);
}
internalSendCommandToShell(_cmd, _runContext, mon);
@ -1147,9 +1140,8 @@ public abstract class RemoteCmdSubSystem extends SubSystem implements IRemoteCmd
/**
* Constructs a new RemoveShellJob
*
* @param runContext
* the context for the removed shell
*
* @param runContext the context for the removed shell
*/
public RemoveShellJob(Object runContext)
{

View file

@ -19,6 +19,7 @@
* David Dykstal (IBM) - [217556] remove service subsystem types
* David McKnight (IBM) - [220524] internalSwitchServiceSubSystemConfiguration -> internalSwitchSubSystemConfiguration
* Martin Oberhuber (Wind River) - [226301][api] IShellService should throw SystemMessageException on error
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.subsystems.shells.core.subsystems.servicesubsystem;
@ -240,6 +241,7 @@ public final class ShellServiceSubSystem extends RemoteCmdSubSystem implements I
public void initializeSubSystem(IProgressMonitor monitor)
{
super.initializeSubSystem(monitor);
getShellService().initService(monitor);
}
@ -247,6 +249,7 @@ public final class ShellServiceSubSystem extends RemoteCmdSubSystem implements I
{
cancelAllShells();
getShellService().uninitService(monitor);
super.uninitializeSubSystem(monitor);
}
}

View file

@ -7,16 +7,17 @@
*
* 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,
* 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:
* Tobias Schwarz (Wind River) - [181394] Include Context in getAbsoluteName() for filter and pool references
* Martin Oberhuber (Wind River) - [182454] improve getAbsoluteName() documentation
* Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API
* Martin Oberhuber (Wind River) - [186748] Move ISubSystemConfigurationAdapter from UI/rse.core.subsystems.util
* Xuan Chen (IBM) - [160775] [api] rename (at least within a zip) blocks UI thread
* Xuan Chen (IBM) - [160775] [api] rename (at least within a zip) blocks UI thread
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
*******************************************************************************/
package org.eclipse.rse.internal.ui.view;
@ -53,19 +54,19 @@ import org.eclipse.ui.views.properties.PropertyDescriptor;
* Adapter for displaying SystemFilterPool reference objects in tree views.
* These are children of SubSystem objects
*/
public class SystemViewFilterPoolReferenceAdapter
public class SystemViewFilterPoolReferenceAdapter
extends AbstractSystemViewAdapter
{
protected String translatedType;
//protected Object parent;
// for reset property support
//private String original_userId, original_port;
// -------------------
// property descriptors
// -------------------
private static PropertyDescriptor[] propertyDescriptorArray = null;
private static PropertyDescriptor[] propertyDescriptorArray = null;
/**
* Returns any actions that should be contributed to the popup menu
* for the given subsystem object.
@ -84,43 +85,48 @@ public class SystemViewFilterPoolReferenceAdapter
ISystemFilterPool pool = getFilterPool(element);
ISubSystemConfiguration ssFactory = getSubSystemConfiguration(pool);
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)ssFactory.getAdapter(ISubSystemConfigurationAdapter.class);
IAction[] actions = adapter.getFilterPoolActions(menu, selection, shell, menuGroup, ssFactory, pool);
if (actions != null)
{
for (int idx=0; idx<actions.length; idx++)
{
IAction action = actions[idx];
menu.add(menuGroup, action);
}
}
actions = adapter.getFilterPoolReferenceActions(menu, selection, shell, menuGroup, ssFactory, (ISystemFilterPoolReference)element);
if (actions != null)
{
//menu.addSeparator();
for (int idx=0; idx<actions.length; idx++)
{
IAction action = actions[idx];
menu.add(menuGroup, action);
}
}
if (adapter != null) {
// Lazy Loading: By default, ISubSystemConfigurationAdapter will
// only be available after its declaring bundle has been loaded,
// which usually happens on "connect" of a subsystem. Before that
// time, dynamically contributed actions will not be available.
// Implementations that want their dynamic actions to be avaialble
// earlier need to either declare them by static plugin.xml, or
// provision for more eager loading of the bundle that declares
// their adapter.
IAction[] actions = adapter.getFilterPoolActions(menu, selection, shell, menuGroup, ssFactory, pool);
if (actions != null) {
for (int idx = 0; idx < actions.length; idx++) {
IAction action = actions[idx];
menu.add(menuGroup, action);
}
}
actions = adapter.getFilterPoolReferenceActions(menu, selection, shell, menuGroup, ssFactory, (ISystemFilterPoolReference) element);
if (actions != null) {
// menu.addSeparator();
for (int idx = 0; idx < actions.length; idx++) {
IAction action = actions[idx];
menu.add(menuGroup, action);
}
}
}
}
private ISubSystemConfiguration getSubSystemConfiguration(ISystemFilterPool pool)
{
return SubSystemHelpers.getParentSubSystemConfiguration(pool);
}
/**
* <i>Overridden from parent.</i><br>
* Returns the subsystem that contains this object.
*/
* Returns the subsystem that contains this object.
*/
public ISubSystem getSubSystem(Object element)
{
ISystemFilterPoolReference ref = (ISystemFilterPoolReference)element;
return (ISubSystem)ref.getProvider();
}
/**
* Returns an image descriptor for the image. More efficient than getting the image.
* @param element The element for which an image is desired
@ -132,7 +138,17 @@ public class SystemViewFilterPoolReferenceAdapter
ISystemFilterPoolManagerProvider provider = pool.getProvider();
if (provider != null) {
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter) provider.getAdapter(ISubSystemConfigurationAdapter.class);
poolImage = adapter.getSystemFilterPoolImage(pool);
if (adapter != null) {
// Lazy Loading: Customized filter pool images will only be
// available once the bundle that declares the
// ISubSystemConfigurationAdapter has been activated. Until
// that time, a default image is shown. Clients who want
// their customized images be available earlier need to
// provision for more eager loading of their bundles at the
// right time (e.g. when expanding the SubSystem node,
// rather than when connecting).
poolImage = adapter.getSystemFilterPoolImage(pool);
}
}
}
if (poolImage == null) {
@ -140,7 +156,7 @@ public class SystemViewFilterPoolReferenceAdapter
}
return poolImage;
}
private ISystemFilterPool getFilterPool(Object element)
{
ISystemFilterPoolReference ref = (ISystemFilterPoolReference)element;
@ -161,7 +177,7 @@ public class SystemViewFilterPoolReferenceAdapter
}
return result;
}
/**
* Return the name of this object, which may be different than the display text ({#link #getText(Object)}.
* <p>
@ -171,14 +187,14 @@ public class SystemViewFilterPoolReferenceAdapter
{
return getFilterPool(element).getName();
}
/*
* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.IRemoteObjectIdentifier#getAbsoluteName(java.lang.Object)
*/
public String getAbsoluteName(Object element)
{
//TODO consider caching the absolute name in the FilterPoolReference to avoid unnecessary String operations - the name won't ever change
//TODO consider caching the absolute name in the FilterPoolReference to avoid unnecessary String operations - the name won't ever change
ISystemFilterPoolReference filterPoolRef = (ISystemFilterPoolReference)element;
ISystemFilterPoolReferenceManagerProvider subSystem = filterPoolRef.getProvider();
ISystemViewElementAdapter adapter = SystemAdapterHelpers.getViewAdapter(subSystem);
@ -188,7 +204,7 @@ public class SystemViewFilterPoolReferenceAdapter
String absoluteName = parentAbsoluteName + "." + managerName + "." + referenceName; //$NON-NLS-1$ //$NON-NLS-2$
return absoluteName;
}
/**
* Return the type label for this object
*/
@ -197,8 +213,8 @@ public class SystemViewFilterPoolReferenceAdapter
if (translatedType == null)
translatedType = SystemViewResources.RESID_PROPERTY_FILTERPOOLREFERENCE_TYPE_VALUE;
return translatedType;
}
}
/**
* Return the parent of this object
*/
@ -206,8 +222,8 @@ public class SystemViewFilterPoolReferenceAdapter
{
ISystemFilterPoolReference fpr = (ISystemFilterPoolReference)element;
return SubSystemHelpers.getParentSubSystem(fpr);
}
}
/**
* Return the children of this object.
* For filter pools, this is a list of filters.
@ -218,7 +234,7 @@ public class SystemViewFilterPoolReferenceAdapter
ISubSystem ss = getSubSystem(element);
return fpRef.getSystemFilterReferences(ss);
}
/**
* Return true if this object has children
*/
@ -233,7 +249,7 @@ public class SystemViewFilterPoolReferenceAdapter
}
return count > 0;
}
// Property sheet descriptors defining all the properties we expose in the Property Sheet
/**
* Return our unique property descriptors
@ -253,7 +269,7 @@ public class SystemViewFilterPoolReferenceAdapter
// Related connection
propertyDescriptorArray[++idx] = createSimplePropertyDescriptor(ISystemPropertyConstants.P_RELATED_CONNECTION, SystemViewResources.RESID_PROPERTY_FILTERPOOLREFERENCE_RELATEDCONNECTION_LABEL, SystemViewResources.RESID_PROPERTY_FILTERPOOLREFERENCE_RELATEDCONNECTION_TOOLTIP);
}
}
return propertyDescriptorArray;
}
/**
@ -261,7 +277,7 @@ public class SystemViewFilterPoolReferenceAdapter
*/
protected Object internalGetPropertyValue(Object key)
{
String name = (String)key;
String name = (String)key;
//SystemFilterPoolReference ref = getFilterPoolReference(propertySourceInput);
ISystemFilterPool pool = getFilterPool(propertySourceInput);
if (name.equals(ISystemPropertyConstants.P_PARENT_FILTERPOOL))
@ -269,22 +285,22 @@ public class SystemViewFilterPoolReferenceAdapter
else if (name.equals(ISystemPropertyConstants.P_PROFILE))
return pool.getSystemFilterPoolManager().getName();
else if (name.equals(ISystemPropertyConstants.P_RELATED_CONNECTION))
return (pool.getOwningParentName()==null) ? getTranslatedNotApplicable() : pool.getOwningParentName();
return (pool.getOwningParentName()==null) ? getTranslatedNotApplicable() : pool.getOwningParentName();
else
return null;
}
}
// FOR COMMON DELETE ACTIONS
/**
* Return true if this object is deletable by the user. If so, when selected,
* the Edit->Delete menu item will be enabled.
*/
public boolean canDelete(Object element)
{
ISystemFilterPool fp = getFilterPool(element);
{
ISystemFilterPool fp = getFilterPool(element);
return fp.isDeletable();
}
/**
* Perform the delete action.
* This physically deletes the filter pool and all references.
@ -294,24 +310,24 @@ public class SystemViewFilterPoolReferenceAdapter
ISystemFilterPool fp = getFilterPool(element);
ISystemFilterPoolManager fpMgr = fp.getSystemFilterPoolManager();
fpMgr.deleteSystemFilterPool(fp);
//SubSystemConfiguration ssParentFactory = getSubSystemConfiguration(fp);
//SubSystemConfiguration ssParentFactory = getSubSystemConfiguration(fp);
//ssParentFactory.deleteFilterPool(fp);
return true;
}
// FOR COMMON RENAME ACTIONS
/**
* Return true if this object is renamable by the user. If so, when selected,
* the Rename menu item will be enabled.
*/
public boolean canRename(Object element)
{
{
if (!canDelete(element))
return false;
ISystemFilterPool fp = getFilterPool(element);
return !fp.isNonRenamable();
}
/**
* Perform the rename action. Assumes uniqueness checking was done already.
*/
@ -320,10 +336,10 @@ public class SystemViewFilterPoolReferenceAdapter
ISystemFilterPool fp = getFilterPool(element);
ISystemFilterPoolManager fpMgr = fp.getSystemFilterPoolManager();
fpMgr.renameSystemFilterPool(fp,name);
//SubSystemConfiguration ssParentFactory = getSubSystemConfiguration(fp);
//SubSystemConfiguration ssParentFactory = getSubSystemConfiguration(fp);
//ssParentFactory.renameFilterPool(fp,name);
return true;
}
}
/**
* Return a validator for verifying the new name is correct.
*/
@ -340,7 +356,7 @@ public class SystemViewFilterPoolReferenceAdapter
String[] names = mgr.getSystemFilterPoolNames();
ISystemValidator nameValidator = new ValidatorFilterPoolName(names);
return nameValidator;
}
}
/**
* Parent override.
* <p>
@ -390,7 +406,7 @@ public class SystemViewFilterPoolReferenceAdapter
/**
* This is a local RSE artifact so returning false
*
*
* @param element the object to check
* @return false since this is not remote
*/

View file

@ -7,10 +7,10 @@
*
* 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,
* 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:
* David Dykstal (IBM) - moved SystemsPreferencesManager to a new package
* Tobias Schwarz (Wind River) - [181394] Include Context in getAbsoluteName() for filter and pool references
@ -19,12 +19,13 @@
* Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API
* Martin Oberhuber (Wind River) - [186748] Move ISubSystemConfigurationAdapter from UI/rse.core.subsystems.util
* Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry
* Tobias Schwarz (Wind River) - [173267] "empty list" should not be displayed
* Tobias Schwarz (Wind River) - [173267] "empty list" should not be displayed
* Martin Oberhuber (Wind River) - [190271] Move ISystemViewInputProvider to Core
* Kevin Doyle (IBM) - [187707] Added separator between New Folder and New File in context menu
* David McKnight (IBM) - [199566] Remove synchronzied from internalGetChildren
* Xuan Chen (IBM) - [160775] [api] rename (at least within a zip) blocks UI thread
* David McKnight (IBM) - [210563] error messages need to be shown if incurred during filter expansion
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
*******************************************************************************/
package org.eclipse.rse.internal.ui.view;
@ -85,15 +86,15 @@ import org.eclipse.ui.views.properties.PropertyDescriptor;
* Adapter for displaying SystemFilterReference objects in tree views.
* These are children of SystemFilterPoolReference and SystemFilterReference objects
*/
public class SystemViewFilterReferenceAdapter
public class SystemViewFilterReferenceAdapter
extends AbstractSystemViewAdapter
{
//private static String translatedFilterString = null;
//private static String translatedFilterString = null;
// -------------------
// property descriptors
// property descriptors
// -------------------
private static PropertyDescriptor[] propertyDescriptorArray = null;
//private SystemComboBoxPropertyDescriptor filterStringsDescriptor, filtersDescriptor;
//private SystemComboBoxPropertyDescriptor filterStringsDescriptor, filtersDescriptor;
/**
* Returns any actions that should be contributed to the popup menu
@ -113,26 +114,34 @@ public class SystemViewFilterReferenceAdapter
IHost currentConnection = currentSubSystem.getHost();
ssFactory.setConnection(currentConnection);
ssFactory.setCurrentSelection(selection.toArray());
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)ssFactory.getAdapter(ISubSystemConfigurationAdapter.class);
IAction[] actions = adapter.getFilterActions(menu, selection, shell, menuGroup, ssFactory, filter);
if (actions != null)
{
for (int idx = 0; idx < actions.length; idx++)
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter) ssFactory.getAdapter(ISubSystemConfigurationAdapter.class);
if (adapter != null) {
// Lazy Loading: Specialized actions on filters are available only
// after the bundle that declares the ISubSystemConfigurationAdapter
// has been loaded, which typically is after connecting. We do not
// load the bundle here because this code is executed as part of
// showing a context menu. Subsystems who want their actions to be
// available earlier need to provide them by static plugin.xml
// markup or provision for more eager loading of their bundle, e.g.
// through Platform.getAdapterManager().loadAdapter() at the right
// time.
IAction[] actions = adapter.getFilterActions(menu, selection, shell, menuGroup, ssFactory, filter);
if (actions != null)
{
IAction action = actions[idx];
if (action instanceof SystemNewFilterAction)
menu.appendToGroup(ISystemContextMenuConstants.GROUP_NEW, new Separator());
menu.add(menuGroup, action);
for (int idx = 0; idx < actions.length; idx++) {
IAction action = actions[idx];
if (action instanceof SystemNewFilterAction)
menu.appendToGroup(ISystemContextMenuConstants.GROUP_NEW, new Separator());
menu.add(menuGroup, action);
}
}
}
actions = adapter.getFilterReferenceActions(menu, selection, shell, menuGroup, ssFactory, getFilterReference(selection.getFirstElement()));
if (actions != null)
{
for (int idx = 0; idx < actions.length; idx++)
actions = adapter.getFilterReferenceActions(menu, selection, shell, menuGroup, ssFactory, getFilterReference(selection.getFirstElement()));
if (actions != null)
{
IAction action = actions[idx];
menu.add(menuGroup, action);
for (int idx = 0; idx < actions.length; idx++) {
IAction action = actions[idx];
menu.add(menuGroup, action);
}
}
}
}
@ -141,7 +150,7 @@ public class SystemViewFilterReferenceAdapter
{
return SubSystemHelpers.getParentSubSystemConfiguration(filter);
}
/**
* <i>Overridden from parent.</i><br>
* Returns the subsystem that contains this object.
@ -153,7 +162,7 @@ public class SystemViewFilterReferenceAdapter
else
return null;
}
/**
* Returns an image descriptor for the image. More efficient than getting the image.
* @param element The element for which an image is desired
@ -165,9 +174,17 @@ public class SystemViewFilterReferenceAdapter
ISystemFilter filter = getFilter(element);
if (filter.getProvider() != null) // getProvider() returns the subsystem factory
{
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)filter.getProvider().getAdapter(ISubSystemConfigurationAdapter.class);
filterImage = adapter.getSystemFilterImage(filter);
if (adapter != null) {
// Lazy Loading: Customized Filter Images will be available only
// after the bundle that declares the
// ISubSystemConfigurationAdapter has been loaded. Until that
// time, a default filter image is used. Extenders who want to
// see their filter images right away need to provision for
// eager loading of their bundles at the right time (i.e. when
// expanding the Subsystem node).
filterImage = adapter.getSystemFilterImage(filter);
}
}
if (filterImage == null)
filterImage = RSEUIPlugin.getDefault().getImageDescriptor(ISystemIconConstants.ICON_SYSTEM_FILTER_ID);
@ -178,7 +195,7 @@ public class SystemViewFilterReferenceAdapter
{
return (ISystemFilterReference) element; // get referenced object
}
private ISystemFilter getFilter(Object element)
{
return getFilterReference(element).getReferencedFilter(); // get master object
@ -191,7 +208,7 @@ public class SystemViewFilterReferenceAdapter
{
return getFilter(element).getName();
}
/**
* Return the name of this object, which may be different than the display text ({#link #getText(Object)}.
* <p>
@ -201,14 +218,14 @@ public class SystemViewFilterReferenceAdapter
{
return getFilter(element).getName();
}
/*
* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.IRemoteObjectIdentifier#getAbsoluteName(java.lang.Object)
*/
public String getAbsoluteName(Object element)
{
//TODO consider caching the absolute name in the FilterReference to avoid unnecessary String operations - the name won't ever change
//TODO consider caching the absolute name in the FilterReference to avoid unnecessary String operations - the name won't ever change
ISystemFilterPoolReference filterPoolReference = getFilterReference(element).getParentSystemFilterReferencePool();
ISystemViewElementAdapter adapter = SystemAdapterHelpers.getViewAdapter(filterPoolReference);
String parentAbsoluteName = (adapter != null) ? adapter.getAbsoluteName(filterPoolReference) : ""; //$NON-NLS-1$
@ -268,17 +285,17 @@ public class SystemViewFilterReferenceAdapter
ISubSystem subsystem = element.getSubSystem();
ISubSystemConfiguration configuration = subsystem.getSubSystemConfiguration();
Object adapter = Platform.getAdapterManager().getAdapter(configuration, ISubSystemConfigurationAdapter.class);
if (adapter instanceof ISubSystemConfigurationAdapter)
if (adapter instanceof ISubSystemConfigurationAdapter)
{
children = ((ISubSystemConfigurationAdapter)adapter).applyViewFilters(element, children);
}
return children;
}
/*
* Returns the children of the specified element. If a monitor is passed in then
* Returns the children of the specified element. If a monitor is passed in then
* the context is assumed to be modal and, as such, the modal version of ss.resolveFilterStrings
* is called rather than the main thread version.
*/
@ -299,7 +316,7 @@ public class SystemViewFilterReferenceAdapter
try
{
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)ssf.getAdapter(ISubSystemConfigurationAdapter.class);
ISystemFilter newFilter = adapter.createFilterByPrompting(ssf, fRef, getShell());
if (newFilter == null)
{
@ -341,14 +358,14 @@ public class SystemViewFilterReferenceAdapter
else
{
/*
// show filter strings
// show filter strings
if (ssf.showFilterStrings())
{
SystemFilterStringReference[] refFilterStrings = fRef.getSystemFilterStringReferences();
if ((nestedFilterReferences == null) || (nestedFilterReferences.length == 0))
return refFilterStrings;
if ((refFilterStrings == null) || (refFilterStrings.length == 0))
return nestedFilterReferences;
return nestedFilterReferences;
int nbrChildren = nestedFilterReferences.length + refFilterStrings.length;
children = new Object[nbrChildren];
int idx=0;
@ -365,10 +382,10 @@ public class SystemViewFilterReferenceAdapter
try
{
// hack to propogate type filters down from connection in select dialogs...
ISystemViewInputProvider inputProvider = getInput();
if ((inputProvider != null) && (inputProvider instanceof SystemSelectRemoteObjectAPIProviderImpl) &&
if ((inputProvider != null) && (inputProvider instanceof SystemSelectRemoteObjectAPIProviderImpl) &&
(filterStrings != null) && (filterStrings.length > 0))
{
SystemSelectRemoteObjectAPIProviderImpl ip = (SystemSelectRemoteObjectAPIProviderImpl) inputProvider;
@ -380,11 +397,11 @@ public class SystemViewFilterReferenceAdapter
filterStrings = adorned;
}
}
boolean doQuery = true;
if (!referencedFilter.isTransient() &&
if (!referencedFilter.isTransient() &&
ssf.supportsFilterCaching() &&
!fRef.isStale() &&
!fRef.isStale() &&
fRef.hasContents(SystemChildrenContentsType.getInstance()))
{
doQuery = false;
@ -409,7 +426,7 @@ public class SystemViewFilterReferenceAdapter
if (doQuery)
{
Object[] allChildren = null;
if (monitor == null)
{
allChildren = ss.resolveFilterStrings(filterStrings, new NullProgressMonitor());
@ -418,7 +435,7 @@ public class SystemViewFilterReferenceAdapter
{
allChildren = ss.resolveFilterStrings(filterStrings, monitor);
}
if (allChildren == null)
{
// System.out.println("filter children == null!"); //$NON-NLS-1$
@ -430,7 +447,7 @@ public class SystemViewFilterReferenceAdapter
// error to display
return allChildren; // nothing to sort or cache - just show the error
}
if (nestedFilterReferences != null)
{
int nbrNestedFilters = nestedFilterReferences.length;
@ -440,8 +457,8 @@ public class SystemViewFilterReferenceAdapter
children[idx] = nestedFilterReferences[idx];
for (int jdx = 0; jdx < allChildren.length; jdx++)
children[idx++] = allChildren[jdx];
if (!referencedFilter.isTransient() && ssf.supportsFilterCaching())
{
fRef.setContents(SystemChildrenContentsType.getInstance(), children);
@ -449,7 +466,7 @@ public class SystemViewFilterReferenceAdapter
}
}
}
}
catch (InterruptedException exc)
{
@ -474,13 +491,13 @@ public class SystemViewFilterReferenceAdapter
* That is, if the referenced filter has nested filters or filter strings.
*/
public boolean hasChildren(IAdaptable element)
{
{
ISystemFilterReference fRef = getFilterReference(element);
ISystemFilter referencedFilter = fRef.getReferencedFilter();
ISubSystemConfiguration factory = getSubSystemConfiguration(referencedFilter);
if (factory.supportsFilterChildren())
{
{
int nbrNestedFilters = referencedFilter.getSystemFilterCount();
int nbrFilterStrings = referencedFilter.getFilterStringCount();
return (nbrNestedFilters > 0) || (nbrFilterStrings > 0);
@ -521,7 +538,7 @@ public class SystemViewFilterReferenceAdapter
* <li>name="filterType". The value is tested against the non-translated filter type. Note all subsystems
* support different types of filters.
* <li>name="showChangeFilterStringsPropertyPage". The value is tested against the call to the subsystem factory method showChangeFilterStringsPropertyPage(SystemFilter).
* Compares against "true" (default) or "false".
* Compares against "true" (default) or "false".
* </ol>
*/
public boolean testAttribute(Object target, String name, String value)
@ -542,7 +559,7 @@ public class SystemViewFilterReferenceAdapter
if (value.equals("true")) //$NON-NLS-1$
return ssf.showChangeFilterStringsPropertyPage(ref.getReferencedFilter());
else
return !ssf.showChangeFilterStringsPropertyPage(ref.getReferencedFilter());
return !ssf.showChangeFilterStringsPropertyPage(ref.getReferencedFilter());
}
else
return super.testAttribute(target, name, value);
@ -566,7 +583,7 @@ public class SystemViewFilterReferenceAdapter
// number filter strings
propertyDescriptorArray[++idx] = createSimplePropertyDescriptor(ISystemPropertyConstants.P_FILTERSTRINGS_COUNT, SystemViewResources.RESID_PROPERTY_FILTERSTRINGS_COUNT_LABEL, SystemViewResources.RESID_PROPERTY_FILTERSTRINGS_COUNT_TOOLTIP);
// Related connection
propertyDescriptorArray[++idx] = createSimplePropertyDescriptor(ISystemPropertyConstants.P_IS_CONNECTION_PRIVATE, SystemViewResources.RESID_PROPERTY_FILTERPOOLREFERENCE_IS_CONNECTIONPRIVATE_LABEL, SystemViewResources.RESID_PROPERTY_FILTERPOOLREFERENCE_IS_CONNECTIONPRIVATE_TOOLTIP);
propertyDescriptorArray[++idx] = createSimplePropertyDescriptor(ISystemPropertyConstants.P_IS_CONNECTION_PRIVATE, SystemViewResources.RESID_PROPERTY_FILTERPOOLREFERENCE_IS_CONNECTIONPRIVATE_LABEL, SystemViewResources.RESID_PROPERTY_FILTERPOOLREFERENCE_IS_CONNECTIONPRIVATE_TOOLTIP);
}
return propertyDescriptorArray;
}
@ -713,13 +730,13 @@ public class SystemViewFilterReferenceAdapter
ISystemFilter filter = getFilter(element);
return !filter.isPromptable();
}
/**
* Don't show generic "Show in Table" if the factory asks not to
*/
public boolean showGenericShowInTableAction(Object element)
{
{
ISystemFilter filter = getFilter(element);
ISubSystemConfiguration ssParentFactory = getSubSystemConfiguration(filter);
return ssParentFactory.showGenericShowInTableOnFilter();
@ -827,7 +844,7 @@ public class SystemViewFilterReferenceAdapter
// ------------------------------------------
// METHODS TO SUPPORT COMMON DRAG AND DROP FUNCTION...
// ------------------------------------------
// ------------------------------------------
/**
* drag support is handled directly for filter references, rather than delegated here.
*/
@ -837,7 +854,7 @@ public class SystemViewFilterReferenceAdapter
if (fRef != null)
{
if (getSubSystemConfiguration(fRef.getReferencedFilter()).supportsFilterStringExport())
{
{
return true;
}
}
@ -860,11 +877,11 @@ public class SystemViewFilterReferenceAdapter
{
return true;
}
if (!fRef.getReferencedFilter().isNonChangable())
{
{
if (factory.supportsMultiStringFilters())
{
{
return true;
}
}
@ -872,7 +889,7 @@ public class SystemViewFilterReferenceAdapter
}
return false;
}
public ISystemResourceSet doDrag(SystemRemoteResourceSet set, IProgressMonitor monitor)
{
return set;
@ -909,13 +926,13 @@ public class SystemViewFilterReferenceAdapter
else if (from instanceof IAdaptable)
{
ISystemRemoteElementAdapter radapter = (ISystemRemoteElementAdapter) ((IAdaptable) from).getAdapter(ISystemRemoteElementAdapter.class);
{
String newFilterStr = radapter.getFilterStringFor(from);
if (newFilterStr != null)
{
filter.addFilterString(newFilterStr);
filter.addFilterString(newFilterStr);
return fRef;
}
}
@ -929,10 +946,10 @@ public class SystemViewFilterReferenceAdapter
* compatable.
*/
public boolean validateDrop(Object src, Object target, boolean sameSystem)
{
{
if (!sameSystem)
{
if (src instanceof IResource)
if (src instanceof IResource)
{
return true;
}
@ -964,7 +981,7 @@ public class SystemViewFilterReferenceAdapter
return true;
}
}
// check if src has a filter string
// check if src has a filter string
else if (src instanceof IAdaptable)
{
ISystemRemoteElementAdapter adapter = (ISystemRemoteElementAdapter) ((IAdaptable) src).getAdapter(ISystemRemoteElementAdapter.class);
@ -980,20 +997,20 @@ public class SystemViewFilterReferenceAdapter
}
return false;
}
/*
* Return whether deferred queries are supported.
* Defer to the subsystem configuration.
* Defer to the subsystem configuration.
*/
public boolean supportsDeferredQueries(ISubSystem subSys)
{
return subSys.getSubSystemConfiguration().supportsDeferredQueries();
}
/**
* This is a local RSE artifact so returning false
*
*
* @param element the object to check
* @return false since this is not remote
*/

View file

@ -1,15 +1,15 @@
/********************************************************************************
* Copyright (c) 2002, 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
* 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,
* 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:
* David Dykstal (IBM) - 180562: remove implementation of IRSEUserIdConstants
* Martin Oberhuber (Wind River) - [182454] improve getAbsoluteName() documentation
@ -20,11 +20,13 @@
* David Dykstal (IBM) - [217556] remove service subsystem types
* Martin Oberhuber (Wind River) - [195399] Improve String display for default port 0
* David McKnight (IBM) - [223103] [cleanup] fix broken externalized strings
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.internal.ui.view;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
@ -34,7 +36,9 @@ import org.eclipse.rse.core.model.ISystemRegistry;
import org.eclipse.rse.core.subsystems.IConnectorService;
import org.eclipse.rse.core.subsystems.ISubSystem;
import org.eclipse.rse.core.subsystems.ISubSystemConfiguration;
import org.eclipse.rse.core.subsystems.ISubSystemConfigurationProxy;
import org.eclipse.rse.internal.ui.SystemResources;
import org.eclipse.rse.internal.ui.subsystems.SubSystemConfigurationProxyAdapter;
import org.eclipse.rse.ui.ISystemContextMenuConstants;
import org.eclipse.rse.ui.SystemBasePlugin;
import org.eclipse.rse.ui.SystemMenuManager;
@ -55,25 +59,25 @@ import org.eclipse.ui.views.properties.TextPropertyDescriptor;
* Adapter for displaying SubSystem objects in tree views.
* These are children of SystemConnection objects
*/
public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
{
protected String translatedType;
// for reset property support
private String original_portData;
private SystemInheritablePropertyData original_userIdData = new SystemInheritablePropertyData();
//private SystemInheritablePropertyData original_portData = new SystemInheritablePropertyData();
private SystemInheritablePropertyData original_userIdData = new SystemInheritablePropertyData();
//private SystemInheritablePropertyData original_portData = new SystemInheritablePropertyData();
private TextPropertyDescriptor propertyPortDescriptor;
private boolean changed_userId, changed_port;
private boolean port_editable = true;
// -------------------
// property descriptors
// -------------------
private PropertyDescriptor[] propertyDescriptorArray = null;
//private SystemInheritablePropertyData portData = new SystemInheritablePropertyData();
private PropertyDescriptor[] propertyDescriptorArray = null;
//private SystemInheritablePropertyData portData = new SystemInheritablePropertyData();
//private SystemInheritableTextPropertyDescriptor portDescriptor;
private SystemInheritablePropertyData userIdData = new SystemInheritablePropertyData();
private SystemInheritablePropertyData userIdData = new SystemInheritablePropertyData();
private SystemInheritableTextPropertyDescriptor userIdDescriptor = null;
/**
* Returns any actions that should be contributed to the popup menu
* for the given subsystem object.
@ -88,49 +92,92 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
{
// does not make sense adding unique actions per multi-selection
if (selection.size() == 1) {
Object element = selection.getFirstElement();
Object element = selection.getFirstElement();
ISubSystem ss = (ISubSystem)element;
ISubSystemConfiguration ssFactory = ss.getSubSystemConfiguration();
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)ssFactory.getAdapter(ISubSystemConfigurationAdapter.class);
IAction[] actions = adapter.getSubSystemActions(menu, selection, shell, menuGroup, ssFactory, ss);
if (actions != null)
{
for (int idx=0; idx<actions.length; idx++)
if (adapter == null) {
// FIXME Fallback to default SubSystemConfigurationAdapter, such
// that we get at least the "connect" and other common actions
// for subsystems before their adapter is loaded. Note that this
// means that the popular "launch Shell" action will not be
// available before the rse.shells.ui plugin is loaded; but that
// should be fixed by contributing that action via plugin.xml,
// rather than forcing full bundle activation here from the
// menu. See
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=226550
// //adapter = new SubSystemConfigurationAdapter();
Platform.getAdapterManager().loadAdapter(ssFactory, ISubSystemConfigurationAdapter.class.getName());
adapter = (ISubSystemConfigurationAdapter) ssFactory.getAdapter(ISubSystemConfigurationAdapter.class);
// if (adapter == null) {
// //TODO is this right? It deprives clients from the ability
// //to get rid of the standard actions contributed by the
// //default adapter. We shouldn't do that.
// adapter = new SubSystemConfigurationAdapter();
// }
}
if (adapter != null) {
// Lazy Loading: Dynamic contributed subsystem actions will be
// provided only once the corresponding plugin is activated
// (adapter factory loaded). This means, that by default,
// dynamic actions are only shown after connecting a subsystem.
// If a subsystem needs to show these earlier, it needs to
// provision for eager bundle activation to ensure that its
// ISubSystemConfigurationAdapter is loaded -- or, provide these
// actions by static plugin.xml markup.
IAction[] actions = adapter.getSubSystemActions(menu, selection, shell, menuGroup, ssFactory, ss);
if (actions != null)
{
IAction action = actions[idx];
menu.add(menuGroup, action);
for (int idx = 0; idx < actions.length; idx++) {
IAction action = actions[idx];
menu.add(menuGroup, action);
}
}
}
}
menu.appendToGroup(ISystemContextMenuConstants.GROUP_NEW, new GroupMarker(ISystemContextMenuConstants.GROUP_NEW_NONCASCADING));// user or BP/ISV additions
}
/**
* Returns an image descriptor for the image. More efficient than getting the image.
* @param element The element for which an image is desired
*/
public ImageDescriptor getImageDescriptor(Object element)
{
//System.out.println("INSIDE GETIMAGEDESCRIPTOR FOR SUBSYSTEM VIEW ADAPTER: "+element);
//System.out.println("INSIDE GETIMAGEDESCRIPTOR FOR SUBSYSTEM VIEW ADAPTER: "+element);
ISubSystem ss = (ISubSystem)element;
ISubSystemConfiguration ssFactory = ss.getSubSystemConfiguration();
if (ssFactory != null)
{
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)ssFactory.getAdapter(ISubSystemConfigurationAdapter.class);
if (ss.isConnected())
return adapter.getLiveImage(ssFactory);
else
return adapter.getImage(ssFactory);
if (adapter != null) {
if (ss.isConnected())
return adapter.getLiveImage(ssFactory);
else
return adapter.getImage(ssFactory);
} else {
// get image from proxy
ISubSystemConfigurationProxy proxy = ssFactory.getSubSystemConfigurationProxy();
SubSystemConfigurationProxyAdapter proxyAdapter = (SubSystemConfigurationProxyAdapter) Platform.getAdapterManager().getAdapter(proxy,
SubSystemConfigurationProxyAdapter.class);
if (proxyAdapter != null) {
if (ss.isConnected())
return proxyAdapter.getLiveImageDescriptor();
else
return proxyAdapter.getImageDescriptor();
} else {
SystemBasePlugin.logWarning("Unexpected error: SubSystemConfiguration has no adapter and no proxyAdapter: " + ss.getName()); //$NON-NLS-1$
return null;
}
}
}
else
{
SystemBasePlugin.logWarning("Unexpected error: ssFactory is null for ss " + ss.getName()); //$NON-NLS-1$
SystemBasePlugin.logWarning("Unexpected error: SubSystemConfiguration is null for ss " + ss.getName()); //$NON-NLS-1$
return null;
}
}
/**
* Return the label for this object. Uses getName() on the subsystem object.
*/
@ -147,7 +194,7 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
{
return ((ISubSystem)element).getName();
}
/*
* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.IRemoteObjectIdentifier#getAbsoluteName(java.lang.Object)
@ -161,7 +208,7 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
suffix = serviceType.toString();
}
return ss.getSystemProfileName() + "." + ss.getHostAliasName() + "." + suffix; //$NON-NLS-1$ //$NON-NLS-2$
}
}
/**
* Return the type label for this object
*/
@ -170,36 +217,36 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
if (translatedType == null)
translatedType = SystemViewResources.RESID_PROPERTY_SUBSYSTEM_TYPE_VALUE;
return translatedType;
}
}
/**
* Return the parent of this object. This is a connection object.
*/
public Object getParent(Object element)
{
//System.out.println("INSIDE GETPARENT FOR SUBSYSTEM VIEW ADAPTER: "+element);
ISubSystem ss = (ISubSystem)element;
//System.out.println("INSIDE GETPARENT FOR SUBSYSTEM VIEW ADAPTER: "+element);
ISubSystem ss = (ISubSystem)element;
return RSECorePlugin.getTheSystemRegistry().getHost(ss.getSystemProfile(),ss.getHostAliasName());
}
/**
* Return the children of this object
*/
public Object[] getChildren(IAdaptable element, IProgressMonitor monitor)
{
//System.out.println("INSIDE GETCHILDREN FOR SUBSYSTEM VIEW ADAPTER: "+element);
//System.out.println("INSIDE GETCHILDREN FOR SUBSYSTEM VIEW ADAPTER: "+element);
ISubSystem ss = (ISubSystem)element;
Object[] children = ss.getChildren();
Object[] children = ss.getChildren();
return children;
}
/**
* Return true if this object has children
*/
public boolean hasChildren(IAdaptable element)
{
//System.out.println("INSIDE HASCHILDREN FOR SUBSYSTEM VIEW ADAPTER: "+element);
//System.out.println("INSIDE HASCHILDREN FOR SUBSYSTEM VIEW ADAPTER: "+element);
ISubSystem ss = (ISubSystem)element;
return ss.hasChildren();
}
@ -207,12 +254,12 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
// ----------------------------------
// Property sheet supplier methods...
// ----------------------------------
/**
* Returns the current collection of property descriptors for connection objects.
* @return an array containing all descriptors.
* @return an array containing all descriptors.
*/
public IPropertyDescriptor[] getPropertyDescriptors()
public IPropertyDescriptor[] getPropertyDescriptors()
{
if (propertyDescriptorArray == null)
{
@ -221,46 +268,46 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
int idx = 0;
for (idx = 0; idx < defaultProperties.length; idx++)
propertyDescriptorArray[idx] = defaultProperties[idx];
// add our unique property descriptors...
//idx = defaultProperties.length; assertion
// user id
//propertyDescriptorArray[idx] = new TextPropertyDescriptor(ISystemPropertyConstants.P_USERID,
// user id
//propertyDescriptorArray[idx] = new TextPropertyDescriptor(ISystemPropertyConstants.P_USERID,
// SystemViewResources.RESID_PROPERTY_USERID_LABEL));
userIdDescriptor =
new SystemInheritableTextPropertyDescriptor(ISystemPropertyConstants.P_USERID,
new SystemInheritableTextPropertyDescriptor(ISystemPropertyConstants.P_USERID,
SystemViewResources.RESID_PROPERTY_USERID_LABEL);
userIdDescriptor.setToggleButtonToolTipText(SystemResources.RESID_SUBSYSTEM_USERID_INHERITBUTTON_TIP);
userIdDescriptor.setEntryFieldToolTipText(SystemResources.RESID_SUBSYSTEM_USERID_TIP);
propertyDescriptorArray[idx] = userIdDescriptor;
propertyDescriptorArray[idx].setDescription(SystemViewResources.RESID_PROPERTY_USERID_TOOLTIP);
// port
propertyPortDescriptor = new TextPropertyDescriptor(ISystemPropertyConstants.P_PORT,
propertyPortDescriptor = new TextPropertyDescriptor(ISystemPropertyConstants.P_PORT,
SystemViewResources.RESID_PROPERTY_PORT_LABEL);
propertyPortDescriptor.setDescription(SystemViewResources.RESID_PROPERTY_PORT_TOOLTIP);
propertyPortDescriptor.setValidator(new ValidatorPortInput());
propertyDescriptorArray[++idx] = propertyPortDescriptor;
propertyDescriptorArray[++idx] = propertyPortDescriptor;
//propertyDescriptorArray[++idx] = getPortDescriptor();
// connected
propertyDescriptorArray[++idx] = createSimplePropertyDescriptor(ISystemPropertyConstants.P_IS_CONNECTED, SystemViewResources.RESID_PROPERTY_CONNECTED_LABEL, SystemViewResources.RESID_PROPERTY_CONNECTED_TOOLTIP);
// vrm
propertyDescriptorArray[++idx] = createSimplePropertyDescriptor(ISystemPropertyConstants.P_VRM, SystemViewResources.RESID_PROPERTY_VRM_LABEL, SystemViewResources.RESID_PROPERTY_VRM_TOOLTIP);
}
propertyDescriptorArray[++idx] = createSimplePropertyDescriptor(ISystemPropertyConstants.P_VRM, SystemViewResources.RESID_PROPERTY_VRM_LABEL, SystemViewResources.RESID_PROPERTY_VRM_TOOLTIP);
}
return propertyDescriptorArray;
}
}
/**
* Return our unique property descriptors
*/
protected org.eclipse.ui.views.properties.IPropertyDescriptor[] internalGetPropertyDescriptors()
{
return null;
}
}
/**
* Create (first time), configure and return the property descriptor for the port number
*
@ -269,20 +316,20 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
if (portDescriptor == null)
{
SystemViewPlugin plugin = SystemViewPlugin.getDefault();
RSEUIPlugin sp = RSEUIPlugin.getDefault();
RSEUIPlugin sp = RSEUIPlugin.getDefault();
portDescriptor =
new SystemInheritableTextPropertyDescriptor(ISystemPropertyConstants.P_PORT,
SystemViewResources.RESID_PROPERTY_PORT_LABEL));
new SystemInheritableTextPropertyDescriptor(ISystemPropertyConstants.P_PORT,
SystemViewResources.RESID_PROPERTY_PORT_LABEL));
portDescriptor.setToggleButtonToolTipText(SystemResources.RESID_SUBSYSTEM_PORT_INHERITBUTTON_TIP));
portDescriptor.setEntryFieldToolTipText(SystemResources.RESID_SUBSYSTEM_PORT_TIP));
portDescriptor.setDescription(SystemViewResources.RESID_PROPERTY_PORT_DESCRIPTION));
portDescriptor.setDescription(SystemViewResources.RESID_PROPERTY_PORT_DESCRIPTION));
}
return portDescriptor;
}*/
/**
* Set the values in the userIdPropertyData object that drives the userId property sheet widget
*/
*/
private SystemInheritablePropertyData setUserIdPropertyData(SystemInheritablePropertyData data, ISubSystem subsys)
{
String localUserId = subsys.getLocalUserId();
@ -291,24 +338,24 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
data.setInheritedValue(parentUserId);
data.setIsLocal((localUserId!=null)&&(localUserId.length()>0));
// DY: Defect 42735, check if user has temporarilly overrode the userid
// DY: Defect 42735, check if user has temporarilly overrode the userid
// for this connection via the signon dialog
if (subsys.isConnected())
if (subsys.isConnected())
{
String connectedId = subsys.getConnectorService().getUserId();
//On Local subsystems, connectedId==null. Phil.
if (data.getIsLocal() && connectedId!=null && !connectedId.equals(localUserId))
if (data.getIsLocal() && connectedId!=null && !connectedId.equals(localUserId))
{
data.setLocalValue(connectedId);
data.setIsLocal(true);
}
else if (connectedId!=null && !connectedId.equals(parentUserId))
else if (connectedId!=null && !connectedId.equals(parentUserId))
{
data.setLocalValue(connectedId);
data.setIsLocal(true);
}
}
return data;
}
@ -329,12 +376,12 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
boolean notApplicable = (!ssFactory.isPortEditable() && (iPort <= 0));
if (!notApplicable)
{
data.setInheritedValue("0");
data.setInheritedDisplayString(NLS.bind(SystemPropertyResources.RESID_PORT_DYNAMICSELECT, "0")); //$NON-NLS-1$
data.setInheritedValue("0");
data.setInheritedDisplayString(NLS.bind(SystemPropertyResources.RESID_PORT_DYNAMICSELECT, "0")); //$NON-NLS-1$
data.setIsLocal(iPort != 0);
}
data.setNotApplicable(notApplicable);
getPortDescriptor().setEditable(!notApplicable);
getPortDescriptor().setEditable(!notApplicable);
//data.printDetails();
return data;
}
@ -342,10 +389,10 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
private String getPortString(ISubSystem ss)
{
//return getPortPropertyData(portData, ss);
//return getPortPropertyData(portData, ss);
int iPort = ss.getConnectorService().getPort();
ISubSystemConfiguration ssFactory = ss.getSubSystemConfiguration();
boolean notApplicable = (!ssFactory.isPortEditable() && (iPort <= 0));
boolean notApplicable = (!ssFactory.isPortEditable() && (iPort <= 0));
if (notApplicable)
return getTranslatedNotApplicable();
else
@ -353,17 +400,17 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
return Integer.toString(iPort);
}
}
/**
* Returns the current value for the named property.
* The parent handles P_TEXT and P_TYPE only, and we augment that here.
* @param property the name of the property as named by its property descriptor
* @return the current value of the property
*/
public Object getPropertyValue(Object property)
public Object getPropertyValue(Object property)
{
String name = (String)property;
ISubSystem ss = (ISubSystem)propertySourceInput;
String name = (String)property;
ISubSystem ss = (ISubSystem)propertySourceInput;
if (name.equals(ISystemPropertyConstants.P_USERID))
return setUserIdPropertyData(userIdData, ss);
else if (name.equals(ISystemPropertyConstants.P_PORT))
@ -390,7 +437,7 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
// connection is offline
return SystemResources.RESID_OFFLINE_LABEL;
}
IConnectorService system = ss.getConnectorService();
boolean connected = false;
if (system == null)
@ -398,14 +445,14 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
System.out.println("SystemViewSubSystemAdapter: Error! system is null for subsystem "+ss.getClass().getName()); //$NON-NLS-1$
SystemBasePlugin.logError("SystemViewSubSystemAdapter: Error! system is null for subsystem "+ss.getClass().getName(), null); //$NON-NLS-1$
}
else
else
connected = system.isConnected();
return connected ? getTranslatedYes() : getTranslatedNo();
}
else
return super.getPropertyValue(name);
}
}
/**
* Returns itself
*/
@ -414,17 +461,17 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
if (element instanceof ISubSystem)
return (ISubSystem)element;
else
return null;
return null;
}
/**
* Return our unique property values
*/
public Object internalGetPropertyValue(Object key)
{
return null;
}
}
// because this node has some editable properties, these overrides of our
// parent class are needed as callbacks from the PropertySheet window.
/**
@ -436,29 +483,35 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
if (this.propertySourceInput == propertySourceInput)
return;
super.setPropertySourceInput(propertySourceInput);
ISubSystem ss = (ISubSystem)propertySourceInput;
ISubSystemConfiguration ssFactory = ss.getSubSystemConfiguration();
original_userIdData = setUserIdPropertyData(original_userIdData,ss);
//original_portData = setPortPropertyData(original_portData,ss);
ISubSystem ss = (ISubSystem)propertySourceInput;
ISubSystemConfiguration ssFactory = ss.getSubSystemConfiguration();
original_userIdData = setUserIdPropertyData(original_userIdData,ss);
//original_portData = setPortPropertyData(original_portData,ss);
original_portData = getPortString(ss);
changed_userId = changed_port = false;
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)ssFactory.getAdapter(ISubSystemConfigurationAdapter.class);
if (userIdDescriptor != null)
{
userIdDescriptor.setValidator(adapter.getUserIdValidator(ssFactory));
if (adapter != null) {
// Lazy Loading: Since this is called from opening a context
// menu, Dynamic Validator will only be available once the
// ISubSystemConfigurationAdapter is loaded, i.e. after
// connecting.
// If a subsystem wants to provision for having the validator
// available earlier, it needs to eagerly load the bundle that
// declares its ISubSystemConfigurationAdapter.
if (userIdDescriptor != null) {
userIdDescriptor.setValidator(adapter.getUserIdValidator(ssFactory));
}
// getPortDescriptor().setValidator((ICellEditorValidator)ssFactory.getPortValidator());
if (propertyPortDescriptor != null) {
propertyPortDescriptor.setValidator(adapter.getPortValidator(ssFactory));
}
}
//getPortDescriptor().setValidator((ICellEditorValidator)ssFactory.getPortValidator());
if (propertyPortDescriptor != null)
{
propertyPortDescriptor.setValidator(adapter.getPortValidator(ssFactory));
}
ss.getConnectorService().getPort();
port_editable = ssFactory.isPortEditable();
}
/**
* Returns whether the property value has changed from the default.
* Only applicable for editable properties.
@ -466,16 +519,16 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
* @return <code>true</code> if the value of the specified property has changed
* from its original default value; <code>false</code> otherwise.
*/
public boolean isPropertySet(Object propertyObject)
public boolean isPropertySet(Object propertyObject)
{
String property = (String)propertyObject;
String property = (String)propertyObject;
boolean changed = false;
if (property.equals(ISystemPropertyConstants.P_USERID))
changed = changed_userId;
else if (property.equals(ISystemPropertyConstants.P_PORT))
changed = changed_port && port_editable;
return changed;
}
changed = changed_port && port_editable;
return changed;
}
/**
* Change the subsystem user Id value
@ -484,13 +537,13 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
{
//int whereToUpdate = USERID_LOCATION_SUBSYSTEM;
String userId = data.getLocalValue(); // will be "" if !data.getIsLocal(), which results in wiping out local override
ISubSystemConfiguration ssFactory = subsys.getSubSystemConfiguration();
ISubSystemConfiguration ssFactory = subsys.getSubSystemConfiguration();
// unlike with connection objects, we don't ever allow the user to change the parent's
// userId value, even if it is empty, when working with subsystems. There is too much
// userId value, even if it is empty, when working with subsystems. There is too much
// ambiquity as the parent could be the connnection or the user preferences setting for this
// system type. Because of this decision, we don't need to tell updateSubSystem(...) where
// to update, as it always the local subsystem.
ssFactory.updateSubSystem(subsys, true, userId, false, subsys.getConnectorService().getPort());
ssFactory.updateSubSystem(subsys, true, userId, false, subsys.getConnectorService().getPort());
}
/**
* Change the subsystem port value
@ -500,11 +553,11 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
String port = data.getLocalValue(); // will be "" if !data.getIsLocal(), which results in wiping out local override
Integer portInteger = null;
if (data.getIsLocal() && (port.length()>0))
portInteger = new Integer(port);
portInteger = new Integer(port);
else
portInteger = new Integer(0);
SubSystemConfiguration ssFactory = subsys.getParentSubSystemConfiguration();
ssFactory.updateSubSystem((Shell)null, subsys, false, subsys.getLocalUserId(), true, portInteger);
SubSystemConfiguration ssFactory = subsys.getParentSubSystemConfiguration();
ssFactory.updateSubSystem((Shell)null, subsys, false, subsys.getLocalUserId(), true, portInteger);
}
*/
/**
@ -518,11 +571,11 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
Integer portInteger = null;
if (port.length()>0)
{
try
try
{
portInteger = new Integer(port);
}
catch (Exception exc)
portInteger = new Integer(port);
}
catch (Exception exc)
{
return;
}
@ -532,12 +585,12 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
portInteger = new Integer(0);
}
int portInt = portInteger.intValue();
ISubSystemConfiguration ssFactory = subsys.getSubSystemConfiguration();
ISubSystemConfiguration ssFactory = subsys.getSubSystemConfiguration();
ssFactory.updateSubSystem(subsys, false, subsys.getLocalUserId(), true, portInt);
subsys.commit();
}
/**
* Called when user selects the reset button in property sheet.
*/
@ -545,10 +598,10 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
{
String property = (String)propertyObject;
ISubSystem ss = (ISubSystem)propertySourceInput;
ss.getSubSystemConfiguration();
ss.getSubSystemConfiguration();
if (property.equals(ISystemPropertyConstants.P_USERID))
{
updateUserId(ss, original_userIdData);
updateUserId(ss, original_userIdData);
changed_userId = false;
}
else if (property.equals(ISystemPropertyConstants.P_PORT))
@ -557,29 +610,29 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
updatePort(ss, original_portData);
changed_port = false;
}
}
}
/**
* Called when user changes property via property sheet.
*/
public void setPropertyValue(Object property, Object value)
{
String name = (String)property;
String name = (String)property;
ISubSystem ss = (ISubSystem)propertySourceInput;
ss.getSubSystemConfiguration();
//System.out.println("inside setPropVal: " + property + ", value: " + value);
if (name.equals(ISystemPropertyConstants.P_USERID))
{
updateUserId(ss, (SystemInheritablePropertyData)value);
updateUserId(ss, (SystemInheritablePropertyData)value);
changed_userId = true;
}
else if (name.equals(ISystemPropertyConstants.P_PORT))
{
//System.out.println("inside setPropVal: " + property + ", value: " + value);
//updatePort(ss, (SystemInheritablePropertyData)value);
//updatePort(ss, (SystemInheritablePropertyData)value);
updatePort(ss, (String)value);
changed_port = true;
}
}
}
/**
* Override of {@link AbstractSystemViewAdapter#testAttribute(Object, String, String)}. We add
@ -588,9 +641,9 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
* <li>name="serverLaunchPP". Returns "true" if the given subsystem supports the Server Launch Settings
* property page, which is determined by calling it's factory's {@link ISubSystemConfiguration#supportsServerLaunchProperties(org.eclipse.rse.core.model.IHost)} method.
* </ol>
*
*
* This property is used to filter the existence of the Server Launch Settings property page.
*
*
* @see org.eclipse.ui.IActionFilter#testAttribute(Object, String, String)
*/
public boolean testAttribute(Object target, String name, String value)
@ -624,7 +677,7 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
}
return super.testAttribute(target, name, value);
}
// FOR COMMON DELETE ACTIONS
/**
* Return true if we should show the delete action in the popup for the given element.
@ -633,32 +686,32 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
public boolean showDelete(Object element)
{
return canDelete(element);
}
}
/**
* Return true if this object is deletable by the user. If so, when selected,
* the Edit->Delete menu item will be enabled.
*/
public boolean canDelete(Object element)
{
//System.out.println("INSIDE ISDELETABLE FOR SUBSYSTEM VIEW ADAPTER: "+element);
ISubSystem ss = (ISubSystem)element;
ISubSystemConfiguration ssFactory = ss.getSubSystemConfiguration();
//System.out.println("INSIDE ISDELETABLE FOR SUBSYSTEM VIEW ADAPTER: "+element);
ISubSystem ss = (ISubSystem)element;
ISubSystemConfiguration ssFactory = ss.getSubSystemConfiguration();
return ssFactory.isSubSystemsDeletable();
}
/**
* Perform the delete action.
*/
public boolean doDelete(Shell shell, Object element, IProgressMonitor monitor)
{
//System.out.println("INSIDE DODELETE FOR SUBSYSTEM VIEW ADAPTER: "+element);
ISubSystem ss = (ISubSystem)element;
ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
//System.out.println("INSIDE DODELETE FOR SUBSYSTEM VIEW ADAPTER: "+element);
ISubSystem ss = (ISubSystem)element;
ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
sr.deleteSubSystem(ss);
return true;
}
}
// FOR COMMON RENAME ACTIONS
/**
* Return true if we should show the rename action in the popup for the given element.
@ -667,16 +720,16 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
public boolean showRename(Object element)
{
return canRename(element);
}
}
/**
* Return true if this object is renamable by the user. If so, when selected,
* the Rename menu item will be enabled.
*/
public boolean canRename(Object element)
{
{
return canDelete(element); // same rules for both delete and rename
}
/**
* Perform the rename action. Assumes uniqueness checking was done already.
*/
@ -686,8 +739,8 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
ISubSystemConfiguration parentSSFactory = ss.getSubSystemConfiguration();
parentSSFactory.renameSubSystem(ss,name); // renames, and saves to disk
return true;
}
}
/**
* Return a validator for verifying the new name is correct on a rename action.
* The default implementation is not to support rename hence this method returns
@ -697,28 +750,28 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
{
return null;
}
// FOR COMMON DRAG AND DROP ACTIONS
/**
* Indicates whether the subsystem can be dragged.
* Can't be used for physical copies but rather
* Indicates whether the subsystem can be dragged.
* Can't be used for physical copies but rather
* for views (like the Scratchpad)
*/
public boolean canDrag(Object element)
{
return true;
}
/**
* Returns the subsystem (no phyiscal operation required to drag and subsystem (because it's local)
*/
public Object doDrag(Object element, boolean sameSystemType, IProgressMonitor monitor)
{
return element;
return element;
}
// ------------------------------------------------------------
// METHODS FOR SAVING AND RESTORING EXPANSION STATE OF VIEWER...
@ -752,10 +805,10 @@ public class SystemViewSubSystemAdapter extends AbstractSystemViewAdapter
{
return ISystemMementoConstants.MEMENTO_KEY_SUBSYSTEM;
}
/**
* This is a local RSE artifact so returning false
*
*
* @param element the object to check
* @return false since this is not remote
*/

View file

@ -1,18 +1,19 @@
/********************************************************************************
* Copyright (c) 2002, 2007 IBM Corporation and others. All rights reserved.
* Copyright (c) 2002, 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
* 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,
* 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) - [184095] Replace systemTypeName by IRSESystemType
* Martin Oberhuber (Wind River) - [186748] Move ISubSystemConfigurationAdapter from UI/rse.core.subsystems.util
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.internal.ui.view.team;
@ -23,13 +24,16 @@ import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.rse.core.IRSESystemType;
import org.eclipse.rse.core.model.ISystemProfile;
import org.eclipse.rse.core.subsystems.ISubSystemConfiguration;
import org.eclipse.rse.core.subsystems.ISubSystemConfigurationProxy;
import org.eclipse.rse.internal.ui.SystemResources;
import org.eclipse.rse.internal.ui.subsystems.SubSystemConfigurationProxyAdapter;
import org.eclipse.rse.ui.SystemBasePlugin;
import org.eclipse.rse.ui.subsystems.ISubSystemConfigurationAdapter;
/**
* This class represents a child node under category nodes, in the Team view.
* It represents expandable subsystem factories such as "Files" or "iSeries Objects".
* It represents expandable subsystem factories such as "Files" or "iSeries Objects".
*/
public class SystemTeamViewSubSystemConfigurationNode implements IAdaptable
{
@ -38,7 +42,7 @@ public class SystemTeamViewSubSystemConfigurationNode implements IAdaptable
private ISubSystemConfiguration ssf;
private SystemTeamViewCategoryNode parentCategory;
private String name = null;
/**
* Constructor
*/
@ -57,11 +61,11 @@ public class SystemTeamViewSubSystemConfigurationNode implements IAdaptable
*/
public Object getAdapter(Class adapterType)
{
return Platform.getAdapterManager().getAdapter(this, adapterType);
}
return Platform.getAdapterManager().getAdapter(this, adapterType);
}
/**
* Compare this node to another.
* Compare this node to another.
*/
public boolean equals(Object o)
{
@ -78,7 +82,7 @@ public class SystemTeamViewSubSystemConfigurationNode implements IAdaptable
else
return super.equals(o);
}
/**
* Return this node's image
* @return the image to show in the tree, for this node
@ -86,7 +90,21 @@ public class SystemTeamViewSubSystemConfigurationNode implements IAdaptable
public ImageDescriptor getImageDescriptor()
{
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)ssf.getAdapter(ISubSystemConfigurationAdapter.class);
return adapter.getImage(ssf);
if (adapter != null) {
return adapter.getImage(ssf);
} else {
// Fall back to using the Proxy -- see also
// SystemViewSubSystemAdapter.getImageDescriptor()
ISubSystemConfigurationProxy proxy = ssf.getSubSystemConfigurationProxy();
SubSystemConfigurationProxyAdapter proxyAdapter = (SubSystemConfigurationProxyAdapter) Platform.getAdapterManager().getAdapter(proxy,
SubSystemConfigurationProxyAdapter.class);
if (proxyAdapter != null) {
return proxyAdapter.getImageDescriptor();
} else {
SystemBasePlugin.logWarning("Unexpected error: SubSystemConfiguration has no adapter and no proxyAdapter: " + ssf.getId()); //$NON-NLS-1$
return null;
}
}
}
/**
@ -116,9 +134,9 @@ public class SystemTeamViewSubSystemConfigurationNode implements IAdaptable
buf.append(")"); //$NON-NLS-1$
name = buf.toString();
}
return name;
return name;
}
/**
* Convert to string. We call getLabel()
*/

View file

@ -1,26 +1,28 @@
/********************************************************************************
* Copyright (c) 2002, 2007 IBM Corporation and others. All rights reserved.
* Copyright (c) 2002, 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
* 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,
* 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) - [186748] Move ISubSystemConfigurationAdapter from UI/rse.core.subsystems.util
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.ui.propertypages;
import org.eclipse.core.runtime.Platform;
import org.eclipse.rse.core.filters.ISystemFilter;
import org.eclipse.rse.core.filters.ISystemFilterPoolManagerProvider;
import org.eclipse.rse.core.filters.ISystemFilterPoolReferenceManagerProvider;
import org.eclipse.rse.core.filters.ISystemFilterReference;
import org.eclipse.rse.core.subsystems.ISubSystemConfiguration;
import org.eclipse.rse.core.subsystems.SubSystemConfiguration;
import org.eclipse.rse.core.subsystems.SubSystemHelpers;
import org.eclipse.rse.internal.ui.SystemPropertyResources;
import org.eclipse.rse.services.clientserver.messages.SystemMessage;
@ -32,30 +34,33 @@ import org.eclipse.rse.ui.filters.SystemChangeFilterPane;
import org.eclipse.rse.ui.filters.SystemFilterStringEditPane;
import org.eclipse.rse.ui.subsystems.ISubSystemConfigurationAdapter;
import org.eclipse.rse.ui.validators.ISystemValidator;
import org.eclipse.rse.ui.view.SubSystemConfigurationAdapter;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
/**
* This is the property page for changing filters. This page used to be the Change dialog.
* The plugin.xml file registers this for objects of class org.eclipse.rse.internal.filters.SystemFilter or
* org.eclipse.rse.filters.SystemFilterReference.
* This is the property page for changing filters. This page used to be the
* Change dialog. The plugin.xml file registers this for objects of class
* org.eclipse.rse.internal.filters.SystemFilter or
* org.eclipse.rse.filters.SystemFilterReference.
* <p>
* If you have your own change filter dialog (versus configuring ours) you must configure this
* pane yourself by overriding {@link SubSystemConfiguration#customizeChangeFilterPropertyPage(SystemChangeFilterPropertyPage, ISystemFilter, Shell)}
* and configuring the pane as described in that method's javadoc.
* If you have your own change filter dialog (versus configuring ours) you must
* configure this pane yourself by overriding
* {@link SubSystemConfigurationAdapter#customizeChangeFilterPropertyPage(ISubSystemConfiguration, SystemChangeFilterPropertyPage, ISystemFilter, Shell)}
* and configuring the pane as described in that method's javadoc.
*/
public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
implements ISystemPageCompleteListener, ISystemChangeFilterPaneEditPaneSupplier
{
protected String errorMessage;
protected boolean initDone = false;
protected SystemChangeFilterPane changeFilterPane;
protected SystemChangeFilterPane changeFilterPane;
protected SystemFilterStringEditPane editPane;
/**
* Constructor for SystemFilterPropertyPage
*/
@ -83,12 +88,12 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
* provider itself (eg subsystem)
* <p>
* This is passed into the filter and filter string wizards and dialogs in case it is needed
* for context.
* for context.
*/
public void setSystemFilterPoolReferenceManagerProvider(ISystemFilterPoolReferenceManagerProvider provider)
{
changeFilterPane.setSystemFilterPoolReferenceManagerProvider(provider);
}
}
/**
* <i>Configuration method</i><br>
* Set the contextual system filter pool manager provider. Will be non-null if the
@ -96,13 +101,13 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
* provider itself (eg subsystemconfiguration)
* <p>
* This is passed into the filter and filter string wizards and dialogs in case it is needed
* for context.
* for context.
*/
public void setSystemFilterPoolManagerProvider(ISystemFilterPoolManagerProvider provider)
{
changeFilterPane.setSystemFilterPoolManagerProvider(provider);
}
}
/**
* <i>Configuration method</i><br>
* Set the Parent Filter Pool prompt label and tooltip text.
@ -129,7 +134,7 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
changeFilterPane.setListLabel(label, tip);
}
/**
* Set the string to show as the first item in the list.
* Set the string to show as the first item in the list.
* The default is "New filter string"
*/
public void setNewListItemText(String label)
@ -152,7 +157,7 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
}
/**
* <i>Configuration method</i><br>
* Set the error message to use when the user is editing or creating a filter string, and the
* Set the error message to use when the user is editing or creating a filter string, and the
* Apply processing detects a duplicate filter string in the list.
*/
public void setDuplicateFilterStringErrorMessage(SystemMessage msg)
@ -183,9 +188,9 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
{
changeFilterPane.setSupportsMultipleStrings(multi);
}
// OVERRIDABLE METHODS...
/**
* Create the page's GUI contents.
* @see org.eclipse.jface.preference.PreferencePage#createContents(Composite)
@ -196,46 +201,51 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
if (shell == null)
{
System.out.println("Damn, shell is still null!"); //$NON-NLS-1$
}
changeFilterPane.setShell(shell);
ISystemFilter selectedFilter = getFilter();
if (selectedFilter.isPromptable())
{
int nbrColumns = 1;
Composite composite_prompts = SystemWidgetHelpers.createComposite(parent, nbrColumns);
/*Label test =*/ SystemWidgetHelpers.createLabel(composite_prompts, SystemPropertyResources.RESID_TERM_NOTAPPLICABLE, nbrColumns, false);
return composite_prompts;
return composite_prompts;
}
if (getElement() instanceof ISystemFilterReference)
{
ISystemFilterReference filterRef = (ISystemFilterReference)getElement();
changeFilterPane.setSystemFilterPoolReferenceManagerProvider(filterRef.getProvider());
}
changeFilterPane.setSystemFilterPoolManagerProvider(selectedFilter.getProvider());
}
changeFilterPane.setSystemFilterPoolManagerProvider(selectedFilter.getProvider());
ISubSystemConfiguration ssf = SubSystemHelpers.getParentSubSystemConfiguration(selectedFilter);
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)ssf.getAdapter(ISubSystemConfigurationAdapter.class);
if (adapter == null) {
// lazy loading: load adapter if necessary
Platform.getAdapterManager().loadAdapter(ssf, ISubSystemConfigurationAdapter.class.getName());
adapter = (ISubSystemConfigurationAdapter) ssf.getAdapter(ISubSystemConfigurationAdapter.class);
}
adapter.customizeChangeFilterPropertyPage(ssf, this, selectedFilter, shell);
changeFilterPane.setInputObject(getElement());
/*
// ensure the page has no special buttons
noDefaultAndApplyButton();
noDefaultAndApplyButton();
// Inner composite
int nbrColumns = 2;
Composite composite_prompts = SystemWidgetHelpers.createComposite(parent, nbrColumns);
int nbrColumns = 2;
Composite composite_prompts = SystemWidgetHelpers.createComposite(parent, nbrColumns);
Label test = SystemWidgetHelpers.createLabel(composite_prompts, "Testing", nbrColumns);
if (!initDone)
doInitializeFields();
if (!initDone)
doInitializeFields();
return composite_prompts;
*/
return changeFilterPane.createContents(parent);
@ -243,9 +253,9 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
/**
* Intercept of parent so we can reset the default button
*/
protected void contributeButtons(Composite parent)
protected void contributeButtons(Composite parent)
{
super.contributeButtons(parent);
super.contributeButtons(parent);
getShell().setDefaultButton(changeFilterPane.getApplyButton()); // defect 46129
}
@ -255,7 +265,7 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
* Return true if ok, false if there is an error.
*/
protected boolean verifyPageContents()
{
{
return true;
}
@ -270,7 +280,7 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
else
return ((ISystemFilterReference)element).getReferencedFilter();
}
/**
* Called by parent when user presses OK
*/
@ -298,16 +308,16 @@ public class SystemChangeFilterPropertyPage extends SystemBasePropertyPage
//super.setPageComplete(complete);
super.setValid(complete); // we'll see if this is the right thing to do
}
/**
* Return our edit pane. Overriding this is an alternative to calling setEditPane.
* Method is declared in {@link ISystemChangeFilterPaneEditPaneSupplier}.
* Method is declared in {@link ISystemChangeFilterPaneEditPaneSupplier}.
*/
public SystemFilterStringEditPane getFilterStringEditPane(Shell shell)
{
// this method is called from SystemChangeFilterPane via callback
if (editPane == null)
editPane = new SystemFilterStringEditPane(shell);
return editPane;
}
return editPane;
}
}

View file

@ -1,15 +1,15 @@
/********************************************************************************
* Copyright (c) 2002, 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
* 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,
* 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:
* Kevin Doyle (IBM) - [187736] Marked _objectInput stale when new resource created
* Martin Oberhuber (Wind River) - [168975] Move RSE Events API to Core
@ -19,6 +19,7 @@
* Xuan Chen (IBM) - [160775] [api] rename (at least within a zip) blocks UI thread
* David McKnight (IBM) - [224313] [api] Create RSE Events for MOVE and COPY holding both source and destination fields
* David McKnight (IBM) - [225506] [api][breaking] RSE UI leaks non-API types
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.ui.view;
@ -134,14 +135,14 @@ import org.eclipse.ui.views.properties.IPropertyDescriptor;
*/
public class SystemTableView
extends TableViewer
implements IMenuListener,
implements IMenuListener,
ISystemDeleteTarget, ISystemRenameTarget, ISystemSelectAllTarget,
ISystemResourceChangeListener, ISystemRemoteChangeListener,
ISystemShellProvider, ISelectionChangedListener, ISelectionProvider
{
// inner class to support cell editing
// inner class to support cell editing
private ICellModifier cellModifier = new ICellModifier()
{
public Object getValue(Object element, String property)
@ -183,14 +184,14 @@ public class SystemTableView
private class HeaderSelectionListener extends SelectionAdapter
{
public HeaderSelectionListener()
{
_upI = RSEUIPlugin.getDefault().getImage(ISystemIconConstants.ICON_SYSTEM_MOVEUP_ID);
_downI = RSEUIPlugin.getDefault().getImage(ISystemIconConstants.ICON_SYSTEM_MOVEDOWN_ID);
}
/**
* Handles the case of user selecting the
* header area.
@ -220,13 +221,13 @@ public class SystemTableView
{
tcolumn.setImage(_upI);
}
}
}
else
{
setSorter(new SystemTableViewSorter(column, SystemTableView.this, _columnManager));
tcolumn.setImage(_downI);
}
// unset image of other columns
TableColumn[] allColumns = table.getColumns();
for (int i = 0; i < allColumns.length; i++)
@ -264,9 +265,9 @@ public class SystemTableView
// Note the Edit menu actions are set in SystemViewPart. Here we use these
// actions from our own popup menu actions.
private SystemCommonDeleteAction _deleteAction;
// for global delete menu item
// for global delete menu item
private SystemCommonRenameAction _renameAction;
// for common rename menu item
// for common rename menu item
private SystemCommonSelectAllAction _selectAllAction;
// for common Ctrl+A select-all
@ -278,7 +279,7 @@ public class SystemTableView
protected boolean _selectionEnableDeleteAction;
protected boolean _selectionEnableRenameAction;
protected boolean _selectionIsRemoteObject = true;
protected boolean _selectionFlagsUpdated = false;
@ -286,38 +287,38 @@ public class SystemTableView
private int[] _lastWidths = null;
private int _charWidth = 3;
private boolean _showColumns = true;
private Image _upI;
private Image _downI;
protected boolean menuListenerAdded = false;
private static final int LEFT_BUTTON = 1;
private int mouseButtonPressed = LEFT_BUTTON;
private int mouseButtonPressed = LEFT_BUTTON;
/**
* Constructor for the table view
*
*
*/
public SystemTableView(Table table, ISystemMessageLine msgLine)
{
super(table);
_layout = new TableLayout();
_messageLine = msgLine;
_columnManager = new SystemTableViewColumnManager(this);
_provider = getProvider();
_columnSelectionListener = new HeaderSelectionListener();
setContentProvider(_provider);
setLabelProvider(new SystemDecoratingLabelProvider(_provider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
setLabelProvider(new SystemDecoratingLabelProvider(_provider, PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
//setLabelProvider(_provider);
_filter = new SystemTableViewFilter();
addFilter(_filter);
_charWidth = table.getFont().getFontData()[0].getHeight() / 2;
computeLayout();
@ -334,9 +335,9 @@ public class SystemTableView
sr.addSystemRemoteChangeListener(this);
initDragAndDrop();
table.setVisible(false);
// key listening for delete press
getControl().addKeyListener(new KeyAdapter()
{
@ -345,19 +346,19 @@ public class SystemTableView
handleKeyPressed(e);
}
});
getControl().addMouseListener(new MouseAdapter()
getControl().addMouseListener(new MouseAdapter()
{
public void mouseDown(MouseEvent e)
public void mouseDown(MouseEvent e)
{
mouseButtonPressed = e.button; //d40615
mouseButtonPressed = e.button; //d40615
}
});
});
_upI = RSEUIPlugin.getDefault().getImage(ISystemIconConstants.ICON_SYSTEM_ARROW_UP_ID);
_downI = RSEUIPlugin.getDefault().getImage(ISystemIconConstants.ICON_SYSTEM_ARROW_DOWN_ID);
}
protected SystemTableViewProvider getProvider()
{
if (_provider == null)
@ -366,12 +367,12 @@ public class SystemTableView
}
return _provider;
}
public void showColumns(boolean flag)
{
_showColumns = flag;
}
public Layout getLayout()
{
@ -441,7 +442,7 @@ public class SystemTableView
}
/**
* Convenience method for retrieving the view adapter for an object
* Convenience method for retrieving the view adapter for an object
*/
protected ISystemViewElementAdapter getViewAdapter(Object obj)
{
@ -452,7 +453,7 @@ public class SystemTableView
}
/**
* Convenience method for retrieving the view adapter for an object's children
* Convenience method for retrieving the view adapter for an object's children
*/
public ISystemViewElementAdapter getAdapterForContents()
{
@ -475,9 +476,9 @@ public class SystemTableView
Object[] children = provider.getChildren(object);
return getVisibleDescriptors(children);
}
private IPropertyDescriptor[] getVisibleDescriptors(Object[] children)
{
{
if (children != null && children.length > 0)
{
IAdaptable child = (IAdaptable) children[0];
@ -491,14 +492,14 @@ public class SystemTableView
{
return _columnManager;
}
public IPropertyDescriptor getNameDescriptor(Object object)
{
SystemTableViewProvider provider = (SystemTableViewProvider) getContentProvider();
Object[] children = provider.getChildren(object);
return getNameDescriptor(children);
}
private IPropertyDescriptor getNameDescriptor(Object[] children)
{
if (children != null && children.length > 0)
@ -519,7 +520,7 @@ public class SystemTableView
Object[] children = provider.getChildren(_objectInput);
return getFormatsIn(children);
}
private IPropertyDescriptor[] getCustomDescriptors(ISystemViewElementAdapter adapter)
{
return _columnManager.getVisibleDescriptors(adapter);
@ -538,7 +539,7 @@ public class SystemTableView
{
ISystemViewElementAdapter ad = (ISystemViewElementAdapter) adapter;
ad.setPropertySourceInput(child);
IPropertyDescriptor[] descriptors = getCustomDescriptors(ad);
for (int i = 0; i < descriptors.length; i++)
{
@ -547,9 +548,17 @@ public class SystemTableView
try
{
Object key = descriptor.getId();
Object propertyValue = ad.getPropertyValue(key, false);
results.add(propertyValue.getClass());
if (propertyValue != null) {
// FIXME Since we're only checking the FIRST element
// in the list of elements for its descriptor, we
// might get null here if the first element is
// invalid - although other elements might be valid.
// This issue is tracked in
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193329#c5
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=187571
results.add(propertyValue.getClass());
}
}
catch (Exception e)
{
@ -561,7 +570,7 @@ public class SystemTableView
}
return results;
}
}
public void computeLayout()
{
@ -578,7 +587,7 @@ public class SystemTableView
return editor;
}
private boolean sameDescriptors(IPropertyDescriptor[] descriptors1, IPropertyDescriptor[] descriptors2)
{
if (descriptors1 == null || descriptors2 == null)
@ -603,7 +612,7 @@ public class SystemTableView
/**
* Determines what columns should be shown in this view. The columns may change
* anytime the view input changes. The columns in the control are modified and
* columns may be added or deleted as necessary to make it conform to the
* columns may be added or deleted as necessary to make it conform to the
* new data.
*/
public void computeLayout(boolean force)
@ -612,7 +621,7 @@ public class SystemTableView
return;
if (_objectInput == null)
return;
SystemTableViewProvider provider = (SystemTableViewProvider) getContentProvider();
Object[] children = provider.getChildren(_objectInput);
@ -621,17 +630,17 @@ public class SystemTableView
{
return;
}
IPropertyDescriptor[] descriptors = getVisibleDescriptors(children);
IPropertyDescriptor nameDescriptor = getNameDescriptor(children);
int n = descriptors.length; // number of columns we need (name column + other columns)
if (nameDescriptor != null)
n += 1;
if (n == 0)
return; // there is nothing to lay out!
if (sameDescriptors(descriptors,_uniqueDescriptors) && !force)
{
setLastColumnWidths(getCurrentColumnWidths());
@ -660,7 +669,7 @@ public class SystemTableView
int alignment = SWT.LEFT;
int weight = 100;
if (i == 0)
{
{
// this is the first column -- treat it special
//name = SystemPropertyResources.RESID_PROPERTY_NAME_LABEL;
name = SystemResources.RESID_RENAME_COLHDG_OLDNAME;
@ -725,15 +734,15 @@ public class SystemTableView
// find a default
totalWidth = 500;
}
int[] lastWidths = getLastColumnWidths();
if (numColumns > 1)
{
// check if previous widths can be used
// check if previous widths can be used
if (lastWidths != null && lastWidths.length == numColumns)
{
// use previously established widths
setCurrentColumnWidths(lastWidths);
}
@ -749,7 +758,7 @@ public class SystemTableView
columns[0].setWidth(firstWidth);
for (int i = 1; i < numColumns; i++)
{
columns[i].setWidth(averageWidth);
}
setLastColumnWidths(getCurrentColumnWidths());
@ -758,23 +767,23 @@ public class SystemTableView
table.setHeaderVisible(true);
}
else
{
if (numColumns == 1)
{
{
if (numColumns == 1)
{
int width = totalWidth;
if (lastWidths != null && lastWidths.length == 1)
{
width = (totalWidth > lastWidths[0]) ? totalWidth : lastWidths[0];
}
int maxWidth = provider.getMaxCharsInColumnZero() * _charWidth;
if (maxWidth > width)
{
width = maxWidth;
}
if (width > 0)
{
columns[0].setWidth(width);
@ -826,27 +835,27 @@ public class SystemTableView
/**
* Initialize drag and drop support for this view.
*
*/
protected void initDragAndDrop()
*
*/
protected void initDragAndDrop()
{
int ops = DND.DROP_COPY | DND.DROP_MOVE;
Transfer[] dragtransfers = new Transfer[]
{ PluginTransfer.getInstance(),
Transfer[] dragtransfers = new Transfer[]
{ PluginTransfer.getInstance(),
EditorInputTransfer.getInstance()
};
Transfer[] droptransfers = new Transfer[]
{ PluginTransfer.getInstance(),
};
Transfer[] droptransfers = new Transfer[]
{ PluginTransfer.getInstance(),
FileTransfer.getInstance(),
EditorInputTransfer.getInstance()
};
};
addDragSupport(ops | DND.DROP_DEFAULT, dragtransfers, new SystemViewDataDragAdapter(this));
addDropSupport(ops | DND.DROP_DEFAULT, droptransfers, new SystemViewDataDropAdapter(this));
}
/**
/**
* Used to asynchronously update the view whenever properties change.
* @see org.eclipse.rse.core.events.ISystemResourceChangeListener#systemResourceChanged(org.eclipse.rse.core.events.ISystemResourceChangeEvent)
*/
@ -868,7 +877,7 @@ public class SystemTableView
if (child == ((ISystemFilterReference)_objectInput).getReferencedFilter())
{
SystemTableViewProvider provider = (SystemTableViewProvider) getContentProvider();
if (provider != null)
{
if (!madeChange)
@ -876,7 +885,7 @@ public class SystemTableView
provider.flushCache();
madeChange = true;
}
computeLayout();
try
{
@ -889,7 +898,7 @@ public class SystemTableView
}
}
}
}
}
break;
case ISystemResourceChangeEvents.EVENT_PROPERTY_CHANGE :
@ -900,19 +909,19 @@ public class SystemTableView
{
Widget w = findItem(child);
if (w != null)
{
{
updateItem(w, child);
}
}
catch (Exception e)
{
}
}
return;
//break;
case ISystemResourceChangeEvents.EVENT_DELETE:
case ISystemResourceChangeEvents.EVENT_DELETE:
case ISystemResourceChangeEvents.EVENT_DELETE_MANY:
{
if (child instanceof ISystemFilterReference)
@ -921,11 +930,11 @@ public class SystemTableView
if (w != null)
{
remove(child);
}
}
}
}
break;
break;
case ISystemResourceChangeEvents.EVENT_ADD :
case ISystemResourceChangeEvents.EVENT_ADD_RELATIVE :
{
@ -948,7 +957,7 @@ public class SystemTableView
}
}
break;
case ISystemResourceChangeEvents.EVENT_REFRESH:
case ISystemResourceChangeEvents.EVENT_REFRESH_REMOTE:
{
@ -962,9 +971,9 @@ public class SystemTableView
{
Widget w = findItem(child);
if (w != null && w.getData() != _objectInput)
{
{
//child is the children of this table input.
//Need to refresh the whole view to handler
//Need to refresh the whole view to handler
//And we need to make _objectInput to stale, otherwise deleted object
//could not be removed from the table.
if (_objectInput instanceof ISystemContainer)
@ -978,7 +987,7 @@ public class SystemTableView
{
SystemBasePlugin.logError(e.getMessage());
}
}
break;
default :
@ -993,8 +1002,8 @@ public class SystemTableView
if (provider != null)
{
if (!madeChange)
{
provider.flushCache();
{
provider.flushCache();
madeChange = true;
}
@ -1023,7 +1032,7 @@ public class SystemTableView
Object remoteResourceParent = event.getResourceParent();
Object remoteResource = event.getResource();
List remoteResourceNames = null;
if (remoteResource instanceof List) {
if (remoteResource instanceof List) {
remoteResourceNames = (List) remoteResource;
remoteResource = remoteResourceNames.get(0);
}
@ -1040,7 +1049,7 @@ public class SystemTableView
refresh();
return;
}
switch (eventType)
{
// --------------------------
@ -1123,7 +1132,7 @@ public class SystemTableView
{
((ISystemContainer)_objectInput).markStale(true);
}
provider.flushCache();
madeChange = true;
@ -1200,10 +1209,10 @@ public class SystemTableView
{
provider.flushCache();
}
refresh();
}
}
break;
*/
@ -1232,19 +1241,19 @@ public class SystemTableView
public void selectionChanged(SelectionChangedEvent event)
{
IStructuredSelection sel = (IStructuredSelection)event.getSelection();
IStructuredSelection sel = (IStructuredSelection)event.getSelection();
Object firstSelection = sel.getFirstElement();
if (firstSelection == null)
return;
_selectionFlagsUpdated = false;
ISystemViewElementAdapter adapter = getViewAdapter(firstSelection);
if (adapter != null)
{
displayMessage(adapter.getStatusLineText(firstSelection));
if ((mouseButtonPressed == LEFT_BUTTON))
adapter.selectionChanged(firstSelection);
}
if ((mouseButtonPressed == LEFT_BUTTON))
adapter.selectionChanged(firstSelection);
}
else
clearMessage();
}
@ -1282,7 +1291,7 @@ public class SystemTableView
* Everything below is basically stuff copied and pasted from SystemsView
* -There needs to be cleaning up of the below code as some of this stuff
* is broken for the table view
*
*
*
public void createStandardGroups(IMenuManager menu)
{
@ -1315,7 +1324,7 @@ public class SystemTableView
menu.add(new Separator(ISystemContextMenuConstants.GROUP_REORGANIZE));
// rename,move,copy,delete,bookmark,refactoring
menu.add(new Separator(ISystemContextMenuConstants.GROUP_REORDER));
// move up, move down
// move up, move down
menu.add(new GroupMarker(ISystemContextMenuConstants.GROUP_GENERATE));
// getters/setters, etc. Typically in editor
menu.add(new Separator(ISystemContextMenuConstants.GROUP_SEARCH));
@ -1346,7 +1355,7 @@ public class SystemTableView
if (_propertyDialogAction == null)
{
_propertyDialogAction = new PropertyDialogAction(new SameShellProvider(getShell()), this);
//propertyDialogAction.setToolTipText(" ");
//propertyDialogAction.setToolTipText(" ");
}
_propertyDialogAction.selectionChanged(getSelection());
return _propertyDialogAction;
@ -1447,7 +1456,7 @@ public class SystemTableView
}
/**
* Required method from ISystemDeleteTarget
* Decides whether to enable the delete menu item.
* Decides whether to enable the delete menu item.
* Assumes scanSelections() has already been called
*/
public boolean canDelete()
@ -1515,7 +1524,7 @@ public class SystemTableView
return ok;
}
/**
* Decides whether to even show the properties menu item.
* Assumes scanSelections() has already been called
@ -1523,7 +1532,7 @@ public class SystemTableView
protected boolean showProperties() {
return _selectionShowPropertiesAction;
}
// ---------------------------
// ISYSTEMRENAMETARGET METHODS
// ---------------------------
@ -1551,7 +1560,7 @@ public class SystemTableView
setUser(true);
}
public IStatus runInWorkspace(IProgressMonitor monitor)
public IStatus runInWorkspace(IProgressMonitor monitor)
{
ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry();
Object element = null;
@ -1561,7 +1570,7 @@ public class SystemTableView
String oldName = null;
Vector fileNamesRenamed = new Vector();
boolean ok = true;
try {
int steps = elements.length;
monitor.beginTask(renameMessage, steps);
@ -1571,21 +1580,21 @@ public class SystemTableView
adapter = (ISystemViewElementAdapter)elementAdapters[i];
remoteAdapter = getRemoteAdapter(element);
Object parentElement = getParentForContent(element);
if (remoteAdapter != null)
if (remoteAdapter != null)
{
oldName = remoteAdapter.getName(element);
oldFullName = remoteAdapter.getAbsoluteName(element); // pre-rename
monitor.subTask(getRenamingMessage(oldName).getLevelOneText());
}
ok = adapter.doRename(null, element, newNames[i], monitor);
if (ok)
if (ok)
{
fileNamesRenamed.add(oldName);
if (remoteAdapter != null)
{
// Don't think we need to do findItem and updateItem here.
sr.fireRemoteResourceChangeEvent(ISystemRemoteChangeEvents.SYSTEM_REMOTE_RESOURCE_RENAMED, element, parentElement, adapter.getSubSystem(element), new String[]{oldFullName}, this);
}
else
@ -1593,7 +1602,7 @@ public class SystemTableView
}
monitor.worked(1);
}
}
}
catch (SystemMessageException exc) {
ok = false;
//If this operation is canceled, need to display a proper message to the user.
@ -1620,7 +1629,7 @@ public class SystemTableView
exc);
ok = false;
}
return Status.OK_STATUS;
}
}
@ -1637,7 +1646,7 @@ public class SystemTableView
}
/**
* Required method from ISystemRenameTarget
* Decides whether to enable the rename menu item.
* Decides whether to enable the rename menu item.
* Assumes scanSelections() has already been called
*/
public boolean canRename()
@ -1648,32 +1657,32 @@ public class SystemTableView
}
// default implementation
// in default table, parent is input
// in default table, parent is input
protected Object getParentForContent(Object element)
{
return _objectInput;
}
/**
* Get the specific "Renaming %1..."
* Get the specific "Renaming %1..."
*/
protected SystemMessage getRenamingMessage(String oldName)
{
SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_RENAMEGENERIC_PROGRESS);
SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_RENAMEGENERIC_PROGRESS);
msg.makeSubstitution(oldName);
return msg;
}
/**
* Required method from ISystemRenameTarget
*/
public boolean doRename(String[] newNames)
{
IStructuredSelection selection = (IStructuredSelection) getSelection();
Iterator elements = selection.iterator();
Object[] renameElements = new Object[newNames.length];
Object[] elementAdapters = new Object[newNames.length];
int i = 0;
@ -1689,7 +1698,7 @@ public class SystemTableView
RenameJob renameJob = new RenameJob(newNames, renameElements, elementAdapters, renameMessageText);
renameJob.schedule();
return true;
}
/**
@ -1707,7 +1716,7 @@ public class SystemTableView
((ISystemViewElementAdapter) adapter).setViewer(this);
return adapter;
}
/**
* Return true if select all should be enabled for the given object.
@ -1720,9 +1729,9 @@ public class SystemTableView
}
/**
* When this action is run via Edit->Select All or via Ctrl+A, perform the
* select all action. For a tree view, this should select all the children
* select all action. For a tree view, this should select all the children
* of the given selected object. You can use the passed in selected object
* or ignore it and query the selected object yourself.
* or ignore it and query the selected object yourself.
*/
public void doSelectAll(IStructuredSelection selection)
{
@ -1739,9 +1748,9 @@ public class SystemTableView
public void menuAboutToShow(IMenuManager manager)
{
SystemView.createStandardGroups(manager);
fillContextMenu(manager);
if (!menuListenerAdded)
{
if (manager instanceof MenuManager)
@ -1794,7 +1803,7 @@ public class SystemTableView
menu.appendToGroup(ISystemContextMenuConstants.GROUP_REORGANIZE, getRenameAction());
}
// ADAPTER SPECIFIC ACTIONS
// ADAPTER SPECIFIC ACTIONS
SystemMenuManager ourMenu = new SystemMenuManager(menu);
Iterator elements = selection.iterator();
@ -1817,7 +1826,7 @@ public class SystemTableView
AbstractSystemViewAdapter aVA = (AbstractSystemViewAdapter)nextAdapter;
// add remote actions
aVA.addCommonRemoteActions(ourMenu, selection, shell, ISystemContextMenuConstants.GROUP_ADAPTERS);
// add dynamic menu popups
aVA.addDynamicPopupMenuActions(ourMenu, selection, shell, ISystemContextMenuConstants.GROUP_ADDITIONS);
}
@ -1830,7 +1839,7 @@ public class SystemTableView
if ((items[idx] instanceof ActionContributionItem) && (((ActionContributionItem) items[idx]).getAction() instanceof ISystemAction))
{
ISystemAction item = (ISystemAction) (((ActionContributionItem) items[idx]).getAction());
//item.setShell(getShell());
//item.setShell(getShell());
//item.setSelection(selection);
//item.setViewer(this);
item.setInputs(getShell(), this, selection);
@ -1839,8 +1848,8 @@ public class SystemTableView
{
SystemSubMenuManager item = (SystemSubMenuManager) items[idx];
//item.setShell(getShell());
//item.setSelection(selection);
//item.setViewer(this);
//item.setSelection(selection);
//item.setViewer(this);
item.setInputs(getShell(), this, selection);
}
}
@ -1857,7 +1866,7 @@ public class SystemTableView
// PROPERTIES ACTION...
// This is supplied by the system, so we pretty much get it for free. It finds the
// registered propertyPages extension points registered for the selected object's class type.
//propertyDialogAction.selectionChanged(selection);
//propertyDialogAction.selectionChanged(selection);
if (showProperties())
{
@ -1867,7 +1876,7 @@ public class SystemTableView
menu.appendToGroup(ISystemContextMenuConstants.GROUP_PROPERTIES, pdAction);
}
}
// OPEN IN NEW PERSPECTIVE ACTION... if (fromSystemViewPart && showOpenViewActions())
if (!_selectionIsRemoteObject)
{
@ -1927,7 +1936,7 @@ public class SystemTableView
if (_selectionShowRenameAction)
_selectionShowRenameAction = adapter.showRename(element);
if (_selectionShowPropertiesAction)
_selectionShowPropertiesAction = adapter.showProperties(element);
@ -2004,7 +2013,7 @@ public class SystemTableView
*/
}
}
/**
* Display a message/status on the message/status line
*/
@ -2022,5 +2031,5 @@ public class SystemTableView
_messageLine.clearMessage();
}
}

View file

@ -1,26 +1,27 @@
/********************************************************************************
* Copyright (c) 2000, 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
* 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,
* 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:
* Uwe Stieber (Wind River) - Reworked new connection wizard extension point.
* Martin Oberhuber (Wind River) - [168975] Move RSE Events API to Core
* Martin Oberhuber (Wind River) - [184095] Replace systemTypeName by IRSESystemType
* Martin Oberhuber (Wind River) - [186640] Add IRSESystemType.testProperty()
* Martin Oberhuber (Wind River) - [186640] Add IRSESystemType.testProperty()
* Martin Oberhuber (Wind River) - [186748] Move ISubSystemConfigurationAdapter from UI/rse.core.subsystems.util
* Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry
* Martin Oberhuber (Wind River) - [175680] Deprecate obsolete ISystemRegistry methods
* Uwe Stieber (Wind River) - [192202] Default RSE new connection wizard does not allow to query created host instance anymore
* Martin Oberhuber (Wind River) - [cleanup] Avoid using SystemStartHere in production code
* David Dykstal (IBM) - [168976][api] move ISystemNewConnectionWizardPage from core to UI
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.ui.wizards.newconnection;
@ -33,6 +34,7 @@ import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
@ -70,7 +72,7 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
private ISystemProfile privateProfile = null;
private IHost selectedContext = null;
private static String lastProfile = null;
private IHost createdHost = null;
private IHost createdHost = null;
/**
* Constructor.
@ -90,7 +92,7 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
*/
public void dispose() {
super.dispose();
mainPage = null;
subsystemConfigurationSuppliedWizardPages = null;
ssfWizardPagesPerSystemType.clear();
@ -115,7 +117,7 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
subsystemConfigurationSuppliedWizardPages = getAdditionalWizardPages(systemType);
}
}
/**
* Creates the wizard pages. This method is an override from the parent Wizard class.
*/
@ -123,9 +125,9 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
try {
// reset the remembered created host instance
createdHost = null;
mainPage = createMainPage(getSystemType());
SystemConnectionForm form = mainPage.getSystemConnectionForm();
if (form != null) {
form.setCurrentlySelectedConnection(selectedContext);
@ -137,10 +139,10 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
// there had been a default connection name explicitly set from outside.
if (defaultConnectionName != null) form.setConnectionName(defaultConnectionName);
else form.setConnectionName(""); //$NON-NLS-1$
if (defaultHostName != null) form.setHostName(defaultHostName);
}
if (mainPage != null && getSystemType() != null) mainPage.setSystemType(getSystemType());
updateDefaultSelectedProfile();
@ -188,12 +190,12 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
/**
* Calculates the default profile name to propose on the default new
* connection wizard main page.
*
*
* <pre>
* Expected order of default profile selection:
* 1. If a connection is selected, the default profile is the one from the connection.
* 2. If the wizard remembered the last profile and this last remembered profile is still
* available and active, the remembered last profile is the default profile.
* available and active, the remembered last profile is the default profile.
* 3. If the default private system profile is availabe and active, the default private system profile
* is the default profile.
* 4. The first non-empty profile from the list of active profiles is the default profile.
@ -207,7 +209,7 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
List profileNames = activeProfileNames != null ? Arrays.asList(activeProfileNames) : new ArrayList();
mainPage.getSystemConnectionForm().setProfileNames(activeProfileNames);
// 1. If a connection is selected, the default profile is the one from the connection.
String defaultProfileName = selectedContext != null ? selectedContext.getSystemProfileName() : null;
if (defaultProfileName == null || !profileNames.contains(defaultProfileName)) {
@ -222,7 +224,7 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
if (defaultPrivateProfile != null) defaultProfileName = defaultPrivateProfile.getName();
if (defaultProfileName == null || !profileNames.contains(defaultProfileName)) {
// 4. The first non-empty profile from the list of active profiles is the default profile.
// Note: The profile names get normalized within the constructor.
// Note: The profile names get normalized within the constructor.
if (profileNames.size() > 0) defaultProfileName = (String)profileNames.get(0);
}
}
@ -236,9 +238,9 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
if (selectedContext == null || !defaultProfileName.equals(selectedContext.getSystemProfileName()))
lastProfile = defaultProfileName;
}
}
/**
* Set the currently selected context. Used to better default entry fields.
*/
@ -376,17 +378,17 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
/**
* Returns the create host instance once the user pressed finished. The created
* host instance will be reset to <code>null</code> once the wizard got disposed.
*
*
* @return The created host instance or <code>null</code>.
*/
public IHost getCreatedHost() {
return createdHost;
}
/**
* Private method to get all the wizard pages from all the subsystem factories, given a
* system type.
*
*
* @param systemType The system type to query the additional subsystem service pages for. Must be not <code>null</code>.
*/
private ISystemNewConnectionWizardPage[] getAdditionalWizardPages(IRSESystemType systemType) {
@ -400,6 +402,14 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
ISubSystemConfiguration[] factories = sr.getSubSystemConfigurationsBySystemType(systemType, true);
for (int idx = 0; idx < factories.length; idx++) {
ISubSystemConfigurationAdapter adapter = (ISubSystemConfigurationAdapter)factories[idx].getAdapter(ISubSystemConfigurationAdapter.class);
if (adapter == null) {
// try to activate bundle - FIXME should perhaps be done
// earlier in the action that shows the wizard dialog?
// And, is it really necessary to get the wizard pages that
// early already?
Platform.getAdapterManager().loadAdapter(factories[idx], ISubSystemConfigurationAdapter.class.getName());
adapter = (ISubSystemConfigurationAdapter) factories[idx].getAdapter(ISubSystemConfigurationAdapter.class);
}
ISystemNewConnectionWizardPage[] pages = adapter.getNewConnectionWizardPages(factories[idx], this);
if (pages != null) {
@ -418,7 +428,7 @@ public class RSEDefaultNewConnectionWizard extends RSEAbstractNewConnectionWizar
}
/**
* Return true if there are additional pages. This decides whether to enable the Next button
* Return true if there are additional pages. This decides whether to enable the Next button
* on the main page
*/
protected boolean hasAdditionalPages() {

View file

@ -3,13 +3,13 @@
* 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) - 141803: Fix cpu usage 100% while connecting
* David Dykstal (IBM) - 168870: moved SystemPreferencesManager to a new package
@ -35,6 +35,7 @@
* David McKnight (IBM) - [220309] [nls] Some GenericMessages and SubSystemResources should move from UI to Core
* David McKnight (IBM) - [220547] [api][breaking] SimpleSystemMessage needs to specify a message id and some messages should be shared
* David Dykstal (IBM) - [225089][ssh][shells][api] Canceling connection leads to exception
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
********************************************************************************/
package org.eclipse.rse.core.subsystems;
@ -137,14 +138,12 @@ import org.eclipse.ui.progress.WorkbenchJob;
* <li>{@link #internalGetProperties(Object subject, String[] keys, IProgressMonitor monitor)}
* <li>{@link #internalSetProperties(Object subject, String[] keys, String[] values, IProgressMonitor monitor)}
* </ul>
*
*
*/
public abstract class SubSystem extends RSEModelObject
implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
{
protected static final String SUBSYSTEM_FILE_NAME = "subsystem"; //$NON-NLS-1$
//protected transient SubSystemConfiguration parentFactory = null;
@ -182,11 +181,12 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
protected IHost _host;
protected String _name = null;
protected String _subsystemConfigurationId = null;
protected boolean _hidden = false;
private boolean _isInitialized = false;
/**
* @generated This field/method will be replaced during code generation.
@ -495,7 +495,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
/*
* (non-Javadoc)
*
*
* @see org.eclipse.rse.core.subsystems.ISubSystem#checkIsConnected(org.eclipse.core.runtime.IProgressMonitor)
*/
public void checkIsConnected(IProgressMonitor monitor) throws SystemMessageException
@ -806,7 +806,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
* when they do not find a reference for the key themselves.
* </p>
* @see org.eclipse.rse.core.subsystems.IRemoteObjectResolver#getObjectWithAbsoluteName(String, IProgressMonitor)
*
*
* @param key the unique id of the remote object.
* Must not be <code>null</code>.
* @param monitor the progress monitor
@ -2007,13 +2007,23 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
return false;
}
/**
* Return the children of this subsystem, to populate the GUI subtree of this subsystem.
* By default, this method:
* Return the children of this subsystem, to populate the GUI subtree of
* this subsystem. By default, this method:
* <ul>
* <li>Returns the filter pool references of this subsystem, if supportsFilters() is true for our factory.
* <li>If supportsFilters() is false from our factory, returns null
* <li>Returns the filter pool references of this subsystem, if
* supportsFilters() is true for our factory.
* <li>If supportsFilters() is false from our factory, returns null
* </ul>
* So, be sure to override this method IF you do not support filters.
*
* Lazy Loading: Note that if your subsystem does not support connecting,
* and you do not support filters, here is a good point to ensure that the
* bundles which declare your UI adapters get loaded, since the default code
* which overriders usually place in
* {@link #initializeSubSystem(IProgressMonitor)} is not called in that
* case. Similarly, if your subsystem declares custom images for filters or
* filter pools, overriding the getChildren() call here to first load your
* filter adapters and THEN super.getChildren() is a good idea.
*/
public Object[] getChildren()
{
@ -2073,7 +2083,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
/**
* Resolve an <i>absolute</i> filter string.
*
*
* This is only applicable if the subsystem
* factory reports true for {@link org.eclipse.rse.core.subsystems.SubSystemConfiguration#supportsFilters()},
* which is the default. Otherwise, {@link org.eclipse.rse.core.subsystems.SubSystem#getChildren()}
@ -2112,6 +2122,10 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
if (isConnected())
{
if (!supportsConnecting && !_isInitialized) {
// Lazy Loading: Load adapters (e.g. Local Subsystem)
initializeSubSystem(monitor);
}
Object[] results = internalResolveFilterString(filterString, monitor);
if (sortResults && (results!=null))
results = sortResolvedFilterStringObjects(results);
@ -2149,6 +2163,10 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
}
if (isConnected())
{
if (!supportsConnecting && !_isInitialized) {
// Lazy Loading: Load adapters (e.g. Local Subsystem)
initializeSubSystem(monitor);
}
Object[] results = internalResolveFilterStrings(filterStrings, monitor);
if (sortResults && (results!=null))
results = sortResolvedFilterStringObjects(results);
@ -2197,6 +2215,10 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
{
if (isConnected())
{
if (!supportsConnecting && !_isInitialized) {
// Lazy Loading: Load adapters (e.g. Local Subsystem)
initializeSubSystem(monitor);
}
Object[] results= internalResolveFilterString(parent, filterString, monitor);
if (sortResults && (results!=null))
results = sortResolvedFilterStringObjects(results);
@ -2226,7 +2248,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
* @param key Identifies property to set
* @param value Value to set property to
* @return Object interpretable by subsystem. Might be a Boolean, or the might be new value for confirmation.
*
*
* @deprecated this shouldn't be used
*/
public Object setProperty(Object subject, String key, String value)
@ -2242,7 +2264,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
* @param subject Identifies which object to get the properties of
* @param key Identifies property to get value of
* @return String The value of the requested key.
*
*
* @deprecated this shouldn't be used
*/
public String getProperty(Object subject, String key)
@ -2259,7 +2281,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
* @param keys the array of propertie keys to set.
* @param values the array of values to set. The value at a certain index corresponds to the property key at the same index.
* @return Object interpretable by subsystem. Might be a Boolean, or the might be new values for confirmation.
*
*
* @deprecated this shouldn't be used
*/
public Object setProperties(Object subject, String[] keys, String[] values)
@ -2269,26 +2291,37 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
}
/**
* Initialize this subsystem instance after the corresponding {@link IConnectorService} connect method finishes.
* This method should be overridden if any initialization for the subsystem needs
* to occur at this time
* <p> The default implementation currently does nothing, but overriding methods should call super.
* @param monitor a monitor that can be used to show progress or provide cancellation.
* Initialize this subsystem instance after the corresponding
* {@link IConnectorService} connect method finishes. This method should be
* overridden if any initialization for the subsystem needs to occur at this
* time.
* <p>
* The default implementation currently does nothing, but overriding methods
* should call super before doing any other work.
*
* @param monitor a progress monitor that can be used to show progress
* during long-running operation. Cancellation is typically not
* supported since it might leave the system in an inconsistent
* state.
*/
public void initializeSubSystem(IProgressMonitor monitor) {
_isInitialized = true;
}
/**
* Uninitialize this subsystem just after disconnect.
* The default implementation currently does nothing.
* Overriding methods should call super.
* @param monitor a progress monitor that can be used to show uninitialization progress can provide cancellation.
* Uninitialize this subsystem just after disconnect. The default
* implementation currently does nothing. Overriding methods should call
* super after doing their own work.
*
* @param monitor a progress monitor that can be used to show progress
* during long-running operation. Cancellation is typically not
* supported since it might leave the system in an inconsistent
* state.
*/
public void uninitializeSubSystem(IProgressMonitor monitor) {
_isInitialized = false;
}
/*
* Connect to a remote system with a monitor.
* Required for Bug 176603
@ -2441,7 +2474,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
* displaying for you.
* <p>
* Override internalDisconnect if you want, but by default it calls getSystem().disconnect(IProgressMonitor).
*
*
*/
public void disconnect() throws Exception
{
@ -2454,7 +2487,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
* displaying for you.
* <p>
* Override internalDisconnect if you want, but by default it calls getSystem().disconnect(IProgressMonitor).
*
*
* @param collapseTree collapse the tree in the system view
*/
public void disconnect(boolean collapseTree) throws Exception
@ -2497,7 +2530,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
* @param subject Identifies which object to get the properties of
* @param keys the array of property keys.
* @return the values for the given property keys.
*
*
* @deprecated this shouldn't be used
*/
public String[] getProperties(Object subject, String[] keys)
@ -2511,7 +2544,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
* Return the {@link org.eclipse.rse.core.subsystems.IConnectorService IConnectorService} object that represents the live connection for this system.
* This must return an object that implements {@link IConnectorService}. A good starting point for that
* is the base class {@link AbstractConnectorService}.
*
*
* The connector service gets passed in to the constructor for the subsystem so there's normally no reason
* to override this method.
*
@ -2523,7 +2556,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
/**
* Sets the {@link org.eclipse.rse.core.subsystems.IConnectorService IConnectorService} object that represents the live connection for this system.
*
*
* @param connectorService the connector service
*/
public void setConnectorService(IConnectorService connectorService)
@ -2558,7 +2591,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
/**
* Return the CacheManager for this subsystem. This is the default implementation
* which just returns null.
*
*
* @see #supportsCaching()
*/
public ICacheManager getCacheManager()
@ -2577,7 +2610,7 @@ implements IAdaptable, ISubSystem, ISystemFilterPoolReferenceManagerProvider
* - well, actually you can throw anything and we'll wrap it here in an InvocationTargetException
* <li>do not worry about calling monitor.done() ... caller will do that.
* </ul>
*
*
*/
private void internalConnect(IProgressMonitor monitor)
throws InvocationTargetException, OperationCanceledException

View file

@ -1,14 +1,15 @@
/*******************************************************************************
* Copyright (c) 2006, 2007 Wind River Systems, Inc. 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
*
* Contributors:
* Copyright (c) 2006, 2008 Wind River Systems, Inc. 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
*
* Contributors:
* Tobias Schwarz (Wind River) - initial API and implementation
* Martin Oberhuber (Wind River) - [182454] improve getAbsoluteName() documentation
* Martin Oberhuber (Wind River) - [186128][refactoring] Move IProgressMonitor last in public base classes
* Martin Oberhuber (Wind River) - [186128][refactoring] Move IProgressMonitor last in public base classes
* Martin Oberhuber (Wind River) - [218304] Improve deferred adapter loading
*******************************************************************************/
package org.eclipse.rse.tests.internal.testsubsystem;
@ -26,8 +27,8 @@ import org.eclipse.rse.tests.testsubsystem.interfaces.ITestSubSystemNode;
import org.eclipse.rse.tests.testsubsystem.interfaces.ITestSubSystemNodeContainer;
/**
* Simple test subsystem with branches and leafes.
* Further childs can be added or removed via context menu actions.
* Simple test subsystem with branches and leaves. Further children can be added
* or removed via context menu actions.
*/
public class TestSubSystem extends SubSystem implements ITestSubSystem {
@ -35,8 +36,9 @@ public class TestSubSystem extends SubSystem implements ITestSubSystem {
/**
* Constructor.
* @param host
* @param connectorService
*
* @param host the host to connect
* @param connectorService connector service to use
*/
public TestSubSystem(IHost host, IConnectorService connectorService) {
super(host, connectorService);
@ -45,7 +47,8 @@ public class TestSubSystem extends SubSystem implements ITestSubSystem {
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#initializeSubSystem(org.eclipse.core.runtime.IProgressMonitor)
*/
public void initializeSubSystem(IProgressMonitor monitor) {
public void initializeSubSystem(IProgressMonitor monitor) {
super.initializeSubSystem(monitor);
TestSubSystemContainerNode parent0 = new TestSubSystemContainerNode("0"); //$NON-NLS-1$
TestSubSystemContainerNode child0 = new TestSubSystemContainerNode("0:0"); //$NON-NLS-1$
parent0.addChildNode(child0);
@ -63,19 +66,20 @@ public class TestSubSystem extends SubSystem implements ITestSubSystem {
*/
public void uninitializeSubSystem(IProgressMonitor monitor) {
fChildren.clear();
super.uninitializeSubSystem(monitor);
}
/* (non-Javadoc)
* @see org.eclipse.rse.core.subsystems.SubSystem#getObjectWithAbsoluteName(java.lang.String)
*/
public Object getObjectWithAbsoluteName(String key) throws Exception {
public Object getObjectWithAbsoluteName(String key, IProgressMonitor monitor) throws Exception {
ITestSubSystemNode[] childs = getChildNodes();
for (int i = 0; i < childs.length; i++) {
if (childs[i].getName().equalsIgnoreCase(key)) {
return childs[i];
}
}
return super.getObjectWithAbsoluteName(key);
return super.getObjectWithAbsoluteName(key, monitor);
}
/* (non-Javadoc)