View Javadoc

1   /***
2    * 
3    */
4   package de.cohesion.bssh.impl;
5   
6   import java.io.IOException;
7   import java.io.InputStreamReader;
8   import java.lang.Thread.State;
9   
10  import ch.ethz.ssh2.Connection;
11  import ch.ethz.ssh2.Session;
12  import ch.ethz.ssh2.StreamGobbler;
13  import de.cohesion.bssh.Member;
14  import de.cohesion.bssh.Result;
15  import de.cohesion.bssh.impl.lang.NotifyingThread;
16  import de.cohesion.bssh.impl.lang.ThreadStateListener;
17  import de.cohesion.bssh.impl.util.Cache;
18  
19  /***
20   * @author schulzs
21   * 
22   */
23  public class ExecuteSSHCommand extends SSHCommand {
24  
25  	private final String cmd;
26  
27  	public ExecuteSSHCommand(final String cmd,
28  			final Cache<Member, Connection> ccache) {
29  		super(ccache);
30  		this.cmd = cmd;
31  	}
32  
33  	@Override
34  	protected Result perform(final Member m, final Connection c)
35  			throws IOException {
36  		final Session s = c.openSession();
37  
38  		Thread t = Thread.currentThread();
39  		if (t instanceof NotifyingThread) {
40  			((NotifyingThread) t)
41  					.addThreadStateListener(new ThreadStateListener() {
42  						public void stateChanged(Thread t, State state) {
43  							s.close();
44  							((NotifyingThread) t)
45  									.removeThreadStateListener(this);
46  						}
47  					});
48  		}
49  		try {
50  			s.execCommand(Substituter.substitute(cmd, m));
51  			return new ResultImpl(m, this, new InputStreamReader(
52  					new StreamGobbler(s.getStdout())), new InputStreamReader(
53  					new StreamGobbler(s.getStderr())));
54  		} finally {
55  			s.close();
56  		}
57  
58  	}
59  
60  	@Override
61  	public String toString() {
62  		return cmd;
63  	}
64  
65  }