/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.internal.console;
import java.util.ArrayList;
import java.util.List;
import com.subgraph.vega.api.console.ConsoleOutputEvent;
import com.subgraph.vega.api.console.IConsole;
import com.subgraph.vega.api.console.IConsoleDisplay;
import com.subgraph.vega.api.events.EventListenerManager;
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 final EventListenerManager eventManager = new EventListenerManager();
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);
}
eventManager.fireEvent(new ConsoleOutputEvent(output, false));
}
}
@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);
}
eventManager.fireEvent(new ConsoleOutputEvent(output, true));
}
}
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());
eventManager.fireEvent(new ConsoleOutputEvent(errorBuffer.toString(), true));
errorBuffer = null;
}
if(outputBuffer != null) {
display.printOutput(outputBuffer.toString());
eventManager.fireEvent(new ConsoleOutputEvent(outputBuffer.toString(), false));
outputBuffer = null;
}
}
}
@Override
public void addConsoleOutputListener(IEventHandler listener) {
eventManager.addListener(listener);
}
@Override
public void removeConsoleOutputListener(IEventHandler listener) {
eventManager.removeListener(listener);
}
}