package org.jftclient.terminal; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.util.HashMap; import java.util.Map; import javax.annotation.PreDestroy; import org.springframework.stereotype.Component; import com.pty4j.PtyProcess; /** * @author sergei.malafeev */ @Component public class LocalTerminal { private Thread thread; private TerminalPanel localTerminalPanel; private PtyProcess pty; public void connect() throws IOException { if (localTerminalPanel == null) { throw new IllegalStateException("local terminal panel is not set"); } if (pty != null && pty.isAlive()) { return; } String[] cmd = {"/bin/bash", "-i"}; Map<String, String> envs = new HashMap<>(System.getenv()); envs.remove("TERM_PROGRAM"); // for OS X envs.put("TERM", "vt102"); pty = PtyProcess.exec(cmd, envs, System.getProperty("user.home")); OutputStream os = pty.getOutputStream(); InputStream is = pty.getInputStream(); PrintStream printStream = new PrintStream(os, true); localTerminalPanel.setPrintStream(printStream); Runnable run = new TerminalWatcher(is, localTerminalPanel.getTextArea()); thread = new Thread(run); thread.start(); } @PreDestroy public void disconnect() { if (pty != null) { pty.destroy(); } if (thread != null) { thread.interrupt(); } } public void setLocalTerminalPanel(TerminalPanel localTerminalPanel) { this.localTerminalPanel = localTerminalPanel; } }