Just deleting files, there is nothing important about this commit.
+++ /dev/null
-package de.fork.java;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.UnknownHostException;
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import org.xml.sax.SAXException;
-
-/**
- * <p>
- * With this class we can run processes using the intended daemon which is
- * waiting for TCP connections in a specified port.
- * </p>
- * <p>
- * Receiving the results in a XML format from the daemon where we can find three
- * kinds of different fields: error, out and ret. Every field is related to the
- * stderr, stdout and return code respectively. <br>
- * </p>
- * <p>
- * <pre>
- * <b>Example, stream received from daemon:</b>
- * {@code
- * <?xml version="1.0"?><salida><error><![CDATA[ls: no se puede acceder a bbb: No existe el fichero o el directorio
- * ls: no se puede acceder a aaa: No existe el fichero o el directorio
- * ls: no se puede acceder a dddd: No existe el fichero o el directorio
- * ]]></error><ret><![CDATA[2]]></ret></salida>
- * }
- * </pre>
- * </p>
- * <p>
- * This class has to process the above stream and it offers two methods wich can be used
- * to retrieve the stderr and stdout in a right way without having to know about the XML stream
- * received from the daemon. The user does not have to know about how the daemon sends the data,
- * he or she will work directly with the strings related to each stream. Those methods
- * are {@link ForkDaemon#getStdout()} and {@link ForkDaemon#getStderr()} The return code from the command
- * executed by the daemon can be retrieved as a return parameter from the method
- * {@link ForkDaemon#exec(String, String, int)}
- * </p>
- * <p>
- * Instances of this class are mutable. To use them concurrently, clients must surround each
- * method invocation (or invocation sequence) with external synchronization of the clients choosing.
- * </p>
- */
-public class ForkDaemon {
- private final ForkParser handler;
-
-
- /**
- * Simple constructor.
- * Nothing special here.
- *
- */
- public ForkDaemon () {
- handler = new ForkParser();
- }
-
-
- /**
- * This method sends commands to the daemon.
- * <br>
- * It uses a TCP connection in order to send commands to the daemon and receive
- * the results related to that command.
- * <br>
- * The mehtod retrieves the stdout, stderr and the return code of that command.
- *
- * <p> The host name can either be a machine name, such as
- * "<code>java.sun.com</code>", or a textual representation of its
- * IP address. If a literal IP address is supplied, only the
- * validity of the address format is checked.
- * </p>
- * <p> For <code>host</code> specified in literal IPv6 address,
- * either the form defined in RFC 2732 or the literal IPv6 address
- * format defined in RFC 2373 is accepted. IPv6 scoped addresses are also
- * supported. See <a href="Inet6Address.html#scoped">here</a> for a description of IPv6
- * scoped addresses.
- * </p>
- * @param command the command to be executed by the daemon.
- * @param host the specified host.
- * @param port the TCP port where the daemon accepts connections.
- *
- * @return the executed command's return code.
- *
- * @throws UnknownHostException if no IP address for the
- * <code>host</code> could be found, or if a scope_id was specified
- * @throws SecurityException if a security manager exists
- * and its checkConnect method doesn't allow the operation
- * @throws IOException if an I/O error occurs when creating the socket.
- * @throws SAXException
- * @throws FactoryConfigurationError if the implementation is not available or cannot be instantiated.
- * @throws SAXException If any SAX errors occur during processing.
- * @throws ParserConfigurationException
- */
- public int exec(final String command, String host, int port)
- throws UnknownHostException, IOException, SAXException, ParserConfigurationException {
- final SAXParserFactory spf = SAXParserFactory.newInstance();
- final SAXParser saxParser = spf.newSAXParser();
- PrintWriter out = null;
-
- final Socket socket = new Socket(InetAddress.getByName(host), port);
- try {
- out = new PrintWriter(socket.getOutputStream(), true);
- out.println(command);
- saxParser.parse(socket.getInputStream(), handler);
- }
- finally {
- if (out != null) {
- out.close();
- }
- socket.close();
- }
-
- //Just for testing the parser by using a file instead of a TCP connection.
- //InputSource input = new InputSource(new FileReader("/tmp/xmlfromdaemon.xml"));
- //saxParser.parse(input, handler);
-
- return new Integer(handler.getReturnValue()).intValue();
- }
-
-
- /**
- * Retrieve the standard output.
- *
- * @see {@link ForkDaemon#getStderr()}
- * @return stdout
- */
- public String getStdout() {
- return handler.getStdout();
- }
-
-
- /**
- * <p>
- * Retrieve the standard error.
- * </p>
- * <p>
- * <pre>
- * <b>Example, stream received from daemon:</b>
- * {@code
- * <?xml version="1.0"?><salida><error><![CDATA[ls: no se puede acceder a bbb: No existe el fichero o el directorio
- * ls: no se puede acceder a aaa: No existe el fichero o el directorio
- * ls: no se puede acceder a dddd: No existe el fichero o el directorio
- * ]]></error><ret><![CDATA[2]]></ret></salida>
- * }
- * </pre>
- * </p>
- * <p>
- * <pre>
- * <b>From that example with this method we are going to obtain this return parameter:</b>
- * {@code
- * ls: no se puede acceder a bbb: No existe el fichero o el directorio
- * ls: no se puede acceder a aaa: No existe el fichero o el directorio
- * ls: no se puede acceder a dddd: No existe el fichero o el directorio
- * }
- * </pre>
- * </p>
- * @return stderr
- */
- public String getStderr() {
- return handler.getStderr();
- }
-}
\ No newline at end of file
+++ /dev/null
-package de.fork.java;
-
-import org.apache.log4j.Logger;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.ext.DefaultHandler2;
-
-/**
- * <p>
- * Class intended to parse the XML stream received from the daemon which is
- * waiting to run commands. These commands are sent by the method
- * {@link es.dia.pos.n2a.util.os.unix.ForkDaemon#exec(String, String, int)}
- * </p>
- * <p>
- * After processing one command the daemon sends a XML stream with the stderr,
- * stdout and return status of that command. With this class we extract those values
- * and we can retrieve them using the methods {@link #getStderr() }, {@link #getStdout()}
- * and {@link #getReturnValue()}
- * </p>
- * <p>
- * <pre>
- * <b>Example, stream received from daemon:</b>
- * {@code
- * <?xml version="1.0"?><salida><error><![CDATA[ls: no se puede acceder a bbb: No existe el fichero o el directorio
- * ls: no se puede acceder a aaa: No existe el fichero o el directorio
- * ls: no se puede acceder a dddd: No existe el fichero o el directorio
- * ]]></error><ret><![CDATA[2]]></ret></salida>
- * }
- * </pre>
- * </p>
- */
-public class ForkParser extends DefaultHandler2{
- private static final Logger logger = Logger.getLogger(ForkParser.class);
- private StringBuffer accumulator = new StringBuffer();
- private String stderr = new String();
- private String stdout = new String();
- private String returnCode = new String();
-
-
- @Override
- public void endElement (String uri, String localName, String qName) {
- if (qName.equals("error")) {
- // After </error>, we've got the stderror
- stderr = stderr + accumulator.toString();
- } else if (qName.equals("out")) {
- // After </out>, we've got the stdout
- stdout = stdout + accumulator.toString();
- } else if (qName.equals("ret")) {
- returnCode = returnCode + accumulator.toString();
- }
- }
-
-
- @Override
- public void endDocument () throws SAXException
- {
- if (stderr.length() != 0) {
- String lastStderr = stderr.replaceFirst("\\\n$", "");
- stderr = lastStderr;
- }
- else {
- stderr = null;
- }
- if (stdout.length() != 0) {
- String lastStdout = stdout.replaceFirst("\\\n$", "");
- stdout = lastStdout;
- }
- else {
- stdout = null;
- }
- }
-
- /**
- * Retrieve the standard error.
- *
- * <pre>
- * <b>From the above example with this method we are going to obtain this return parameter:</b>
- * {@code
- * ls: no se puede acceder a bbb: No existe el fichero o el directorio
- * ls: no se puede acceder a aaa: No existe el fichero o el directorio
- * ls: no se puede acceder a dddd: No existe el fichero o el directorio
- * }
- * </pre>
- *
- * @return stderr
- */
- public String getStderr() {
- return stderr;
-
- }
-
-
- /**
- * Retrieve the standard output.
- *
- * @see {@link ForkParser#getStderr()}
- * @return stdout
- */
- public String getStdout() {
- return stdout;
- }
-
-
- /**
- * Retrieve the return code from the executed command.
- *
- * @return return status, usually <code>0<code> means the command went OK.
- */
- public String getReturnValue() {
- return returnCode;
- }
-
-
- @Override
- public void startElement (String uri, String localName, String qName, Attributes attributes) {
- accumulator.setLength(0);
- }
-
-
- @Override
- public void characters(char[] buffer, int start, int length) {
- accumulator.append(buffer, start, length);
- }
-
- @Override
- public void warning(SAXParseException exception) {
- logger.error("WARNING line:" + exception.getLineNumber(), exception);
- }
-
- @Override
- public void error(SAXParseException exception) {
- logger.error("ERROR line:" + exception.getLineNumber(), exception);
- }
-
- @Override
- public void fatalError(SAXParseException exception) throws SAXException {
- logger.error("FATAL ERROR line:" + exception.getLineNumber(), exception);
- throw (exception);
- }
-}
\ No newline at end of file
+++ /dev/null
-package de.fork.java;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.net.UnknownHostException;
-import javax.xml.parsers.ParserConfigurationException;
-import org.apache.log4j.Logger;
-import org.xml.sax.SAXException;
-
-
-public class LauncherProcesses {
-
- private static final Logger logger = Logger.getLogger(LauncherProcesses.class);
-
- // Exit process status
- private static final int STATUS_ERR = -1;
-
- private static final int DEFAULT_PORT = 5193;
- private static final String DEFAULT_HOST = "127.0.0.1";
-
- /**
- * Run a process.
- *
- * @param command system command to be executed.
- *
- * @return return code.
- */
- public static int exec(final String command) throws IOException, InterruptedException {
-
- return exec(command, null, null);
- }
-
- /**
- * Run a process.
- *
- * @param command system command to execute.
- * @param standarOutPut if not null, the standard output is redirected to this parameter.
- *
- * @return return code.
- */
- public static int exec(final String command, final PrintStream standarOutPut) throws IOException, InterruptedException {
-
- return exec(command, standarOutPut, null);
- }
-
-
- /**
- * Run a process.
- *
- * @param command system command to be executed.
- * @param standarOutPut if not null, the standard output is redirected to this parameter.
- * @param errorOutPut if not null, the error output is redirected to this parameter.
- *
- * @return return code from the executed system command.
- */
- public static int exec(final String command, final PrintStream standarOutPut, final PrintStream errorOutPut) throws IOException, InterruptedException {
-
- return exec(command, standarOutPut, errorOutPut, DEFAULT_HOST, DEFAULT_PORT);
- }
-
- /**
- * Run a process.
- *
- * @param command system command to be executed.
- * @param aLogger send the information to log.
- */
- public static int exec(final String command, final Logger aLogger) throws IOException, InterruptedException {
-
- //calling private method to handle logger input/ouput in a common method
- return execHandlingLogger(command, aLogger, DEFAULT_HOST, DEFAULT_PORT);
- }
-
-
- /**
- * @param commandAndArguments String array containing system command and its
- * arguments to be executed.<br>
- * <b>For example:</b>
- * <pre>
- * commandAndArguments[0]="ls";
- * commandAndArguments[1]="-lr";
- * </pre>
- * @param aLogger
- *
- * @return return code from the executed system command.
- *
- * @throws IOException
- * @throws InterruptedException
- */
- public static int exec(final String[] commandAndArguments, final Logger aLogger) throws IOException, InterruptedException {
- String wholeCommand="";
-
- for(String argument : commandAndArguments) {
- wholeCommand = wholeCommand + " " + argument;
- }
-
- //calling private method to handle logger input/ouput in a common method
- return execHandlingLogger(wholeCommand, aLogger, DEFAULT_HOST, DEFAULT_PORT);
- }
-
-
- /**
- *
- * @param command system command to be executed.
- * @param standarOutPut the stdout stream from that command as a <code>PrintStream</code>
- * @param errorOutPut the stderr stream from that command as a <code>PrintStream</code>
- * @param host the specified host.
- * @param port the TCP port where the daemon accepts connections.
- *
- * <p> The host name can either be a machine name, such as
- * "<code>java.sun.com</code>", or a textual representation of its
- * IP address. If a literal IP address is supplied, only the
- * validity of the address format is checked.
- * </p>
- * <p> For <code>host</code> specified in literal IPv6 address,
- * either the form defined in RFC 2732 or the literal IPv6 address
- * format defined in RFC 2373 is accepted. IPv6 scoped addresses are also
- * supported. See <a href="Inet6Address.html#scoped">here</a> for a description of IPv6
- * scoped addresses.
- * </p>
- *
- * @return the executed command's return code.
- *
- * @throws UnknownHostException
- * @throws IOException
- */
- public static int exec(final String command, final PrintStream standarOutPut,
- final PrintStream errorOutPut, final String host, int port) throws IOException {
- int exitStatus = LauncherProcesses.STATUS_ERR;
-
- ForkDaemon process = new ForkDaemon();
- try {
- exitStatus = process.exec(command, host, port);
- } catch (SAXException e) {
- // This is not a crazy thing, we are trying to insert this new method without
- // breaking the old methods which did not throw SAXException or ParserConfigurationException
- //[§EJ Item 61] Do not blame me.
- throw new IOException(e);
- } catch (ParserConfigurationException e) {
- // This is not a crazy thing, we are trying to insert this new method without
- // breaking the old methods which did not throw SAXException or ParserConfigurationException
- //[§EJ Item 61] Do not blame me.
- throw new IOException(e);
- }
-
- if (standarOutPut != null) {
- if (process.getStdout() != null) {
- standarOutPut.println(process.getStdout());
- }
- }
-
- if (errorOutPut != null) {
- if (process.getStderr() != null) {
- errorOutPut.println(process.getStderr());
- }
- }
-
- return exitStatus;
- }
-
-
- /**
- *
- * @param command system command to be executed.
- * @param aLogger
- * @param host the specified host.
- * @param port the TCP port where the daemon accepts connections.
- *
- * @return the executed command's return code.
- *
- * @throws IOException
- * @throws InterruptedException
- */
- private static int execHandlingLogger(final String command, final Logger aLogger,
- final String host, int port) throws IOException, InterruptedException {
- int exitStatus = LauncherProcesses.STATUS_ERR;
-
- ForkDaemon process = new ForkDaemon();
- try {
- exitStatus = process.exec(command, host, port);
- } catch (SAXException e) {
- // This is not a crazy thing, we are trying to insert this new method without
- // breaking the old methods which did not throw SAXException or ParserConfigurationException
- // Do not blame me.
- throw new IOException(e);
- } catch (ParserConfigurationException e) {
- // This is not a crazy thing, we are trying to insert this new method without
- // breaking the old methods which did not throw SAXException or ParserConfigurationException
- // Do not blame me.
- throw new IOException(e);
- }
-
- if (process.getStdout() != null) {
- aLogger.info(process.getStdout());
- }
- if (process.getStderr() != null) {
- aLogger.error(process.getStderr());
- }
-
- return exitStatus;
- }
-
-
- /**
- * @param command command and its arguments to be executed.<br>
- * <b>For example:</b>
- * <pre>
- * commandAndArguments[0]="ls";
- * commandAndArguments[1]="-lr";
- * </pre>
- * @param aLogger send information to log
- *
- * @return the executed command's return code.
- *
- * @throws IOException
- * @throws InterruptedException
- */
- public static InputStream execStream (final String [] command, final Logger aLogger)
- throws IOException, InterruptedException {
- int exitStatus = LauncherProcesses.STATUS_ERR;
-
- InputStream stdInput = null;
-
- String wholeCommand="";
- for(String argument : command) {
- wholeCommand = wholeCommand + " " + argument;
- }
-
- ForkDaemon process = new ForkDaemon();
- try {
- exitStatus = process.exec(wholeCommand, DEFAULT_HOST, DEFAULT_PORT);
- } catch (SAXException e) {
- // This is not a crazy thing, we are trying to insert this new method without
- // breaking the old methods which did not throw SAXException or ParserConfigurationException
- throw new IOException(e);
- } catch (ParserConfigurationException e) {
- // This is not a crazy thing, we are trying to insert this new method without
- // breaking the old methods which did not throw SAXException or ParserConfigurationException
- throw new IOException(e);
- }
-
- if(exitStatus == 0) {
- stdInput = new ByteArrayInputStream(process.getStdout().getBytes("UTF-8"));
- }
- else {
- aLogger.error(process.getStderr());
- }
-
-
- return stdInput;
- }
-
- /**
- * <p>The <em>command</em> is lunched from <em>location</em>
- * <li>#>cd <em>location</em></li>
- * <li>#location> <em>command</em></li></p>
- *
- * @param command the command to be executed by the daemon.
- * @param location
- *
- * @return the executed command's return code. <br>
- * Usually <code>0</code> if execution is OK, otherwise <code>!=0</code>
- *
- * @throws IOException
- * @throws InterruptedException
- */
- public static int execInLocation (final String command, final String location) throws IOException, InterruptedException {
- int exitStatus = LauncherProcesses.STATUS_ERR;
- final String wholeCommand = "cd " + location + " && " + command;
-
- exitStatus = exec(wholeCommand, null, null, DEFAULT_HOST, DEFAULT_PORT);
- return exitStatus;
- }
-}
\ No newline at end of file
+++ /dev/null
-package de.fork.java;
-
-import java.io.ByteArrayOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.PrintStream;
-import javax.xml.parsers.ParserConfigurationException;
-import org.xml.sax.SAXException;
-
-
-public class MainJavaFork {
-
- /**
- * @param args
- * @throws SAXException
- * @throws ParserConfigurationException
- * @throws FileNotFoundException
- */
- public static void main(String[] args)
- throws ParserConfigurationException, SAXException, FileNotFoundException, IOException {
-
- final ByteArrayOutputStream stdoutByteOut = new ByteArrayOutputStream();
- final PrintStream stdout = new PrintStream(stdoutByteOut);
- final String command = "/home/gustavo/github/JavaForFun/JavaFork/Daemon/script.sh";
- final ByteArrayOutputStream stderrByteOut = new ByteArrayOutputStream();
- final PrintStream stderr = new PrintStream(stderrByteOut);
- int result;
-
- result = LauncherProcesses.exec(command,stdout, stderr, "127.0.0.1", 5193);
- System.out.println(result);
- System.out.println("Stdout: " + stdoutByteOut.toString());
- System.out.println("Stderr: " + stderrByteOut.toString());
- }
-
-}
\ No newline at end of file