blob: 4a0e8dd0598c2c014e3360dc7ff0d9dbea63449b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.core.fs.vfs;
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.vfs.RandomAccessContent;
import org.apache.jackrabbit.core.fs.RandomAccessOutputStream;
/**
* Wrapper of VFS output stream on a random access file.
*
* @author <a href="mailto:edgarpoce@gmail.com">Edgar Poce </a>
*/
class VFSRAFOutputStream extends RandomAccessOutputStream
{
private Log log = LogFactory.getLog(VFSRAFOutputStream.class);
/**
* The default size of the write buffer in bytes.
*/
static final int DEFAULT_BUFFER_SIZE = 1024;
/**
* The write buffer.
*/
private final byte[] buffer;
/**
* The underlying <code>RandomAccessContent</code>.
*/
protected RandomAccessContent rac;
/**
* The starting position of the buffer in the code.
*/
private long bufferStart;
/**
* The end of valid data in the buffer.
*/
private int bufferEnd;
/**
* Dummy buffer for {@link #write(int)}.
*/
private byte[] one = new byte[1];
/**
* Constructor
*/
public VFSRAFOutputStream(RandomAccessContent rac, int size)
{
super();
this.rac = rac;
this.buffer = new byte[size];
try
{
bufferStart = rac.getFilePointer();
} catch (IOException e)
{
log.error("Unable to get file pointer");
}
}
/**
* Constructor
*/
public VFSRAFOutputStream(RandomAccessContent rac)
{
this(rac, DEFAULT_BUFFER_SIZE);
}
/*
* (non-Javadoc)
*
* @see org.apache.jackrabbit.core.fs.RandomAccessOutputStream#seek(long)
*/
public void seek(long position) throws IOException
{
flush();
rac.seek(position);
bufferStart = position;
}
/*
* (non-Javadoc)
*
* @see java.io.OutputStream#write(int)
*/
public void write(int b) throws IOException
{
one[0] = (byte) b;
write(one, 0, 1);
}
public void close() throws IOException
{
flush();
rac.close();
rac = null;
}
public void flush() throws IOException
{
rac.write(buffer, 0, bufferEnd);
bufferEnd = 0;
bufferStart = rac.getFilePointer();
}
public void write(byte b[], int off, int len) throws IOException
{
if (len > buffer.length - bufferEnd)
{
flush();
rac.write(b, off, len);
} else
{
System.arraycopy(b, off, buffer, bufferEnd, len);
bufferEnd += len;
}
}
public void write(byte[] b) throws IOException
{
write(b, 0, b.length);
}
}