diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RSEHelper.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RSEHelper.java new file mode 100644 index 00000000000..0b1e583be39 --- /dev/null +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RSEHelper.java @@ -0,0 +1,153 @@ +/******************************************************************************** + * Copyright (c) 2009 MontaVista Software, Inc. + * 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: + * Anna Dushistova (MontaVista) - initial API and implementation + ********************************************************************************/ + +package org.eclipse.cdt.launch.remote; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Status; +import org.eclipse.rse.core.RSECorePlugin; +import org.eclipse.rse.core.model.IHost; +import org.eclipse.rse.core.subsystems.ISubSystem; +import org.eclipse.rse.services.IService; +import org.eclipse.rse.services.shells.IShellService; +import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem; + +public class RSEHelper { + + public static IHost getRemoteConnectionByName(String remoteConnection) { + if (remoteConnection == null) + return null; + IHost[] connections = RSECorePlugin.getTheSystemRegistry().getHosts(); + for (int i = 0; i < connections.length; i++) + if (connections[i].getAliasName().equals(remoteConnection)) + return connections[i]; + return null; // TODO Connection is not found in the list--need to react + // somehow, throw the exception? + + } + + public static IService getConnectedRemoteFileService( + IHost currentConnection, IProgressMonitor monitor) throws Exception { + final ISubSystem subsystem = getFileSubsystem(currentConnection); + + if (subsystem == null) + throw new Exception(Messages.RemoteRunLaunchDelegate_4); + + try { + subsystem.connect(monitor, false); + } catch (CoreException e) { + throw e; + } catch (OperationCanceledException e) { + throw new CoreException(Status.CANCEL_STATUS); + } + + if (!subsystem.isConnected()) + throw new Exception(Messages.RemoteRunLaunchDelegate_5); + + return ((IFileServiceSubSystem) subsystem).getFileService(); + } + + public static IService getConnectedRemoteShellService( + IHost currentConnection, IProgressMonitor monitor) throws Exception { + ISubSystem subsystem = getSubSystemWithShellService(currentConnection); + if (subsystem != null) { + try { + subsystem.connect(monitor, false); + } catch (CoreException e) { + throw e; + } catch (OperationCanceledException e) { + throw new CoreException(Status.CANCEL_STATUS); + } + if (!subsystem.isConnected()) + throw new Exception(Messages.RemoteRunLaunchDelegate_5); + + return (IShellService) subsystem.getSubSystemConfiguration() + .getService(currentConnection).getAdapter( + IShellService.class); + } else { + throw new Exception(Messages.RemoteRunLaunchDelegate_4); + } + } + + /** + * Find the first shell service associated with the host. + * + * @param host + * the connection + * @return shell service object, or null if not found. + */ + public static IShellService getShellService(IHost host) { + ISubSystem ss = getSubSystemWithShellService(host); + if (ss != null) { + return (IShellService) ss.getSubSystemConfiguration().getService( + host).getAdapter(IShellService.class); + } + return null; + } + + /** + * Find the first IShellServiceSubSystem service associated with the host. + * + * @param host + * the connection + * @return shell service subsystem, or null if not found. + */ + public static ISubSystem getSubSystemWithShellService(IHost host) { + if (host == null) + return null; + ISubSystem[] subSystems = host.getSubSystems(); + IShellService ssvc = null; + for (int i = 0; subSystems != null && i < subSystems.length; i++) { + IService svc = subSystems[i].getSubSystemConfiguration() + .getService(host); + if (svc != null) { + ssvc = (IShellService) svc.getAdapter(IShellService.class); + if (ssvc != null) { + return subSystems[i]; + } + } + } + return null; + } + + public static ISubSystem getFileSubsystem(IHost host) { + if (host == null) + return null; + ISubSystem[] subSystems = host.getSubSystems(); + for (int i = 0; i < subSystems.length; i++) { + if (subSystems[i] instanceof IFileServiceSubSystem) + return subSystems[i]; + } + return null; + } + + public static IHost[] getSuitableConnections() { + ArrayList shellConnections = new ArrayList(Arrays.asList(RSECorePlugin.getTheSystemRegistry() + .getHostsBySubSystemConfigurationCategory("shells"))); //$NON-NLS-1$ + ArrayList terminalConnections = new ArrayList(Arrays.asList(RSECorePlugin.getTheSystemRegistry() + .getHostsBySubSystemConfigurationCategory("terminals")));//$NON-NLS-1$ + + Iterator iter = terminalConnections.iterator(); + while(iter.hasNext()){ + Object terminalConnection = iter.next(); + if(!shellConnections.contains(terminalConnection)){ + shellConnections.add(terminalConnection); + } + } + + return (IHost[]) shellConnections.toArray(new IHost[shellConnections.size()]); + } +} diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteCMainTab.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteCMainTab.java index eed3c1ad8ad..6df97f1bb12 100644 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteCMainTab.java +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteCMainTab.java @@ -15,6 +15,7 @@ * Johann Draschwandtner (Wind River) - [233057][remotecdt]Fix button enablement * Anna Dushistova (MontaVista) - [181517][usability] Specify commands to be run before remote application launch * Anna Dushistova (MontaVista) - [223728] [remotecdt] connection combo is not populated until RSE is activated + * Anna Dushistova (MontaVista) - [267951] [remotecdt] Support systemTypes without files subsystem *******************************************************************************/ package org.eclipse.cdt.launch.remote; @@ -368,15 +369,8 @@ public class RemoteCMainTab extends CMainTab { int currentSelection = connectionCombo.getSelectionIndex(); String remoteConnection = currentSelection >= 0 ? connectionCombo .getItem(currentSelection) : null; - if (remoteConnection == null) - return null; - IHost[] connections = RSECorePlugin.getTheSystemRegistry().getHosts(); - int i = 0; - for (i = 0; i < connections.length; i++) - if (connections[i].getAliasName().equals(remoteConnection)) - break; - return connections[i]; - } + return RSEHelper.getRemoteConnectionByName(remoteConnection); + } protected void handleRemoteBrowseSelected() { IHost currentConnectionSelected = getCurrentConnection(); @@ -494,8 +488,7 @@ public class RemoteCMainTab extends CMainTab { } // already initialized connectionCombo.removeAll(); - IHost[] connections = RSECorePlugin.getTheSystemRegistry() - .getHostsBySubSystemConfigurationCategory("shells"); //$NON-NLS-1$ + IHost[] connections = RSEHelper.getSuitableConnections(); for (int i = 0; i < connections.length; i++) { IRSESystemType sysType = connections[i].getSystemType(); if (sysType != null && sysType.isEnabled()) { @@ -609,6 +602,18 @@ public class RemoteCMainTab extends CMainTab { } if ((skipDownloadButton != null) && !skipDownloadButton.isDisposed()) { skipDownloadButton.setSelection(getDefaultSkipDownload()); + if(RSEHelper.getFileSubsystem(getCurrentConnection()) == null){ + skipDownloadButton.setEnabled(false); + } else { + skipDownloadButton.setEnabled(true); + } + } + if((remoteBrowseButton!=null) && !remoteBrowseButton.isDisposed()){ + if(RSEHelper.getFileSubsystem(getCurrentConnection()) == null){ + remoteBrowseButton.setEnabled(false); + } else { + remoteBrowseButton.setEnabled(true); + } } } @@ -644,6 +649,9 @@ public class RemoteCMainTab extends CMainTab { private boolean getDefaultSkipDownload() { IHost host = getCurrentConnection(); if (host != null) { + if(RSEHelper.getFileSubsystem(host) == null){ + return true; + } IPropertySet propertySet = host .getPropertySet(IRemoteConnectionHostConstants.PI_REMOTE_CDT); if (propertySet != null) { diff --git a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteRunLaunchDelegate.java b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteRunLaunchDelegate.java index f61daf31299..5a3f636f815 100644 --- a/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteRunLaunchDelegate.java +++ b/cross/org.eclipse.cdt.launch.remote/src/org/eclipse/cdt/launch/remote/RemoteRunLaunchDelegate.java @@ -15,6 +15,7 @@ * Anna Dushistova (MontaVista) - [244173][remotecdt][nls] Externalize Strings in RemoteRunLaunchDelegate * Anna Dushistova (MontaVista) - [181517][usability] Specify commands to be run before remote application launch * Nikita Shulga (EmbeddedAlley) - [265236][remotecdt] Wait for RSE to initialize before querying it for host list + * Anna Dushistova (MontaVista) - [267951] [remotecdt] Support systemTypes without files subsystem *******************************************************************************/ package org.eclipse.cdt.launch.remote; @@ -37,7 +38,6 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; @@ -50,20 +50,14 @@ import org.eclipse.debug.core.model.IProcess; import org.eclipse.osgi.util.NLS; import org.eclipse.rse.core.RSECorePlugin; import org.eclipse.rse.core.model.IHost; -import org.eclipse.rse.core.subsystems.ISubSystem; -import org.eclipse.rse.services.IService; import org.eclipse.rse.services.clientserver.messages.SystemOperationCancelledException; import org.eclipse.rse.services.files.IFileService; import org.eclipse.rse.services.shells.HostShellProcessAdapter; import org.eclipse.rse.services.shells.IHostShell; import org.eclipse.rse.services.shells.IShellService; -import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem; -import org.eclipse.rse.subsystems.shells.core.subsystems.servicesubsystem.IShellServiceSubSystem; public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate { - private final static String SHELL_SERVICE = "shell.service"; //$NON-NLS-1$ - private final static String FILE_SERVICE = "file.service"; //$NON-NLS-1$ private final static String EXIT_CMD = "exit"; //$NON-NLS-1$ private final static String CMD_DELIMITER = ";"; //$NON-NLS-1$ @@ -92,13 +86,15 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate { if (monitor == null) monitor = new NullProgressMonitor(); - if (!RSECorePlugin.isInitComplete(RSECorePlugin.INIT_MODEL)) { + if (!RSECorePlugin.isInitComplete(RSECorePlugin.INIT_MODEL)) { monitor.subTask(Messages.RemoteRunLaunchDelegate_10); try { - RSECorePlugin.waitForInitCompletion(RSECorePlugin.INIT_MODEL); + RSECorePlugin + .waitForInitCompletion(RSECorePlugin.INIT_MODEL); } catch (InterruptedException e) { - throw new CoreException(new Status(IStatus.ERROR, getPluginID(), - IStatus.OK, e.getLocalizedMessage(), e)); + throw new CoreException(new Status(IStatus.ERROR, + getPluginID(), IStatus.OK, e.getLocalizedMessage(), + e)); } } if (mode.equals(ILaunchManager.DEBUG_MODE)) { @@ -255,65 +251,13 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate { String remoteConnection = config.getAttribute( IRemoteConnectionConfigurationConstants.ATTR_REMOTE_CONNECTION, ""); //$NON-NLS-1$ - - IHost[] connections = RSECorePlugin.getTheSystemRegistry().getHosts(); - int i = 0; - for (i = 0; i < connections.length; i++) - if (connections[i].getAliasName().equals(remoteConnection)) - break; - if (i >= connections.length) { + IHost connection = RSEHelper + .getRemoteConnectionByName(remoteConnection); + if (connection == null) { abort(Messages.RemoteRunLaunchDelegate_13, null, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); } - return connections[i]; - } - - protected IService getConnectedRemoteService(ILaunchConfiguration config, - String kindOfService, IProgressMonitor monitor) - throws CoreException { - - // Check that the service requested is file or shell. - if (!kindOfService.equals(SHELL_SERVICE) - && !kindOfService.equals(FILE_SERVICE)) - abort(Messages.RemoteRunLaunchDelegate_3, null, - ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); - - IHost currentConnection = getCurrentConnection(config); - - ISubSystem[] subSystems = currentConnection.getSubSystems(); - int i = 0; - for (i = 0; i < subSystems.length; i++) { - if (subSystems[i] instanceof IShellServiceSubSystem - && kindOfService.equals(SHELL_SERVICE)) - break; - if (subSystems[i] instanceof IFileServiceSubSystem - && kindOfService.equals(FILE_SERVICE)) - break; - } - if (i >= subSystems.length) - abort(Messages.RemoteRunLaunchDelegate_4, null, - ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); - - final ISubSystem subsystem = subSystems[i]; - try { - subsystem.connect(monitor, false); - } catch (CoreException e) { - throw e; - } catch (OperationCanceledException e) { - throw new CoreException(Status.CANCEL_STATUS); - } catch (Exception e) { - throw new CoreException(new Status(IStatus.ERROR, getPluginID(), - IStatus.OK, e.getLocalizedMessage(), e)); - } - - if (!subsystem.isConnected()) - abort(Messages.RemoteRunLaunchDelegate_5, null, - ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); - - if (kindOfService.equals(SHELL_SERVICE)) - return ((IShellServiceSubSystem) subsystem).getShellService(); - else - return ((IFileServiceSubSystem) subsystem).getFileService(); + return connection; } protected Process remoteFileDownload(ILaunchConfiguration config, @@ -329,11 +273,14 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate { // Nothing to do. Download is skipped. return null; monitor.beginTask(Messages.RemoteRunLaunchDelegate_2, 100); - IFileService fileService = (IFileService) getConnectedRemoteService( - config, FILE_SERVICE, new SubProgressMonitor(monitor, 10)); - File file = new File(localExePath); - Path remotePath = new Path(remoteExePath); + IFileService fileService; try { + fileService = (IFileService) RSEHelper + .getConnectedRemoteFileService( + getCurrentConnection(config), + new SubProgressMonitor(monitor, 10)); + File file = new File(localExePath); + Path remotePath = new Path(remoteExePath); fileService.upload(file, remotePath.removeLastSegments(1) .toString(), remotePath.lastSegment(), true, null, null, new SubProgressMonitor(monitor, 85)); @@ -379,28 +326,37 @@ public class RemoteRunLaunchDelegate extends AbstractCLaunchDelegate { if (!prelaunchCmd.trim().equals("")) //$NON-NLS-1$ remote_command = prelaunchCmd + CMD_DELIMITER + remote_command; - IShellService shellService = (IShellService) getConnectedRemoteService( - config, SHELL_SERVICE, new SubProgressMonitor(monitor, 7)); - - // This is necessary because runCommand does not actually run the - // command right now. - String env[] = new String[0]; + IShellService shellService; Process p = null; try { - IHostShell hostShell = shellService.launchShell( - "", env, new SubProgressMonitor(monitor, 3)); //$NON-NLS-1$ - hostShell.writeToShell(remote_command); - p = new HostShellProcessAdapter(hostShell); - } catch (Exception e) { - if (p != null) { - p.destroy(); + shellService = (IShellService) RSEHelper + .getConnectedRemoteShellService( + getCurrentConnection(config), + new SubProgressMonitor(monitor, 7)); + + // This is necessary because runCommand does not actually run the + // command right now. + String env[] = new String[0]; + try { + IHostShell hostShell = shellService.launchShell( + "", env, new SubProgressMonitor(monitor, 3)); //$NON-NLS-1$ + hostShell.writeToShell(remote_command); + p = new HostShellProcessAdapter(hostShell); + } catch (Exception e) { + if (p != null) { + p.destroy(); + } + abort(Messages.RemoteRunLaunchDelegate_7, e, + ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); } - abort(Messages.RemoteRunLaunchDelegate_7, e, + } catch (Exception e1) { + // TODO Auto-generated catch block + abort(e1.getMessage(), e1, ICDTLaunchConfigurationConstants.ERR_INTERNAL_ERROR); } + monitor.done(); return p; - } protected String getPluginID() {