/**
* Copyright (c) 2013 by JP Moresmau
* This code is made available under the terms of the Eclipse Public License,
* version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html
*/
package net.sf.eclipsefp.haskell.util;
import java.io.IOException;
import java.io.Writer;
import java.util.LinkedList;
/**
* A string writer that only keeps n max characters, discarding the first received characters
* @author JP Moresmau
*
*/
public class CappedStringWriter extends Writer {
private int maxSize;
private LinkedList<String> ls=new LinkedList<>();
private int size;
public CappedStringWriter(int max){
maxSize=max;
lock=ls;
}
/* (non-Javadoc)
* @see java.io.Writer#write(char[], int, int)
*/
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
synchronized (lock) {
ls.add(new String(cbuf,off,len));
size+=len;
checkSize();
}
}
/* (non-Javadoc)
* @see java.io.Writer#write(java.lang.String)
*/
@Override
public void write(String str) throws IOException {
synchronized (lock) {
if (str!=null){
ls.add(str);
size+=str.length();
checkSize();
}
}
}
/* (non-Javadoc)
* @see java.io.Writer#write(java.lang.String, int, int)
*/
@Override
public void write(String str, int off, int len) throws IOException {
write(str.substring(off, off+len));
}
private void checkSize(){
while (size>maxSize){
String s=ls.removeFirst();
size-=s.length();
}
}
/* (non-Javadoc)
* @see java.io.Writer#flush()
*/
@Override
public void flush() throws IOException {
// noop
}
/* (non-Javadoc)
* @see java.io.Writer#close()
*/
@Override
public void close() throws IOException {
// noop
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
synchronized (lock) {
StringBuilder sb=new StringBuilder(size);
for (String s:ls){
sb.append(s);
}
return sb.toString();
}
}
public void clear(){
synchronized (lock) {
ls.clear();
size=0;
}
}
}