blob: 2566bdf6fe3086f414f2b7535ce99825a8801faa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2010 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.core.ui.internal.console;
/**
* Simple circular buffer that stores a fix number of lines.
*/
// TODO consider use standard ConsoleDocument
public class ConsoleDocument {
public static final int COMMAND = 0; // command text
public static final int MESSAGE = 1; // message received
public static final int ERROR = 2; // error received
public static final int STATUS = 3; // status text
public static final int DELIMITER = 4; // delimiter text between runs
private int[] lineTypes;
private String[] lines;
private int writeIndex = 0;
private int readIndex = 0;
private static final int BUFFER_SIZE = 200;
protected static class ConsoleLine {
public String line;
public int type;
ConsoleLine(String line, int type) {
this.line = line;
this.type = type;
}
}
/**
* Creates an empty console document.
*/
public ConsoleDocument() {
}
/**
* Clears the console document.
*/
public void clear() {
lineTypes = null;
lines = null;
writeIndex = 0;
readIndex = 0;
}
/**
* Appends a line of the specified type to the end of the console.
*/
public void appendConsoleLine(int type, String line) {
if(lines == null) {
lines = new String[BUFFER_SIZE];
lineTypes = new int[BUFFER_SIZE];
}
lines[writeIndex] = line;
lineTypes[writeIndex] = type;
if(++writeIndex >= BUFFER_SIZE) {
writeIndex = 0;
}
if(writeIndex == readIndex) {
if(++readIndex >= BUFFER_SIZE) {
readIndex = 0;
}
}
}
public ConsoleLine[] getLines() {
if(isEmpty())
return new ConsoleLine[0];
ConsoleLine[] docLines = new ConsoleLine[readIndex > writeIndex ? BUFFER_SIZE : writeIndex];
int index = readIndex;
for(int i = 0; i < docLines.length; i++ ) {
docLines[i] = new ConsoleLine(lines[index], lineTypes[index]);
if(++index >= BUFFER_SIZE) {
index = 0;
}
}
return docLines;
}
public boolean isEmpty() {
return writeIndex == readIndex;
}
}