Java tutorial
/** * sacmis * * An application wich let you write to the stdin of any executable file and * return the stdout on success or stderr on error. You have to specify the * executable file as first argument and optional as second argument the * expected exit value (default is 0) * * Copyright (c) 2010 Christoph Kappestein <k42b3.x@gmail.com> * * This file is part of sacmis. sacmis is free software: you can * redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation, * either version 3 of the License, or at any later version. * * sacmis is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with sacmis. If not, see <http://www.gnu.org/licenses/>. */ package com.k42b3.sacmis; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.ExecuteException; import org.apache.commons.exec.ExecuteResultHandler; import org.apache.commons.exec.ExecuteWatchdog; import org.apache.commons.exec.PumpStreamHandler; /** * sacmis * * @author Christoph Kappestein <k42b3.x@gmail.com> * @license http://www.gnu.org/licenses/gpl.html GPLv3 * @link http://code.google.com/p/delta-quadrant * @version $Revision$ */ public class Sacmis extends JFrame { public static String ver = "0.0.6 beta"; private String path; private String file = "input.cache"; private int exitCode; private boolean writerStdIn = false; private long timeout = 4000; private JTextField args; private In in; private Out out; private Toolbar toolbar; private ByteArrayOutputStream baos; private ByteArrayOutputStream baosErr; private ByteArrayInputStream bais; public Sacmis(String path, String file, int exitCode, boolean writerStdIn) throws Exception { this.path = path; this.file = file; this.exitCode = exitCode; this.writerStdIn = writerStdIn; this.setTitle("sacmis (version: " + ver + ")"); this.setLocation(100, 100); this.setSize(600, 500); this.setMinimumSize(this.getSize()); // arguments JPanel panelArgs = new JPanel(); panelArgs.setLayout(new BorderLayout()); panelArgs.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); this.args = new Args(); this.args.setText(file); panelArgs.add(this.args, BorderLayout.CENTER); this.add(panelArgs, BorderLayout.NORTH); // main panel JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT); this.in = new In(); JScrollPane scrIn = new JScrollPane(this.in); scrIn.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); scrIn.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scrIn.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); sp.add(scrIn); this.out = new Out(); JScrollPane scrOut = new JScrollPane(this.out); scrOut.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); scrOut.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scrOut.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); sp.add(scrOut); this.add(sp, BorderLayout.CENTER); // toolbar this.toolbar = new Toolbar(); this.toolbar.getRun().addActionListener(new runHandler()); this.toolbar.getReset().addActionListener(new resetHandler()); this.toolbar.getAbout().addActionListener(new aboutHandler()); this.toolbar.getExit().addActionListener(new exitHandler()); this.getContentPane().add(this.toolbar, BorderLayout.SOUTH); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.loadFile(); } private void loadFile() { File fIn = new File(file); FileInputStream fileIn; in.setText(""); out.setText(""); if (fIn.exists()) { try { fileIn = new FileInputStream(file); BufferedReader brIn = new BufferedReader(new InputStreamReader(fileIn)); String line = null; while ((line = brIn.readLine()) != null) { in.append(line + "\n"); } brIn.close(); } catch (IOException e) { out.setText(e.getMessage()); } } } private void saveFile() throws Exception { FileOutputStream fileOut; fileOut = new FileOutputStream(file); new PrintStream(fileOut).print(in.getText()); fileOut.close(); } private void executeCommand() { out.setText(""); try { // save file saveFile(); CommandLine commandLine = CommandLine.parse(this.path + " " + this.args.getText()); // set timeout ExecuteWatchdog watchdog = new ExecuteWatchdog(timeout); // create executor DefaultExecutor executor = new DefaultExecutor(); executor.setExitValue(this.exitCode); this.baos = new ByteArrayOutputStream(); this.baosErr = new ByteArrayOutputStream(); if (this.writerStdIn) { this.bais = new ByteArrayInputStream(in.getText().getBytes()); executor.setStreamHandler(new PumpStreamHandler(this.baos, this.baosErr, this.bais)); } else { executor.setStreamHandler(new PumpStreamHandler(this.baos, this.baosErr)); } executor.setWatchdog(watchdog); executor.execute(commandLine, new ExecuteResultHandler() { public void onProcessComplete(int e) { out.setText(baos.toString()); } public void onProcessFailed(ExecuteException e) { out.setText(baosErr.toString()); } }); } catch (Exception e) { out.setText(e.getMessage()); } } public class resetHandler implements ActionListener { public void actionPerformed(ActionEvent e) { args.setText(""); in.setText(""); out.setText(""); } } public class runHandler implements ActionListener { public void actionPerformed(ActionEvent args) { executeCommand(); } } public class aboutHandler implements ActionListener { public void actionPerformed(ActionEvent args) { out.setText(""); out.append("Version: sacmis " + ver + "\n"); out.append("Author: Christoph \"k42b3\" Kappestein" + "\n"); out.append("Website: http://code.google.com/p/delta-quadrant" + "\n"); out.append("License: GPLv3 <http://www.gnu.org/licenses/gpl-3.0.html>" + "\n"); out.append("\n"); out.append("An application wich let you write to the stdin of any executable file and" + "\n"); out.append("return the stdout on success or stderr on error. You have to specify the" + "\n"); out.append("executable file as first argument and optional as second argument the" + "\n"); out.append("expected exit value (default is 0)" + "\n"); } } public class exitHandler implements ActionListener { public void actionPerformed(ActionEvent args) { try { saveFile(); System.exit(0); } catch (Exception e) { out.setText(e.getMessage()); } } } }