### Eclipse Workspace Patch 1.0 #P org.eclipse.rse.subsystems.terminals.core Index: plugin.properties =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.subsystems.terminals.core/plugin.properties,v retrieving revision 1.1 diff -u -r1.1 plugin.properties --- plugin.properties 16 Apr 2008 20:56:40 -0000 1.1 +++ plugin.properties 25 Sep 2008 20:54:19 -0000 @@ -14,3 +14,6 @@ pluginName = RSE Terminals Core (Incubation) providerName = Eclipse.org + +TerminalSubsystemName = Terminals +TerminalSubsystemDescription = Work with terminals and commands on remote systems. Index: src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystem.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.subsystems.terminals.core/src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystem.java,v retrieving revision 1.5 diff -u -r1.5 TerminalServiceSubSystem.java --- src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystem.java 5 May 2008 18:40:36 -0000 1.5 +++ src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystem.java 25 Sep 2008 20:54:19 -0000 @@ -26,6 +26,7 @@ import org.eclipse.rse.core.subsystems.CommunicationsEvent; import org.eclipse.rse.core.subsystems.ICommunicationsListener; import org.eclipse.rse.core.subsystems.IConnectorService; +import org.eclipse.rse.core.subsystems.ISubSystemConfiguration; import org.eclipse.rse.core.subsystems.SubSystem; import org.eclipse.rse.internal.services.terminals.ITerminalService; import org.eclipse.rse.subsystems.terminals.core.elements.TerminalElement; @@ -185,4 +186,8 @@ getConnectorService().removeCommunicationsListener(this); super.uninitializeSubSystem(monitor); } + + public boolean canSwitchTo(ISubSystemConfiguration configuration) { + return (configuration instanceof ITerminalServiceSubSystemConfiguration); + } } \ No newline at end of file Index: src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystemConfiguration.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.subsystems.terminals.core/src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystemConfiguration.java,v retrieving revision 1.1 diff -u -r1.1 TerminalServiceSubSystemConfiguration.java --- src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystemConfiguration.java 16 Apr 2008 20:56:41 -0000 1.1 +++ src/org/eclipse/rse/subsystems/terminals/core/TerminalServiceSubSystemConfiguration.java 25 Sep 2008 20:54:19 -0000 @@ -51,4 +51,9 @@ return ITerminalService.class; } + public boolean isFactoryFor(Class subSystemType) { + boolean isFor = TerminalServiceSubSystem.class.equals(subSystemType); + return isFor; + } + } Index: src/org/eclipse/rse/internal/subsystems/terminals/core/TerminalSubSystemConfigurationImpl.java =================================================================== RCS file: src/org/eclipse/rse/internal/subsystems/terminals/core/TerminalSubSystemConfigurationImpl.java diff -N src/org/eclipse/rse/internal/subsystems/terminals/core/TerminalSubSystemConfigurationImpl.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/rse/internal/subsystems/terminals/core/TerminalSubSystemConfigurationImpl.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2008 MontaVista Software, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Yu-Fen Kuo (MontaVista)- initial API and implementation + *******************************************************************************/ + +package org.eclipse.rse.internal.subsystems.terminals.core; + +import org.eclipse.rse.core.model.IHost; +import org.eclipse.rse.core.subsystems.IConnectorService; +import org.eclipse.rse.core.subsystems.ISubSystem; +import org.eclipse.rse.internal.services.terminals.ITerminalService; +import org.eclipse.rse.subsystems.terminals.core.TerminalServiceSubSystem; +import org.eclipse.rse.subsystems.terminals.core.TerminalServiceSubSystemConfiguration; + +public class TerminalSubSystemConfigurationImpl extends + TerminalServiceSubSystemConfiguration { + + /** + * Instantiate and return an instance of OUR subsystem. Do not populate it + * yet though! + * + * @see org.eclipse.rse.core.subsystems.SubSystemConfiguration#createSubSystemInternal(IHost) + */ + public ISubSystem createSubSystemInternal(IHost host) { + IConnectorService connectorService = getConnectorService(host); + ISubSystem subsys = new TerminalServiceSubSystem(host, + connectorService, getTerminalService(host)); + return subsys; + } + + public ITerminalService createTerminalService(IHost host) { + + ISubSystem ss = TerminalSubSystemHelper.getSuitableSubSystem(host); + if (ss != null) { + return (ITerminalService) (ss.getSubSystemConfiguration() + .getService(host)).getAdapter(ITerminalService.class); + } else { + return new DelegatingTerminalService(host); + } + + + } + + public void setConnectorService(IHost host, + IConnectorService connectorService) { +// SshConnectorServiceManager.getInstance().setConnectorService(host, +// ISshService.class, connectorService); +// Nothing to do here since we just re-use the existing suitable subsystem + } + + public IConnectorService getConnectorService(IHost host) { + ISubSystem ss = TerminalSubSystemHelper.getSuitableSubSystem(host); + if (ss != null) { + return ss.getConnectorService(); + } else { + return new DelegatingTerminalConnectorService(host); + } + } +} Index: plugin.xml =================================================================== RCS file: plugin.xml diff -N plugin.xml --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ plugin.xml 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,30 @@ + + + + + + + + + + Index: src/org/eclipse/rse/internal/subsystems/terminals/core/DelegatingTerminalService.java =================================================================== RCS file: src/org/eclipse/rse/internal/subsystems/terminals/core/DelegatingTerminalService.java diff -N src/org/eclipse/rse/internal/subsystems/terminals/core/DelegatingTerminalService.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/rse/internal/subsystems/terminals/core/DelegatingTerminalService.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,82 @@ +/******************************************************************************** + * Copyright (c) 2008 IBM Corporation. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Initial Contributors: + * The following IBM employees contributed to the Remote System Explorer + * component that contains this file: David McKnight. + * + * Contributors: + * {Name} (company) - description of contribution. + ********************************************************************************/ +package org.eclipse.rse.internal.subsystems.terminals.core; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.rse.core.model.IHost; +import org.eclipse.rse.core.subsystems.ISubSystem; +import org.eclipse.rse.internal.services.terminals.ITerminalService; +import org.eclipse.rse.internal.services.terminals.ITerminalShell; +import org.eclipse.rse.services.IService; +import org.eclipse.rse.services.clientserver.messages.SystemMessageException; + +public class DelegatingTerminalService implements ITerminalService { + + private IHost _host; + private ITerminalService _realService; + + public DelegatingTerminalService(IHost host){ + _host = host; + } + + + private ITerminalService getRealService() { + if (_host != null && _realService == null){ + ISubSystem[] subSystems = _host.getSubSystems(); + if (subSystems != null){ + for (int i = 0; i < subSystems.length && _realService == null; i++){ + ISubSystem subsys = subSystems[i]; + + IService svc = subsys.getSubSystemConfiguration().getService(_host); + if (svc!=null) { + ITerminalService tsvc = (ITerminalService)svc.getAdapter(ITerminalService.class); + if (tsvc!=null && tsvc != this) { + _realService = tsvc; + } + } + } + } + } + + return _realService; + } + + public ITerminalShell launchTerminal(String ptyType, String encoding, + String[] environment, String initialWorkingDirectory, + String commandToRun, IProgressMonitor monitor) + throws SystemMessageException { + return getRealService().launchTerminal(ptyType, encoding, environment, initialWorkingDirectory, commandToRun, monitor); + } + + public String getDescription() { + return "Generic Terminal Service"; + } + + public String getName() { + return "Terminal Service"; + } + + public void initService(IProgressMonitor monitor) { + getRealService().initService(monitor); + } + + public void uninitService(IProgressMonitor monitor) { + getRealService().uninitService(monitor); + } + + public Object getAdapter(Class adapter) { + return getRealService().getAdapter(adapter); + } + +} Index: src/org/eclipse/rse/internal/subsystems/terminals/core/TerminalSubSystemHelper.java =================================================================== RCS file: src/org/eclipse/rse/internal/subsystems/terminals/core/TerminalSubSystemHelper.java diff -N src/org/eclipse/rse/internal/subsystems/terminals/core/TerminalSubSystemHelper.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/rse/internal/subsystems/terminals/core/TerminalSubSystemHelper.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,50 @@ +package org.eclipse.rse.internal.subsystems.terminals.core; + +import org.eclipse.rse.core.model.IHost; +import org.eclipse.rse.core.subsystems.ISubSystem; +import org.eclipse.rse.internal.services.terminals.ITerminalService; +import org.eclipse.rse.services.IService; +import org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem; + +public class TerminalSubSystemHelper { + /** + * Find the first ITerminalServiceSubSystem service associated with the + * host. + * + * @param host + * the connection + * @return shell service subsystem, or null if not found. + */ + public static ISubSystem getSuitableSubSystem(IHost host) { + if (host == null) + return null; + ISubSystem[] subSystems = host.getSubSystems(); + ITerminalService ssvc = null; + for (int i = 0; subSystems != null && i < subSystems.length; i++) { + IService svc = subSystems[i].getSubSystemConfiguration() + .getService(host); + if (svc != null) { + ssvc = (ITerminalService) svc + .getAdapter(ITerminalService.class); + if (ssvc != null) { + return subSystems[i]; + } + } + } + return null; + } + + public static ITerminalServiceSubSystem getTerminalServiceSubSystem( + IHost host) { + if (host == null) + return null; + ISubSystem[] subSystems = host.getSubSystems(); + for (int i = 0; subSystems != null && i < subSystems.length; i++) { + if (subSystems[i] instanceof ITerminalServiceSubSystem) { + return (ITerminalServiceSubSystem) subSystems[i]; + } + } + return null; + } + +} Index: src/org/eclipse/rse/internal/subsystems/terminals/core/DelegatingTerminalConnectorService.java =================================================================== RCS file: src/org/eclipse/rse/internal/subsystems/terminals/core/DelegatingTerminalConnectorService.java diff -N src/org/eclipse/rse/internal/subsystems/terminals/core/DelegatingTerminalConnectorService.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/rse/internal/subsystems/terminals/core/DelegatingTerminalConnectorService.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,66 @@ +/******************************************************************************** + * Copyright (c) 2007, 2008 IBM Corporation and others. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Initial Contributors: + * The following IBM employees contributed to the Remote System Explorer + * component that contains this file: David McKnight. + * + * Contributors: + * Anna Dushistova (MontaVista) - [239159] The shell process subsystem not working without the shells subsystem present for the systemType + ********************************************************************************/ +package org.eclipse.rse.internal.subsystems.terminals.core; + +import org.eclipse.rse.core.model.IHost; +import org.eclipse.rse.core.subsystems.AbstractDelegatingConnectorService; +import org.eclipse.rse.core.subsystems.IConnectorService; +import org.eclipse.rse.core.subsystems.ISubSystem; +import org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem; + +/** + * This class delegates the connector service requests for the terminal + * subsystem to the connector service of any subsystem that has service which can be adopted to ITerminalService. + */ +public class DelegatingTerminalConnectorService extends AbstractDelegatingConnectorService +{ + private IConnectorService _realService; + + /** + * @param host the linux host that is the target for this connector service. + */ + public DelegatingTerminalConnectorService(IHost host) + { + super(host); + } + + /* (non-Javadoc) + * @see org.eclipse.rse.core.subsystems.AbstractDelegatingConnectorService#getRealConnectorService() + */ + public IConnectorService getRealConnectorService() + { + if (_realService != null) + { + return _realService; + } + else + { + ISubSystem ss = TerminalSubSystemHelper.getSuitableSubSystem(getHost()); + if (ss != null) + { + _realService = ss.getConnectorService(); + + // register the process subsystem + ITerminalServiceSubSystem ts = TerminalSubSystemHelper.getTerminalServiceSubSystem(getHost()); + _realService.registerSubSystem(ts); + return _realService; + } + else + { + return null; + } + } + } + +} #P org.eclipse.rse.terminals.ui Index: src/org/eclipse/rse/internal/terminals/ui/TerminalServiceHelper.java =================================================================== RCS file: /cvsroot/dsdp/org.eclipse.tm.rse/plugins/org.eclipse.rse.terminals.ui/src/org/eclipse/rse/internal/terminals/ui/TerminalServiceHelper.java,v retrieving revision 1.3 diff -u -r1.3 TerminalServiceHelper.java --- src/org/eclipse/rse/internal/terminals/ui/TerminalServiceHelper.java 20 May 2008 21:32:25 -0000 1.3 +++ src/org/eclipse/rse/internal/terminals/ui/TerminalServiceHelper.java 25 Sep 2008 20:54:19 -0000 @@ -42,8 +42,7 @@ ISystemRegistry systemRegistry = RSECorePlugin.getTheSystemRegistry(); ISubSystem[] subsystems = systemRegistry.getSubSystems(connection); for (int i = 0; i < subsystems.length; i++) { - if ("ssh.terminals".equals(subsystems[i] - .getSubSystemConfiguration().getId())) { + if (subsystems[i] instanceof ITerminalServiceSubSystem) { ITerminalServiceSubSystem subSystem = (ITerminalServiceSubSystem) subsystems[i]; return subSystem; }