• R/O
  • SSH
  • HTTPS

phosphoresce: Commit


Commit MetaInfo

Revision555 (tree)
Time2015-02-26 19:30:22
Authorbbcry

Log Message

(empty log message)

Change Summary

Incremental Difference

--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshFileTransferException.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshFileTransferException.java (revision 555)
@@ -0,0 +1,33 @@
1+package org.phosphoresce.lib.ssh.exception;
2+
3+/**
4+ * ファイル転送関係における操作において例外が発生した場合にスローされます。<br>
5+ * <p>
6+ * </p>
7+ *
8+ * @author Kitagawa<br>
9+ *
10+ *<!--
11+ * 更新日 更新者 更新内容
12+ * 2015/02/26 Kitagawa 新規作成
13+ *-->
14+ */
15+public class SshFileTransferException extends SshProcessException {
16+
17+ /**
18+ * コンストラクタ<br>
19+ * @param message 例外メッセージ
20+ * @param cause ルート要因
21+ */
22+ public SshFileTransferException(String message, Throwable cause) {
23+ super(message, cause);
24+ }
25+
26+ /**
27+ * コンストラクタ<br>
28+ * @param message 例外メッセージ
29+ */
30+ public SshFileTransferException(String message) {
31+ super(message);
32+ }
33+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshCommanderException.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshCommanderException.java (revision 555)
@@ -0,0 +1,33 @@
1+package org.phosphoresce.lib.ssh.exception;
2+
3+/**
4+ * コマンド実行関係における操作において例外が発生した場合にスローされます。<br>
5+ * <p>
6+ * </p>
7+ *
8+ * @author Kitagawa<br>
9+ *
10+ *<!--
11+ * 更新日 更新者 更新内容
12+ * 2015/02/26 Kitagawa 新規作成
13+ *-->
14+ */
15+public class SshCommanderException extends SshProcessException {
16+
17+ /**
18+ * コンストラクタ<br>
19+ * @param message 例外メッセージ
20+ * @param cause ルート要因
21+ */
22+ public SshCommanderException(String message, Throwable cause) {
23+ super(message, cause);
24+ }
25+
26+ /**
27+ * コンストラクタ<br>
28+ * @param message 例外メッセージ
29+ */
30+ public SshCommanderException(String message) {
31+ super(message);
32+ }
33+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshIOException.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshIOException.java (revision 555)
@@ -0,0 +1,33 @@
1+package org.phosphoresce.lib.ssh.exception;
2+
3+/**
4+ * SSH操作中の入出力例外発生時にスローされます。<br>
5+ * <p>
6+ * </p>
7+ *
8+ * @author Kitagawa<br>
9+ *
10+ *<!--
11+ * 更新日 更新者 更新内容
12+ * 2015/02/26 Kitagawa 新規作成
13+ *-->
14+ */
15+public class SshIOException extends SshProcessException {
16+
17+ /**
18+ * コンストラクタ<br>
19+ * @param message 例外メッセージ
20+ * @param cause ルート要因
21+ */
22+ public SshIOException(String message, Throwable cause) {
23+ super(message, cause);
24+ }
25+
26+ /**
27+ * コンストラクタ<br>
28+ * @param message 例外メッセージ
29+ */
30+ public SshIOException(String message) {
31+ super(message);
32+ }
33+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshIllegalStateException.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshIllegalStateException.java (revision 555)
@@ -0,0 +1,33 @@
1+package org.phosphoresce.lib.ssh.exception;
2+
3+/**
4+ * 不正な状態における各種操作が行われた場合にスローされます。<br>
5+ * <p>
6+ * </p>
7+ *
8+ * @author Kitagawa<br>
9+ *
10+ *<!--
11+ * 更新日 更新者 更新内容
12+ * 2015/02/26 Kitagawa 新規作成
13+ *-->
14+ */
15+public class SshIllegalStateException extends SshProcessException {
16+
17+ /**
18+ * コンストラクタ<br>
19+ * @param message 例外メッセージ
20+ * @param cause ルート要因
21+ */
22+ public SshIllegalStateException(String message, Throwable cause) {
23+ super(message, cause);
24+ }
25+
26+ /**
27+ * コンストラクタ<br>
28+ * @param message 例外メッセージ
29+ */
30+ public SshIllegalStateException(String message) {
31+ super(message);
32+ }
33+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshProcessException.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshProcessException.java (revision 555)
@@ -0,0 +1,33 @@
1+package org.phosphoresce.lib.ssh.exception;
2+
3+/**
4+ * SSH関連操作におけるすべての例外はこのクラス若しくは、継承されたクラスによってスローされます。<br>
5+ * <p>
6+ * </p>
7+ *
8+ * @author Kitagawa<br>
9+ *
10+ *<!--
11+ * 更新日 更新者 更新内容
12+ * 2015/02/26 Kitagawa 新規作成
13+ *-->
14+ */
15+public class SshProcessException extends RuntimeException {
16+
17+ /**
18+ * コンストラクタ<br>
19+ * @param message 例外メッセージ
20+ * @param cause ルート要因
21+ */
22+ public SshProcessException(String message, Throwable cause) {
23+ super(message, cause);
24+ }
25+
26+ /**
27+ * コンストラクタ<br>
28+ * @param message 例外メッセージ
29+ */
30+ public SshProcessException(String message) {
31+ super(message);
32+ }
33+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshConnectionException.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/exception/SshConnectionException.java (revision 555)
@@ -0,0 +1,33 @@
1+package org.phosphoresce.lib.ssh.exception;
2+
3+/**
4+ * SSHの接続操作における例外が発生した場合にスローされます。<br>
5+ * <p>
6+ * </p>
7+ *
8+ * @author Kitagawa<br>
9+ *
10+ *<!--
11+ * 更新日 更新者 更新内容
12+ * 2015/02/26 Kitagawa 新規作成
13+ *-->
14+ */
15+public class SshConnectionException extends SshProcessException {
16+
17+ /**
18+ * コンストラクタ<br>
19+ * @param message 例外メッセージ
20+ * @param cause ルート要因
21+ */
22+ public SshConnectionException(String message, Throwable cause) {
23+ super(message, cause);
24+ }
25+
26+ /**
27+ * コンストラクタ<br>
28+ * @param message 例外メッセージ
29+ */
30+ public SshConnectionException(String message) {
31+ super(message);
32+ }
33+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/SshGlobal.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/SshGlobal.java (revision 555)
@@ -0,0 +1,25 @@
1+package org.phosphoresce.lib.ssh;
2+
3+/**
4+ * SSHライブラリ共通の定数をインタフェースとして提供します。<br>
5+ * <p>
6+ * </p>
7+ *
8+ * @author Kitagawa<br>
9+ *
10+ *<!--
11+ * 更新日 更新者 更新内容
12+ * 2015/02/26 Kitagawa 新規作成
13+ *-->
14+ */
15+public interface SshGlobal {
16+
17+ /** ディフォルトサーバー文字コード */
18+ public static final String DEFAULT_SERVER_CHARSET = "UTF-8";
19+
20+ /** ディフォルトクライアント文字コード */
21+ public static final String DEFAULT_CLIENT_CHARSET = System.getProperty("file.encoding");
22+
23+ /** ディフォルトシェルプロファイル(bash向け) */
24+ public static final String DEFAULT_SHELL_PROFILE = ". /etc/profile;. ~/.bash_profile";
25+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/session/SshSession.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/session/SshSession.java (revision 555)
@@ -0,0 +1,254 @@
1+package org.phosphoresce.lib.ssh.session;
2+
3+import org.phosphoresce.lib.ssh.SshGlobal;
4+import org.phosphoresce.lib.ssh.exception.SshCommanderException;
5+import org.phosphoresce.lib.ssh.exception.SshConnectionException;
6+import org.phosphoresce.lib.ssh.exception.SshFileTransferException;
7+import org.phosphoresce.lib.ssh.exception.SshIllegalStateException;
8+
9+/**
10+ * SSH接続状態を管理するインタフェースを提供します。<br>
11+ * <p>
12+ * </p>
13+ *
14+ * @author Kitagawa<br>
15+ *
16+ *<!--
17+ * 更新日 更新者 更新内容
18+ * 2015/02/26 Kitagawa 新規作成
19+ *-->
20+ */
21+public abstract class SshSession<C extends SshCommander<?>, F extends SshFileTransfer<?>> implements SshGlobal {
22+
23+ /** 接続先サーバー */
24+ private String server;
25+
26+ /** 接続先ポート */
27+ private int port;
28+
29+ /** ユーザー名 */
30+ private String user;
31+
32+ /** パスワード */
33+ private String password;
34+
35+ /** セッション環境設定 */
36+ private SshConfig config;
37+
38+ /** セッションオープン済みフラグ */
39+ private boolean opened;
40+
41+ /** コマンド実行オブジェクト */
42+ private C commander;
43+
44+ /** ファイル転送オブジェクト */
45+ private F fileTransfer;
46+
47+ /**
48+ * コンストラクタ<br>
49+ * @param server 接続先サーバー
50+ * @param port 接続先ポート
51+ * @param user ユーザー名
52+ * @param password パスワード
53+ */
54+ public SshSession(String server, int port, String user, String password) {
55+ super();
56+ this.server = server;
57+ this.port = port;
58+ this.user = user;
59+ this.password = password;
60+ this.config = new SshConfig();
61+ this.opened = false;
62+ this.commander = null;
63+ }
64+
65+ /**
66+ * 接続先サーバーを取得します。
67+ * @return 接続先サーバー
68+ */
69+ public final String getServer() {
70+ return server;
71+ }
72+
73+ /**
74+ * 接続先サーバーを設定します。
75+ * @param server 接続先サーバー
76+ * @throws SshIllegalStateException 既に接続がオープンされている状態での操作が行われた場合にスローされます
77+ */
78+ public final void setServer(String server) throws SshIllegalStateException {
79+ this.server = server;
80+ if (opened) {
81+ throw new SshIllegalStateException("SSH session is already opened");
82+ }
83+ }
84+
85+ /**
86+ * 接続先ポートを取得します。
87+ * @return 接続先ポート
88+ */
89+ public final int getPort() {
90+ return port;
91+ }
92+
93+ /**
94+ * 接続先ポートを設定します。
95+ * @param port 接続先ポート
96+ * @throws SshIllegalStateException 既に接続がオープンされている状態での操作が行われた場合にスローされます
97+ */
98+ public final void setPort(int port) throws SshIllegalStateException {
99+ if (opened) {
100+ throw new SshIllegalStateException("SSH session is already opened");
101+ }
102+ this.port = port;
103+ }
104+
105+ /**
106+ * ユーザー名を取得します。
107+ * @return ユーザー名
108+ */
109+ public final String getUser() {
110+ return user;
111+ }
112+
113+ /**
114+ * ユーザー名を設定します。
115+ * @param user ユーザー名
116+ * @throws SshIllegalStateException 既に接続がオープンされている状態での操作が行われた場合にスローされます
117+ */
118+ public final void setUser(String user) throws SshIllegalStateException {
119+ if (opened) {
120+ throw new SshIllegalStateException("SSH session is already opened");
121+ }
122+ this.user = user;
123+ }
124+
125+ /**
126+ * パスワードを取得します。
127+ * @return パスワード
128+ */
129+ public final String getPassword() {
130+ return password;
131+ }
132+
133+ /**
134+ * パスワードを設定します。
135+ * @param password パスワード
136+ * @throws SshIllegalStateException 既に接続がオープンされている状態での操作が行われた場合にスローされます
137+ */
138+ public final void setPassword(String password) throws SshIllegalStateException {
139+ if (opened) {
140+ throw new SshIllegalStateException("SSH session is already opened");
141+ }
142+ this.password = password;
143+ }
144+
145+ /**
146+ * セッション環境設定を取得します。
147+ * @return セッション環境設定
148+ */
149+ public SshConfig getConfig() {
150+ return config;
151+ }
152+
153+ /**
154+ * セッションオープン済みフラグを取得します。
155+ * @return セッションオープン済みフラグ
156+ */
157+ public final boolean isOpened() {
158+ return opened;
159+ }
160+
161+ /**
162+ * SSH接続をオープンします。<br>
163+ * @throws SshConnectionException 正常に接続が確立できなかった場合にスローされます
164+ * @throws SshIllegalStateException 既に接続がオープンされている場合にスローされます
165+ */
166+ public final void open() throws SshConnectionException, SshIllegalStateException {
167+ if (opened) {
168+ throw new SshIllegalStateException("SSH session is already opened");
169+ }
170+ openProcess();
171+ opened = true;
172+ }
173+
174+ /**
175+ * SSH接続をオープンします。<br>
176+ * @throws SshConnectionException 正常に接続が確立できなかった場合にスローされます
177+ * @throws SshIllegalStateException 既に接続がオープンされている場合にスローされます
178+ */
179+ protected abstract void openProcess() throws SshConnectionException, SshIllegalStateException;
180+
181+ /**
182+ * SSH接続をクローズします。<br>
183+ * @throws SshConnectionException 正常に接続がクローズできなかった場合にスローされます
184+ * @throws SshIllegalStateException 接続がオープンされていなかった場合にスローされます
185+ */
186+ public final void close() throws SshConnectionException, SshIllegalStateException {
187+ if (!opened) {
188+ throw new SshIllegalStateException("SSH session has not been opened");
189+ }
190+ if (commander != null) {
191+ commander.close();
192+ commander = null;
193+ }
194+ if (fileTransfer != null) {
195+ fileTransfer.close();
196+ fileTransfer = null;
197+ }
198+ closeProcess();
199+ opened = false;
200+ }
201+
202+ /**
203+ * SSH接続をクローズします。<br>
204+ * @throws SshConnectionException 正常に接続がクローズできなかった場合にスローされます
205+ * @throws SshIllegalStateException 接続がオープンされていなかった場合にスローされます
206+ */
207+ protected abstract void closeProcess() throws SshConnectionException, SshIllegalStateException;
208+
209+ /**
210+ * コマンド実行オブジェクトを取得します。<br>
211+ * @return コマンド実行オブジェクト
212+ * @throws SshIllegalStateException 接続がオープンされていなかった場合にスローされます
213+ * @throws SshCommanderException コマンド実行オブジェクトの生成が正しく行えなかった場合にスローされます
214+ */
215+ public final C getCommander() throws SshIllegalStateException, SshCommanderException {
216+ if (!opened) {
217+ throw new SshIllegalStateException("SSH session has not been opened");
218+ }
219+ if (commander == null) {
220+ commander = createCommander();
221+ }
222+ return commander;
223+ }
224+
225+ /**
226+ * コマンド実行オブジェクトを生成します。<br>
227+ * @return コマンド実行オブジェクト
228+ * @throws SshCommanderException コマンド実行オブジェクトの生成が正しく行えなかった場合にスローされます
229+ */
230+ protected abstract C createCommander() throws SshCommanderException;
231+
232+ /**
233+ * ファイル転送オブジェクトを取得します。<br>
234+ * @return ファイル転送オブジェクト
235+ * @throws SshIllegalStateException 接続がオープンされていなかった場合にスローされます
236+ * @throws SshFileTransferException ファイル転送オブジェクトの生成が正しく行えなかった場合にスローされます
237+ */
238+ public final F getFileTransfer() throws SshIllegalStateException, SshFileTransferException {
239+ if (!opened) {
240+ throw new SshIllegalStateException("SSH session has not been opened");
241+ }
242+ if (fileTransfer == null) {
243+ fileTransfer = createFileTransfer();
244+ }
245+ return fileTransfer;
246+ }
247+
248+ /**
249+ * ファイル転送オブジェクトを生成します。<br>
250+ * @return ファイル転送オブジェクト
251+ * @throws SshFileTransferException ファイル転送オブジェクトの生成が正しく行えなかった場合にスローされます
252+ */
253+ protected abstract F createFileTransfer() throws SshFileTransferException;
254+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/session/SshFileTransfer.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/session/SshFileTransfer.java (revision 555)
@@ -0,0 +1,367 @@
1+package org.phosphoresce.lib.ssh.session;
2+
3+import java.io.File;
4+import java.io.FileInputStream;
5+import java.io.FileOutputStream;
6+import java.io.IOException;
7+import java.io.InputStream;
8+import java.io.OutputStream;
9+
10+import org.phosphoresce.lib.commons.util.FileUtil;
11+import org.phosphoresce.lib.ssh.enums.DirectoryMakeMode;
12+import org.phosphoresce.lib.ssh.enums.FileOverwriteMode;
13+import org.phosphoresce.lib.ssh.exception.SshConnectionException;
14+import org.phosphoresce.lib.ssh.exception.SshFileTransferException;
15+
16+/**
17+ * ファイル転送に関する処理インタフェースを提供します。<br>
18+ * <p>
19+ * </p>
20+ *
21+ * @author Kitagawa<br>
22+ *
23+ *<!--
24+ * 更新日 更新者 更新内容
25+ * 2015/02/26 Kitagawa 新規作成
26+ *-->
27+ */
28+public abstract class SshFileTransfer<S extends SshSession<?, ?>> {
29+
30+ /** 接続セッションオブジェクト */
31+ private S session;
32+
33+ /**
34+ * コンストラクタ<br>
35+ * @param session 接続セッションオブジェクト
36+ */
37+ protected SshFileTransfer(S session) {
38+ super();
39+ this.session = session;
40+ }
41+
42+ /**
43+ * 接続セッションオブジェクトを取得します。
44+ * @return 接続セッションオブジェクト
45+ */
46+ public final S getSession() {
47+ return session;
48+ }
49+
50+ /**
51+ * セッション環境設定オブジェクトを取得します。<br>
52+ * @return セッション環境設定オブジェクト
53+ */
54+ public final SshConfig getConfig() {
55+ return session.getConfig();
56+ }
57+
58+ /**
59+ * ファイル転送オブジェクトのクローズを行います。<br>
60+ * @throws SshConnectionException ファイル転送オブジェクトのクローズが正しく行えなかった場合にスローされます
61+ */
62+ final void close() throws SshConnectionException {
63+ closeProcess();
64+ }
65+
66+ /**
67+ * ファイル転送オブジェクトのクローズを行います。<br>
68+ * @throws SshConnectionException ファイル転送オブジェクトのクローズが正しく行えなかった場合にスローされます
69+ */
70+ protected abstract void closeProcess() throws SshConnectionException;
71+
72+ /**
73+ * リモートパスが存在するか判定します。<br>
74+ * @param remote リモートパス
75+ * @return リモートパスが存在する場合にtrueを返却
76+ * @throws SshFileTransferException 正常にファイル転送プロトコルによるリソース存在チェックが行えなかった場合にスローされます
77+ */
78+ public abstract boolean exists(String remote) throws SshFileTransferException;
79+
80+ /**
81+ * 入力ストリームからリモートにファイルを配置する内部コア処理を行います。<br>
82+ * @param input 入力ストリーム
83+ * @param remote 配置先リモートパス
84+ * @param localTimestamp タイムスタンプ判定時のローカル側タイムスタンプ(直接ストリームから入力する場合は最大にしておきます)
85+ * @param localSize タイムスタンプ判定時のローカル側タイムスタンプ(直接ストリームから入力する場合は最小にしておきます)
86+ * @param overwrite ファイル上書きモード
87+ * @param mkdir ディレクトリ作成モード
88+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
89+ */
90+ protected abstract void putProcess(InputStream input, String remote, long localTimestamp, long localSize, FileOverwriteMode overwrite, DirectoryMakeMode mkdir) throws SshFileTransferException;
91+
92+ /**
93+ * 入力ストリームからリモートにファイルを配置します。<br>
94+ * @param input 入力ストリーム
95+ * @param remote 配置先リモートパス
96+ * @param overwrite ファイル上書きモード
97+ * @param mkdir ディレクトリ作成モード
98+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
99+ */
100+ public final void put(InputStream input, String remote, FileOverwriteMode overwrite, DirectoryMakeMode mkdir) throws SshFileTransferException {
101+ putProcess(input, remote, Long.MAX_VALUE, Long.MIN_VALUE, overwrite, mkdir);
102+ }
103+
104+ /**
105+ * 入力ストリームからリモートにファイルを配置します。<br>
106+ * リモートディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
107+ * @param input 入力ストリーム
108+ * @param remote 配置先リモートパス
109+ * @param overwrite ファイル上書きモード
110+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
111+ */
112+ public final void put(InputStream input, String remote, FileOverwriteMode overwrite) throws SshFileTransferException {
113+ putProcess(input, remote, Long.MAX_VALUE, Long.MIN_VALUE, overwrite, DirectoryMakeMode.NOTHING_ON_NOTEXISTS);
114+ }
115+
116+ /**
117+ * 入力ストリームからリモートにファイルを配置します。<br>
118+ * リモートディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
119+ * また、ファイルが既に存在する場合は常に上書きされます。<br>
120+ * @param input 入力ストリーム
121+ * @param remote 配置先リモートパス
122+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
123+ */
124+ public final void put(InputStream input, String remote) throws SshFileTransferException {
125+ putProcess(input, remote, Long.MAX_VALUE, Long.MIN_VALUE, FileOverwriteMode.ALWAYS_OVERWRITE, DirectoryMakeMode.NOTHING_ON_NOTEXISTS);
126+ }
127+
128+ /**
129+ * ローカルファイルをリモートに配置します。<br>
130+ * @param input ローカルファイル
131+ * @param remote 配置先リモートパス
132+ * @param overwrite ファイル上書きモード
133+ * @param mkdir ディレクトリ作成モード
134+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
135+ */
136+ public final void put(File input, String remote, FileOverwriteMode overwrite, DirectoryMakeMode mkdir) throws SshFileTransferException {
137+ if (input == null || !input.exists()) {
138+ return;
139+ }
140+ FileInputStream stream = null;
141+ try {
142+ stream = new FileInputStream(input);
143+ putProcess(stream, remote, input.lastModified(), input.length(), overwrite, mkdir);
144+ } catch (IOException e) {
145+ throw new SshFileTransferException("Failed to load local file", e);
146+ } finally {
147+ if (stream != null) {
148+ try {
149+ stream.close();
150+ stream = null;
151+ } catch (IOException e) {
152+ //
153+ }
154+ }
155+ }
156+ }
157+
158+ /**
159+ * ローカルファイルをリモートに配置します。<br>
160+ * リモートディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
161+ * @param input ローカルファイル
162+ * @param remote 配置先リモートパス
163+ * @param overwrite ファイル上書きモード
164+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
165+ */
166+ public final void put(File input, String remote, FileOverwriteMode overwrite) throws SshFileTransferException {
167+ if (input == null || !input.exists()) {
168+ return;
169+ }
170+ FileInputStream stream = null;
171+ try {
172+ stream = new FileInputStream(input);
173+ putProcess(stream, remote, input.lastModified(), input.length(), overwrite, DirectoryMakeMode.NOTHING_ON_NOTEXISTS);
174+ } catch (IOException e) {
175+ throw new SshFileTransferException("Failed to load local file", e);
176+ } finally {
177+ if (stream != null) {
178+ try {
179+ stream.close();
180+ stream = null;
181+ } catch (IOException e) {
182+ //
183+ }
184+ }
185+ }
186+ }
187+
188+ /**
189+ * ローカルファイルをリモートに配置します。<br>
190+ * リモートディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
191+ * また、ファイルが既に存在する場合は常に上書きされます。<br>
192+ * @param input ローカルファイル
193+ * @param remote 配置先リモートパス
194+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
195+ */
196+ public final void put(File input, String remote) throws SshFileTransferException {
197+ if (input == null || !input.exists()) {
198+ return;
199+ }
200+ FileInputStream stream = null;
201+ try {
202+ stream = new FileInputStream(input);
203+ putProcess(stream, remote, input.lastModified(), input.length(), FileOverwriteMode.ALWAYS_OVERWRITE, DirectoryMakeMode.NOTHING_ON_NOTEXISTS);
204+ } catch (IOException e) {
205+ throw new SshFileTransferException("Failed to load local file", e);
206+ } finally {
207+ if (stream != null) {
208+ try {
209+ stream.close();
210+ stream = null;
211+ } catch (IOException e) {
212+ //
213+ }
214+ }
215+ }
216+ }
217+
218+ /**
219+ * ローカルファイルをリモートに配置します。<br>
220+ * @param input ローカルファイルパス
221+ * @param remote 配置先リモートパス
222+ * @param overwrite ファイル上書きモード
223+ * @param mkdir ディレクトリ作成モード
224+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
225+ */
226+ public final void put(String input, String remote, FileOverwriteMode overwrite, DirectoryMakeMode mkdir) throws SshFileTransferException {
227+ put(new File(input), remote, overwrite, mkdir);
228+ }
229+
230+ /**
231+ * ローカルファイルをリモートに配置します。<br>
232+ * リモートディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
233+ * @param input ローカルファイルパス
234+ * @param remote 配置先リモートパス
235+ * @param overwrite ファイル上書きモード
236+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
237+ */
238+ public final void put(String input, String remote, FileOverwriteMode overwrite) throws SshFileTransferException {
239+ put(new File(input), remote, overwrite);
240+ }
241+
242+ /**
243+ * ローカルファイルをリモートに配置します。<br>
244+ * リモートディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
245+ * また、ファイルが既に存在する場合は常に上書きされます。<br>
246+ * @param input ローカルファイルパス
247+ * @param remote 配置先リモートパス
248+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
249+ */
250+ public final void put(String input, String remote) throws SshFileTransferException {
251+ put(new File(input), remote);
252+ }
253+
254+ /**
255+ * リモートファイルを取得してストリームに出力する内部コア処理を行います。<br>
256+ * @param remote 取得元リモートパス
257+ * @param output 出力ストリーム
258+ * @param localTimestamp タイムスタンプ判定時のローカル側タイムスタンプ(直接ストリームに出力する場合は最小値にしておきます)
259+ * @param localSize タイムスタンプ判定時のローカル側タイムスタンプ(直接ストリームから入力する場合は最小にしておきます)
260+ * @param localDirectory ローカル側ファイル出力を行う際の出力先ディレクトリパス(直接ストリームに出力する場合はnullを設定しておきます)
261+ * @param overwrite ファイル上書きモード
262+ * @param mkdir ディレクトリ作成モード
263+ * @throws SshFileTransferException
264+ */
265+ protected abstract void getProcess(String remote, OutputStream output, long localTimestamp, long localSize, String localDirectory, FileOverwriteMode overwrite, DirectoryMakeMode mkdir) throws SshFileTransferException;
266+
267+ /**
268+ * リモートファイルを取得してストリームに出力します。<br>
269+ * @param remote 取得元リモートパス
270+ * @param output 出力ストリーム
271+ * @throws SshFileTransferException
272+ */
273+ public final void get(String remote, OutputStream output) throws SshFileTransferException {
274+ getProcess(remote, output, Long.MIN_VALUE, Long.MIN_VALUE, null, FileOverwriteMode.ALWAYS_OVERWRITE, DirectoryMakeMode.NOTHING_ON_NOTEXISTS);
275+ }
276+
277+ /**
278+ * リモートファイルをローカルファイルに転送します。<br>
279+ * @param remote 取得元リモートパス
280+ * @param output ローカルファイル
281+ * @param overwrite ファイル上書きモード
282+ * @param mkdir ディレクトリ作成モード
283+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
284+ */
285+ public final void get(String remote, File output, FileOverwriteMode overwrite, DirectoryMakeMode mkdir) throws SshFileTransferException {
286+ FileOutputStream stream = null;
287+ try {
288+ long lastModified = output.exists() ? output.lastModified() : Long.MIN_VALUE;
289+ long localSize = output.exists() ? output.length() : Long.MIN_VALUE;
290+ String outputDirectory = FileUtil.getDirectory(output).getAbsolutePath();
291+ stream = new FileOutputStream(output);
292+ getProcess(remote, stream, lastModified, localSize, outputDirectory, overwrite, mkdir);
293+ } catch (IOException e) {
294+ throw new SshFileTransferException("Failed to save file", e);
295+ } finally {
296+ if (stream != null) {
297+ try {
298+ stream.flush();
299+ stream.close();
300+ stream = null;
301+ } catch (IOException e) {
302+ //
303+ }
304+ }
305+ }
306+ }
307+
308+ /**
309+ * リモートファイルをローカルファイルに転送します。<br>
310+ * ローカルディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
311+ * @param remote 取得元リモートパス
312+ * @param output ローカルファイル
313+ * @param overwrite ファイル上書きモード
314+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
315+ */
316+ public final void get(String remote, File output, FileOverwriteMode overwrite) throws SshFileTransferException {
317+ get(remote, output, overwrite, DirectoryMakeMode.NOTHING_ON_NOTEXISTS);
318+ }
319+
320+ /**
321+ * リモートファイルをローカルファイルに転送します。<br>
322+ * ローカルディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
323+ * また、ファイルが既に存在する場合は常に上書きされます。<br>
324+ * @param remote 取得元リモートパス
325+ * @param output ローカルファイルパス
326+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
327+ */
328+ public final void get(String remote, File output) throws SshFileTransferException {
329+ get(remote, output, FileOverwriteMode.ALWAYS_OVERWRITE, DirectoryMakeMode.NOTHING_ON_NOTEXISTS);
330+ }
331+
332+ /**
333+ * リモートファイルをローカルファイルに転送します。<br>
334+ * @param remote 取得元リモートパス
335+ * @param output ローカルファイル
336+ * @param overwrite ファイル上書きモード
337+ * @param mkdir ディレクトリ作成モード
338+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
339+ */
340+ public final void get(String remote, String output, FileOverwriteMode overwrite, DirectoryMakeMode mkdir) throws SshFileTransferException {
341+ get(remote, new File(output), overwrite, mkdir);
342+ }
343+
344+ /**
345+ * リモートファイルをローカルファイルに転送します。<br>
346+ * ローカルディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
347+ * @param remote 取得元リモートパス
348+ * @param output ローカルファイル
349+ * @param overwrite ファイル上書きモード
350+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
351+ */
352+ public final void get(String remote, String output, FileOverwriteMode overwrite) throws SshFileTransferException {
353+ get(remote, new File(output), overwrite);
354+ }
355+
356+ /**
357+ * リモートファイルをローカルファイルに転送します。<br>
358+ * ローカルディレクトリが存在しないパスが指定された場合は例外がスローされます。<br>
359+ * また、ファイルが既に存在する場合は常に上書きされます。<br>
360+ * @param remote 取得元リモートパス
361+ * @param output ローカルファイルパス
362+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
363+ */
364+ public final void get(String remote, String output) throws SshFileTransferException {
365+ get(remote, new File(output));
366+ }
367+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/session/SshCommander.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/session/SshCommander.java (revision 555)
@@ -0,0 +1,146 @@
1+package org.phosphoresce.lib.ssh.session;
2+
3+import java.io.PrintStream;
4+import java.util.LinkedList;
5+import java.util.List;
6+
7+import org.phosphoresce.lib.commons.util.StringUtil;
8+import org.phosphoresce.lib.ssh.exception.SshCommanderException;
9+import org.phosphoresce.lib.ssh.exception.SshConnectionException;
10+
11+/**
12+ * コマンド実行に関する処理インタフェースを提供します。<br>
13+ * <p>
14+ * </p>
15+ *
16+ * @author Kitagawa<br>
17+ *
18+ *<!--
19+ * 更新日 更新者 更新内容
20+ * 2015/02/26 Kitagawa 新規作成
21+ *-->
22+ */
23+public abstract class SshCommander<S extends SshSession<?, ?>> {
24+
25+ /** 接続セッションオブジェクト */
26+ private S session;
27+
28+ /** コマンド実行キュー */
29+ private List<String> commands;
30+
31+ /**
32+ * コンストラクタ<br>
33+ * @param session 接続セッションオブジェクト
34+ */
35+ protected SshCommander(S session) {
36+ super();
37+ this.session = session;
38+ this.commands = new LinkedList<String>();
39+ clear();
40+ }
41+
42+ /**
43+ * 接続セッションオブジェクトを取得します。
44+ * @return 接続セッションオブジェクト
45+ */
46+ public final S getSession() {
47+ return session;
48+ }
49+
50+ /**
51+ * セッション環境設定オブジェクトを取得します。<br>
52+ * @return セッション環境設定オブジェクト
53+ */
54+ public final SshConfig getConfig() {
55+ return session.getConfig();
56+ }
57+
58+ /**
59+ * 割り込みエラーを発生させずに指定された時刻スリープします。<br>
60+ * @param mills スリープ時間(ミリ秒)
61+ */
62+ protected final void silentSleep(long mills) {
63+ try {
64+ Thread.sleep(mills);
65+ } catch (InterruptedException e) {
66+ }
67+ }
68+
69+ /**
70+ * コマンド実行オブジェクトのクローズを行います。<br>
71+ * @throws SshConnectionException コマンド実行オブジェクトのクローズが正しく行えなかった場合にスローされます
72+ */
73+ final void close() throws SshConnectionException {
74+ clear();
75+ closeProcess();
76+ }
77+
78+ /**
79+ * コマンド実行オブジェクトのクローズを行います。<br>
80+ * @throws SshConnectionException コマンド実行オブジェクトのクローズが正しく行えなかった場合にスローされます
81+ */
82+ protected abstract void closeProcess() throws SshConnectionException;
83+
84+ /**
85+ * コマンドキューに設定されているコマンド群をすべてクリアします。<br>
86+ */
87+ public final void clear() {
88+ commands.clear();
89+ String profile = getConfig().getShellProfile();
90+ if (!StringUtil.isEmpty(profile)) {
91+ for (String token : profile.split(";")) {
92+ if (StringUtil.isEmpty(StringUtil.nvl(token).trim())) {
93+ continue;
94+ }
95+ add(token);
96+ }
97+ }
98+ }
99+
100+ /**
101+ * 実行コマンドを追加します。<br>
102+ * このタイミングでは実際にコマンドの実行は行われません。<br>
103+ * @param command コマンド文字列
104+ * @return 自身のインスタンス
105+ */
106+ public final SshCommander<S> add(String command) {
107+ commands.add(command);
108+ return this;
109+ }
110+
111+ /**
112+ * キューに追加されているコマンドを実行します。<br>
113+ * コマンドが正常に実行されたタイミングでキューに追加されていたコマンドはクリアされます。<br>
114+ * @return コマンド実行返却値
115+ * @throws SshCommanderException 正常にコマンドの実行が行えなかった場合にスローされます
116+ */
117+ public final int exec() throws SshCommanderException {
118+ PrintStream cmdout = null;
119+ if (getConfig().getCmdoutStream() != null) {
120+ cmdout = new PrintStream(getConfig().getCmdoutStream());
121+ }
122+ StringBuffer buffer = new StringBuffer();
123+ for (String command : commands) {
124+ if (cmdout != null) {
125+ cmdout.println(command);
126+ }
127+ buffer.append(command);
128+ buffer.append(";");
129+ }
130+ String command = buffer.toString();
131+ if (command.endsWith(";")) {
132+ command = command.substring(0, command.length() - 1);
133+ }
134+ int retval = execProcess(command);
135+ clear();
136+ return retval;
137+ }
138+
139+ /**
140+ * 指定されたコマンドを実行します。<br>
141+ * @param command コマンド文字列
142+ * @return コマンド実行返却値
143+ * @throws SshCommanderException 正常にコマンドの実行が行えなかった場合にスローされます
144+ */
145+ protected abstract int execProcess(String command) throws SshCommanderException;
146+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/session/SshConfig.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/session/SshConfig.java (revision 555)
@@ -0,0 +1,154 @@
1+package org.phosphoresce.lib.ssh.session;
2+
3+import java.io.OutputStream;
4+
5+import org.phosphoresce.lib.ssh.SshGlobal;
6+import org.phosphoresce.lib.ssh.exception.SshIOException;
7+import org.phosphoresce.lib.ssh.exception.SshIllegalStateException;
8+import org.phosphoresce.lib.ssh.io.EncodingOutputStream;
9+
10+/**
11+ * SSH処理時の各種環境設定を管理するインタフェースを提供します。<br>
12+ * <p>
13+ * </p>
14+ *
15+ * @author Kitagawa<br>
16+ *
17+ *<!--
18+ * 更新日 更新者 更新内容
19+ * 2015/02/26 Kitagawa 新規作成
20+ *-->
21+ */
22+public class SshConfig implements SshGlobal {
23+
24+ /** シェルプロファイル */
25+ private String shellProfile;
26+
27+ /** サーバー文字コード */
28+ private String serverCharset;
29+
30+ /** クライアント文字コード */
31+ private String clientCharset;
32+
33+ /** コマンドトレースストリーム */
34+ private EncodingOutputStream cmdoutStream;
35+
36+ /** 標準出力ストリーム */
37+ private EncodingOutputStream sysoutStream;
38+
39+ /** エラー出力ストリーム */
40+ private EncodingOutputStream syserrStream;
41+
42+ /**
43+ * コンストラクタ<br>
44+ */
45+ SshConfig() {
46+ super();
47+ this.shellProfile = DEFAULT_SHELL_PROFILE;
48+ this.serverCharset = DEFAULT_SERVER_CHARSET;
49+ this.clientCharset = DEFAULT_CLIENT_CHARSET;
50+ this.cmdoutStream = new EncodingOutputStream(null, true);
51+ this.sysoutStream = new EncodingOutputStream(System.out, true, serverCharset);
52+ this.syserrStream = new EncodingOutputStream(System.err, true, serverCharset);
53+ }
54+
55+ /**
56+ * シェルプロファイルを取得します。
57+ * @return シェルプロファイル
58+ */
59+ public String getShellProfile() {
60+ return shellProfile;
61+ }
62+
63+ /**
64+ * シェルプロファイルを設定します。
65+ * @param shellProfile シェルプロファイル
66+ * @throws SshIllegalStateException 既に接続がオープンされている状態での操作が行われた場合にスローされます
67+ */
68+ public void setShellProfile(String shellProfile) throws SshIllegalStateException {
69+ this.shellProfile = shellProfile;
70+ }
71+
72+ /**
73+ * サーバー文字コードを取得します。
74+ * @return サーバー文字コード
75+ */
76+ public String getServerCharset() {
77+ return serverCharset;
78+ }
79+
80+ /**
81+ * サーバー文字コードを設定します。
82+ * @param serverCharset サーバー文字コード
83+ * @throws SshIOException 環境設定されているストリームに対して文字コード再設定時に入出力例外が発生した場合にスローされます
84+ */
85+ public void setServerCharset(String serverCharset) throws SshIOException {
86+ this.serverCharset = serverCharset;
87+ sysoutStream.setCharset(serverCharset);
88+ syserrStream.setCharset(serverCharset);
89+ }
90+
91+ /**
92+ * クライアント文字コードを取得します。
93+ * @return クライアント文字コード
94+ */
95+ public String getClientCharset() {
96+ return clientCharset;
97+ }
98+
99+ /**
100+ * クライアント文字コードを設定します。
101+ * @param clientCharset クライアント文字コード
102+ */
103+ public void setClientCharset(String clientCharset) {
104+ this.clientCharset = clientCharset;
105+ }
106+
107+ /**
108+ * コマンドトレースストリームを取得します。
109+ * @return コマンドトレースストリーム
110+ */
111+ public OutputStream getCmdoutStream() {
112+ return cmdoutStream;
113+ }
114+
115+ /**
116+ * コマンドトレースストリームを設定します。
117+ * @param cmdoutStream コマンドトレースストリーム
118+ */
119+ public void setCmdoutStream(OutputStream cmdoutStream) {
120+ this.cmdoutStream = new EncodingOutputStream(cmdoutStream, true);
121+ }
122+
123+ /**
124+ * 標準出力ストリームを取得します。
125+ * @return 標準出力ストリーム
126+ */
127+ public OutputStream getSysoutStream() {
128+ return sysoutStream;
129+ }
130+
131+ /**
132+ * 標準出力ストリームを設定します。
133+ * @param sysoutStream 標準出力ストリーム
134+ */
135+ public void setSysoutStream(OutputStream sysoutStream) {
136+ this.sysoutStream = new EncodingOutputStream(sysoutStream, true, serverCharset);
137+ }
138+
139+ /**
140+ * エラー出力ストリームを取得します。
141+ * @return エラー出力ストリーム
142+ */
143+ public OutputStream getSyserrStream() {
144+ return syserrStream;
145+ }
146+
147+ /**
148+ * エラー出力ストリームを設定します。
149+ * @param syserrStream エラー出力ストリーム
150+ */
151+ public void setSyserrStream(OutputStream syserrStream) {
152+ this.sysoutStream = new EncodingOutputStream(syserrStream, true, serverCharset);
153+ }
154+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/enums/DirectoryMakeMode.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/enums/DirectoryMakeMode.java (revision 555)
@@ -0,0 +1,22 @@
1+package org.phosphoresce.lib.ssh.enums;
2+
3+/**
4+ * ファイル転送時のディレクトリ作成モード種別を列挙型で提供します。<br>
5+ * <p>
6+ * </p>
7+ *
8+ * @author Kitagawa<br>
9+ *
10+ *<!--
11+ * 更新日 更新者 更新内容
12+ * 2015/02/26 Kitagawa 新規作成
13+ *-->
14+ */
15+public enum DirectoryMakeMode {
16+
17+ /** ディレクトリが存在しない場合、作成します */
18+ MAKE_ON_NOTEXISTS,
19+
20+ /** ディレクトリが存在しない場合、何もしません */
21+ NOTHING_ON_NOTEXISTS,
22+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/enums/FileOverwriteMode.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/enums/FileOverwriteMode.java (revision 555)
@@ -0,0 +1,31 @@
1+package org.phosphoresce.lib.ssh.enums;
2+
3+/**
4+ * ファイル転送時の上書きモード種別を列挙型で提供します。<br>
5+ * <p>
6+ * </p>
7+ *
8+ * @author Kitagawa<br>
9+ *
10+ *<!--
11+ * 更新日 更新者 更新内容
12+ * 2015/02/26 Kitagawa 新規作成
13+ *-->
14+ */
15+public enum FileOverwriteMode {
16+
17+ /** 常に上書きします */
18+ ALWAYS_OVERWRITE,
19+
20+ /** 既に存在するファイルがある場合、新しいタイムスタンプのもので上書きます */
21+ OVERWRITE_NEWER_ON_EXISTS,
22+
23+ /** 既に存在するファイルがある場合、サイズが異なる場合に上書きます */
24+ OVERWRITE_SIZEDIFF_ON_EXISTS,
25+
26+ /** 既に存在するファイルがある場合、何もせずにスキップします */
27+ SKIP_ON_EXISTS,
28+
29+ /** 既に存在するファイルがある場合、ファイルに追加します */
30+ APPEND_ON_EXISTS,
31+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/io/EncodingOutputStream.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/io/EncodingOutputStream.java (revision 555)
@@ -0,0 +1,183 @@
1+package org.phosphoresce.lib.ssh.io;
2+
3+import java.io.IOException;
4+import java.io.OutputStream;
5+import java.util.LinkedList;
6+import java.util.List;
7+
8+import org.phosphoresce.lib.ssh.exception.SshIOException;
9+
10+/**
11+ * 出力ストリームオブジェクトをラップしてバイト単位の出力に対するエンコード処理を提供します。<br>
12+ * <p>
13+ * </p>
14+ *
15+ * @author Kitagawa<br>
16+ *
17+ *<!--
18+ * 更新日 更新者 更新内容
19+ * 2015/02/24 Kitagawa 新規作成
20+ *-->
21+ */
22+public class EncodingOutputStream extends OutputStream {
23+
24+ /** ラップ元ストリームオブジェクト */
25+ private OutputStream parent;
26+
27+ /** エンコーディングキャラクタセット */
28+ private String charset;
29+
30+ /** 自動フラッシュフラグ */
31+ private boolean autoFlush;
32+
33+ /** ライトバッファ */
34+ private List<Byte> buffer;
35+
36+ /**
37+ * コンストラクタ<br>
38+ * @param parent ラップ元ストリームオブジェクト
39+ * @param autoFlush 自動フラッシュフラグ
40+ * @param charset エンコーディングキャラクタセット
41+ */
42+ public EncodingOutputStream(OutputStream parent, boolean autoFlush, String charset) {
43+ super();
44+ this.parent = parent;
45+ this.autoFlush = autoFlush;
46+ this.charset = charset;
47+ this.buffer = new LinkedList<Byte>();
48+ }
49+
50+ /**
51+ * コンストラクタ<br>
52+ * @param parent ラップ元ストリームオブジェクト
53+ * @param autoFlush 自動フラッシュフラグ
54+ */
55+ public EncodingOutputStream(OutputStream parent, boolean autoFlush) {
56+ this(parent, autoFlush, null);
57+ }
58+
59+ /**
60+ * ラップ元ストリームオブジェクトを取得します。
61+ * @return ラップ元ストリームオブジェクト
62+ */
63+ public OutputStream getParent() {
64+ return parent;
65+ }
66+
67+ /**
68+ * ラップされているストリームオブジェクトを再設定します。<br>
69+ * バッファされているデータが存在する状態でストリームオブジェクトを変更する場合、
70+ * 既に設定されているストリームにバッファをフラッシュしてから変更されます。<br>
71+ * @param parent ストリームオブジェクト
72+ * @throws SshIOException フラッシュ処理時に入出力例外が発生した場合にスローされます
73+ */
74+ public void setParent(OutputStream parent) throws SshIOException {
75+ try {
76+ flush();
77+ this.parent = parent;
78+ } catch (IOException e) {
79+ throw new SshIOException("Failed to flush before set autoFlush", e);
80+ }
81+ }
82+
83+ /**
84+ * エンコーディングキャラクタセットを取得します。<br>
85+ * @return エンコーディングキャラクタセット
86+ */
87+ public String getCharset() {
88+ return charset;
89+ }
90+
91+ /**
92+ * エンコーディングキャラクタセットを再設定します。<br>
93+ * バッファされているデータが存在する状態でストリームオブジェクトを変更する場合、
94+ * 既に設定されているストリームにバッファをフラッシュしてから変更されます。<br>
95+ * @param charset エンコーディングキャラクタセット
96+ * @throws SshIOException フラッシュ処理時に入出力例外が発生した場合にスローされます
97+ */
98+ public void setCharset(String charset) throws SshIOException {
99+ try {
100+ flush();
101+ this.charset = charset;
102+ } catch (IOException e) {
103+ throw new SshIOException("Failed to flush before set autoFlush", e);
104+ }
105+ }
106+
107+ /**
108+ * 自動フラッシュフラグを取得します。
109+ * @return 自動フラッシュフラグ
110+ */
111+ public boolean isAutoFlush() {
112+ return autoFlush;
113+ }
114+
115+ /**
116+ * 自動フラッシュフラグを再設定します。
117+ * バッファされているデータが存在する状態でストリームオブジェクトを変更する場合、
118+ * 既に設定されているストリームにバッファをフラッシュしてから変更されます。<br>
119+ * @param autoFlush 自動フラッシュフラグ
120+ * @throws SshIOException フラッシュ処理時に入出力例外が発生した場合にスローされます
121+ */
122+ public void setAutoFlush(boolean autoFlush) throws SshIOException {
123+ try {
124+ flush();
125+ this.autoFlush = autoFlush;
126+ } catch (IOException e) {
127+ throw new SshIOException("Failed to flush before set autoFlush", e);
128+ }
129+ }
130+
131+ /**
132+ * バイトを書き込みます。<br>
133+ * @param b バイトデータ
134+ * @see java.io.OutputStream#write(int)
135+ */
136+ @Override
137+ public void write(int b) throws IOException {
138+ if (parent == null) {
139+ return;
140+ }
141+ buffer.add((byte) b);
142+ if ((b == '\n') && autoFlush) {
143+ flush();
144+ }
145+ }
146+
147+ /**
148+ * バッファリングされたバイトデータをフラッシュします。<br>
149+ * @see java.io.OutputStream#flush()
150+ */
151+ @Override
152+ public void flush() throws IOException {
153+ if (parent == null) {
154+ return;
155+ }
156+ byte[] data = new byte[buffer.size()];
157+ for (int i = 0; i <= buffer.size() - 1; i++) {
158+ data[i] = buffer.get(i);
159+ }
160+ String render = null;
161+ if (charset == null) {
162+ render = new String(data);
163+ } else {
164+ render = new String(data, charset);
165+ }
166+ parent.write(render.getBytes());
167+ parent.flush();
168+ buffer.clear();
169+ }
170+
171+ /**
172+ * ストリームをクローズします。<br>
173+ * @see java.io.OutputStream#close()
174+ */
175+ @Override
176+ public void close() throws IOException {
177+ if (parent == null) {
178+ return;
179+ }
180+ flush();
181+ parent.close();
182+ }
183+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/wrap/jsch/JschSession.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/wrap/jsch/JschSession.java (revision 555)
@@ -0,0 +1,119 @@
1+package org.phosphoresce.lib.ssh.wrap.jsch;
2+
3+import org.phosphoresce.lib.ssh.exception.SshCommanderException;
4+import org.phosphoresce.lib.ssh.exception.SshConnectionException;
5+import org.phosphoresce.lib.ssh.exception.SshFileTransferException;
6+import org.phosphoresce.lib.ssh.exception.SshIllegalStateException;
7+import org.phosphoresce.lib.ssh.session.SshSession;
8+
9+import com.jcraft.jsch.JSch;
10+import com.jcraft.jsch.Session;
11+
12+/**
13+ * SSH制御コア部にJSchライブラリを用いるセッションインタフェースを提供します。<br>
14+ * <p>
15+ * </p>
16+ *
17+ * @author Kitagawa<br>
18+ *
19+ *<!--
20+ * 更新日 更新者 更新内容
21+ * 2015/02/26 Kitagawa 新規作成
22+ *-->
23+ */
24+public class JschSession extends SshSession<JschCommander, JschFileTransfer> {
25+
26+ /** JSchオブジェクト */
27+ private JSch jsch;
28+
29+ /** JSchセッションオブジェクト */
30+ private Session jschSession;
31+
32+ /**
33+ * コンストラクタ<br>
34+ * @param server 接続先サーバー
35+ * @param port 接続先ポート
36+ * @param user ユーザー名
37+ * @param password パスワード
38+ */
39+ public JschSession(String server, int port, String user, String password) {
40+ super(server, port, user, password);
41+ }
42+
43+ /**
44+ * JSchオブジェクトを取得します。
45+ * @return JSchオブジェクト
46+ */
47+ JSch getJsch() {
48+ return jsch;
49+ }
50+
51+ /**
52+ * JSchセッションオブジェクトを取得します。
53+ * @return JSchセッションオブジェクト
54+ */
55+ Session getJschSession() {
56+ return jschSession;
57+ }
58+
59+ /**
60+ * SSH接続をオープンします。<br>
61+ * @throws SshConnectionException 正常に接続が確立できなかった場合にスローされます
62+ * @throws SshIllegalStateException 既に接続がオープンされている場合にスローされます
63+ * @see org.phosphoresce.lib.ssh.session.SshSession#openProcess()
64+ */
65+ @Override
66+ protected void openProcess() throws SshConnectionException, SshIllegalStateException {
67+ try {
68+ // TODO 外部設定インタフェースを検討
69+ JSch.setConfig("StrictHostKeyChecking", "no");
70+ jsch = new JSch();
71+ jschSession = jsch.getSession(getUser(), getServer(), getPort());
72+ jschSession.setPassword(getPassword());
73+ jschSession.connect();
74+ } catch (Throwable e) {
75+ throw new SshConnectionException("Failed to connect SSH server", e);
76+ }
77+ }
78+
79+ /**
80+ * SSH接続をクローズします。<br>
81+ * @throws SshConnectionException 正常に接続がクローズできなかった場合にスローされます
82+ * @throws SshIllegalStateException 接続がオープンされていなかった場合にスローされます
83+ * @see org.phosphoresce.lib.ssh.session.SshSession#closeProcess()
84+ */
85+ @Override
86+ protected void closeProcess() throws SshConnectionException, SshIllegalStateException {
87+ try {
88+ jschSession.disconnect();
89+ jschSession = null;
90+ jsch = null;
91+ } catch (Throwable e) {
92+ throw new SshConnectionException("Failed to close SSH server", e);
93+ }
94+ }
95+
96+ /**
97+ * コマンド実行オブジェクトを生成します。<br>
98+ * @return コマンド実行オブジェクト
99+ * @throws SshCommanderException コマンド実行オブジェクトの生成が正しく行えなかった場合にスローされます
100+ * @see org.phosphoresce.lib.ssh.session.SshSession#createCommander()
101+ */
102+ @Override
103+ protected JschCommander createCommander() throws SshCommanderException {
104+ JschCommander commander = new JschCommander(this);
105+ return commander;
106+ }
107+
108+ /**
109+ * ファイル転送オブジェクトを生成します。<br>
110+ * @return ファイル転送オブジェクト
111+ * @throws SshFileTransferException ファイル転送オブジェクトの生成が正しく行えなかった場合にスローされます
112+ * @see org.phosphoresce.lib.ssh.session.SshSession#createFileTransfer()
113+ */
114+ @Override
115+ protected JschFileTransfer createFileTransfer() throws SshFileTransferException {
116+ JschFileTransfer fileTransfer = new JschFileTransfer(this);
117+ return fileTransfer;
118+ }
119+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/wrap/jsch/JschFileTransfer.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/wrap/jsch/JschFileTransfer.java (revision 555)
@@ -0,0 +1,239 @@
1+package org.phosphoresce.lib.ssh.wrap.jsch;
2+
3+import java.io.File;
4+import java.io.InputStream;
5+import java.io.OutputStream;
6+import java.lang.reflect.Field;
7+
8+import org.phosphoresce.lib.commons.util.ReflectionUtil;
9+import org.phosphoresce.lib.commons.util.StringUtil;
10+import org.phosphoresce.lib.ssh.enums.DirectoryMakeMode;
11+import org.phosphoresce.lib.ssh.enums.FileOverwriteMode;
12+import org.phosphoresce.lib.ssh.exception.SshConnectionException;
13+import org.phosphoresce.lib.ssh.exception.SshFileTransferException;
14+import org.phosphoresce.lib.ssh.session.SshFileTransfer;
15+
16+import com.jcraft.jsch.ChannelSftp;
17+import com.jcraft.jsch.SftpATTRS;
18+import com.jcraft.jsch.SftpException;
19+
20+/**
21+ * SSH制御コア部にJSchライブラリを用いるファイル転送インタフェースを提供します。<br>
22+ * <p>
23+ * </p>
24+ *
25+ * @author Kitagawa<br>
26+ *
27+ *<!--
28+ * 更新日 更新者 更新内容
29+ * 2015/02/26 Kitagawa 新規作成
30+ *-->
31+ */
32+public class JschFileTransfer extends SshFileTransfer<JschSession> {
33+
34+ /**
35+ * コンストラクタ<br>
36+ * @param session 接続セッションオブジェクト
37+ */
38+ JschFileTransfer(JschSession session) {
39+ super(session);
40+ }
41+
42+ /**
43+ * コマンド実行オブジェクトのクローズを行います。<br>
44+ * @throws SshConnectionException コマンド実行オブジェクトのクローズが正しく行えなかった場合にスローされます
45+ * @see org.phosphoresce.lib.ssh.session.SshFileTransfer#closeProcess()
46+ */
47+ @Override
48+ protected void closeProcess() throws SshConnectionException {
49+ }
50+
51+ /**
52+ * JSchのSFTPプロトコルチャンネルに対してキャラクタセットを設定します。<br>
53+ * RFC準拠によりSSHサーバーバージョンが3~5間でない場合にUTF-8以外を設定すると例外がスローされるが、
54+ * 用途としてUTF-8以外の文字コードを利用することもあるため、リフレクションにて強制的にフィールド値を設定します。<br>
55+ * @param channel チャンネルオブジェクト
56+ * @param charset 文字コード
57+ * @throws Throwable 何らかの理由で正常に文字コードを設定できなかった場合にスローされます
58+ */
59+ private void setCharsetToChannelSftp(ChannelSftp channel, String charset) throws Throwable {
60+ try {
61+ Field fEncoding = ReflectionUtil.getField(ChannelSftp.class, "fEncoding");
62+ fEncoding.set(channel, charset);
63+ Field fEncoding_is_utf8 = ReflectionUtil.getField(ChannelSftp.class, "fEncoding_is_utf8");
64+ fEncoding_is_utf8.set(channel, charset.equalsIgnoreCase("utf-8") || charset.equalsIgnoreCase("utf8"));
65+ } catch (Throwable e) {
66+ throw e;
67+ }
68+ }
69+
70+ /**
71+ * リモートパスが存在するか判定します。<br>
72+ * @param remote リモートパス
73+ * @return リモートパスが存在する場合にtrueを返却
74+ * @throws SshFileTransferException 正常にファイル転送プロトコルによるリソース存在チェックが行えなかった場合にスローされます
75+ * @see org.phosphoresce.lib.ssh.session.SshFileTransfer#exists(java.lang.String)
76+ */
77+ @Override
78+ public boolean exists(String remote) throws SshFileTransferException {
79+ ChannelSftp channel = null;
80+ try {
81+ channel = (ChannelSftp) getSession().getJschSession().openChannel("sftp");
82+ // JSchチャンネルに対する強制的なキャラクタセット設定
83+ setCharsetToChannelSftp(channel, getConfig().getServerCharset());
84+ channel.connect();
85+ SftpATTRS attrs = channel.stat(remote);
86+ } catch (SftpException e) {
87+ return false;
88+ } catch (Throwable e) {
89+ throw new SshFileTransferException("Failed to put file", e);
90+ } finally {
91+ if (channel != null) {
92+ channel.disconnect();
93+ }
94+ }
95+ return true;
96+ }
97+
98+ /**
99+ * 入力ストリームからリモートにファイルを配置する内部コア処理を行います。<br>
100+ * @param input 入力ストリーム
101+ * @param remote 配置先リモートパス
102+ * @param localTimestamp タイムスタンプ判定時のローカル側タイムスタンプ(直接ストリームから入力する場合は最大にしておきます)
103+ * @param localSize タイムスタンプ判定時のローカル側タイムスタンプ(直接ストリームから入力する場合は最小にしておきます)
104+ * @param overwrite ファイル上書きモード
105+ * @param mkdir ディレクトリ作成モード
106+ * @throws SshFileTransferException 正常にファイル転送が行えなかった場合にスローされます
107+ * @see org.phosphoresce.lib.ssh.session.SshFileTransfer#putProcess(java.io.InputStream, java.lang.String, long, long, org.phosphoresce.lib.ssh.enums.FileOverwriteMode, org.phosphoresce.lib.ssh.enums.DirectoryMakeMode)
108+ */
109+ @Override
110+ protected void putProcess(InputStream input, String remote, long localTimestamp, long localSize, FileOverwriteMode overwrite, DirectoryMakeMode mkdir) throws SshFileTransferException {
111+ ChannelSftp channel = null;
112+ try {
113+ /*
114+ * チャンネルオブジェクト生成
115+ */
116+ channel = (ChannelSftp) getSession().getJschSession().openChannel("sftp");
117+
118+ /*
119+ * JSchチャンネルに対する強制的なキャラクタセット設定
120+ */
121+ setCharsetToChannelSftp(channel, getConfig().getServerCharset());
122+
123+ /*
124+ * チャンネル接続
125+ */
126+ channel.connect();
127+
128+ /*
129+ * ディレクトリ生成
130+ */
131+ String dir = remote.indexOf("/") >= 0 ? remote.substring(0, remote.lastIndexOf("/")) : "";
132+ if (!StringUtil.isEmpty(dir) && mkdir == DirectoryMakeMode.MAKE_ON_NOTEXISTS && !exists(dir)) {
133+ getSession().getCommander().add("mkdir -p " + dir);
134+ }
135+
136+ /*
137+ * ファイル転送
138+ */
139+ boolean skip = false;
140+ int mode = ChannelSftp.OVERWRITE;
141+ if (overwrite == FileOverwriteMode.ALWAYS_OVERWRITE) {
142+ // ファイルが既に存在する場合でも常に上書きします
143+ mode = ChannelSftp.OVERWRITE;
144+ } else if (overwrite == FileOverwriteMode.APPEND_ON_EXISTS) {
145+ // ファイルが既に存在する場合はファイル追記を行います
146+ mode = ChannelSftp.APPEND;
147+ } else if (overwrite == FileOverwriteMode.SKIP_ON_EXISTS) {
148+ // ファイルが既に存在する場合は処理を行いません
149+ skip = exists(remote);
150+ } else if (overwrite == FileOverwriteMode.OVERWRITE_NEWER_ON_EXISTS) {
151+ // ファイルが既に存在する場合はタイムスタンプが新しい場合に上書きします
152+ skip = (exists(remote) && (localTimestamp <= channel.stat(remote).getMTime()));
153+ } else if (overwrite == FileOverwriteMode.OVERWRITE_SIZEDIFF_ON_EXISTS) {
154+ // ファイルが既に存在する場合はサイズが異なる場合に上書きします
155+ skip = (exists(remote) && (localSize == channel.stat(remote).getSize()));
156+ }
157+ if (!skip) {
158+ channel.put(input, remote, mode);
159+ }
160+ } catch (Throwable e) {
161+ throw new SshFileTransferException("Failed to put file", e);
162+ } finally {
163+ if (channel != null) {
164+ channel.disconnect();
165+ }
166+ }
167+ }
168+
169+ /**
170+ * リモートファイルを取得してストリームに出力する内部コア処理を行います。<br>
171+ * @param remote 取得元リモートパス
172+ * @param output 出力ストリーム
173+ * @param localTimestamp タイムスタンプ判定時のローカル側タイムスタンプ(直接ストリームに出力する場合は最小値にしておきます)
174+ * @param localSize タイムスタンプ判定時のローカル側タイムスタンプ(直接ストリームから入力する場合は最小にしておきます)
175+ * @param localDirectory ローカル側ファイル出力を行う際の出力先ディレクトリパス(直接ストリームに出力する場合はnullを設定しておきます)
176+ * @param overwrite ファイル上書きモード
177+ * @param mkdir ディレクトリ作成モード
178+ * @throws SshFileTransferException
179+ * @see org.phosphoresce.lib.ssh.session.SshFileTransfer#getProcess(java.lang.String, java.io.OutputStream, long, long, java.lang.String, org.phosphoresce.lib.ssh.enums.FileOverwriteMode, org.phosphoresce.lib.ssh.enums.DirectoryMakeMode)
180+ */
181+ @Override
182+ protected void getProcess(String remote, OutputStream output, long localTimestamp, long localSize, String localDirectory, FileOverwriteMode overwrite, DirectoryMakeMode mkdir) throws SshFileTransferException {
183+ ChannelSftp channel = null;
184+ try {
185+ /*
186+ * チャンネルオブジェクト生成
187+ */
188+ channel = (ChannelSftp) getSession().getJschSession().openChannel("sftp");
189+
190+ /*
191+ * JSchチャンネルに対する強制的なキャラクタセット設定
192+ */
193+ setCharsetToChannelSftp(channel, getConfig().getServerCharset());
194+
195+ /*
196+ * チャンネル接続
197+ */
198+ channel.connect();
199+
200+ /*
201+ * ディレクトリ生成
202+ */
203+ if (localDirectory != null) {
204+ new File(localDirectory).mkdirs();
205+ }
206+
207+ /*
208+ * ファイル転送
209+ */
210+ boolean skip = false;
211+ int mode = ChannelSftp.OVERWRITE;
212+ if (overwrite == FileOverwriteMode.ALWAYS_OVERWRITE) {
213+ // ファイルが既に存在する場合でも常に上書きします
214+ mode = ChannelSftp.OVERWRITE;
215+ } else if (overwrite == FileOverwriteMode.APPEND_ON_EXISTS) {
216+ // ファイルが既に存在する場合はファイル追記を行います
217+ mode = ChannelSftp.APPEND;
218+ } else if (overwrite == FileOverwriteMode.SKIP_ON_EXISTS) {
219+ // ファイルが既に存在する場合は処理を行いません
220+ skip = exists(remote);
221+ } else if (overwrite == FileOverwriteMode.OVERWRITE_NEWER_ON_EXISTS) {
222+ // ファイルが既に存在する場合はタイムスタンプが新しい場合に上書きします
223+ skip = (exists(remote) && (localTimestamp >= channel.stat(remote).getMTime()));
224+ } else if (overwrite == FileOverwriteMode.OVERWRITE_SIZEDIFF_ON_EXISTS) {
225+ // ファイルが既に存在する場合はサイズが異なる場合に上書きします
226+ skip = (exists(remote) && (localSize == channel.stat(remote).getSize()));
227+ }
228+ if (!skip) {
229+ channel.get(remote, output, null, mode, 0);
230+ }
231+ } catch (Throwable e) {
232+ throw new SshFileTransferException("Failed to get file", e);
233+ } finally {
234+ if (channel != null) {
235+ channel.disconnect();
236+ }
237+ }
238+ }
239+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
--- develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/wrap/jsch/JschCommander.java (nonexistent)
+++ develop/Javalib/Javalib6_SSH/trunk/source/org/phosphoresce/lib/ssh/wrap/jsch/JschCommander.java (revision 555)
@@ -0,0 +1,90 @@
1+package org.phosphoresce.lib.ssh.wrap.jsch;
2+
3+import java.io.InputStream;
4+import java.io.OutputStream;
5+
6+import org.phosphoresce.lib.ssh.exception.SshCommanderException;
7+import org.phosphoresce.lib.ssh.exception.SshConnectionException;
8+import org.phosphoresce.lib.ssh.session.SshCommander;
9+
10+import com.jcraft.jsch.ChannelExec;
11+
12+/**
13+ * SSH制御コア部にJSchライブラリを用いるコマンド実行インタフェースを提供します。<br>
14+ * <p>
15+ * </p>
16+ *
17+ * @author Kitagawa<br>
18+ *
19+ *<!--
20+ * 更新日 更新者 更新内容
21+ * 2015/02/26 Kitagawa 新規作成
22+ *-->
23+ */
24+public class JschCommander extends SshCommander<JschSession> {
25+
26+ /**
27+ * コンストラクタ<br>
28+ * @param session 接続セッションオブジェクト
29+ */
30+ JschCommander(JschSession session) {
31+ super(session);
32+ }
33+
34+ /**
35+ * コマンド実行オブジェクトのクローズを行います。<br>
36+ * @throws SshConnectionException コマンド実行オブジェクトのクローズが正しく行えなかった場合にスローされます
37+ * @see org.phosphoresce.lib.ssh.session.SshCommander#closeProcess()
38+ */
39+ @Override
40+ protected void closeProcess() throws SshConnectionException {
41+ }
42+
43+ /**
44+ * 指定されたコマンドを実行します。<br>
45+ * @param command コマンド文字列
46+ * @return コマンド実行返却値
47+ * @throws SshCommanderException 正常にコマンドの実行が行えなかった場合にスローされます
48+ * @see org.phosphoresce.lib.ssh.session.SshCommander#execProcess(java.lang.String)
49+ */
50+ @Override
51+ protected int execProcess(String command) throws SshCommanderException {
52+ ChannelExec channel = null;
53+ try {
54+ channel = (ChannelExec) getSession().getJschSession().openChannel("exec");
55+ channel.setOutputStream(getConfig().getSysoutStream(), true);
56+ channel.setExtOutputStream(getConfig().getSysoutStream(), true);
57+ channel.setErrStream(getConfig().getSyserrStream(), true);
58+ channel.setCommand(command.getBytes(getConfig().getServerCharset()));
59+ channel.connect();
60+
61+ int retval = 0;
62+ InputStream stream = channel.getInputStream();
63+ byte[] temp = new byte[1024];
64+ while (true) {
65+ while (stream.available() > 0) {
66+ int i = stream.read(temp, 0, 1024);
67+ if (i < 0) {
68+ break;
69+ } else {
70+ OutputStream sysoutStream = getSession().getConfig().getSysoutStream();
71+ if (sysoutStream != null) {
72+ sysoutStream.write(temp, 0, i);
73+ }
74+ }
75+ }
76+ if (channel.isClosed()) {
77+ retval = channel.getExitStatus();
78+ break;
79+ }
80+ //silentSleep(100);
81+ }
82+
83+ return retval;
84+ } catch (Throwable e) {
85+ throw new SshCommanderException("Failed to execute command (" + command + ")");
86+ } finally {
87+ channel.disconnect();
88+ }
89+ }
90+}
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Show on old repository browser