blob: bbdda4eef4e308c4ef6b3fd86e0a22b768a69929 [file] [log] [blame]
/******************************************************************************
* 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.internal.ssh;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.eclipse.ptp.remotetools.core.IRemoteScriptExecution;
import org.eclipse.ptp.remotetools.core.messages.Messages;
import org.eclipse.ptp.remotetools.exception.RemoteConnectionException;
import org.eclipse.ptp.remotetools.internal.common.Debug;
import org.eclipse.ptp.remotetools.internal.common.RemoteScript;
import com.jcraft.jsch.ChannelExec;
/**
* @author richardm
*
*/
public class ScriptExecution extends KillableExecution implements IRemoteScriptExecution {
protected RemoteScript remoteScript;
protected InputStream fromProcessOutput;
protected InputStream fromProcessError;
protected OutputStream toProcessInput;
protected ScriptExecution(ExecutionManager executionManager, RemoteScript remoteScript)
throws RemoteConnectionException {
super(executionManager);
this.remoteScript = remoteScript;
}
/*
* (non-Javadoc)
* @see org.eclipse.ptp.remotetools.internal.ssh.KillableExecution#startExecution()
*/
public void startExecution() throws RemoteConnectionException {
String commandline = getRemoteScript().getScriptString();
ChannelExec channel = createChannel(getRemoteScript().getAllocateTerminal());
setCommandLine(commandline);
try {
if (remoteScript.getInputStream() != null) {
channel.setInputStream(remoteScript.getInputStream());
} else if (remoteScript.getFetchProcessInputStream()) {
toProcessInput = channel.getOutputStream();
}
if (remoteScript.getOutputStream() != null) {
channel.setOutputStream(remoteScript.getOutputStream());
} else if (remoteScript.getFetchProcessOutputStream()) {
fromProcessOutput = channel.getInputStream();
}
if (remoteScript.getErrorStream() != null) {
channel.setErrStream(remoteScript.getErrorStream());
} else if (remoteScript.getFetchProcessErrorStream()) {
fromProcessError = channel.getErrStream();
}
} catch (IOException e) {
throw new RemoteConnectionException(Messages.ScriptExecution_StartExecution_FailedInitStreams, e);
}
channel.setXForwarding(remoteScript.willForwardX11());
super.startExecution();
Debug.println("Executing " + commandline); //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.remotetools.IRemoteCommandExecution#getInputStreamFromProcessOutputStream()
*/
public InputStream getInputStreamFromProcessOutputStream() throws IOException {
if (fromProcessOutput == null) {
throw new IllegalStateException();
}
return fromProcessOutput;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.remotetools.IRemoteCommandExecution#getInputStreamFromProcessErrorStream()
*/
public InputStream getInputStreamFromProcessErrorStream() throws IOException {
if (fromProcessError == null) {
throw new IllegalStateException();
}
return fromProcessError;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ptp.remotetools.IRemoteCommandExecution#getOutputStreamFromProcessInputStream()
*/
public OutputStream getOutputStreamToProcessInputStream() throws IOException {
if (toProcessInput == null) {
throw new IllegalStateException();
}
return toProcessInput;
}
public RemoteScript getRemoteScript() {
return (RemoteScript) remoteScript;
}
}