blob: 19801e04aa9a54586d514d8127518fdbe9d4c93f [file] [log] [blame]
package org.eclipse.remote.internal.jsch.core.commands;
import java.io.ByteArrayOutputStream;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.remote.core.exception.RemoteConnectionException;
import org.eclipse.remote.internal.jsch.core.JSchConnection;
import org.eclipse.remote.internal.jsch.core.messages.Messages;
import com.jcraft.jsch.JSchException;
public class ExecCommand extends AbstractRemoteCommand<String> {
private String fCommand;
public ExecCommand(JSchConnection connection) {
super(connection);
}
public ExecCommand setCommand(String command) {
fCommand = command;
return this;
}
@Override
public String getResult(IProgressMonitor monitor) throws RemoteConnectionException {
final SubMonitor subMon = SubMonitor.convert(monitor, 10);
ExecCallable<String> c = new ExecCallable<>() {
@Override
public String call() throws JSchException, RemoteConnectionException {
getChannel().setCommand(fCommand);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ByteArrayOutputStream err = new ByteArrayOutputStream();
getChannel().setOutputStream(stream);
getChannel().setErrStream(err);
getChannel().connect();
while (!getChannel().isClosed() && !getProgressMonitor().isCanceled()) {
synchronized (this) {
try {
wait(100);
} catch (InterruptedException e) {
// Ignore
}
}
}
if (getProgressMonitor().isCanceled()) {
return ""; //$NON-NLS-1$
}
if (getChannel().getExitStatus() != 0) {
throw new RemoteConnectionException(err.toString());
}
return stream.toString();
}
};
subMon.subTask(NLS.bind(Messages.ExecCommand_Exec_command, fCommand));
return c.getResult(subMon.newChild(10));
}
}