/**
* Copyright (c) 2012 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.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Dispatch write operations to several writers
* @author JP Moresmau
*
*/
public class DispatchWriter extends Writer {
private final List<Writer> writers=Collections.synchronizedList(new ArrayList<Writer>());
private final List<Writer> fClosedOutputs = new ArrayList<>();
/**
* @return the writers
*/
public List<Writer> getWriters() {
return writers;
}
private void outputClosed(final Writer output) {
fClosedOutputs.add(output);
}
private void removeClosedOutputs() {
for (Writer output : fClosedOutputs) {
writers.remove( output );
}
fClosedOutputs.clear();
}
/* (non-Javadoc)
* @see java.io.Writer#write(char[], int, int)
*/
@Override
public void write(char[] cbuf, int off, int len) {
for (Writer w:writers){
try {
w.write(cbuf,off,len);
} catch (IOException ex) {
outputClosed(w);
}
}
removeClosedOutputs();
}
/* (non-Javadoc)
* @see java.io.Writer#flush()
*/
@Override
public void flush() {
for (Writer w:writers){
try {
w.flush();
} catch (IOException ex) {
outputClosed(w);
}
}
removeClosedOutputs();
}
/* (non-Javadoc)
* @see java.io.Writer#close()
*/
@Override
public void close() {
for (Writer w:writers){
try {
w.close();
} catch (IOException ex) {
outputClosed(w);
}
}
removeClosedOutputs();
}
}