| /** |
| * Copyright (c) 2006 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 |
| * |
| * Contributors: |
| * IBM Corporation - Initial Implementation |
| * |
| */ |
| package org.eclipse.ptp.remotetools.environment.generichost.core; |
| |
| |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.ptp.remotetools.RemotetoolsPlugin; |
| import org.eclipse.ptp.remotetools.environment.control.ITargetControl; |
| import org.eclipse.ptp.remotetools.environment.control.ITargetStatus; |
| import org.eclipse.ptp.remotetools.environment.control.SSHTargetControl; |
| import org.eclipse.ptp.remotetools.environment.core.ITargetElement; |
| import org.eclipse.ptp.remotetools.environment.extension.ITargetVariables; |
| import org.eclipse.ptp.remotetools.environment.generichost.Activator; |
| |
| /** |
| * Controls an instance of a target created from the Environment. |
| * @author Daniel Felix Ferber |
| * @since 1.2 |
| */ |
| public class TargetControl extends SSHTargetControl implements ITargetControl, ITargetVariables { |
| |
| /** |
| * Configuration provided to the target control. |
| */ |
| ConfigFactory configFactory; |
| TargetConfig currentTargetConfig; |
| |
| /** |
| * Name of the target. |
| */ |
| //String name; |
| |
| /** |
| * BackReference to the target element |
| */ |
| ITargetElement targetElement; |
| |
| /** |
| * Current connection state. |
| */ |
| private int state; |
| private static final int NOT_OPERATIONAL = 1; |
| private static final int CONNECTING = 2; |
| private static final int CONNECTED = 3; |
| private static final int DISCONNECTING = 4; |
| |
| /** |
| * Default cipher id |
| */ |
| public static final String DEFAULT_CIPHER = RemotetoolsPlugin.CIPHER_DEFAULT; |
| |
| /** |
| * Creates a target control. |
| * |
| * @param attributes |
| * Configuration attributes |
| * @param element |
| * Name for the target (displayed in GUI) |
| * @throws CoreException |
| * Some attribute is not valid |
| */ |
| public TargetControl(ITargetElement element) throws CoreException { |
| super(); |
| state = NOT_OPERATIONAL; |
| targetElement = element; |
| configFactory = new ConfigFactory(targetElement.getAttributes()); |
| currentTargetConfig = configFactory.createTargetConfig(); |
| } |
| |
| /** |
| * Connect to the remote target.. On every error or possible failure, an exception |
| * (CoreException) is thrown, whose (multi)status describe the error(s) that prevented creating the target control. |
| * |
| * @param monitor |
| * Progress indicator or <code>null</code> |
| * @return Always true. |
| * @throws CoreException |
| * Some attribute is not valid, the simulator cannot be launched, the ssh failed to connect. |
| */ |
| public boolean create(IProgressMonitor monitor) throws CoreException { |
| monitor.beginTask(Messages.TargetControl_create_MonitorConnecting, 1); |
| /* |
| * Connect to the remote temote target |
| */ |
| if(currentTargetConfig.isPasswordAuth()) { |
| setConnectionParameters( |
| new SSHParameters( |
| currentTargetConfig.getConnectionAddress(), |
| currentTargetConfig.getConnectionPort(), |
| currentTargetConfig.getLoginUserName(), |
| currentTargetConfig.getLoginPassword(), |
| currentTargetConfig.getCipherType(), |
| currentTargetConfig.getConnectionTimeout()*1000 |
| ) |
| ); |
| } else { |
| setConnectionParameters( |
| new SSHParameters( |
| currentTargetConfig.getConnectionAddress(), |
| currentTargetConfig.getConnectionPort(), |
| currentTargetConfig.getLoginUserName(), |
| currentTargetConfig.getKeyPath(), |
| currentTargetConfig.getKeyPassphrase(), |
| currentTargetConfig.getCipherType(), |
| currentTargetConfig.getConnectionTimeout()*1000 |
| ) |
| ); |
| } |
| |
| try { |
| setState(CONNECTING); |
| super.create(monitor); |
| setState(CONNECTED); |
| monitor.worked(1); |
| } catch (CoreException e) { |
| disconnect(); |
| setState(NOT_OPERATIONAL); |
| } |
| monitor.done(); |
| return true; |
| } |
| |
| private synchronized void setState(int state) { |
| this.state = state; |
| } |
| |
| public boolean kill(IProgressMonitor monitor) throws CoreException { |
| try { |
| setState(DISCONNECTING); |
| super.kill(monitor); |
| } finally { |
| setState(NOT_OPERATIONAL); |
| } |
| return true; |
| } |
| |
| public synchronized int query() { |
| switch (state) { |
| case NOT_OPERATIONAL: |
| return ITargetStatus.STOPPED; |
| case CONNECTING: |
| case DISCONNECTING: |
| return ITargetStatus.STARTED; |
| case CONNECTED: |
| if (isConnected()) { |
| return ITargetStatus.RESUMED; |
| } else { |
| return ITargetStatus.STARTED; |
| } |
| default: |
| return ITargetStatus.STOPPED; |
| } |
| } |
| |
| public boolean resume(IProgressMonitor monitor) throws CoreException { |
| throw new CoreException(new Status(IStatus.ERROR, getPluginId(), 0, |
| Messages.TargetControl_resume_CannotResume, null)); |
| } |
| |
| public boolean stop(IProgressMonitor monitor) throws CoreException { |
| throw new CoreException(new Status(IStatus.ERROR, getPluginId(), 0, |
| Messages.TargetControl_stop_CannotPause, null)); |
| } |
| |
| public void updateConfiguration() throws CoreException { |
| //targetElement.setName(name); |
| configFactory = new ConfigFactory(targetElement.getAttributes()); |
| currentTargetConfig = configFactory.createTargetConfig(); |
| } |
| |
| public String getName() { |
| return targetElement.getName(); |
| } |
| |
| protected String getPluginId() { |
| return Activator.getDefault().getBundle().getSymbolicName(); |
| } |
| |
| public TargetSocket createTargetSocket(int port) { |
| Assert.isTrue(isConnected()); |
| TargetSocket socket = new TargetSocket(); |
| socket.host = currentTargetConfig.getConnectionAddress(); |
| socket.port = port; |
| return socket; |
| } |
| |
| public String getSystemWorkspace() { |
| return currentTargetConfig.getSystemWorkspace(); |
| } |
| |
| public void destroy() throws CoreException { |
| // End all jobs, if possible, then disconnect |
| try { |
| terminateJobs(null); |
| } finally { |
| disconnect(); |
| } |
| |
| //setState(NOT_OPERATIONAL); |
| } |
| } |