package com.subgraph.vega.internal.console;
import java.util.ArrayList;
import java.util.List;
import com.subgraph.vega.api.console.IConsole;
import com.subgraph.vega.api.console.IConsoleDisplay;
import com.subgraph.vega.api.events.IEventHandler;
public class ConsoleService implements IConsole {
private final static int MAX_BUFFER = 8192;
private final List<IConsoleDisplay> displays = new ArrayList<IConsoleDisplay>();
private StringBuilder outputBuffer = null;
private StringBuilder errorBuffer = null;
@Override
public synchronized void write(String output) {
if(!output.endsWith("\n"))
output = output + "\n";
if(displays.size() == 0) {
bufferOutput(output);
} else {
for(IConsoleDisplay display: displays) {
display.printOutput(output);
}
}
}
@Override
public synchronized void error(String output) {
if(!output.endsWith("\n"))
output = output + "\n";
if(displays.size() == 0) {
bufferError(output);
} else {
for(IConsoleDisplay display: displays) {
display.printError(output);
}
}
}
private void bufferOutput(String output) {
if(outputBuffer == null)
outputBuffer = new StringBuilder();
appendBuffer(output, outputBuffer);
}
private void bufferError(String output) {
if(errorBuffer == null)
errorBuffer = new StringBuilder();
appendBuffer(output, errorBuffer);
}
private void appendBuffer(String output, StringBuilder buffer) {
if(output == null)
return;
if(output.length() > MAX_BUFFER)
output = output.substring(0, MAX_BUFFER);
final int totalLength = buffer.length() + output.length();
if(totalLength > MAX_BUFFER) {
int trimCount = totalLength - MAX_BUFFER;
buffer.delete(0, trimCount);
}
buffer.append(output);
}
@Override
public synchronized void registerDisplay(IConsoleDisplay display) {
displays.add(display);
if(displays.size() == 1) {
if(errorBuffer != null) {
display.printError(errorBuffer.toString());
errorBuffer = null;
}
if(outputBuffer != null) {
display.printOutput(outputBuffer.toString());
outputBuffer = null;
}
}
}
@Override
public void addConsoleOutputListener(IEventHandler listener) {
// TODO Auto-generated method stub
}
@Override
public void removeConsoleOutputListener(IEventHandler listener) {
// TODO Auto-generated method stub
}
}