/**
*
* Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
**/
package lucee.commons.io.retirement;
import java.io.IOException;
import java.io.OutputStream;
import lucee.commons.io.res.Resource;
public class RetireOutputStream extends OutputStream {
private Resource res;
private boolean append;
private OutputStream os;
private long lastAccess=0;
private long retireRange;
private RetireListener listener;
/**
*
* @param res
* @param append
* @param retireRange retire the stream after given time in minutes
*/
public RetireOutputStream(Resource res, boolean append, int retireRangeInSeconds, RetireListener listener){
this.res=res;
this.append=append;
retireRange = retireRangeInSeconds>0?retireRangeInSeconds*1000:0;
//print.e("range:"+retireRange);
this.listener=listener;
}
private OutputStream getOutputStream() throws IOException {
if(os==null) {
//print.e("start "+res);
os=res.getOutputStream(append);
if(os==null)throw new IOException("could not open a connection to ["+res+"]");
RetireOutputStreamFactory.list.add(this);
RetireOutputStreamFactory.startThread(retireRange);
}
lastAccess=System.currentTimeMillis();
return os;
}
public synchronized boolean retire() throws IOException{
if(os==null || (lastAccess+retireRange)>System.currentTimeMillis()) {
//print.e("not retire "+res);
return false;
}
//print.e("retire "+res);
append=true;
close();
return true;
}
public synchronized boolean retireNow() throws IOException{
if(os==null)return false;
append=true;
close();
return true;
}
@Override
public synchronized void close() throws IOException {
if(os!=null){
if(listener!=null) listener.retire(this);
try{
os.close();
}
finally{
RetireOutputStreamFactory.list.remove(this);
os=null;
}
}
}
@Override
public synchronized void flush() throws IOException {
if(os!=null){
getOutputStream().flush();
if(retireRange==0) retireNow();
}
}
@Override
public synchronized void write(int b) throws IOException {
//print.e("write:"+((char)b));
getOutputStream().write(b);
if(retireRange==0) retireNow();
}
@Override
public synchronized void write(byte[] b) throws IOException {
//print.e("write.barr:"+b.length);
getOutputStream().write(b);
if(retireRange==0) retireNow();
}
@Override
public synchronized void write(byte[] b, int off, int len) throws IOException {
//print.e("write.barr:"+b.length+":"+off+":"+len);
getOutputStream().write(b, off, len);
if(retireRange==0) retireNow();
}
}