package info.istlab.IoTP;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
/**
* スクリプトファイルの実行
*/
public class ScriptRunner implements Runnable {
String scriptfile;
String scriptfile_base;
String srcfile;
Thread thread;
Process process;
// JButton runB;
String originalButtonLabel;
public ScriptRunner(String shfile, String targetfile) {
scriptfile_base = shfile;
scriptfile = (App.isWindows) ? scriptfile_base + ".bat" : scriptfile_base + ".sh";
srcfile = targetfile;
prepareComList();
}
public void startstop() {
if (thread == null) {
thread = new Thread(this);
thread.start();
// originalButtonLabel = runB.getText();
// runB.setText("Stop");
} else {
process.destroyForcibly();
thread = null;
// runB.setText(originalButtonLabel);
}
}
ArrayList<String> comlist;
public void prepareComList() {
comlist = new ArrayList<String>();
if (App.isWindows) {
SerialWindow.check(false);
comlist.add("cmd");
comlist.add("/c");
comlist.add("start");
comlist.add(scriptfile);
if (srcfile != null && srcfile.length() > 0)
comlist.add(srcfile);
if (App.serialName != null)
comlist.add(App.serialName);
} else { //MacOS, Linux
comlist.add("bash");
// comlist.add("-l");
comlist.add(scriptfile);
if (srcfile != null && srcfile.length() > 0)
comlist.add(srcfile);
if (App.serialName != null)
comlist.add(App.serialName);
}
// 現在選択しているシリアルコンソールを閉じる
for (String key : SerialWindow.hash.keySet()) {
if (!key.equals(App.serialName))
continue; // 選択していないものだったら閉じない。
SerialWindow swin = SerialWindow.hash.get(key);
if (swin != null) {
swin.closeSerialPort(null);
}
}
// 既存のコンパイルコンソールをすべて閉じる
while (!JTAConsole.winStack.isEmpty()) {
JTAConsole jcon = JTAConsole.winStack.pop();
jcon.closeWin();
}
}
@Override
public void run() {
ProcessBuilder processBuilder = new ProcessBuilder(comlist);
// ProcessBuilder processBuilder = new ProcessBuilder("pwd");
processBuilder.directory(new File(App.workingDir));
// System.out.println(App.workingDir);
// processBuilder.inheritIO();
JTAConsole con = new JTAConsole("(Exec) " + scriptfile + " " + srcfile);
// con.setMainSrcByFileName(scriptfile);
con.Systemoutprintln("=== 実行開始 ===");
if (App.isWindows) {
con.Systemoutprintln("=== バッチファイルを実行します ===");
con.Systemoutprintln(String.join(" ", comlist.toArray(new String[] {})));
}
// con.Systemoutprintln(CommandRunner.prompt+"cd ~" + App.nwpsrc+" (注:~ はチルダ記号〜
// で,ホームディレクトリを表します)");
// for (String s : comlist) {
// con.Systemoutprintln(s);
// }
// Map<String, String> envs = processBuilder.environment();
// System.out.println(envs.get("Path"));
// envs.put("Path", "C:\\Users\\istlab\\bin");
// processBuilder.redirectErrorStream();
try {
process = processBuilder.start();
con.startBR(process);
// BufferedReader reader = new BufferedReader(new
// InputStreamReader(process.getInputStream()));
// String line;
// while ((line = reader.readLine()) != null) {
// jta.append(line);
// }
process.waitFor();
} catch (IOException | InterruptedException e1) {
e1.printStackTrace();
}
con.Systemoutprintln("=== 終了 === (ALT+Wで閉じる)");
thread = null;
// runB.setText("Run");
if (scriptfile_base.startsWith("Upload")) {
SerialWindow.disposeByName(App.serialName);
SerialWindow.invoke(false); // no serial connectionsのとき、メッセージ表示しない
}
if (App.isWindows) {
con.windowClosing(null);
con.frame.dispose();
}
}
}