package eu.leads.processor.utils;
import eu.leads.processor.conf.WP3Configuration;
import java.io.IOException;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* Created by vagvaz on 12/17/13.
*/
//This class is used in order to give feedback to the user
public class StdOutputWriter implements Runnable {
private static StdOutputWriter singleton;
private static ConcurrentLinkedQueue<String> queue;
private static final Object mutex = new Object();
private static Thread threadWriter;
private static boolean isRunning = false;
private StdOutputWriter() {
}
public static StdOutputWriter getInstance() {
if (singleton == null) {
synchronized (StdOutputWriter.class) {
singleton = new StdOutputWriter();
threadWriter = new Thread(singleton);
isRunning = true;
threadWriter.start();
queue = new ConcurrentLinkedQueue<String>();
}
}
return singleton;
}
@Override
public void run() {
while (isRunning) {
if (queue.isEmpty()) {
waitForInput();
}
while (!queue.isEmpty()) {
String out = queue.poll();
try {
System.out.write(out.getBytes());
out = null;
} catch (IOException e) {
e.printStackTrace();
}
System.out.flush();
}
}
}
private static void waitForInput() {
synchronized (mutex) {
try {
mutex.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void println(String out) {
if(!WP3Configuration.getBoolean("loginfo"))
return;
String newOut = out + "\n";
queue.add(newOut);
notifyForInput();
}
public void printlnAndClear(String out) {
String newOut = out + "\n";
System.out.flush();
queue.clear();
System.out.flush();
queue.add(newOut);
notifyForInput();
}
public void write(String out) {
// if(!WP3Configuration.getBoolean("loginfo"))
// return;
queue.add(out);
notifyForInput();
}
private static void notifyForInput() {
synchronized (mutex) {
mutex.notify();
}
}
public static void stop() {
notifyForInput();
isRunning = false;
}
}