99 lines
2.2 KiB
Java
99 lines
2.2 KiB
Java
package com.flaremicro.crossjeeves.net;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.InputStreamReader;
|
|
|
|
import com.flaremicro.crossjeeves.net.packet.Packet7LogEntry;
|
|
import com.flaremicro.util.Util;
|
|
|
|
/* TODO
|
|
* Forward output from entire process, rather than just from started processes?
|
|
*/
|
|
public class StreamForwarder {
|
|
private InnerThread innerThread;
|
|
|
|
public StreamForwarder(NetworkHandler handler, InputStream processInput, byte stdType) {
|
|
innerThread = new InnerThread(handler, processInput, stdType);
|
|
}
|
|
|
|
public void startAsync() {
|
|
innerThread.start();
|
|
}
|
|
|
|
public void end() {
|
|
innerThread.stop();
|
|
}
|
|
|
|
private class InnerThread implements Runnable {
|
|
private Thread parent = null;
|
|
private final NetworkHandler handler;
|
|
private final InputStream processInput;
|
|
private final byte stdType;
|
|
private boolean isRunning = false;
|
|
|
|
public InnerThread(NetworkHandler handler, InputStream processInput, byte stdType) {
|
|
this.handler = handler;
|
|
this.processInput = processInput;
|
|
this.stdType = stdType;
|
|
}
|
|
|
|
public void stop() {
|
|
isRunning = false;
|
|
}
|
|
|
|
public void start() {
|
|
if (!isRunning && parent != null)
|
|
{
|
|
isRunning = true;
|
|
parent = new Thread(this);
|
|
parent.start();
|
|
}
|
|
}
|
|
|
|
public void print(String s)
|
|
{
|
|
if(stdType == Packet7LogEntry.STD_ERR)
|
|
System.err.println(s);
|
|
else
|
|
System.out.println(s);
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
BufferedReader reader = null;
|
|
try
|
|
{
|
|
reader = new BufferedReader(new InputStreamReader(processInput));
|
|
String line;
|
|
while (isRunning && (line = reader.readLine()) != null)
|
|
{
|
|
handler.enqueue(new Packet7LogEntry(stdType, line));
|
|
print(line);
|
|
}
|
|
if (processInput.available() > 0)
|
|
{
|
|
byte[] remaining = new byte[processInput.available()];
|
|
processInput.read(remaining);
|
|
line = new String(remaining);
|
|
print(line);
|
|
handler.enqueue(new Packet7LogEntry(stdType, line));
|
|
}
|
|
parent = null;
|
|
}
|
|
catch (IOException ex)
|
|
{
|
|
ex.printStackTrace();
|
|
handler.enqueue(new Packet7LogEntry(stdType, "Error occured:" + ex.toString() + ", logging ended."));
|
|
print("Error occured, logging ended.");
|
|
}
|
|
finally
|
|
{
|
|
Util.cleanClose(reader);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|