diff options
author | David Dykstal | 2008-02-05 18:33:54 +0000 |
---|---|---|
committer | David Dykstal | 2008-02-05 18:33:54 +0000 |
commit | 1464adb94f9e0639fa308f84f5825bab73b083ac (patch) | |
tree | 9aaeee7efbb2c6e89925d7a47b4804a982946365 | |
parent | 3f705b5db74484c36578f597653fa30342e2cbc2 (diff) | |
download | org.eclipse.tm-1464adb94f9e0639fa308f84f5825bab73b083ac.tar.gz org.eclipse.tm-1464adb94f9e0639fa308f84f5825bab73b083ac.tar.xz org.eclipse.tm-1464adb94f9e0639fa308f84f5825bab73b083ac.zip |
[197036] - filter pools are now created only for the subsystem configurations used during connection creation
ASSIGNED - bug 197036: All Filter Pools created on Clean Workspace
https://bugs.eclipse.org/bugs/show_bug.cgi?id=197036
26 files changed, 1008 insertions, 953 deletions
diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/filters/ISystemFilterPoolManager.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/filters/ISystemFilterPoolManager.java index 460fcc39b..a18ebb374 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/filters/ISystemFilterPoolManager.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/filters/ISystemFilterPoolManager.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2007 IBM Corporation and others. + * 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 available at @@ -12,7 +12,8 @@ * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. * * Contributors: - * {Name} (company) - description of contribution. + * David Dykstal (IBM) - [197036] All filter pools created on clean workspace + * cleaned javadoc for renameSystemFilterPool *******************************************************************************/ package org.eclipse.rse.core.filters; @@ -237,19 +238,13 @@ public interface ISystemFilterPoolManager extends IRSEPersistableContainer { public boolean preTestRenameFilterPool(ISystemFilterPool pool) throws Exception; /** - * Rename a given filter pool. Dependending on the save policy, the - * appropriate file or folder on disk will also be renamed. - * <p> - * Does the following: + * Rename a filter pool. * <ul> - * <li>Renames referencing objects - * <li>Renames pool object in the in-memory model - * <li>Renames folder on disk for policies of one folder per pool - * <li>Renames file on disk for policy of one file per pool - * <li>Saves model to disk for policy of one file per manager - * <li>Invalidates in-memory caches + * <li>Renames pool object + * <li>Informs any filter pool references to this pool + * <li>Schedules a save of the pool object * </ul> - * @param pool The filter pool object to physically rename + * @param pool The filter pool object to rename * @param newName The new name to give the pool */ public void renameSystemFilterPool(ISystemFilterPool pool, String newName) throws Exception; diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/IHost.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/IHost.java index bf58fcf69..10f2672b5 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/IHost.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/IHost.java @@ -13,6 +13,7 @@ * Contributors: * Martin Oberhuber (Wind River) - [175262] IHost.getSystemType() should return IRSESystemType * Martin Oberhuber (Wind River) - [206742] Make SystemHostPool thread-safe + * David Dykstal (IBM) - [197036] cleaned javddoc for getConnectorServices() ********************************************************************************/ package org.eclipse.rse.core.model; @@ -261,8 +262,7 @@ public interface IHost extends IAdaptable, IRSEModelObject { void setOffline(boolean value); /** - * Returns all the connector services provided - * for this host + * Returns all the connector services currently configured for this host * @return the connector services */ IConnectorService[] getConnectorServices(); diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemProfile.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemProfile.java index 2b6cc58c0..0ae70e62e 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemProfile.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemProfile.java @@ -13,11 +13,12 @@ * Contributors: * David Dykstal (IBM) - 142806: refactoring persistence framework * Martin Oberhuber (Wind River) - [184095] Replace systemTypeName by IRSESystemType + * David Dykstal (IBM) - [197036] removed createHost() shortcut (should use ISystemRegistry), + * cleaned javadoc for getFilterPools() ********************************************************************************/ package org.eclipse.rse.core.model; -import org.eclipse.rse.core.IRSESystemType; import org.eclipse.rse.core.filters.ISystemFilterPool; import org.eclipse.rse.core.subsystems.ISubSystemConfiguration; import org.eclipse.rse.persistence.IRSEPersistenceProvider; @@ -47,12 +48,6 @@ public interface ISystemProfile extends IRSEModelObject { public ISystemProfileManager getProfileManager(); /** - * Convenience method for create a new connection within this profile. - * Shortcut for {@link ISystemRegistry#createHost(IRSESystemType,String,String,String)} - */ - public IHost createHost(IRSESystemType systemType, String connectionName, String hostName, String description) throws Exception; - - /** * @return The value of the Name attribute */ String getName(); @@ -81,7 +76,7 @@ public interface ISystemProfile extends IRSEModelObject { public IHost[] getHosts(); /** - * Return all filter pools for this profile + * @return all existing filter pools for this profile. */ public ISystemFilterPool[] getFilterPools(); diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemProfileManager.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemProfileManager.java index a3407c6aa..641023bc7 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemProfileManager.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemProfileManager.java @@ -11,11 +11,13 @@ * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. * * Contributors: - * {Name} (company) - description of contribution. + * David Dykstal (IBM) - [197036] added commitSystemProfile operation to interface ********************************************************************************/ package org.eclipse.rse.core.model; +import org.eclipse.core.runtime.IStatus; + /** * Manages a list of SystemProfile objects. System profiles * should be created, deleted, restored, activated, and deactivated though @@ -108,6 +110,13 @@ public interface ISystemProfileManager { * @return the new profile */ public ISystemProfile cloneSystemProfile(ISystemProfile profile, String newName); + + /** + * Commit a system profile + * @param profile the profile to commit + * @return a status object indicating the result of the commit + */ + public IStatus commitSystemProfile(ISystemProfile profile); /** * Get an indication of whether a profile is active or not. diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemRegistry.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemRegistry.java index d4a510700..0a319d290 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemRegistry.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/model/ISystemRegistry.java @@ -20,6 +20,8 @@ * Martin Oberhuber (Wind River) - [175680] Deprecate obsolete ISystemRegistry methods * Martin Oberhuber (Wind River) - [190271] Move ISystemViewInputProvider to Core * David McKnight (IBM) - [207100] adding ISystemRegistry.isRegisteredSystemRemoteChangeListener + * David Dykstal (IBM) - [197036] adding new createHost and getSubSystemConfigurationsBySYstemType which + * are able to delay the creation of subsystems. ********************************************************************************/ package org.eclipse.rse.core.model; @@ -99,11 +101,26 @@ public interface ISystemRegistry extends ISchedulingRule, IAdaptable, ISystemVie /** * Return all subsystem configurations which support the given system type. - * If the type is null, returns all. + * If the type is null, returns all subsystem confgurations. + * Fully equivalent to getSubSystemConfigurationsBySystemType(systemType, filterDuplicates, <code>true</code>) + * which is preferred since we do not want to load subsystem configurations unless necessary. * @param systemType system type to filter - * @param filterDuplicateServiceSubSystemConfigurations set false by default + * @param filterDuplicates if true and the subsystem configuration uses services then return only one + * subsystem configuration that supports this service. Which configuration is returned is undefined. + * @return an array of subsystem configurations meeting the criteria */ - public ISubSystemConfiguration[] getSubSystemConfigurationsBySystemType(IRSESystemType systemType, boolean filterDuplicateServiceSubSystemConfigurations); + public ISubSystemConfiguration[] getSubSystemConfigurationsBySystemType(IRSESystemType systemType, boolean filterDuplicates); + + /** + * Return all subsystem configurations which support the given system type. + * If the type is null, returns all subsystem confgurations. + * @param systemType system type to filter + * @param filterDuplicates if true and the subsystem configuration uses services then return only one + * subsystem configuration that supports this service. Which configuration is returned is undefined. + * @param activate if true activate the respective configurations if not already active, if false return only those that are already active. + * @return an array of subsystem configurations meeting the criteria + */ + public ISubSystemConfiguration[] getSubSystemConfigurationsBySystemType(IRSESystemType systemType, boolean filterDuplicates, boolean activate); // ---------------------------------- // SYSTEMVIEWINPUTPROVIDER METHODS... @@ -211,59 +228,52 @@ public interface ISystemRegistry extends ISchedulingRule, IAdaptable, ISystemVie public void setSystemProfileActive(ISystemProfile profile, boolean makeActive); /** - * Return the list of connector services provided for the given host - * @param conn the host + * Return the list of connector services currently configured for the given host + * @param host the host * @return the list of connector services */ - public IConnectorService[] getConnectorServices(IHost conn); + public IConnectorService[] getConnectorServices(IHost host); // ---------------------------- // SUBSYSTEM METHODS... // ---------------------------- /** - * Return list of subsystem objects for a given connection. If the subsystems have - * not all been read into memory, this loads them up + * Return list of subsystem objects for a given host. + * @param host the host for which to return the subsystems that are currently known. + * @return an array of subsystem objects known to this host. */ - public ISubSystem[] getSubSystems(IHost conn); + public ISubSystem[] getSubSystems(IHost host); /** - * Return list of subsystem objects for a given connection. Use the force - * flag to indicate whether or not to restore from disk + * Return list of subsystem objects for a given connection. + * @param host the host for which to return the subsystems that are known. + * @param force if true, force the creation of subsystems for which the system type of this host is configured. + * Use this parameter with care since it can cause extensive initialization. + * @return the list of subsystems known to this host, possibly after the creation of subsystems. + * @deprecated Use {@link #getSubSystems(IHost)} instead, the "force" parameter is now ignored. */ - public ISubSystem[] getSubSystems(IHost conn, boolean force); + public ISubSystem[] getSubSystems(IHost host, boolean force); /** * Get those subsystems that are registered against a given connection, * which are an instance of the given interface class. - * <p> - * This method activates all subsystem configurations of the given - * host in order to support checking against the given interface. - * If lazy loading is desired, use {@link #getSubSystems(IHost, boolean)} - * with a boolean parameter <code>false</code> instead, and check against - * the class instance in client code. * </p> - * @param connection the connection to check + * @param host the connection to check * @param subsystemInterface the interface class to filter against * @return list of matching subsystems */ - public ISubSystem[] getSubsystems(IHost connection, Class subsystemInterface); + public ISubSystem[] getSubsystems(IHost host, Class subsystemInterface); /** * Get those subsystems that are registered against a given connection, * which are an instance of ServiceSubSystem for the given serviceType. - * <p> - * This method activates all subsystem configurations of the given - * host in order to support checking against the given interface. - * If lazy loading is desired, use {@link #getSubSystems(IHost, boolean)} - * with a boolean parameter <code>false</code> instead, and check against - * the class instance in client code. * </p> - * @param connection the connection to check + * @param host the host to check * @param serviceType the class of service to ask for * @return list of matching subsystems */ - public ISubSystem[] getServiceSubSystems(IHost connection, Class serviceType); + public ISubSystem[] getServiceSubSystems(IHost host, Class serviceType); /** * Resolve a subsystem from it's absolute name @@ -283,10 +293,10 @@ public interface ISystemRegistry extends ISchedulingRule, IAdaptable, ISystemVie /** * Return the absolute name for the specified host (connection) - * @param connection the host (aka connection) object to query + * @param host the host (aka connection) object to query * @return the absolute name of the host */ - public String getAbsoluteNameForConnection(IHost connection); + public String getAbsoluteNameForConnection(IHost host); /** * Get a list of subsystem objects for given connection, owned by a subsystem factory @@ -301,7 +311,7 @@ public interface ISystemRegistry extends ISchedulingRule, IAdaptable, ISystemVie * that are really needed. Then, use {@link ISubSystemConfiguration#getSubSystems(boolean)} * with a parameter true. */ - public ISubSystem[] getSubSystemsBySubSystemConfigurationCategory(String factoryCategory, IHost connection); + public ISubSystem[] getSubSystemsBySubSystemConfigurationCategory(String factoryCategory, IHost host); /** * Delete a subsystem object. This code finds the factory that owns it and @@ -507,6 +517,26 @@ public interface ISystemRegistry extends ISchedulingRule, IAdaptable, ISystemVie public IHost createHost(IRSESystemType systemType, String connectionName, String hostAddress, String description) throws Exception; /** + * Create a host object. The resulting host object is added to the list of existing host objects + * in the specified profile. + * <ul> + * <li>creates and saves a new host within the given profile + * <li>optionally creates subsystem instances + * <li>fires an ISystemResourceChangeEvent event of type EVENT_ADD to all registered listeners + * </ul> + * <p> + * @param profileName Name of the system profile to which the host is to be added. + * @param systemType system type of the new host. + * @param hostName unique host name within the profile. + * @param hostAddress ip name of host. + * @param description optional description of the connection. May be null. + * @param createSubSystems <code>true</code> to create subsystems for the host, <code>false</code> otherwise. + * @return IHost object, or null if it failed to create. This is typically because the hostName is not unique. Call getLastException() if necessary. + * @since 3.0 + */ + public IHost createHost(String profileName, IRSESystemType systemType, String hostName, String hostAddress, String description, boolean createSubSystems) throws Exception; + + /** * Update an existing host given the new information. * This method: * <ul> diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/subsystems/IServiceSubSystem.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/subsystems/IServiceSubSystem.java index 88a8a8bad..074b4f4b1 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/subsystems/IServiceSubSystem.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/subsystems/IServiceSubSystem.java @@ -12,13 +12,44 @@ * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. * * Contributors: - * {Name} (company) - description of contribution. + * David Dykstal (IBM) - [197036] added javadoc and canSwitchTo method. *******************************************************************************/ package org.eclipse.rse.core.subsystems; +/** + * A service subsystem provides a common subsystem implementation defined on a + * service interface. The service itself may have various + * implementations determined by a subsystem configuration. A service subsystem + * may be asked to switch its subsystem configuration in order to switch the + * underlying service implementation. + */ public interface IServiceSubSystem extends ISubSystem { + + /** + * 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 null. + */ public Class getServiceType(); - public void switchServiceFactory(IServiceSubSystemConfiguration factory); + /** + * Requests a service subsystem to switch to a new configuration. If the configuration + * is compatible with this subsystem then it must disconnect, possibly reset its + * filter pool references, and request new services and parameters from its new configuration. + * It must also answer true to {@link #canSwitchTo(IServiceSubSystemConfiguration)}. + * If the configuration is not compatible with this subsystem then this must do nothing and must answer + * false to {@link #canSwitchTo(IServiceSubSystemConfiguration)}. + * @param configuration the configuration to which to switch. + */ + public void switchServiceFactory(IServiceSubSystemConfiguration configuration); + + /** + * 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 return false. + */ + public boolean canSwitchTo(IServiceSubSystemConfiguration configuration); + } diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/subsystems/ISubSystemConfiguration.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/subsystems/ISubSystemConfiguration.java index 271058bee..3d6c4ab5d 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/subsystems/ISubSystemConfiguration.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/core/subsystems/ISubSystemConfiguration.java @@ -15,6 +15,7 @@ * 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) - [189123] Move renameSubSystemProfile() from UI to Core + * David Dykstal (IBM) - [197036] change signature of getFilterPoolManager method to be able to control the creation of filter pools ********************************************************************************/ package org.eclipse.rse.core.subsystems; @@ -34,7 +35,7 @@ import org.eclipse.rse.core.model.ISystemProfile; * * <p> * This interface is not intended to be implemented by clients. Subsystem - * configuration implementations must subclass {@link SubSystemConfiguration} + * configuration implementations must subclass SubSystemConfiguration * rather than implementing this interface directly. * </p> */ @@ -351,11 +352,13 @@ public interface ISubSystemConfiguration extends ISystemFilterPoolManagerProvide /** * Called by SystemRegistry's renameSystemProfile method to ensure we update our - * subsystem names within each subsystem. - * <p> - * This is called AFTER changing the profile's name!! + * subsystem names within each subsystem. + * This should be invoked after changing the profile's name. + * @param subsystem the subsystem to be updated + * @param oldProfileName the old profile name + * @param newProfileName the new profile name */ - public void renameSubSystemProfile(ISubSystem ss, String oldProfileName, String newProfileName); + public void renameSubSystemProfile(ISubSystem subsystem, String oldProfileName, String newProfileName); /** * Called by SystemRegistry's renameSystemProfile method to pre-test if we are going to run into errors on a @@ -488,7 +491,22 @@ public interface ISubSystemConfiguration extends ISystemFilterPoolManagerProvide // FILTER POOL METHODS... // --------------------------------- /** - * Get the filter pool manager for the given profile + * A subsystem configuration has a filter pool manager for each profile. + * Get the filter pool manager for the given profile. + * @param profile The system profile for which to get the manager. + * @param force if true then create the default filters for this subsystem configuration in this profile. This should only be + * done during initial subsystem creation, not during subsystem restore. + * @return a filter pool manager + */ + public ISystemFilterPoolManager getFilterPoolManager(ISystemProfile profile, boolean force); + + /** + * A subsystem configuration has a filter pool manager for each profile. + * Get the filter pool manager for the given profile. + * Do not force the creation of default filter pools. + * Fully equivalent to getFilterPoolManager(profile, false). + * @param profile The system profile for which to get the manager. + * @return a filter pool manager */ public ISystemFilterPoolManager getFilterPoolManager(ISystemProfile profile); diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/filters/SystemFilterPoolManager.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/filters/SystemFilterPoolManager.java index 2f8f9243e..61f52f804 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/filters/SystemFilterPoolManager.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/filters/SystemFilterPoolManager.java @@ -12,6 +12,7 @@ * * Contributors: * David Dykstal (IBM) - 142806: refactoring persistence framework + * David Dykstal (IBM) - [197036] removed caching mechanism to clean up logic ********************************************************************************/ package org.eclipse.rse.internal.core.filters; @@ -57,10 +58,10 @@ import org.eclipse.rse.logging.Logger; * This class is not intended to be subclassed by clients. */ public class SystemFilterPoolManager extends RSEPersistableObject implements ISystemFilterPoolManager { - private ISystemFilterPool[] poolArray = null; // cache for performance +// private ISystemFilterPool[] poolArray = null; // cache for performance private ISystemFilterPoolManagerProvider caller = null; private Object poolMgrData; - private Vector poolNames; +// private Vector poolNames; private boolean initialized = false; private boolean suspendCallbacks = false; @@ -152,7 +153,8 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy */ protected boolean singleFilterStringOnly = SINGLE_FILTER_STRING_ONLY_EDEFAULT; - protected List pools = null; + protected List pools = new ArrayList(3); +// protected List pools = null; /** * Constructor @@ -210,7 +212,7 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy initialize(logger, caller, name); // core data } setSupportsNestedFilters(allowNestedFilters); // cascade it down - invalidatePoolCache(); +// invalidatePoolCache(); // List pools = getPools(); // ISystemFilterPool pool = null; // Vector poolNames = getSystemFilterPoolNamesVector(); @@ -397,17 +399,20 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy * Return array of SystemFilterPools managed by this manager. */ public ISystemFilterPool[] getSystemFilterPools() { - //System.out.println("Inside getSFPools for mgr "+getName()+". poolArray null? "+(poolArray==null)); - if ((poolArray == null) || (getPools().size() != poolArray.length)) { - List pools = getPools(); - poolArray = new ISystemFilterPool[pools.size()]; - Iterator i = pools.iterator(); - int idx = 0; - while (i.hasNext()) - poolArray[idx++] = (ISystemFilterPool) i.next(); - //System.out.println("Pool array created. length = "+poolArray.length); - } - return poolArray; + ISystemFilterPool[] result = new ISystemFilterPool[pools.size()]; + pools.toArray(result); + return result; +// //System.out.println("Inside getSFPools for mgr "+getName()+". poolArray null? "+(poolArray==null)); +// if ((poolArray == null) || (getPools().size() != poolArray.length)) { +// List pools = getPools(); +// poolArray = new ISystemFilterPool[pools.size()]; +// Iterator i = pools.iterator(); +// int idx = 0; +// while (i.hasNext()) +// poolArray[idx++] = (ISystemFilterPool) i.next(); +// //System.out.println("Pool array created. length = "+poolArray.length); +// } +// return poolArray; } /** @@ -425,24 +430,31 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy * Get list of filter pool names currently existing. */ public Vector getSystemFilterPoolNamesVector() { - List pools = getPools(); - if ((poolNames == null) || (poolNames.size() != pools.size())) // been invalidated? - { - poolNames = new Vector(); - Iterator i = pools.iterator(); - while (i.hasNext()) - poolNames.addElement(((ISystemFilterPool) i.next()).getName()); + Vector result = new Vector(pools.size()); + for (Iterator z = pools.iterator(); z.hasNext();) { + ISystemFilterPool pool = (ISystemFilterPool) z.next(); + String poolName = pool.getName(); + result.add(poolName); } - return poolNames; + return result; +// List pools = getPools(); +// if ((poolNames == null) || (poolNames.size() != pools.size())) // been invalidated? +// { +// poolNames = new Vector(); +// Iterator i = pools.iterator(); +// while (i.hasNext()) +// poolNames.addElement(((ISystemFilterPool) i.next()).getName()); +// } +// return poolNames; } /* * Call this to invalidate array cache after any activity */ - private void invalidatePoolCache() { - poolArray = null; - poolNames = null; - } +// private void invalidatePoolCache() { +// poolArray = null; +// poolNames = null; +// } /** * Create a new filter pool. @@ -473,9 +485,9 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy pool.setSystemFilterPoolManager(this); pool.setStringsCaseSensitive(areStringsCaseSensitive()); pool.setSupportsDuplicateFilterStrings(isSetSupportsDuplicateFilterStrings() && supportsDuplicateFilterStrings()); - List pools = getPools(); +// List pools = getPools(); pools.add(pool); - invalidatePoolCache(); +// invalidatePoolCache(); commit(pool); if ((caller != null) && !suspendCallbacks) { caller.filterEventFilterPoolCreated(pool); @@ -501,63 +513,22 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy * @param pool The filter pool object to physically delete */ public void deleteSystemFilterPool(ISystemFilterPool pool) throws Exception { - - // remove all references IRSEBaseReferencingObject[] refs = pool.getReferencingObjects(); - //boolean needsSave = false; if (refs != null) { for (int idx = 0; idx < refs.length; idx++) { if (refs[idx] instanceof ISystemFilterPoolReference) { ISystemFilterPoolReference fpRef = (ISystemFilterPoolReference) refs[idx]; ISystemFilterPoolReferenceManager fprMgr = fpRef.getFilterPoolReferenceManager(); - if (fprMgr != null) fprMgr.removeSystemFilterPoolReference(fpRef, false);// false means don't dereference + if (fprMgr != null) { + fprMgr.removeSystemFilterPoolReference(fpRef, false); // false means don't dereference DWD why? + } } } } - // DWD removing a pool should mark its parent profile as dirty and cause a save to be "scheduled" - - // remove from model - List pools = getPools(); pools.remove(pool); - invalidatePoolCache(); - - /* FIXME - // now in EMF, the pools are "owned" by the Resource, and only referenced by this pool manager, - // so I don't think just removing it from the manager is enough... it must also be removed from its - // resource. Phil. - Resource res = pool.eResource(); - if (res != null) - res.getContents().remove(pool); - - // remove from disk - if ( (savePolicy == SystemFilterConstants.SAVE_POLICY_ONE_FILEANDFOLDER_PER_POOL) || - (savePolicy == SystemFilterConstants.SAVE_POLICY_ONE_FILE_PER_FILTER) ) - { - String expectedFolderName = derivePoolFolderName(poolName); - if (expectedFolderName.equals(poolFolder.getName())) - { - // folder name equals what we would have named it if left to us. - // assumption is this folder only exists to hold this pool! - if (poolFolder.exists()) - getResourceHelpers().deleteResource(poolFolder); - } - } - else if (savePolicy == SystemFilterConstants.SAVE_POLICY_ONE_FILE_PER_POOL_SAME_FOLDER) - { - String poolFileName = SystemFilterPoolImpl.getSaveFileName(getMOFHelpers(),pool); - IFile poolFile = SystemResourceHelpers.getResourceHelpers().getFile(poolFolder,poolFileName); - if (poolFile.exists()) - getResourceHelpers().deleteResource(poolFile); - } - else // all pools in one file per manager. Just save it - { - commit(); - } - invalidatePoolCache(); - // if caller provider, callback to inform them of this event - if ((caller != null) && !suspendCallbacks) - caller.filterEventFilterPoolDeleted(pool); - */ + _profile.setDirty(true); + _profile.commit(); + getProvider().filterEventFilterPoolDeleted(pool); } /** @@ -576,174 +547,25 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy } /** - * Pre-test if we are going to run into any trouble renaming any of the files or folders - * used to persist a filter pool. - * @return true if everything seems ok, false if a file/folder is in use. + * Pre-test if we are going to run into any trouble renaming a filter pool. + * @return true if the pool can be renamed. */ public boolean preTestRenameFilterPool(ISystemFilterPool pool) throws Exception { - boolean ok = true; /* - * DWD this looks like it needs to be modified so that it queries the persistence - * manager to see if the pool can be renamed. The provider is in charge of determining - * pool names in the persistent form. The Manager will have to construct a DOM - * object for this pool and query the appropriate provider. - */ - /* FIXME - if ( (savePolicy == SystemFilterConstants.SAVE_POLICY_ONE_FILEANDFOLDER_PER_POOL) || - (savePolicy == SystemFilterConstants.SAVE_POLICY_ONE_FILE_PER_FILTER) ) - { - String expectedFolderName = derivePoolFolderName(pool.getName()); - boolean ourFolderName = expectedFolderName.equals(pool.getFolder().getName()); - // we must rename the old file... - String poolFileName = SystemFilterPoolImpl.getSaveFileName(getMOFHelpers(),pool); - IFile poolFile = getResourceHelpers().getFile(pool.getFolder(),poolFileName); - IFolder poolFolder = pool.getFolder(); - - // first, pre-test for file-in-use error: - boolean inUse = poolFile.exists() && SystemResourceHelpers.testIfResourceInUse(poolFile); - if (inUse) - { - SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_FILE_INUSE); - msg.makeSubstitution(poolFile.getFullPath()); - throw new SystemMessageException(msg); - } - // next, pre-test for folder-in-use error: - if (ourFolderName) - { - inUse = poolFolder.exists() && SystemResourceHelpers.testIfResourceInUse(poolFolder); - if (inUse) - { - SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_FOLDER_INUSE); - msg.makeSubstitution(poolFolder.getFullPath()); - throw new SystemMessageException(msg); - } - } - } - else if (savePolicy == SystemFilterConstants.SAVE_POLICY_ONE_FILE_PER_POOL_SAME_FOLDER) - { - String poolFileName = SystemFilterPoolImpl.getSaveFileName(getMOFHelpers(),pool); - IFile poolFile = getResourceHelpers().getFile(pool.getFolder(),poolFileName); - // first, pre-test for file-in-use error: - boolean inUse = poolFile.exists() && SystemResourceHelpers.testIfResourceInUse(poolFile); - if (inUse) - { - SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_FILE_INUSE); - msg.makeSubstitution(poolFile.getFullPath()); - throw new SystemMessageException(msg); - } - } + * The default implementation returns true. Persistence providers should be able to handle this + * circumstance regardless. If a pool can be renamed internally, it should be able to be + * renamed in its persistent form. */ + boolean ok = true; return ok; } - /** - * Rename a given filter pool. Dependending on the save policy, the - * appropriate file or folder on disk will also be renamed. - * <p> - * Does the following: - * <ul> - * <li>Updates all referencing objects - * <li>Renames pool object in the in-memory model - * <li>Renames folder on disk for policies of one folder per pool - * <li>Renames file on disk for policy of one file per pool - * <li>Saves model to disk for policy of one file per manager - * <li>Invalidates in-memory caches - * <li>Calls back to provider to inform of this event. - * </ul> - * @param pool The filter pool object to physically rename - * @param newName The new name to give the pool + /* (non-Javadoc) + * @see org.eclipse.rse.core.filters.ISystemFilterPoolManager#renameSystemFilterPool(org.eclipse.rse.core.filters.ISystemFilterPool, java.lang.String) */ public void renameSystemFilterPool(ISystemFilterPool pool, String newName) throws Exception { - /* - * DWD Renaming a filter pool should mark its parent profile as dirty and - * the pool itself as dirty. A rewrite of the profile should be scheduled. - */ - String oldName = pool.getName(); - // rename on disk - /* FIXME - int oldLen = oldName.length(); - int newLen = newName.length(); - if ( (savePolicy == SystemFilterConstants.SAVE_POLICY_ONE_FILEANDFOLDER_PER_POOL) || - (savePolicy == SystemFilterConstants.SAVE_POLICY_ONE_FILE_PER_FILTER) ) - { - String expectedFolderName = derivePoolFolderName(pool.getName()); - boolean ourFolderName = expectedFolderName.equals(pool.getFolder().getName()); - // we must rename the old file... - String poolFileName = SystemFilterPoolImpl.getSaveFileName(getMOFHelpers(),pool); - String poolFileNewName = SystemFilterPoolImpl.getSaveFileName(getMOFHelpers(),pool,newName); - IFile poolFile = getResourceHelpers().getFile(pool.getFolder(),poolFileName); - IFolder poolFolder = pool.getFolder(); - - // first, pre-test for file-in-use error: - boolean inUse = poolFile.exists() && SystemResourceHelpers.testIfResourceInUse(poolFile); - if (inUse) - { - SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_FILE_INUSE); - msg.makeSubstitution(poolFile.getFullPath()); - throw new SystemMessageException(msg); - } - // next, pre-test for folder-in-use error: - if (ourFolderName) - { - inUse = poolFolder.exists() && SystemResourceHelpers.testIfResourceInUse(poolFolder); - if (inUse) - { - SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_FOLDER_INUSE); - msg.makeSubstitution(poolFolder.getFullPath()); - throw new SystemMessageException(msg); - } - } - - if (poolFile.exists()) - { - // pre-test if the new name will be too long for MOF (256) - if (nameLenDiff > 0) - { - if (ourFolderName) - nameLenDiff *= 2; // new name affects folder and file - int newNameLen = poolFile.getLocation().toOSString().length() + nameLenDiff; - if (newNameLen > 256) - throw new Exception("Fully qualified filter pool name too long for "+newName+". Exceeds 256 characters"); - } - getResourceHelpers().renameResource(poolFile, poolFileNewName); - } - if (ourFolderName) - { - // folder name equals what we would have named it if left to us. - // assumption is this folder only exists to hold this pool! - if (poolFolder.exists()) - { - String newFolderName = derivePoolFolderName(newName); - getResourceHelpers().renameResource(poolFolder, newFolderName); - // as we now know, the original IFolder still points to the old name! - poolFolder = getResourceHelpers().getRenamedFolder(poolFolder, newFolderName); - pool.setFolder(poolFolder); - } - } - } - else if (savePolicy == SystemFilterConstants.SAVE_POLICY_ONE_FILE_PER_POOL_SAME_FOLDER) - { - String poolFileName = SystemFilterPoolImpl.getSaveFileName(getMOFHelpers(),pool); - IFile poolFile = getResourceHelpers().getFile(pool.getFolder(),poolFileName); - // first, pre-test for file-in-use error: - boolean inUse = poolFile.exists() && SystemResourceHelpers.testIfResourceInUse(poolFile); - if (inUse) - { - SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_FILE_INUSE); - msg.makeSubstitution(poolFile.getFullPath()); - throw new SystemMessageException(msg); - } - if (poolFile.exists()) - { - String poolFileNewName = SystemFilterPoolImpl.getSaveFileName(getMOFHelpers(),pool,newName); - getResourceHelpers().renameResource(poolFile, poolFileNewName); - } - } - */ pool.setName(newName); - invalidatePoolCache(); - // inform all referencees IRSEBaseReferencingObject[] refs = pool.getReferencingObjects(); if (refs != null) { @@ -756,9 +578,10 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy } } } - // if caller provider, callback to inform them of this event - if ((caller != null) && !suspendCallbacks) caller.filterEventFilterPoolRenamed(pool, oldName); + if ((caller != null) && !suspendCallbacks) { + caller.filterEventFilterPoolRenamed(pool, oldName); + } } /** @@ -1148,24 +971,23 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy * @param delta the amount by which to move the filters (filterEventFiltersRePositioned) */ public void moveSystemFilters(ISystemFilter filters[], int delta) throws Exception { - /* - * DWD revisit this. Make sure that the pool is scheduled to be saved. - */ - // ISystemFilterContainer container = filters[0].getParentFilterContainer(); int[] oldPositions = new int[filters.length]; - for (int idx = 0; idx < filters.length; idx++) + for (int idx = 0; idx < filters.length; idx++) { oldPositions[idx] = getSystemFilterPosition(filters[idx]); - if (delta > 0) // moving down, process backwards - for (int idx = filters.length - 1; idx >= 0; idx--) + } + if (delta > 0) { // moving down, process backwards + for (int idx = filters.length - 1; idx >= 0; idx--) { moveFilter(filters[idx], oldPositions[idx] + delta); - else - for (int idx = 0; idx < filters.length; idx++) + } + } else { + for (int idx = 0; idx < filters.length; idx++) { moveFilter(filters[idx], oldPositions[idx] + delta); - + } + } commit(filters[0].getParentFilterPool()); - - // if caller provider, callback to inform them of this event - if ((caller != null) && !suspendCallbacks) caller.filterEventFiltersRePositioned(filters, delta); + if ((caller != null) && !suspendCallbacks) { + caller.filterEventFiltersRePositioned(filters, delta); + } } /** @@ -1331,21 +1153,13 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy * Copy a system filter string to a filter in this or another filter pool manager. */ public ISystemFilterString copySystemFilterString(ISystemFilter targetFilter, ISystemFilterString oldFilterString) throws Exception { - /* - * DWD revisit this. make sure that pool is persisted. - */ ISystemFilterPool targetPool = targetFilter.getParentFilterPool(); ISystemFilterPoolManager targetMgr = targetPool.getSystemFilterPoolManager(); ISystemFilter oldFilter = oldFilterString.getParentSystemFilter(); - // ISystemFilterPool oldPool = oldFilter.getParentFilterPool(); - targetMgr.suspendCallbacks(true); - ISystemFilterString newFilterString = oldFilter.copySystemFilterString(targetFilter, oldFilterString); // creates it in memory commit(targetPool); // save updated pool to disk - targetMgr.suspendCallbacks(false); - targetMgr.getProvider().filterEventFilterStringCreated(newFilterString); return newFilterString; } @@ -1570,10 +1384,12 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy * @generated This field/method will be replaced during code generation */ public List getPools() { - if (pools == null) { - pools = new ArrayList(); - } - return pools; +// if (pools == null) { +// pools = new ArrayList(); +// } + List result = new ArrayList(pools.size()); + result.addAll(pools); + return result; } /** @@ -1638,10 +1454,10 @@ public class SystemFilterPoolManager extends RSEPersistableObject implements ISy } /** - * Save all the filter pools to disk. - * Uses the save policy specified in this manager's factory method. + * Save a specific filter pool. */ public boolean commit(ISystemFilterPool pool) { + pool.setDirty(true); boolean result = pool.commit(); return result; } diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/filters/SystemFilterPoolReferenceManager.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/filters/SystemFilterPoolReferenceManager.java index e5222f07a..425cd712e 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/filters/SystemFilterPoolReferenceManager.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/filters/SystemFilterPoolReferenceManager.java @@ -12,7 +12,7 @@ * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. * * Contributors: - * {Name} (company) - description of contribution. + * David Dykstal (IBM) - [197036] fixed parent references and names so that delete references would function correctly *******************************************************************************/ package org.eclipse.rse.internal.core.filters; @@ -185,7 +185,11 @@ public class SystemFilterPoolReferenceManager extends SystemPersistableReference * objects in this list reference. */ public ISystemFilterPoolManager[] getSystemFilterPoolManagers() { - return poolMgrProvider.getSystemFilterPoolManagers(); + ISystemFilterPoolManager[] result = new ISystemFilterPoolManager[0]; + if (poolMgrProvider != null) { + result = poolMgrProvider.getSystemFilterPoolManagers(); + } + return result; } /** @@ -379,6 +383,7 @@ public class SystemFilterPoolReferenceManager extends SystemPersistableReference */ private ISystemFilterPoolReference createSystemFilterPoolReference(ISystemFilterPool filterPool) { ISystemFilterPoolReference filterPoolReference = new SystemFilterPoolReference(filterPool); + filterPoolReference.setParentReferenceManager(this); invalidateFilterPoolReferencesCache(); return filterPoolReference; } @@ -391,6 +396,7 @@ public class SystemFilterPoolReferenceManager extends SystemPersistableReference */ private ISystemFilterPoolReference createSystemFilterPoolReference(String filterPoolName) { ISystemFilterPoolReference filterPoolReference = new SystemFilterPoolReference(filterPoolName); + filterPoolReference.setParentReferenceManager(this); invalidateFilterPoolReferencesCache(); return filterPoolReference; } @@ -402,7 +408,7 @@ public class SystemFilterPoolReferenceManager extends SystemPersistableReference */ public int addSystemFilterPoolReference(ISystemFilterPoolReference filterPoolReference) { int count = addReferencingObject(filterPoolReference); - filterPoolReference.setParentReferenceManager(this); // DWD - should be done in the addReferencingObject method? + filterPoolReference.setParentReferenceManager(this); // DWD - should be done in addReferencingObject? invalidateFilterPoolReferencesCache(); quietSave(); return count; @@ -432,7 +438,6 @@ public class SystemFilterPoolReferenceManager extends SystemPersistableReference count = super.removeReferencingObject(filterPoolReference); else count = super.removeAndDeReferenceReferencingObject(filterPoolReference); - filterPoolReference.setParentReferenceManager(null); // DWD should be done in remove? invalidateFilterPoolReferencesCache(); if (fireEvents && (caller != null)) caller.filterEventFilterPoolReferenceDeleted(filterPoolReference); quietSave(); @@ -541,8 +546,8 @@ public class SystemFilterPoolReferenceManager extends SystemPersistableReference */ public ISystemFilterPoolReference addReferenceToSystemFilterPool(ISystemFilterPool filterPool) { ISystemFilterPoolReference filterPoolReference = createSystemFilterPoolReference(filterPool); - addReferencingObject(filterPoolReference); // DWD - should be done in addReferencingObject? - filterPoolReference.setParentReferenceManager(this); + addReferencingObject(filterPoolReference); + filterPoolReference.setParentReferenceManager(this); // DWD - should be done in addReferencingObject? invalidateFilterPoolReferencesCache(); quietSave(); if (fireEvents && (caller != null)) caller.filterEventFilterPoolReferenceCreated(filterPoolReference); @@ -555,7 +560,7 @@ public class SystemFilterPoolReferenceManager extends SystemPersistableReference public ISystemFilterPoolReference addReferenceToSystemFilterPool(String filterPoolName) { ISystemFilterPoolReference filterPoolReference = createSystemFilterPoolReference(filterPoolName); addReferencingObject(filterPoolReference); - filterPoolReference.setParentReferenceManager(this); + filterPoolReference.setParentReferenceManager(this); // DWD - should be done in addReferencingObject? invalidateFilterPoolReferencesCache(); quietSave(); if (fireEvents && (caller != null)) caller.filterEventFilterPoolReferenceCreated(filterPoolReference); @@ -574,11 +579,12 @@ public class SystemFilterPoolReferenceManager extends SystemPersistableReference if (filterPoolReference != null) { filterPoolReference.removeReference(); newCount = removeReferencingObject(filterPoolReference); - filterPoolReference.setParentReferenceManager(null); // DWD should be done in removeReferencingObject? invalidateFilterPoolReferencesCache(); quietSave(); // callback to provider so they can fire events in their GUI - if (fireEvents && (caller != null)) caller.filterEventFilterPoolReferenceDeleted(filterPoolReference); + if (fireEvents && (caller != null)) { + caller.filterEventFilterPoolReferenceDeleted(filterPoolReference); + } } else newCount = getSystemFilterPoolReferenceCount(); return newCount; @@ -621,7 +627,7 @@ public class SystemFilterPoolReferenceManager extends SystemPersistableReference //addReferenceToSystemFilterPool(filterPools[idx]); ISystemFilterPoolReference filterPoolReference = createSystemFilterPoolReference(filterPools[idx]); addReferencingObject(filterPoolReference); - filterPoolReference.setParentReferenceManager(this); // DWD should be done in addReferencingObject? + filterPoolReference.setParentReferenceManager(this); // DWD - should be done in addReferencingObject? } invalidateFilterPoolReferencesCache(); quietSave(); diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/ISystemProfileOperation.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/ISystemProfileOperation.java new file mode 100644 index 000000000..7436feb3e --- /dev/null +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/ISystemProfileOperation.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 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 + * + * Contributors: + * David Dykstal (IBM) - [197036] new interface + *******************************************************************************/ + +package org.eclipse.rse.internal.core.model; + +import org.eclipse.core.runtime.IStatus; + +/** + * A profile operation can be executed by the SystemProfileManager. This allows for multiple changes + * to model objects to be committed all at once when the last level of nesting is completed. + */ +public interface ISystemProfileOperation { + + /** + * Run this operation. Should not be invoked directly. + * See {@link SystemProfileManager#run(ISystemProfileOperation) + * @return The IStatus of the operation + */ + public IStatus run(); + +} diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemProfile.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemProfile.java index 822d62c7e..48f1cfb60 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemProfile.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemProfile.java @@ -14,17 +14,18 @@ * David Dykstal (IBM) - 142806: refactoring persistence framework * Martin Oberhuber (Wind River) - [184095] Replace systemTypeName by IRSESystemType * Martin Oberhuber (Wind River) - [177523] Unify singleton getter methods + * David Dykstal (IBM) - [197036] changed getFilterPools to not force the loading of subsystem configurations + * removed createHost, migrated commit logic to SystemProfileManager ********************************************************************************/ package org.eclipse.rse.internal.core.model; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Vector; import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; -import org.eclipse.rse.core.IRSESystemType; import org.eclipse.rse.core.RSECorePlugin; import org.eclipse.rse.core.filters.ISystemFilterPool; import org.eclipse.rse.core.filters.ISystemFilterPoolManager; @@ -35,6 +36,7 @@ import org.eclipse.rse.core.model.ISystemProfileManager; import org.eclipse.rse.core.model.ISystemRegistry; import org.eclipse.rse.core.model.RSEModelObject; import org.eclipse.rse.core.subsystems.ISubSystemConfiguration; +import org.eclipse.rse.core.subsystems.ISubSystemConfigurationProxy; import org.eclipse.rse.internal.core.RSECoreMessages; import org.eclipse.rse.persistence.IRSEPersistenceProvider; @@ -80,15 +82,6 @@ public class SystemProfile extends RSEModelObject implements ISystemProfile, IAd return mgr; } - /** - * Convenience method for create a new connection within this profile. - * Shortcut for {@link ISystemRegistry#createHost(String,String,String,String)} - */ - public IHost createHost(IRSESystemType systemType, String connectionName, String hostName, String description) throws Exception - { - return RSECorePlugin.getTheSystemRegistry().createHost(getName(), systemType, connectionName, hostName, description); - } - /** * Return all connections for this profile */ @@ -97,25 +90,26 @@ public class SystemProfile extends RSEModelObject implements ISystemProfile, IAd return RSECorePlugin.getTheSystemRegistry().getHostsByProfile(this); } - /** - * Return all filter pools for this profile + /* (non-Javadoc) + * @see org.eclipse.rse.core.model.ISystemProfile#getFilterPools() */ public ISystemFilterPool[] getFilterPools() { - ISubSystemConfiguration[] ssFactories = RSECorePlugin.getTheSystemRegistry().getSubSystemConfigurations(); - Vector poolsVector = new Vector(); - for (int idx = 0; idx < ssFactories.length; idx++) - { - ISystemFilterPoolManager poolMgr = ssFactories[idx].getFilterPoolManager(this); - ISystemFilterPool[] pools = poolMgr.getSystemFilterPools(); - for (int ydx=0; ydx<pools.length; ydx++) - { - poolsVector.add(pools[ydx]); + List filterPools = new ArrayList(10); // 10 is arbitrary but reasonable + ISystemRegistry registry = RSECorePlugin.getTheSystemRegistry(); + ISubSystemConfigurationProxy proxies[] = registry.getSubSystemConfigurationProxies(); + for (int i = 0; i < proxies.length; i++) { + ISubSystemConfigurationProxy proxy = proxies[i]; + if (proxy.isSubSystemConfigurationActive()) { + ISubSystemConfiguration config = proxy.getSubSystemConfiguration(); + ISystemFilterPoolManager fpm = config.getFilterPoolManager(this); + ISystemFilterPool[] poolArray = fpm.getSystemFilterPools(); + filterPools.addAll(Arrays.asList(poolArray)); } } - ISystemFilterPool[] allPools = new ISystemFilterPool[poolsVector.size()]; - poolsVector.toArray(allPools); - return allPools; + ISystemFilterPool[] result = new ISystemFilterPool[filterPools.size()]; + filterPools.toArray(result); + return result; } /** @@ -209,13 +203,13 @@ public class SystemProfile extends RSEModelObject implements ISystemProfile, IAd setDirty(true); } - public boolean commit() - { - boolean result = false; - if (!RSECorePlugin.getThePersistenceManager().isBusy()) { - result = RSECorePlugin.getThePersistenceManager().commitProfile(this, 5000); - } - return result; + /* (non-Javadoc) + * @see org.eclipse.rse.core.model.IRSEPersistableContainer#commit() + */ + public boolean commit() { + IStatus status = SystemProfileManager.getDefault().commitSystemProfile(this); + boolean scheduled = status.isOK(); + return scheduled; } /** diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemProfileManager.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemProfileManager.java index ae271dd8a..f76edc20b 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemProfileManager.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/model/SystemProfileManager.java @@ -16,6 +16,7 @@ * Kevin Doyle (IBM) - [197199] Renaming a Profile doesn't cause a save * Yu-Fen Kuo (MontaVista) - [189271] [team] New Profile's are always active * - [189219] [team] Inactive Profiles become active after workbench restart + * David Dykstal (IBM) - [197036] added implementation of run() for commit transaction support ********************************************************************************/ package org.eclipse.rse.internal.core.model; @@ -24,6 +25,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; import org.eclipse.rse.core.RSECorePlugin; import org.eclipse.rse.core.RSEPreferencesManager; import org.eclipse.rse.core.model.ISystemProfile; @@ -39,7 +42,8 @@ public class SystemProfileManager implements ISystemProfileManager { private List _profiles = new ArrayList(10); private static SystemProfileManager singleton = null; - private boolean restoring = false; + private boolean restoring = false; + private boolean active = true; /** * Ordinarily there should be only one instance of a SystemProfileManager @@ -68,11 +72,65 @@ public class SystemProfileManager implements ISystemProfileManager { public static void clearDefault() { singleton = null; } - + public void setRestoring(boolean flag) { restoring = flag; } + + /** + * Run an operation that make make changes to the persistent model in such a way that + * results are scheduled to be persisted at the end of the operation. + * @param operation an ISystemProfileOperation to be performed. + * @return an IStatus indicating the status of the operation. Changes to + * profiles are committed in any case. + */ + public static IStatus run(ISystemProfileOperation operation) { + IStatus result = null; + SystemProfileManager instance = getDefault(); + result = instance.runOperation(operation); + return result; + } + + private IStatus runOperation(ISystemProfileOperation operation) { + IStatus status = Status.OK_STATUS; + boolean wasActive = active; + active = false; + try { + status = operation.run(); + } finally { + if (wasActive) { + active = true; + commitProfiles(); + } + } + return status; + } + private void commitProfiles() { + for (Iterator z = _profiles.iterator(); z.hasNext();) { + ISystemProfile profile = (ISystemProfile) z.next(); + profile.commit(); + } + } + + public IStatus commitSystemProfile(ISystemProfile profile) { + IStatus status = Status.OK_STATUS; + boolean scheduled = false; + if (active) { + if (!RSECorePlugin.getThePersistenceManager().isBusy()) { + scheduled = RSECorePlugin.getThePersistenceManager().commitProfile(profile, 5000); + } + } else { + scheduled = true; + } + if (!scheduled) { + String pluginId = RSECorePlugin.getDefault().getBundle().getSymbolicName(); + int code = 1; // TODO DWD make this a constant + status = new Status(IStatus.INFO, pluginId, code, "", null); //$NON-NLS-1$ + } + return status; + } + /** * Create a new profile with the given name, and add to the list. * The name must be unique within the existing list. @@ -115,7 +173,7 @@ public class SystemProfileManager implements ISystemProfileManager { * @see org.eclipse.rse.core.model.ISystemProfileManager#getSystemProfiles() */ public ISystemProfile[] getSystemProfiles() { - return getSystemProfiles(!restoring); + return getSystemProfiles(restoring); } /* (non-Javadoc) @@ -162,14 +220,14 @@ public class SystemProfileManager implements ISystemProfileManager { /* (non-Javadoc) * @see org.eclipse.rse.core.model.ISystemProfileManager#getSystemProfile(java.lang.String) */ - private ISystemProfile getSystemProfileOld(String name) { - ISystemProfile[] profiles = getSystemProfiles(); - if ((profiles == null) || (profiles.length == 0)) return null; - ISystemProfile match = null; - for (int idx = 0; (match == null) && (idx < profiles.length); idx++) - if (profiles[idx].getName().equals(name)) match = profiles[idx]; - return match; - } +// private ISystemProfile getSystemProfileOld(String name) { +// ISystemProfile[] profiles = getSystemProfiles(); +// if ((profiles == null) || (profiles.length == 0)) return null; +// ISystemProfile match = null; +// for (int idx = 0; (match == null) && (idx < profiles.length); idx++) +// if (profiles[idx].getName().equals(name)) match = profiles[idx]; +// return match; +// } /* (non-Javadoc) * @see org.eclipse.rse.core.model.ISystemProfileManager#renameSystemProfile(org.eclipse.rse.core.model.ISystemProfile, java.lang.String) @@ -225,14 +283,14 @@ public class SystemProfileManager implements ISystemProfileManager { /* (non-Javadoc) * @see org.eclipse.rse.core.model.ISystemProfileManager#isSystemProfileActive(java.lang.String) */ - private boolean isSystemProfileActiveOld(String profileName) { - String[] activeProfiles = getActiveSystemProfileNames(); - boolean match = false; - for (int idx = 0; !match && (idx < activeProfiles.length); idx++) { - if (activeProfiles[idx].equals(profileName)) match = true; - } - return match; - } +// private boolean isSystemProfileActiveOld(String profileName) { +// String[] activeProfiles = getActiveSystemProfileNames(); +// boolean match = false; +// for (int idx = 0; !match && (idx < activeProfiles.length); idx++) { +// if (activeProfiles[idx].equals(profileName)) match = true; +// } +// return match; +// } /* (non-Javadoc) * @see org.eclipse.rse.core.model.ISystemProfileManager#getActiveSystemProfiles() @@ -270,92 +328,92 @@ public class SystemProfileManager implements ISystemProfileManager { /* (non-Javadoc) * @see org.eclipse.rse.core.model.ISystemProfileManager#getActiveSystemProfileNames() */ - private String[] getActiveSystemProfileNamesOld() { - String[] activeProfileNames = RSEPreferencesManager.getActiveProfiles(); - // dy: defect 48355, need to sync this with the actual profile list. If the user - // imports old preference settings or does a team sync and a profile is deleted then - // it is possible an active profile no longer exists. - // String[] systemProfileNames = getSystemProfileNames(); - ISystemProfile[] systemProfiles = getSystemProfiles(); - boolean found; - boolean found_team = false; - boolean found_private = false; - boolean changed = false; - String defaultProfileName = RSEPreferencesManager.getDefaultPrivateSystemProfileName(); - - for (int activeIdx = 0; activeIdx < activeProfileNames.length; activeIdx++) { - // skip Team and Private profiles - String activeProfileName = activeProfileNames[activeIdx]; - if (activeProfileName.equals(defaultProfileName)) { - found_private = true; - } else if (activeProfileName.equals(RSEPreferencesManager.getDefaultTeamProfileName())) { - found_team = true; - } else { - found = false; - for (int systemIdx = 0; systemIdx < systemProfiles.length && !found; systemIdx++) { - if (activeProfileNames[activeIdx].equals(systemProfiles[systemIdx].getName())) { - found = true; - } - } - - if (!found) { - // The active profile no longer exists so remove it from the active list - RSEPreferencesManager.deleteActiveProfile(activeProfileNames[activeIdx]); - changed = true; - } - } - } - - for (int systemIdx = 0; systemIdx < systemProfiles.length && !changed; systemIdx++) { - boolean matchesBoth = false; - String name = systemProfiles[systemIdx].getName(); - - for (int activeIdx = 0; activeIdx < activeProfileNames.length && !matchesBoth; activeIdx++) { - String aname = activeProfileNames[activeIdx]; - if (name.equals(aname)) { - matchesBoth = true; - } - - } - if (!matchesBoth && found_private) { - if (systemProfiles[systemIdx].isActive() || systemProfiles[systemIdx].isDefaultPrivate()) { - RSEPreferencesManager.addActiveProfile(name); - RSEPreferencesManager.deleteActiveProfile(RSECorePlugin.getLocalMachineName()); - activeProfileNames = RSEPreferencesManager.getActiveProfiles(); - } - } - } - - // the active profiles list needed to be changed because of an external update, also - // check if Default profile needs to be added back to the list - if (changed || !found_team || !found_private) { - if (systemProfiles.length == 0) { - // First time user, make sure default is in the active list, the only time it wouldn't - // be is if the pref_store.ini was modified (because the user imported old preferences) - if (!found_team) { - RSEPreferencesManager.addActiveProfile(RSEPreferencesManager.getDefaultTeamProfileName()); - changed = true; - } - - if (!found_private) { - RSEPreferencesManager.addActiveProfile(RSECorePlugin.getLocalMachineName()); - changed = true; - } - } else { - ISystemProfile defaultProfile = getDefaultPrivateSystemProfile(); - if (defaultProfile != null && !found_private) { - RSEPreferencesManager.addActiveProfile(defaultProfile.getName()); - changed = true; - } - } - - if (changed) { - activeProfileNames = RSEPreferencesManager.getActiveProfiles(); - } - } - - return activeProfileNames; - } +// private String[] getActiveSystemProfileNamesOld() { +// String[] activeProfileNames = RSEPreferencesManager.getActiveProfiles(); +// // dy: defect 48355, need to sync this with the actual profile list. If the user +// // imports old preference settings or does a team sync and a profile is deleted then +// // it is possible an active profile no longer exists. +// // String[] systemProfileNames = getSystemProfileNames(); +// ISystemProfile[] systemProfiles = getSystemProfiles(); +// boolean found; +// boolean found_team = false; +// boolean found_private = false; +// boolean changed = false; +// String defaultProfileName = RSEPreferencesManager.getDefaultPrivateSystemProfileName(); +// +// for (int activeIdx = 0; activeIdx < activeProfileNames.length; activeIdx++) { +// // skip Team and Private profiles +// String activeProfileName = activeProfileNames[activeIdx]; +// if (activeProfileName.equals(defaultProfileName)) { +// found_private = true; +// } else if (activeProfileName.equals(RSEPreferencesManager.getDefaultTeamProfileName())) { +// found_team = true; +// } else { +// found = false; +// for (int systemIdx = 0; systemIdx < systemProfiles.length && !found; systemIdx++) { +// if (activeProfileNames[activeIdx].equals(systemProfiles[systemIdx].getName())) { +// found = true; +// } +// } +// +// if (!found) { +// // The active profile no longer exists so remove it from the active list +// RSEPreferencesManager.deleteActiveProfile(activeProfileNames[activeIdx]); +// changed = true; +// } +// } +// } +// +// for (int systemIdx = 0; systemIdx < systemProfiles.length && !changed; systemIdx++) { +// boolean matchesBoth = false; +// String name = systemProfiles[systemIdx].getName(); +// +// for (int activeIdx = 0; activeIdx < activeProfileNames.length && !matchesBoth; activeIdx++) { +// String aname = activeProfileNames[activeIdx]; +// if (name.equals(aname)) { +// matchesBoth = true; +// } +// +// } +// if (!matchesBoth && found_private) { +// if (systemProfiles[systemIdx].isActive() || systemProfiles[systemIdx].isDefaultPrivate()) { +// RSEPreferencesManager.addActiveProfile(name); +// RSEPreferencesManager.deleteActiveProfile(RSECorePlugin.getLocalMachineName()); +// activeProfileNames = RSEPreferencesManager.getActiveProfiles(); +// } +// } +// } +// +// // the active profiles list needed to be changed because of an external update, also +// // check if Default profile needs to be added back to the list +// if (changed || !found_team || !found_private) { +// if (systemProfiles.length == 0) { +// // First time user, make sure default is in the active list, the only time it wouldn't +// // be is if the pref_store.ini was modified (because the user imported old preferences) +// if (!found_team) { +// RSEPreferencesManager.addActiveProfile(RSEPreferencesManager.getDefaultTeamProfileName()); +// changed = true; +// } +// +// if (!found_private) { +// RSEPreferencesManager.addActiveProfile(RSECorePlugin.getLocalMachineName()); +// changed = true; +// } +// } else { +// ISystemProfile defaultProfile = getDefaultPrivateSystemProfile(); +// if (defaultProfile != null && !found_private) { +// RSEPreferencesManager.addActiveProfile(defaultProfile.getName()); +// changed = true; +// } +// } +// +// if (changed) { +// activeProfileNames = RSEPreferencesManager.getActiveProfiles(); +// } +// } +// +// return activeProfileNames; +// } /* (non-Javadoc) * @see org.eclipse.rse.core.model.ISystemProfileManager#getDefaultPrivateSystemProfile() @@ -449,8 +507,8 @@ public class SystemProfileManager implements ISystemProfileManager { } } - private ISystemProfile[] getSystemProfiles(boolean ensureDefaultPrivateProfileExists) { - if (ensureDefaultPrivateProfileExists) { + private ISystemProfile[] getSystemProfiles(boolean restoring) { + if (!restoring) { ensureDefaultPrivateProfile(); } ISystemProfile[] result = new ISystemProfile[_profiles.size()]; diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/subsystems/SubSystemConfigurationProxy.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/subsystems/SubSystemConfigurationProxy.java index 2540d3ccf..6d2e8830d 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/subsystems/SubSystemConfigurationProxy.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/core/subsystems/SubSystemConfigurationProxy.java @@ -16,6 +16,7 @@ * David Dykstal (IBM) - 168870: move core function from UI to core * Martin Oberhuber (Wind River) - [184095] Replace systemTypeName by IRSESystemType * Martin Oberhuber (Wind River) - [177523] Unify singleton getter methods + * David Dykstal (IBM) - [197036] delay the creation of filterPoolManagers when restoring ********************************************************************************/ package org.eclipse.rse.internal.core.subsystems; @@ -264,11 +265,12 @@ public class SubSystemConfigurationProxy implements ISubSystemConfigurationProxy * After a reset, restore from disk */ public void restore() { - try { - configuration.getAllSystemFilterPoolManagers(); - } catch (Exception exc) { - RSECorePlugin.getDefault().getLogger().logError("Error restoring subsystem for configuration " + getName(), exc); //$NON-NLS-1$ - } + // Filter pool managers do not need to be created until they are needed. +// try { +// configuration.getAllSystemFilterPoolManagers(); +// } catch (Exception exc) { +// RSECorePlugin.getDefault().getLogger().logError("Error restoring subsystem for configuration " + getName(), exc); //$NON-NLS-1$ +// } } /* (non-Javadoc) diff --git a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/persistence/dom/RSEDOMImporter.java b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/persistence/dom/RSEDOMImporter.java index 74a5bb893..bc67d2a66 100644 --- a/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/persistence/dom/RSEDOMImporter.java +++ b/rse/plugins/org.eclipse.rse.core/src/org/eclipse/rse/internal/persistence/dom/RSEDOMImporter.java @@ -17,6 +17,7 @@ * Kevin Doyle (IBM) - [163883] Multiple filter strings are disabled * Martin Oberhuber (Wind River) - [202416] Protect against NPEs when importing DOM * David McKnight (IBM) - [217715] [api] RSE property sets should support nested property sets + * David Dykstal (IBM) - [197036] respond to removal of SystemProfile.createHost() ********************************************************************************/ package org.eclipse.rse.internal.persistence.dom; @@ -117,11 +118,11 @@ public class RSEDOMImporter { IHost host = null; // get host node attributes - String connectionName = hostNode.getName(); + String hostName = hostNode.getName(); // we changed from storing names to storing IDs, so these may be null String systemTypeName = getAttributeValueMaybeNull(hostNode, IRSEDOMConstants.ATTRIBUTE_TYPE); String systemTypeId = getAttributeValueMaybeNull(hostNode, IRSEDOMConstants.ATTRIBUTE_SYSTEM_TYPE); - String hostName = getAttributeValue(hostNode, IRSEDOMConstants.ATTRIBUTE_HOSTNAME); + String hostAddress = getAttributeValue(hostNode, IRSEDOMConstants.ATTRIBUTE_HOSTNAME); String description = getAttributeValue(hostNode, IRSEDOMConstants.ATTRIBUTE_DESCRIPTION); boolean isOffline = getBooleanValue(hostNode, IRSEDOMConstants.ATTRIBUTE_OFFLINE); boolean isPromptable = getBooleanValue(hostNode, IRSEDOMConstants.ATTRIBUTE_PROMPTABLE); @@ -130,16 +131,18 @@ public class RSEDOMImporter { try { // NOTE create host effectively recreates the subsystems // so instead of creating subsystems on restore, we should be updating their properties - IRSECoreRegistry registry = RSECorePlugin.getTheCoreRegistry(); + IRSECoreRegistry coreRegistry = RSECorePlugin.getTheCoreRegistry(); IRSESystemType systemType = null; if (systemTypeId != null) { - systemType = registry.getSystemTypeById(systemTypeId); + systemType = coreRegistry.getSystemTypeById(systemTypeId); } else if (systemTypeName != null) { - systemType = registry.getSystemType(systemTypeName); + systemType = coreRegistry.getSystemType(systemTypeName); } //cannot create a host from a profile if we do not know the systemType if (systemType != null) { - host = profile.createHost(systemType, connectionName, hostName, description); + ISystemRegistry registry = RSECorePlugin.getTheSystemRegistry(); + String profileName = profile.getName(); + host = registry.createHost(profileName, systemType, hostName, hostAddress, description, false); host.setOffline(isOffline); host.setPromptable(isPromptable); } else { @@ -151,7 +154,7 @@ public class RSEDOMImporter { msg.append(") in "); //$NON-NLS-1$ msg.append(profile.getName()); msg.append(':'); - msg.append(connectionName); + msg.append(hostName); logWarning(msg.toString()); } } catch (Exception e) { @@ -292,7 +295,7 @@ public class RSEDOMImporter { fprMgr.setDefaultSystemFilterPoolManager(defaultFilterPoolManager); } - // restore filer pool references + // restore filter pool references RSEDOMNode[] filterPoolReferenceChildren = subSystemNode.getChildren(IRSEDOMConstants.TYPE_FILTER_POOL_REFERENCE); for (int i = 0; i < filterPoolReferenceChildren.length; i++) { RSEDOMNode fprChild = filterPoolReferenceChildren[i]; @@ -506,7 +509,7 @@ public class RSEDOMImporter { } // properties are now stored as children, get those next RSEDOMNode[] children = propertySetNode.getChildren(); - for (int i = 0; i < children.length; i++) { + for (int i = 0; i < children.length; i++) { RSEDOMNode child = children[i]; // is this a property set or a property? @@ -515,14 +518,14 @@ public class RSEDOMImporter { restorePropertySet((IRSEModelObject)set, child); } else { - String propertyName = child.getName(); - String propertyValue = getAttributeValue(child, IRSEDOMConstants.ATTRIBUTE_VALUE); - String propertyTypeName = getAttributeValue(child, IRSEDOMConstants.ATTRIBUTE_TYPE); - IPropertyType propertyType = PropertyType.fromString(propertyTypeName); - if (IPropertySet.DESCRIPTION_KEY.equals(propertyName)) { // any descriptions found as properties should be set directly - set.setDescription(propertyValue); - } else { - set.addProperty(propertyName, propertyValue, propertyType); + String propertyName = child.getName(); + String propertyValue = getAttributeValue(child, IRSEDOMConstants.ATTRIBUTE_VALUE); + String propertyTypeName = getAttributeValue(child, IRSEDOMConstants.ATTRIBUTE_TYPE); + IPropertyType propertyType = PropertyType.fromString(propertyTypeName); + if (IPropertySet.DESCRIPTION_KEY.equals(propertyName)) { // any descriptions found as properties should be set directly + set.setDescription(propertyValue); + } else { + set.addProperty(propertyName, propertyValue, propertyType); } } } diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java index a338ec58e..c03f3f6eb 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/servicesubsystem/FileServiceSubSystem.java @@ -27,6 +27,7 @@ * David McKnight (IBM) - [209552] API changes to use multiple and getting rid of deprecated * Kevin Doyle (IBM) - [208778] [efs][api] RSEFileStore#getOutputStream() does not support EFS#APPEND * David McKnight (IBM) - [209704] added supportsEncodingConversion() + * David Dykstal (IBM) - [197036] pulling up subsystem switch logic *******************************************************************************/ package org.eclipse.rse.subsystems.files.core.servicesubsystem; @@ -77,10 +78,6 @@ public final class FileServiceSubSystem extends RemoteFileSubSystem implements I protected ISearchService _hostSearchService; protected IHostFileToRemoteFileAdapter _hostFileToRemoteFileAdapter; protected IRemoteFile _userHome; - - - - public FileServiceSubSystem(IHost host, IConnectorService connectorService, IFileService hostFileService, IHostFileToRemoteFileAdapter fileAdapter, ISearchService searchService) { super(host, connectorService); @@ -919,43 +916,28 @@ public final class FileServiceSubSystem extends RemoteFileSubSystem implements I return null; } + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.SubSystem#canSwitchTo(org.eclipse.rse.core.subsystems.IServiceSubSystemConfiguration) + * Overriding the super implementation to return true for any configuration that implements IFileServiceSubSystemConfiguration + */ + public boolean canSwitchTo(IServiceSubSystemConfiguration configuration) { + return (configuration instanceof IFileServiceSubSystemConfiguration); + } - - /** - * Switch to use another protocol + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.SubSystem#internalSwitchServiceSubSystemConfiguration(org.eclipse.rse.core.subsystems.IServiceSubSystemConfiguration) + * Overriding the super implementation to do switch the file subsystem bits that need to be copied or initialized in a switch */ - public void switchServiceFactory(IServiceSubSystemConfiguration fact) - { - if (fact != getSubSystemConfiguration() && fact instanceof IFileServiceSubSystemConfiguration) - { - IFileServiceSubSystemConfiguration factory = (IFileServiceSubSystemConfiguration)fact; - try - { - _cachedRemoteFiles.clear(); - disconnect(); - } - catch (Exception e) - { - } - - _languageUtilityFactory = null; + protected void internalSwitchServiceSubSystemConfiguration(IServiceSubSystemConfiguration newConfig) { + if (newConfig instanceof IFileServiceSubSystemConfiguration) { IHost host = getHost(); - setSubSystemConfiguration(factory); - - IConnectorService oldConnectorService = getConnectorService(); - oldConnectorService.deregisterSubSystem(this); - - IConnectorService newConnectorService = factory.getConnectorService(host); - setConnectorService(newConnectorService); - - oldConnectorService.commit(); - newConnectorService.commit(); - - setName(factory.getName()); - setFileService(factory.getFileService(host)); - setHostFileToRemoteFileAdapter(factory.getHostFileAdapter()); - setSearchService(factory.getSearchService(host)); - + IFileServiceSubSystemConfiguration config = (IFileServiceSubSystemConfiguration) newConfig; + // file subsystem specific bits + _cachedRemoteFiles.clear(); + _languageUtilityFactory = null; + setFileService(config.getFileService(host)); + setHostFileToRemoteFileAdapter(config.getHostFileAdapter()); + setSearchService(config.getSearchService(host)); } } diff --git a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystemConfiguration.java b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystemConfiguration.java index 88d12974c..40e57d1f5 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystemConfiguration.java +++ b/rse/plugins/org.eclipse.rse.subsystems.files.core/src/org/eclipse/rse/subsystems/files/core/subsystems/RemoteFileSubSystemConfiguration.java @@ -15,6 +15,7 @@ * Martin Oberhuber (Wind River) - [168870] refactor org.eclipse.rse.core package of the UI plugin * Martin Oberhuber (Wind River) - [189130] Move SystemIFileProperties from UI to Core * Martin Oberhuber (Wind River) - [189123] Move renameSubSystemProfile() from UI to Core + * David Dykstal (IBM) - [197036] fixed NPE found during testing *******************************************************************************/ package org.eclipse.rse.subsystems.files.core.subsystems; @@ -330,13 +331,14 @@ public abstract class RemoteFileSubSystemConfiguration extends SubSystemConfigur try { // ----------------------------------------------------- // create a pool named filters - // ----------------------------------------------------- - pool = mgr.createSystemFilterPool(getDefaultFilterPoolName(mgr.getName(), getId()), true); // true=>is deletable by user + // ----------------------------------------------------- + String poolName = getDefaultFilterPoolName(mgr.getName(), getId()); + pool = mgr.createSystemFilterPool(poolName, true); // true => is deletable by user //System.out.println("Pool created"); // --------------------------------------------------------------------------------------------- // create default filters in that pool iff this is the user's private profile we are creating... // --------------------------------------------------------------------------------------------- - if (isUserPrivateProfile(mgr)) + if (pool != null && isUserPrivateProfile(mgr)) { Vector filterStrings = new Vector(); diff --git a/rse/plugins/org.eclipse.rse.subsystems.processes.core/src/org/eclipse/rse/subsystems/processes/servicesubsystem/ProcessServiceSubSystem.java b/rse/plugins/org.eclipse.rse.subsystems.processes.core/src/org/eclipse/rse/subsystems/processes/servicesubsystem/ProcessServiceSubSystem.java index 5933fd5a3..8c3ff9ef4 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.processes.core/src/org/eclipse/rse/subsystems/processes/servicesubsystem/ProcessServiceSubSystem.java +++ b/rse/plugins/org.eclipse.rse.subsystems.processes.core/src/org/eclipse/rse/subsystems/processes/servicesubsystem/ProcessServiceSubSystem.java @@ -13,6 +13,7 @@ * 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 ********************************************************************************/ package org.eclipse.rse.subsystems.processes.servicesubsystem; @@ -145,37 +146,21 @@ public class ProcessServiceSubSystem extends RemoteProcessSubSystemImpl implemen } /* (non-Javadoc) - * @see org.eclipse.rse.core.servicesubsystem.IServiceSubSystem#switchServiceFactory(org.eclipse.rse.core.servicesubsystem.IServiceSubSystemConfiguration) + * @see org.eclipse.rse.core.subsystems.SubSystem#internalSwitchServiceSubSystemConfiguration(org.eclipse.rse.core.subsystems.IServiceSubSystemConfiguration) */ - public void switchServiceFactory(IServiceSubSystemConfiguration fact) + protected void internalSwitchServiceSubSystemConfiguration(IServiceSubSystemConfiguration configuration) { - if (fact != getSubSystemConfiguration() && fact instanceof IProcessServiceSubSystemConfiguration) - { - IProcessServiceSubSystemConfiguration factory = (IProcessServiceSubSystemConfiguration)fact; - try - { - disconnect(); - } - catch (Exception e) - { - } - + IProcessServiceSubSystemConfiguration config = (IProcessServiceSubSystemConfiguration) configuration; IHost host = getHost(); - setSubSystemConfiguration(factory); - setName(factory.getName()); - - IConnectorService oldConnectorService = getConnectorService(); - oldConnectorService.deregisterSubSystem(this); - - IConnectorService newConnectorService = factory.getConnectorService(host); - setConnectorService(newConnectorService); - - oldConnectorService.commit(); - newConnectorService.commit(); - - setProcessService(factory.getProcessService(host)); - setHostProcessToRemoteProcessAdapter(factory.getHostProcessAdapter()); - } + setProcessService(config.getProcessService(host)); + setHostProcessToRemoteProcessAdapter(config.getHostProcessAdapter()); + } + + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.SubSystem#canSwitchTo(org.eclipse.rse.core.subsystems.IServiceSubSystemConfiguration) + */ + public boolean canSwitchTo(IServiceSubSystemConfiguration configuration) { + return configuration instanceof IProcessServiceSubSystemConfiguration; } /* (non-Javadoc) @@ -186,7 +171,6 @@ 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) */ diff --git a/rse/plugins/org.eclipse.rse.subsystems.shells.core/src/org/eclipse/rse/subsystems/shells/core/subsystems/servicesubsystem/ShellServiceSubSystem.java b/rse/plugins/org.eclipse.rse.subsystems.shells.core/src/org/eclipse/rse/subsystems/shells/core/subsystems/servicesubsystem/ShellServiceSubSystem.java index 8710b793e..e6c239a98 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.shells.core/src/org/eclipse/rse/subsystems/shells/core/subsystems/servicesubsystem/ShellServiceSubSystem.java +++ b/rse/plugins/org.eclipse.rse.subsystems.shells.core/src/org/eclipse/rse/subsystems/shells/core/subsystems/servicesubsystem/ShellServiceSubSystem.java @@ -15,6 +15,7 @@ * Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API * Martin Oberhuber (Wind River) - [186640] Add IRSESystemType.testProperty() * David McKnight (IBM) - [191599] Need to pass in shell encoding + * David Dykstal (IBM) - [197036] refactored switch configuration ********************************************************************************/ package org.eclipse.rse.subsystems.shells.core.subsystems.servicesubsystem; @@ -33,6 +34,7 @@ import org.eclipse.rse.services.shells.IHostShell; import org.eclipse.rse.services.shells.IShellService; import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFile; import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCmdSubSystem; +import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCmdSubSystemConfiguration; import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCommandShell; import org.eclipse.rse.subsystems.shells.core.subsystems.RemoteCmdSubSystem; @@ -204,38 +206,25 @@ public final class ShellServiceSubSystem extends RemoteCmdSubSystem implements I return l; } - /** - * swtich from one protocol to another + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.SubSystem#canSwitchTo(org.eclipse.rse.core.subsystems.IServiceSubSystemConfiguration) */ - public void switchServiceFactory(IServiceSubSystemConfiguration fact) - { - if (fact != getSubSystemConfiguration() && fact instanceof IShellServiceSubSystemConfiguration) - { - IShellServiceSubSystemConfiguration factory = (IShellServiceSubSystemConfiguration)fact; - try - { - disconnect(); - } - catch (Exception e) - { - } - - IHost host = getHost(); - setSubSystemConfiguration(factory); - setName(factory.getName()); - IConnectorService oldConnectorService = getConnectorService(); - oldConnectorService.deregisterSubSystem(this); - - IConnectorService newConnectorService = factory.getConnectorService(host); - setConnectorService(newConnectorService); - - oldConnectorService.commit(); - newConnectorService.commit(); - - setShellService(factory.getShellService(host)); - } + public boolean canSwitchTo(IServiceSubSystemConfiguration configuration) { + return configuration instanceof IShellServiceSubSystemConfiguration; } + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.SubSystem#internalSwitchServiceSubSystemConfiguration(org.eclipse.rse.core.subsystems.IServiceSubSystemConfiguration) + */ + protected void internalSwitchServiceSubSystemConfiguration(IServiceSubSystemConfiguration newConfiguration) { + IShellServiceSubSystemConfiguration configuration = (IShellServiceSubSystemConfiguration) newConfiguration; + IHost host = getHost(); + setShellService(configuration.getShellService(host)); + } + + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.SubSystem#getServiceType() + */ public Class getServiceType() { return IShellService.class; diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/actions/SystemDisconnectAllSubSystemsAction.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/actions/SystemDisconnectAllSubSystemsAction.java index cb2e6105f..2164e7b3c 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/actions/SystemDisconnectAllSubSystemsAction.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/actions/SystemDisconnectAllSubSystemsAction.java @@ -13,6 +13,7 @@ * Contributors: * Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry * Kevin Doyle (IBM) - [175277] Cannot disconnect multiple connections at once with multiselect + * David Dykstal (IBM) - [197036] minor refactoring ********************************************************************************/ package org.eclipse.rse.internal.ui.actions; @@ -59,7 +60,7 @@ public class SystemDisconnectAllSubSystemsAction extends SystemBaseAction if (element instanceof IHost) { IHost host = (IHost)element; ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry(); - ISubSystem[] ss = sr.getSubSystems(host, false); + ISubSystem[] ss = sr.getSubSystems(host); List l = new ArrayList(); for (int i=0; i<ss.length; i++) { if (ss[i].isConnected() && ss[i].getSubSystemConfiguration().supportsSubSystemConnect()) { diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/filters/dialogs/SystemFilterWorkWithFilterPoolsDialog.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/filters/dialogs/SystemFilterWorkWithFilterPoolsDialog.java index 0e3cb31f8..bd105c757 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/filters/dialogs/SystemFilterWorkWithFilterPoolsDialog.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/filters/dialogs/SystemFilterWorkWithFilterPoolsDialog.java @@ -12,6 +12,8 @@ * * Contributors: * Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry + * David Dykstal (IBM) - [197036] fixed delete filter pool bug found during testing of this bug + * see also bug 194260 regarding deleting filter pools ********************************************************************************/ package org.eclipse.rse.internal.ui.filters.dialogs; @@ -20,6 +22,7 @@ import java.util.Vector; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.ToolBarManager; +import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.IBasicPropertyConstants; import org.eclipse.jface.viewers.ISelection; @@ -77,6 +80,15 @@ public class SystemFilterWorkWithFilterPoolsDialog SystemFilterPoolDialogInterface //,ISystemResourceChangeListener { + class DeleteFilterPoolAction extends SystemCommonDeleteAction { + public DeleteFilterPoolAction(Shell parent, ISystemDeleteTarget deleteTarget) { + super(parent, deleteTarget); + } + protected Object getDialogValue(Dialog dlg) { + doDelete(null); + return null; + } + } private String promptString; //private Label prompt; @@ -93,8 +105,8 @@ public class SystemFilterWorkWithFilterPoolsDialog //private ActionContributionItem newActionItem, deleteActionItem, renameActionItem; private SystemFilterWorkWithFilterPoolsRefreshAllAction refreshAction = null; private SystemFilterNewFilterPoolAction newAction = null; - //private SystemSimpleDeleteAction dltAction = null; - private SystemCommonDeleteAction dltAction = null; + private DeleteFilterPoolAction dltAction = null; + //private SystemCommonDeleteAction dltAction = null; //private SystemSimpleRenameAction rnmAction = null; private SystemCommonRenameAction rnmAction = null; private SystemFilterCopyFilterPoolAction cpyAction = null; @@ -251,7 +263,7 @@ public class SystemFilterWorkWithFilterPoolsDialog { newAction = new SystemFilterNewFilterPoolAction(shell,this); //dltAction = new SystemSimpleDeleteAction(shell,this); - dltAction = new SystemCommonDeleteAction(shell,this); + dltAction = new DeleteFilterPoolAction(shell,this); rnmAction = new SystemCommonRenameAction(shell,this); // undo typical settings... rnmAction.allowOnMultipleSelection(false); diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemViewConnectionAdapter.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemViewConnectionAdapter.java index 210ea2515..b9b4f6298 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemViewConnectionAdapter.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/SystemViewConnectionAdapter.java @@ -30,6 +30,7 @@ * Uwe Stieber (Wind River) - [199032] [api] Remove method acceptContextMenuActionContribution(...) from RSESystemTypeAdapter * Xuan Chen (IBM) - [160775] [api] rename (at least within a zip) blocks UI thread * Martin Oberhuber (Wind River) - [216266] Consider stateless subsystems (supportsSubSystemConnect==false) + * David Dykstal (IBM) - [197036] minor refactoring caused by SystemRegistry fix for this bug ********************************************************************************/ package org.eclipse.rse.internal.ui.view; @@ -599,7 +600,7 @@ public class SystemViewConnectionAdapter //specifically, this allows deletion of "Local" which is always connected (but does not support disconnect) //need to get subsystems from registry instead of host in order to be lazy: //subsystems which are not yet instantiated do not need to be considered. - ISubSystem[] ss = sr.getSubSystems(host, false); + ISubSystem[] ss = sr.getSubSystems(host); for (int i=0; i<ss.length; i++) { if (ss[i].isConnected() && ss[i].getSubSystemConfiguration().supportsSubSystemConnect()) return false; diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/team/SystemTeamViewCategoryAdapter.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/team/SystemTeamViewCategoryAdapter.java index 99e278506..2f258fcc9 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/team/SystemTeamViewCategoryAdapter.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/internal/ui/view/team/SystemTeamViewCategoryAdapter.java @@ -15,10 +15,18 @@ * Martin Oberhuber (Wind River) - [182454] improve getAbsoluteName() documentation * Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API * Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry + * David Dykstal (IBM) - [197036] rewrote getSubSystemConfigurationNodes to get filter pools + * in a way that delays the loading of subsystem configurations ********************************************************************************/ package org.eclipse.rse.internal.ui.view.team; -import java.util.Vector; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; @@ -28,6 +36,8 @@ import org.eclipse.rse.core.RSECorePlugin; import org.eclipse.rse.core.model.ISystemProfile; import org.eclipse.rse.core.model.ISystemRegistry; import org.eclipse.rse.core.subsystems.ISubSystemConfiguration; +import org.eclipse.rse.core.subsystems.ISubSystemConfigurationProxy; +import org.eclipse.rse.core.subsystems.SubSystemConfiguration; import org.eclipse.rse.internal.ui.SystemResources; import org.eclipse.rse.internal.ui.view.SystemViewResources; import org.eclipse.rse.ui.SystemMenuManager; @@ -156,48 +166,55 @@ public class SystemTeamViewCategoryAdapter /** - * Create subsystem factory child nodes for expanded category node + * Create subsystem configuration child nodes for expanded category node. */ - private SystemTeamViewSubSystemConfigurationNode[] createSubSystemConfigurationNodes(ISystemProfile profile, SystemTeamViewCategoryNode category) - { - SystemTeamViewSubSystemConfigurationNode[] nodes = null; - + private SystemTeamViewSubSystemConfigurationNode[] createSubSystemConfigurationNodes(ISystemProfile profile, SystemTeamViewCategoryNode category) { + // create a sorted set to hold the subsystem configurations based on the proxy ordering ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry(); - ISubSystemConfiguration[] factories = sr.getSubSystemConfigurations(); - if (factories != null) - { - Vector v = new Vector(); - String categoryType = category.getMementoHandle(); - for (int idx=0; idx<factories.length; idx++) - { - boolean createNode = false; - ISubSystemConfiguration ssf = factories[idx]; - if (categoryType.equals(SystemTeamViewCategoryNode.MEMENTO_FILTERPOOLS)) - { - createNode = ssf.supportsFilters() && (profile.getFilterPools(ssf).length > 0); - } - else if (categoryType.equals(SystemTeamViewCategoryNode.MEMENTO_USERACTIONS)) - { - createNode = ssf.supportsUserDefinedActions(); // && profile.getUserActions(ssf).length > 0; - } - else if (categoryType.equals(SystemTeamViewCategoryNode.MEMENTO_COMPILECMDS)) - { - createNode = ssf.supportsCompileActions(); // && profile.getCompileCommandTypes(ssf).length > 0; - } - else if (categoryType.equals(SystemTeamViewCategoryNode.MEMENTO_TARGETS)) - { - createNode = ssf.supportsTargets(); // && profile.getTargets(ssf).length > 0; - } - if (createNode) - v.addElement(new SystemTeamViewSubSystemConfigurationNode(profile, category, factories[idx])); + final List proxies = Arrays.asList(sr.getSubSystemConfigurationProxies()); + Comparator comparator = new Comparator() { + public int compare(Object o1, Object o2) { + ISubSystemConfiguration c1 = (SubSystemConfiguration) o1; + ISubSystemConfiguration c2 = (SubSystemConfiguration) o2; + ISubSystemConfigurationProxy proxy1 = c1.getSubSystemConfigurationProxy(); + ISubSystemConfigurationProxy proxy2 = c2.getSubSystemConfigurationProxy(); + Integer p1 = new Integer(proxies.indexOf(proxy1)); + Integer p2 = new Integer(proxies.indexOf(proxy2)); + int result = p1.compareTo(p2); + return result; } - nodes = new SystemTeamViewSubSystemConfigurationNode[v.size()]; - for (int idx=0; idx<nodes.length; idx++) - { - nodes[idx] = (SystemTeamViewSubSystemConfigurationNode)v.elementAt(idx); + }; + SortedSet activeSubsystemConfigurations = new TreeSet(comparator); + // find the active subsystem configurations + for (Iterator z = proxies.iterator(); z.hasNext();) { + ISubSystemConfigurationProxy proxy = (ISubSystemConfigurationProxy) z.next(); + if (proxy.isSubSystemConfigurationActive()) { + ISubSystemConfiguration config = proxy.getSubSystemConfiguration(); + activeSubsystemConfigurations.add(config); } - } - return nodes; + } + // construct the nodes for the view based on these configurations + List nodes = new ArrayList(); + String categoryType = category.getMementoHandle(); + for (Iterator z = activeSubsystemConfigurations.iterator(); z.hasNext();) { + ISubSystemConfiguration ssf = (ISubSystemConfiguration) z.next(); + boolean createNode = false; + if (categoryType.equals(SystemTeamViewCategoryNode.MEMENTO_FILTERPOOLS)) { + createNode = ssf.supportsFilters() && (profile.getFilterPools(ssf).length > 0); + } else if (categoryType.equals(SystemTeamViewCategoryNode.MEMENTO_USERACTIONS)) { + createNode = ssf.supportsUserDefinedActions(); // && profile.getUserActions(ssf).length > 0; + } else if (categoryType.equals(SystemTeamViewCategoryNode.MEMENTO_COMPILECMDS)) { + createNode = ssf.supportsCompileActions(); // && profile.getCompileCommandTypes(ssf).length > 0; + } else if (categoryType.equals(SystemTeamViewCategoryNode.MEMENTO_TARGETS)) { + createNode = ssf.supportsTargets(); // && profile.getTargets(ssf).length > 0; + } + if (createNode) { + nodes.add(new SystemTeamViewSubSystemConfigurationNode(profile, category, ssf)); + } + } + SystemTeamViewSubSystemConfigurationNode[] result = new SystemTeamViewSubSystemConfigurationNode[nodes.size()]; + nodes.toArray(result); + return result; } /** diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/RSEUIPlugin.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/RSEUIPlugin.java index f16a87014..68bdbac7e 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/RSEUIPlugin.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/RSEUIPlugin.java @@ -27,7 +27,8 @@ * David Dykstal (IBM) - [186589] move user types, user actions, and compile commands * API to the user actions plugin * David Dykstal (IBM) - [191038] initialize SystemRegistryUI without a log file, it was not used - * David McKnight (IBM) - [196838] Don't recreate local after it has been deleted + * David McKnight (IBM) - [196838] Don't recreate local after it has been deleted + * David Dykstal (IBM) - [197036] formatted the initialize job to be able to read it ********************************************************************************/ package org.eclipse.rse.ui; @@ -79,45 +80,26 @@ import org.osgi.framework.BundleContext; */ public class RSEUIPlugin extends SystemBasePlugin implements ISystemMessageProvider { - public class InitRSEJob extends Job - { - public InitRSEJob() - { - //IMPORTANT: The name of this job must not ever be changed. It is par of API, - //because clients can use it to find the InitRSEJob by name, such that they can join it. + public class InitRSEJob extends Job { + public InitRSEJob() { + // IMPORTANT: The name of this job must not ever be changed. It is part of the API, + // because clients can use it to find the InitRSEJob by name, such that they can join it. super("Initialize RSE"); //$NON-NLS-1$ } - public IStatus run(IProgressMonitor monitor) - { + public IStatus run(IProgressMonitor monitor) { //System.err.println("InitRSEJob started"); //$NON-NLS-1$ ISystemRegistry registry = getSystemRegistryInternal(); - - -// SystemResourceManager.getRemoteSystemsProject(); // create core folder tree - try - { - SystemStartHere.getSystemProfileManager(); // create folders per profile - } - catch (Exception e) - { - e.printStackTrace(); - } - - - - + SystemStartHere.getSystemProfileManager(); // create folders per profile // add workspace listener for our project IProject remoteSystemsProject = SystemResourceManager.getRemoteSystemsProject(false); SystemResourceListener listener = SystemResourceListener.getListener(remoteSystemsProject); SystemResourceManager.startResourceEventListening(listener); - // determining whether to create an initial local connection IPath statePath = RSECorePlugin.getDefault().getStateLocation(); IPath markPath = statePath.append("localHostCreated.mark"); //$NON-NLS-1$ File markFile = new File(markPath.toOSString()); - if (!markFile.exists() && SystemPreferencesManager.getShowLocalConnection()) - { + if (!markFile.exists() && SystemPreferencesManager.getShowLocalConnection()) { // create the connection only if the local system type is enabled IRSESystemType systemType = RSECorePlugin.getTheCoreRegistry().getSystemTypeById(IRSESystemType.SYSTEMTYPE_LOCAL_ID); if (systemType != null) { @@ -134,7 +116,6 @@ public class RSEUIPlugin extends SystemBasePlugin implements ISystemMessageProvi } } } - //System.err.println("InitRSEJob done"); //$NON-NLS-1$ return Status.OK_STATUS; } diff --git a/rse/plugins/org.eclipse.rse.ui/model/org/eclipse/rse/ui/internal/model/SystemRegistry.java b/rse/plugins/org.eclipse.rse.ui/model/org/eclipse/rse/ui/internal/model/SystemRegistry.java index 2e5a2308e..c1cc2ade8 100644 --- a/rse/plugins/org.eclipse.rse.ui/model/org/eclipse/rse/ui/internal/model/SystemRegistry.java +++ b/rse/plugins/org.eclipse.rse.ui/model/org/eclipse/rse/ui/internal/model/SystemRegistry.java @@ -39,18 +39,25 @@ * Martin Oberhuber (Wind River) - [206742] Make SystemHostPool thread-safe * David Dykstal (IBM) - [210537] removed exception handling for SystemHostPool, no longer needed * Martin Oberhuber (Wind River) - [216266] improved non-forced getSubSystems() code, removed getSubSystemsLazily() + * David Dykstal (IBM) - [197036] wrapped createHost to commit changes only once + * rewrote createHost to better pick default subsystem configurations to activate + * rewrote getSubSystemConfigurationsBySystemType to be able to delay the creation (and loading) of subsystem configurations ********************************************************************************/ package org.eclipse.rse.ui.internal.model; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.Vector; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.rse.core.IRSESystemType; import org.eclipse.rse.core.IRSEUserIdConstants; @@ -90,6 +97,7 @@ import org.eclipse.rse.core.subsystems.ISubSystemConfiguration; import org.eclipse.rse.core.subsystems.ISubSystemConfigurationProxy; import org.eclipse.rse.core.subsystems.ISystemDragDropAdapter; import org.eclipse.rse.internal.core.filters.SystemFilterStartHere; +import org.eclipse.rse.internal.core.model.ISystemProfileOperation; import org.eclipse.rse.internal.core.model.SystemHostPool; import org.eclipse.rse.internal.core.model.SystemModelChangeEvent; import org.eclipse.rse.internal.core.model.SystemModelChangeEventManager; @@ -108,6 +116,8 @@ import org.eclipse.rse.ui.view.ISystemRemoteElementAdapter; import org.eclipse.rse.ui.view.SystemAdapterHelpers; import org.eclipse.swt.widgets.Display; +import com.ibm.icu.text.MessageFormat; + /** * Registry for all connections. */ @@ -206,7 +216,9 @@ public class SystemRegistry implements ISystemRegistry */ public Object[] getConnectionChildren(IHost selectedConnection) { - return getSubSystems(selectedConnection); + // DWD shouldn't this be "getHostChildren"? Its part of the ISystemViewInputProvider interface. + Object[] result = getSubSystems(selectedConnection); + return result; } /** * This method is called by the connection adapter when deciding to show a plus-sign @@ -321,64 +333,45 @@ public class SystemRegistry implements ISystemRegistry * (non-Javadoc) * @see org.eclipse.rse.core.model.ISystemRegistry#getSubSystemConfigurationsBySystemType(org.eclipse.rse.core.IRSESystemType, boolean) */ + /** + * @deprecated Use {@link #getSubSystemConfigurationsBySystemType(IRSESystemType,boolean,boolean)} instead + */ public ISubSystemConfiguration[] getSubSystemConfigurationsBySystemType(IRSESystemType systemType, boolean filterDuplicateServiceSubSystemFactories) { - List serviceTypesAdded = new ArrayList(); - List serviceImplsAdded = new ArrayList(); - Vector v = new Vector(); - if (subsystemConfigurationProxies != null) - { - for (int idx = 0; idx < subsystemConfigurationProxies.length; idx++) - { - ISubSystemConfigurationProxy ssfProxy = subsystemConfigurationProxies[idx]; - if (ssfProxy.appliesToSystemType(systemType)) - { - ISubSystemConfiguration ssFactory = ssfProxy.getSubSystemConfiguration(); - if (ssFactory != null) - { - if (ssFactory instanceof IServiceSubSystemConfiguration && filterDuplicateServiceSubSystemFactories) - { - IServiceSubSystemConfiguration serviceFactory = (IServiceSubSystemConfiguration)ssFactory; - Class serviceType = serviceFactory.getServiceType(); - Class serviceImplType = serviceFactory.getServiceImplType(); - boolean containsThisServiceType = serviceTypesAdded.contains(serviceType); - boolean containsThisServiceImplType = serviceImplsAdded.contains(serviceImplType); - - if (!containsThisServiceType) - { - serviceTypesAdded.add(serviceType); - serviceImplsAdded.add(serviceImplType); - v.addElement(ssFactory); - } - else if (containsThisServiceImplType) - { - // remove the other one - for (int i = 0; i < v.size(); i++) - { - if (v.get(i) instanceof IServiceSubSystemConfiguration) - { - IServiceSubSystemConfiguration addedConfig = (IServiceSubSystemConfiguration)v.get(i); - if (addedConfig.getServiceType() == serviceType) - { - v.remove(addedConfig); - } - } - + return getSubSystemConfigurationsBySystemType(systemType, filterDuplicateServiceSubSystemFactories, true); + } + /* + * (non-Javadoc) + * @see org.eclipse.rse.core.model.ISystemRegistry#getSubSystemConfigurationsBySystemType(org.eclipse.rse.core.IRSESystemType, boolean) + */ + public ISubSystemConfiguration[] getSubSystemConfigurationsBySystemType(IRSESystemType systemType, final boolean filterDuplicates, boolean activate) { + List configurations = new ArrayList(); + if (subsystemConfigurationProxies != null) { + Set serviceTypes = new HashSet(); +// Set serviceImplsAdded = new HashSet(); + for (int idx = 0; idx < subsystemConfigurationProxies.length; idx++) { + ISubSystemConfigurationProxy subsystemConfigurationProxy = subsystemConfigurationProxies[idx]; + if (subsystemConfigurationProxy.appliesToSystemType(systemType)) { + if (activate || subsystemConfigurationProxy.isSubSystemConfigurationActive()) { + ISubSystemConfiguration configuration = subsystemConfigurationProxy.getSubSystemConfiguration(); + if (configuration != null) { // could happen if activate fails + if (filterDuplicates && configuration instanceof IServiceSubSystemConfiguration) { + IServiceSubSystemConfiguration service = (IServiceSubSystemConfiguration) configuration; + Class serviceType = service.getServiceType(); + if (!serviceTypes.contains(serviceType)) { + serviceTypes.add(serviceType); + configurations.add(configuration); } - - v.addElement(ssFactory); + } else { + configurations.add(configuration); } - } - else - { - v.addElement(ssFactory); } } } } } - ISubSystemConfiguration[] factories = (ISubSystemConfiguration[])v.toArray(new ISubSystemConfiguration[v.size()]); - return factories; + ISubSystemConfiguration[] result = (ISubSystemConfiguration[]) configurations.toArray(new ISubSystemConfiguration[configurations.size()]); + return result; } @@ -875,70 +868,53 @@ public class SystemRegistry implements ISystemRegistry return pool.getSystemProfile(); } - public IConnectorService[] getConnectorServices(IHost conn) - { - List csList = new ArrayList(); - // DKM for now, I'll just use the subsystems to get at the systems - // but later with new model, we should be getting these directly - ISubSystem[] sses = getSubSystems(conn); - for (int i = 0; i < sses.length; i++) - { - ISubSystem ss = sses[i]; - IConnectorService service = ss.getConnectorService(); - if (!csList.contains(service)) - { - csList.add(service); + /* (non-Javadoc) + * @see org.eclipse.rse.core.model.ISystemRegistry#getConnectorServices(org.eclipse.rse.core.model.IHost) + */ + public IConnectorService[] getConnectorServices(IHost host) { + List services = new ArrayList(); + ISubSystem[] subsystems = getSubSystems(host); + for (int i = 0; i < subsystems.length; i++) { + ISubSystem subsystem = subsystems[i]; + IConnectorService service = subsystem.getConnectorService(); + if (!services.contains(service)) { + services.add(service); } } - return (IConnectorService[])csList.toArray(new IConnectorService[csList.size()]); + return (IConnectorService[]) services.toArray(new IConnectorService[services.size()]); } - /** - * Return list of subsystem objects for a given connection. - * Demand pages the subsystem factories into memory if they aren't already. - * <p> - * To protect against crashes, if there are no subsystems, an array of length zero is returned. + /* (non-Javadoc) + * @see org.eclipse.rse.core.model.ISystemRegistry#getSubSystems(org.eclipse.rse.core.model.IHost, boolean) */ - public ISubSystem[] getSubSystems(IHost conn) - { - return getSubSystems(conn, ISubSystemConfiguration.FORCE_INTO_MEMORY); + public ISubSystem[] getSubSystems(IHost host, boolean force) { + return getSubSystems(host); } - /** - * Return list of subsystem objects for a given connection. - * Demand pages the subsystem factories into memory if they aren't already. - * <p> - * To protect against crashes, if there are no subsystems, an array of length zero is returned. - */ - public ISubSystem[] getSubSystems(IHost conn, boolean force) - { - ISubSystem[] subsystems = null; - - if (subsystemConfigurationProxies != null) - { - List v = new ArrayList(); - for (int idx = 0; idx < subsystemConfigurationProxies.length; idx++) - { - if (!force && !subsystemConfigurationProxies[idx].isSubSystemConfigurationActive()) { - //avoid instantiation if not forced. - continue; - } - - if (subsystemConfigurationProxies[idx].appliesToSystemType(conn.getSystemType())) - { - ISubSystemConfiguration factory = subsystemConfigurationProxies[idx].getSubSystemConfiguration(); - if (factory != null) - { - ISubSystem[] sss = factory.getSubSystems(conn, force); - if (sss != null) - for (int jdx = 0; jdx < sss.length; jdx++) - v.add(sss[jdx]); + /* (non-Javadoc) + * @see org.eclipse.rse.core.model.ISystemRegistry#getSubSystems(org.eclipse.rse.core.model.IHost) + */ + public ISubSystem[] getSubSystems(IHost host) { + IRSESystemType systemType = host.getSystemType(); + List subsystems = new ArrayList(); + if (subsystemConfigurationProxies != null) { + for (int i = 0; i < subsystemConfigurationProxies.length; i++) { + ISubSystemConfigurationProxy proxy = subsystemConfigurationProxies[i]; + if (proxy.appliesToSystemType(systemType)) { + if (proxy.isSubSystemConfigurationActive()) { + ISubSystemConfiguration config = proxy.getSubSystemConfiguration(); + ISubSystem[] ssArray = config.getSubSystems(host, false); + if (ssArray == null) { // create a subsystem for this connection and config + ssArray = this.createSubSystems(host, new ISubSystemConfiguration[] {config}); + } + subsystems.addAll(Arrays.asList(ssArray)); } } } - subsystems = (ISubSystem[])v.toArray(new ISubSystem[v.size()]); } - return subsystems; + ISubSystem[] result = new ISubSystem[subsystems.size()]; + subsystems.toArray(result); + return result; } /** @@ -1147,12 +1123,15 @@ public class SystemRegistry implements ISystemRegistry dataStream.append("."); //$NON-NLS-1$ dataStream.append(connectionName); return dataStream.toString(); - } - - public ISubSystem[] getSubsystems(IHost connection, Class subsystemInterface) + } + + /* (non-Javadoc) + * @see org.eclipse.rse.core.model.ISystemRegistry#getSubsystems(org.eclipse.rse.core.model.IHost, java.lang.Class) + */ + public ISubSystem[] getSubsystems(IHost host, Class subsystemInterface) { List matches = new ArrayList(); - ISubSystem[] allSS = connection.getSubSystems(); + ISubSystem[] allSS = getSubSystems(host); for (int i = 0; i < allSS.length; i++) { ISubSystem ss = allSS[i]; @@ -1164,10 +1143,13 @@ public class SystemRegistry implements ISystemRegistry return (ISubSystem[])matches.toArray(new ISubSystem[matches.size()]); } - public ISubSystem[] getServiceSubSystems(IHost connection, Class serviceType) + /* (non-Javadoc) + * @see org.eclipse.rse.core.model.ISystemRegistry#getServiceSubSystems(org.eclipse.rse.core.model.IHost, java.lang.Class) + */ + public ISubSystem[] getServiceSubSystems(IHost host, Class serviceType) { List matches = new ArrayList(); - ISubSystem[] allSS = connection.getSubSystems(); + ISubSystem[] allSS = getSubSystems(host); for (int i = 0; i < allSS.length; i++) { ISubSystem ss = allSS[i]; @@ -1187,9 +1169,9 @@ public class SystemRegistry implements ISystemRegistry * (non-Javadoc) * @see org.eclipse.rse.core.model.ISystemRegistry#getSubSystemsBySubSystemConfigurationCategory(java.lang.String, org.eclipse.rse.core.model.IHost) */ - public ISubSystem[] getSubSystemsBySubSystemConfigurationCategory(String factoryCategory, IHost connection) + public ISubSystem[] getSubSystemsBySubSystemConfigurationCategory(String factoryCategory, IHost host) { - ISubSystem[] subsystems = getSubSystems(connection); + ISubSystem[] subsystems = getSubSystems(host); if ((subsystems != null) && (subsystems.length > 0)) { Vector v = new Vector(); @@ -1658,82 +1640,116 @@ public class SystemRegistry implements ISystemRegistry } /** - * Create a connection object, given the connection pool and given all the possible attributes. - * <p> - * THE RESULTING CONNECTION OBJECT IS ADDED TO THE LIST OF EXISTING CONNECTIONS FOR YOU, IN - * THE PROFILE YOU SPECIFY. THE PROFILE IS ALSO SAVED TO DISK. + * Create a host object, given its host pool and its attributes. * <p> * This method: * <ul> - * <li>creates and saves a new connection within the given profile - * <li>calls all subsystem factories to give them a chance to create a subsystem instance - * <li>fires an ISystemResourceChangeEvent event of type EVENT_ADD to all registered listeners + * <li>creates and saves a new connection within the given profile + * <li>calls all subsystem factories to give them a chance to create a subsystem instance + * <li>fires an ISystemResourceChangeEvent event of type EVENT_ADD to all registered listeners * </ul> * <p> * @param profileName Name of the system profile the connection is to be added to. - * @param systemType system type matching one of the system types - * defined via the systemTypes extension point. - * @param connectionName unique connection name. - * @param hostName ip name of host. + * @param systemType system type matching one of the system types defined via the systemTypes extension point. + * @param hostName unique connection name. + * @param hostAddress IP name of host. * @param description optional description of the connection. Can be null. * @param defaultUserId userId to use as the default for the subsystems. * @param defaultUserIdLocation one of the constants in {@link org.eclipse.rse.core.IRSEUserIdConstants} - * that tells us where to set the user Id + * that tells us where to set the user Id * @param createSubSystems <code>true</code> to create subsystems for the host, <code>false</code> otherwise. * @param newConnectionWizardPages when called from the New Connection wizard this is union of the list of additional - * wizard pages supplied by the subsystem factories that pertain to the specified system type. Else null. + * wizard pages supplied by the subsystem factories that pertain to the specified system type. Else null. * @return SystemConnection object, or null if it failed to create. This is typically - * because the connectionName is not unique. Call getLastException() if necessary. - */ - public IHost createHost( - String profileName, - IRSESystemType systemType, - String connectionName, - String hostName, - String description, - String defaultUserId, - int defaultUserIdLocation, - boolean createSubSystems, - ISystemNewConnectionWizardPage[] newConnectionWizardPages) - throws Exception { - lastException = null; - ISystemHostPool pool = getHostPool(profileName); - IHost conn = null; - boolean promptable = false; // systemType.equals(IRSESystemType.SYSTEMTYPE_PROMPT); - try - { - // create, register and save new connection... - if ((defaultUserId != null) && (defaultUserId.length() == 0)) - defaultUserId = null; - conn = pool.createHost(systemType, connectionName, hostName, description, defaultUserId, defaultUserIdLocation); - if (conn == null) // conn already exists - { - conn = pool.getHost(connectionName); + * because the connectionName is not unique. Call getLastException() if necessary. + */ + // FIXME need to remove ISystemNewConnectionWizardPage[] from this and replace with IAdaptable[] + public IHost createHost(final String profileName, final IRSESystemType systemType, final String hostName, + final String hostAddress, final String description, final String defaultUserId, + final int defaultUserIdLocation, final boolean createSubSystems, + final ISystemNewConnectionWizardPage[] newConnectionWizardPages) throws Exception { + final ISystemRegistry sr = this; + class CreateHostOperation implements ISystemProfileOperation { + private IHost host = null; + private ISubSystem[] subsystems = new ISubSystem[0]; + IHost getHost() { + return host; } - if (promptable) - conn.setPromptable(true); - } - catch (Exception exc) - { - lastException = exc; - SystemBasePlugin.logError("Exception in createConnection for " + connectionName, exc); //$NON-NLS-1$ - throw exc; - } - if ((lastException == null) && !promptable && createSubSystems) { - // only 1 factory used per service type - ISubSystemConfiguration[] factories = getSubSystemConfigurationsBySystemType(systemType, true); - ISubSystem subSystems[] = new ISubSystem[factories.length]; - for (int idx = 0; idx < factories.length; idx++) { - ISubSystemConfiguration factory = factories[idx]; - ISystemNewConnectionWizardPage[] interestingPages = getApplicableWizardPages(factory, newConnectionWizardPages); - subSystems[idx] = factory.createSubSystem(conn, true, interestingPages); // give it the opportunity to create a subsystem + public ISubSystem[] getSubSystems() { + return subsystems; + } + public IStatus run() { + IStatus status = Status.OK_STATUS; + ISystemHostPool pool = getHostPool(profileName); + try { + // create, register and save new connection... + String uid = defaultUserId; + if ((uid != null) && (uid.length() == 0)) { + uid = null; + } + host = pool.createHost(systemType, hostName, hostAddress, description, uid, defaultUserIdLocation); + if (host == null) { // did not create since host already exists + host = pool.getHost(hostName); + } + } catch (Exception e) { + String pluginId = RSEUIPlugin.getDefault().getSymbolicName(); + String message = MessageFormat.format("Exception in createHost for {0}", new Object[] {hostName}); + status = new Status(IStatus.ERROR, pluginId, message, e); + } + if (status.isOK()) { + if (createSubSystems) { + // determine the list of configs to use to create subsystems from + List configs = new ArrayList(10); // arbitrary but reasonable + if (newConnectionWizardPages != null) { + // if there are wizard pages need to at least use those + for (int i = 0; i < newConnectionWizardPages.length; i++) { + configs.add(newConnectionWizardPages[i].getSubSystemConfiguration()); + } + // add any non-service subsystem configs that aren't already there that apply to this systemtype + ISubSystemConfiguration[] configsArray = getSubSystemConfigurationsBySystemType(systemType, false); + for (int i = 0; i < configsArray.length; i++) { + ISubSystemConfiguration config = configsArray[i]; + boolean isStrange = !(config instanceof IServiceSubSystemConfiguration); + boolean isAbsent = !configs.contains(config); + if (isStrange && isAbsent) { + configs.add(config); + } + } + } else { + // just get the defaults with the service subsystems filtered + ISubSystemConfiguration[] configsArray = getSubSystemConfigurationsBySystemType(systemType, true); + configs = Arrays.asList(configsArray); + } + // only subsystem configuration is used per service type + subsystems = new ISubSystem[configs.size()]; + ISystemProfile profile = host.getSystemProfile(); + int i = 0; + for (Iterator z = configs.iterator(); z.hasNext();) { + ISubSystemConfiguration config = (ISubSystemConfiguration) z.next(); + config.getFilterPoolManager(profile, true); // create the filter pool + ISystemNewConnectionWizardPage[] interestingPages = getApplicableWizardPages(config, newConnectionWizardPages); + subsystems[i] = config.createSubSystem(host, true, interestingPages); // give it the opportunity to create a subsystem + i++; + } + } + host.commit(); + } + return status; } - FireNewHostEvents fire = new FireNewHostEvents(conn, subSystems, this); - Display.getDefault().asyncExec(fire); } - conn.commit(); + CreateHostOperation op = new CreateHostOperation(); + IStatus status = SystemProfileManager.run(op); + lastException = (Exception) status.getException(); + if (lastException != null) { + SystemBasePlugin.logError(status.getMessage(), lastException); + throw lastException; + } + IHost host = op.getHost(); + ISubSystem[] subsystems = op.getSubSystems(); + FireNewHostEvents fire = new FireNewHostEvents(host, subsystems, sr); + Display.getDefault().asyncExec(fire); SystemPreferencesManager.setConnectionNamesOrder(); // update preferences order list - return conn; + return host; } /* @@ -1949,33 +1965,12 @@ public class SystemRegistry implements ISystemRegistry return createHost(profileName, systemType, connectionName, hostName, description, true); } - /** - * Create a connection object. This is a simplified version - * <p> - * THE RESULTING CONNECTION OBJECT IS ADDED TO THE LIST OF EXISTING CONNECTIONS FOR YOU, IN - * THE PROFILE YOU SPECIFY. THE PROFILE IS ALSO SAVED TO DISK. - * <p> - * This method: - * <ul> - * <li>creates and saves a new connection within the given profile - * <li>optionally calls all subsystem factories to give them a chance to create subsystem instances - * <li>fires an ISystemResourceChangeEvent event of type EVENT_ADD to all registered listeners - * </ul> - * <p> - * @param profileName Name of the system profile the connection is to be added to. - * @param systemType system type matching one of the system types - * defined via the systemTypes extension point. - * @param connectionName unique connection name. - * @param hostName ip name of host. - * @param description optional description of the connection. Can be null. - * @param createSubSystems <code>true</code> to create subsystems for the host, <code>false</code> otherwise. - * @return SystemConnection object, or null if it failed to create. This is typically - * because the connectionName is not unique. Call getLastException() if necessary. - * @since 2.0 + /* (non-Javadoc) + * @see org.eclipse.rse.core.model.ISystemRegistry#createHost(java.lang.String, org.eclipse.rse.core.IRSESystemType, java.lang.String, java.lang.String, java.lang.String, boolean) */ public IHost createHost(String profileName, IRSESystemType systemType, String connectionName, String hostName, String description, boolean createSubSystems) throws Exception { - return createHost(profileName, systemType, connectionName, hostName, description, null, IRSEUserIdConstants.USERID_LOCATION_HOST, null); + return createHost(profileName, systemType, connectionName, hostName, description, null, IRSEUserIdConstants.USERID_LOCATION_HOST, createSubSystems, null); } /* @@ -2318,7 +2313,7 @@ public class SystemRegistry implements ISystemRegistry public boolean isAnySubSystemConnected(IHost conn) { boolean any = false; - ISubSystem[] subsystems = getSubSystems(conn, false); + ISubSystem[] subsystems = getSubSystems(conn); if (subsystems == null) return false; for (int idx = 0; !any && (idx < subsystems.length); idx++) @@ -2352,7 +2347,7 @@ public class SystemRegistry implements ISystemRegistry return false; } - + /* * (non-Javadoc) * @see org.eclipse.rse.core.model.ISystemRegistry#areAllSubSystemsConnected(org.eclipse.rse.core.model.IHost) @@ -2394,7 +2389,7 @@ public class SystemRegistry implements ISystemRegistry public void disconnectAllSubSystems(IHost conn) { // get subsystems lazily, because not instantiated ones cannot be disconnected anyways. - ISubSystem[] subsystems = getSubSystems(conn, false); + ISubSystem[] subsystems = getSubSystems(conn); if (subsystems == null) return; diff --git a/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/SubSystem.java b/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/SubSystem.java index 62c2737f5..a13424cca 100644 --- a/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/SubSystem.java +++ b/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/SubSystem.java @@ -28,13 +28,19 @@ * David McKnight (IBM) - [186363] get rid of obsolete calls to SubSystem.connect() * David McKnight (IBM) - [211472] [api][breaking] IRemoteObjectResolver.getObjectWithAbsoluteName() needs a progress monitor * David McKnight (IBM) - [212403] [apidoc][breaking] Fixing docs of SubSystem#getConnectorService() and making internalConnect() private + * David Dykstal (IBM) - [197036] pulled up subsystem configuration switching logic from the service subsystem layer + * implemented IServiceSubSystem here so that subsystem configuration switching can be + * made common among all service subsystems. ********************************************************************************/ package org.eclipse.rse.core.subsystems; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Vector; import org.eclipse.core.resources.IResource; @@ -51,6 +57,7 @@ import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.rse.core.RSECorePlugin; import org.eclipse.rse.core.RSEPreferencesManager; +import org.eclipse.rse.core.events.ISystemModelChangeEvent; import org.eclipse.rse.core.events.ISystemModelChangeEvents; import org.eclipse.rse.core.events.ISystemResourceChangeEvents; import org.eclipse.rse.core.events.SystemResourceChangeEvent; @@ -69,6 +76,9 @@ import org.eclipse.rse.core.model.IRSEPersistableContainer; import org.eclipse.rse.core.model.ISystemProfile; import org.eclipse.rse.core.model.ISystemRegistry; import org.eclipse.rse.core.model.RSEModelObject; +import org.eclipse.rse.internal.core.model.ISystemProfileOperation; +import org.eclipse.rse.internal.core.model.SystemModelChangeEvent; +import org.eclipse.rse.internal.core.model.SystemProfileManager; import org.eclipse.rse.internal.ui.GenericMessages; import org.eclipse.rse.services.clientserver.messages.SystemMessage; import org.eclipse.rse.services.clientserver.messages.SystemMessageException; @@ -122,7 +132,7 @@ import org.eclipse.ui.progress.WorkbenchJob; */ public abstract class SubSystem extends RSEModelObject - implements IAdaptable, ISubSystem, + implements IAdaptable, ISubSystem, IServiceSubSystem, ISystemFilterPoolReferenceManagerProvider { @@ -175,6 +185,8 @@ public abstract class SubSystem extends RSEModelObject */ protected ISystemFilterPoolReferenceManager filterPoolReferenceManager = null; + private Map poolReferencesMap = new HashMap(); + private class NullRunnableContext implements IRunnableContext { public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException { IProgressMonitor monitor = new NullProgressMonitor(); @@ -2958,7 +2970,7 @@ public abstract class SubSystem extends RSEModelObject { ISubSystem firstSS = null; ISystemRegistry registry = RSECorePlugin.getTheSystemRegistry(); - ISubSystem[] sses = registry.getSubSystems(getHost(), false); + ISubSystem[] sses = registry.getSubSystems(getHost()); for (int i = 0; i < sses.length; i++) { ISubSystem ss = sses[i]; @@ -3049,4 +3061,131 @@ public abstract class SubSystem extends RSEModelObject return result; } + /* Service Subsystem support */ + + /** + * Perform the subsystem specific processing required to complete a subsystem configuration switch for a + * service subsystem. The subsystem will typically query this configuration for interesting properties or + * policies. It should also reset any state to a fresh start. + * This supplied implementation does nothing. Subclasses may override if they implement a service subsystem. + * @param newConfiguration the configuration this subsystem should use from this point. + */ + protected void internalSwitchServiceSubSystemConfiguration(IServiceSubSystemConfiguration newConfiguration) { + } + + /** + * Determine if a service subsystem is capable of switching to this new configuration. + * This is usually a test of this configuration's type against the type expected by this subsystem. + * This supplied implementation returns false. Subclasses should override if they implement a service subsystem. + * @param configuration the configuration to which this subsystem may switch + * @return true if this subsystem is capable of switching to this configuration, false otherwise. This implementation + * returns false. + * @see IServiceSubSystem#canSwitchTo(IServiceSubSystemConfiguration) + */ + public boolean canSwitchTo(IServiceSubSystemConfiguration configuration) { + return false; + } + + /** + * Switch to use another subsystem configuration. This default implementation will test if the subsystem is a + * service subsystem and if the subsystem is compatible with the suggested configuration. If it is the switch will + * be performed and internalSwitchSubSystemConfiguration will be called. + * @see IServiceSubSystem#switchServiceFactory(IServiceSubSystemConfiguration) + * @see #internalSwitchServiceSubSystemConfiguration(IServiceSubSystemConfiguration) + */ + public void switchServiceFactory(final IServiceSubSystemConfiguration config) { + if (config != getSubSystemConfiguration() && canSwitchTo(config)) { + // define the operation to be executed + ISystemProfileOperation op = new ISystemProfileOperation() { + public IStatus run() { + doSwitchServiceConfiguration(config); + return Status.OK_STATUS; + } + }; + // execute the operation in a commit guard + SystemProfileManager.run(op); + } + } + + /** + * Return the service type for this subsystem. + * @return the default implementation returns null. Subclasses that implement service subsystems + * should return a type as specified in the interface. + * @see org.eclipse.rse.core.subsystems.IServiceSubSystem#getServiceType() + */ + public Class getServiceType() { + return null; + } + + /** + * Actually perform the switch inside the commit guard + * @param newConfig + */ + private void doSwitchServiceConfiguration(IServiceSubSystemConfiguration newConfig) { + try { + disconnect(); + } catch (Exception e) { + } + IHost host = getHost(); + // remove the old references and store them for later use + ISubSystemConfiguration oldConfig = getSubSystemConfiguration(); + if (oldConfig.supportsFilters()) { + ISystemFilterPoolReferenceManager fprm = getSystemFilterPoolReferenceManager(); + List poolReferences = Arrays.asList(fprm.getSystemFilterPoolReferences()); + poolReferencesMap.put(oldConfig, poolReferences); + for (Iterator z = poolReferences.iterator(); z.hasNext();) { + ISystemFilterPoolReference poolReference = (ISystemFilterPoolReference) z.next(); + fprm.removeSystemFilterPoolReference(poolReference, true); + } + fprm.setSystemFilterPoolManagerProvider(null); + } + setSubSystemConfiguration(newConfig); + setConfigurationId(newConfig.getId()); + setName(newConfig.getName()); + // add the new pools to the manager + if (newConfig.supportsFilters()) { + ISystemFilterPoolReferenceManager fprm = getSystemFilterPoolReferenceManager(); + fprm.setSystemFilterPoolManagerProvider(newConfig); + List poolReferences = (List) poolReferencesMap.get(newConfig); + if (poolReferences == null) { + // create default pools + ISystemProfile profile = host.getSystemProfile(); + ISystemFilterPoolManager poolManager = newConfig.getFilterPoolManager(profile, true); // get and initialize the new filter pool manager + int eventType = ISystemModelChangeEvents.SYSTEM_RESOURCE_CHANGED; + int resourceType = ISystemModelChangeEvents.SYSTEM_RESOURCETYPE_CONNECTION; + ISystemModelChangeEvent event = new SystemModelChangeEvent(eventType, resourceType, host); + RSECorePlugin.getTheSystemRegistry().fireEvent(event); // signal a model change event as well + // create references to those pools + fprm.setDefaultSystemFilterPoolManager(poolManager); + ISystemFilterPool[] pools = poolManager.getSystemFilterPools(); + for (int i = 0; i < pools.length; i++) { + ISystemFilterPool pool = pools[i]; + fprm.addReferenceToSystemFilterPool(pool); + } + } else { // use the found pools + for (Iterator z = poolReferences.iterator(); z.hasNext();) { + ISystemFilterPoolReference poolReference = (ISystemFilterPoolReference) z.next(); + fprm.addSystemFilterPoolReference(poolReference); + } + fprm.resolveReferencesAfterRestore(); + } + filterEventFilterPoolReferencesReset(); // signal a resource change event + } + + // switch the connector service + IConnectorService oldConnectorService = getConnectorService(); + oldConnectorService.deregisterSubSystem(this); + IConnectorService newConnectorService = newConfig.getConnectorService(host); + setConnectorService(newConnectorService); + oldConnectorService.commit(); + newConnectorService.commit(); + + // call the subsystem specfic switching support + internalSwitchServiceSubSystemConfiguration(newConfig); + + // commit the subsystem + setDirty(true); + commit(); + } + }
\ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/SubSystemConfiguration.java b/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/SubSystemConfiguration.java index a24176c99..de5492013 100644 --- a/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/SubSystemConfiguration.java +++ b/rse/plugins/org.eclipse.rse.ui/subsystems/org/eclipse/rse/core/subsystems/SubSystemConfiguration.java @@ -25,6 +25,8 @@ * Rupen Mardirossian (IBM) - [189434] Move Up/Down on Filters Error * Kevin Doyle (IBM) - [190445] Set Position of cloned event in cloneEvent() * Martin Oberhuber (Wind River) - [195392] Avoid setting port 0 in initializeSubSystem() + * David Dykstal (IBM) - [197036] rewrote getFilterPoolManager to delay the creation of default filter pools until the corresponding + * a subsystem configuration is actually used for a host. ********************************************************************************/ package org.eclipse.rse.core.subsystems; @@ -67,6 +69,7 @@ import org.eclipse.rse.internal.core.filters.SystemFilterStartHere; import org.eclipse.rse.internal.core.model.SystemProfileManager; import org.eclipse.rse.internal.ui.SystemPropertyResources; import org.eclipse.rse.internal.ui.SystemResources; +import org.eclipse.rse.logging.Logger; import org.eclipse.rse.services.clientserver.messages.SystemMessage; import org.eclipse.rse.ui.ISystemMessages; import org.eclipse.rse.ui.RSEUIPlugin; @@ -632,31 +635,20 @@ public abstract class SubSystemConfiguration implements ISubSystemConfiguration // SUBSYSTEM METHODS... // --------------------------------- - /** - * Called by SystemRegistry's renameSystemProfile method to ensure we update our - * subsystem names within each subsystem. - * <p> - * This is called AFTER changing the profile's name!! + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.ISubSystemConfiguration#renameSubSystemProfile(org.eclipse.rse.core.subsystems.ISubSystem, java.lang.String, java.lang.String) */ - public void renameSubSystemProfile(ISubSystem ss, String oldProfileName, String newProfileName) - { - //RSEUIPlugin.logDebugMessage(this.getClass().getName(), "Inside renameSubSystemProfile. newProfileName = "+newProfileName+", old ssName = "+ss.getName()); - //renameFilterPoolManager(getSystemProfile(newProfileName)); // update filter pool manager name - ss.renamingProfile(oldProfileName, newProfileName); - ISystemFilterPoolReferenceManager sfprm = ss.getSystemFilterPoolReferenceManager(); - if (sfprm != null) - { - sfprm.regenerateReferencedSystemFilterPoolNames(); // ask it to re-ask each pool for its reference name - } - try - { - saveSubSystem(ss); + public void renameSubSystemProfile(ISubSystem subsystem, String oldProfileName, String newProfileName) { + subsystem.renamingProfile(oldProfileName, newProfileName); + ISystemFilterPoolReferenceManager sfprm = subsystem.getSystemFilterPoolReferenceManager(); + if (sfprm != null) { + sfprm.regenerateReferencedSystemFilterPoolNames(); // ask it to re-ask each pool for its reference name } - catch (Exception exc) - { - // already dealt with in save? + try { + saveSubSystem(subsystem); + } catch (Exception exc) { + RSECorePlugin.getDefault().getLogger().logError("Unexpected error saving subsystem.", exc); //$NON-NLS-1$ } - } /** @@ -1015,9 +1007,7 @@ public abstract class SubSystemConfiguration implements ISubSystemConfiguration try { saveSubSystem(subsys); - //DKM - save this event til all the processing is done! - // fire model change event in case any BP code is listening... - //RSECorePlugin.getTheSystemRegistry().fireModelChangeEvent(ISystemModelChangeEvents.SYSTEM_RESOURCE_ADDED, ISystemModelChangeEvents.SYSTEM_RESOURCETYPE_SUBSYSTEM, subsys, null); + RSECorePlugin.getTheSystemRegistry().fireModelChangeEvent(ISystemModelChangeEvents.SYSTEM_RESOURCE_ADDED, ISystemModelChangeEvents.SYSTEM_RESOURCETYPE_SUBSYSTEM, subsys, null); } catch (Exception exc) { @@ -1597,79 +1587,55 @@ public abstract class SubSystemConfiguration implements ISubSystemConfiguration } return activeManagers; } + + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.ISubSystemConfiguration#getFilterPoolManager(org.eclipse.rse.core.model.ISystemProfile) + */ + public ISystemFilterPoolManager getFilterPoolManager(ISystemProfile profile) { + return getFilterPoolManager(profile, false); + } - /** - * Get the filter pool manager for the given profile + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.ISubSystemConfiguration#getFilterPoolManager(org.eclipse.rse.core.model.ISystemProfile, boolean) */ - public ISystemFilterPoolManager getFilterPoolManager(ISystemProfile profile) - { - // it is important to key by profile object not profile name, since that - // name can change but the object never should for any one session. + public ISystemFilterPoolManager getFilterPoolManager(ISystemProfile profile, boolean force) { + // it is important to key by profile object not profile name, since that name can change but the object never should for any one session. ISystemFilterPoolManager mgr = (ISystemFilterPoolManager) filterPoolManagersPerProfile.get(profile); - //System.out.println("in getFilterPoolManager for ssfactory "+getId()+" for profile " + profile.getName() + ", mgr found? " + (mgr!=null)); - if (mgr == null) - { - try - { - mgr = SystemFilterPoolManager.createSystemFilterPoolManager(profile, RSECorePlugin.getDefault().getLogger(), this, // the caller - getFilterPoolManagerName(profile), // the filter pool manager name - supportsNestedFilters(), // whether or not nested filters are allowed - ISystemFilterSavePolicies.SAVE_POLICY_ONE_FILE_PER_FILTER, filterNamingPolicy); - mgr.setSingleFilterStringOnly(!supportsMultipleFilterStrings()); // DWD was restored flag? - } - catch (Exception exc) - { + if (mgr == null) { + try { + Logger logger = RSECorePlugin.getDefault().getLogger(); + String managerName = getFilterPoolManagerName(profile); + boolean supportsNested = supportsNestedFilters(); + int savePolicy = ISystemFilterSavePolicies.SAVE_POLICY_ONE_FILE_PER_FILTER; + mgr = SystemFilterPoolManager.createSystemFilterPoolManager(profile, logger, this, managerName, supportsNested, savePolicy, filterNamingPolicy);// the filter pool manager name + mgr.setSingleFilterStringOnly(!supportsMultipleFilterStrings()); + mgr.setWasRestored(false); // not yet initialized + } catch (Exception exc) { SystemBasePlugin.logError("Restore/Creation of SystemFilterPoolManager " + getFilterPoolManagerName(profile) + " failed!", exc); //$NON-NLS-1$ //$NON-NLS-2$ SystemMessageDialog.displayExceptionMessage(null, exc); - return null; // something very bad happend! + return null; // something very bad happened! } - addFilterPoolManager(profile, mgr); - - boolean restored = mgr.wasRestored(); - //System.out.println("...after createSystemFilterPoolManager for " + mgr.getName() + ", restored = " + restored); - - // allow subclasses to create default filter pool... - if (!restored) - { - ISystemFilterPool defaultPool = createDefaultFilterPool(mgr); - if (defaultPool != null) - { - defaultPool.setDefault(true); - try - { - defaultPool.commit(); - } - catch (Exception exc) - { - } - } + } + boolean initialized = mgr.wasRestored(); + if (force && !initialized) { + String defaultPoolName = getDefaultFilterPoolName(profile.getName(), getId()); + ISystemFilterPool defaultPool = mgr.getSystemFilterPool(defaultPoolName); + if (defaultPool == null) { + // allow subclasses to create default filter pool... + defaultPool = createDefaultFilterPool(mgr); // createDefaultFilterPool(mgr) is typically overridden by subclasses } - // else filter pools restored for this profile. Allow subclasses chance to do post-processing, - // such as any migration needed - else - { - if (doPostRestoreProcessing(mgr)) - { - try - { - mgr.commit(); - } - catch (Exception exc) - { - } - } + if (defaultPool != null) { + defaultPool.setDefault(true); + defaultPool.commit(); } - // these should be inside the above logic but we need them outside for now because they were - // added late and there are existing filter pool managers that need this to be set for. - // In a future release we should move them inside the if (!restored) logic. Phil. - if (supportsDuplicateFilterStrings()) - mgr.setSupportsDuplicateFilterStrings(true); - if (isCaseSensitive()) - mgr.setStringsCaseSensitive(isCaseSensitive()); + if (supportsDuplicateFilterStrings()) mgr.setSupportsDuplicateFilterStrings(true); + if (isCaseSensitive()) mgr.setStringsCaseSensitive(true); + mgr.setWasRestored(true); } return mgr; } + /** * Do post-restore-processing of an existing filter pool manager. * This is where child classes do any required migration work. By default, we do nothing. |