/*
* Copyright (c) 2002-2009 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.kernel.impl.transaction.xaframework;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
class DirectLogBuffer implements LogBuffer
{
private final FileChannel fileChannel;
private final ByteBuffer buffer;
DirectLogBuffer( FileChannel fileChannel, ByteBuffer buffer )
{
if ( fileChannel == null || buffer == null )
{
throw new IllegalArgumentException( "Null argument" );
}
if ( buffer.capacity() < 8 )
{
throw new IllegalArgumentException( "Capacity less then 8" );
}
this.fileChannel = fileChannel;
this.buffer = buffer;
}
public LogBuffer put( byte b ) throws IOException
{
buffer.clear();
buffer.put( b );
buffer.flip();
fileChannel.write( buffer );
return this;
}
public LogBuffer putInt( int i ) throws IOException
{
buffer.clear();
buffer.putInt( i );
buffer.flip();
fileChannel.write( buffer );
return this;
}
public LogBuffer putLong( long l ) throws IOException
{
buffer.clear();
buffer.putLong( l );
buffer.flip();
fileChannel.write( buffer );
return this;
}
public LogBuffer put( byte[] bytes ) throws IOException
{
fileChannel.write( ByteBuffer.wrap( bytes ) );
return this;
}
public LogBuffer put( char[] chars ) throws IOException
{
int position = 0;
do
{
buffer.clear();
int leftToWrite = chars.length - position;
if ( leftToWrite * 2 < buffer.capacity() )
{
buffer.asCharBuffer().put( chars, position, leftToWrite );
buffer.limit( leftToWrite * 2);
fileChannel.write( buffer );
position += leftToWrite;
}
else
{
int length = buffer.capacity() / 2;
buffer.asCharBuffer().put( chars, position, length );
buffer.limit( length * 2 );
fileChannel.write( buffer );
position += length;
}
} while ( position < chars.length );
return this;
}
public void force() throws IOException
{
fileChannel.force( false );
}
public long getFileChannelPosition() throws IOException
{
return fileChannel.position();
}
public FileChannel getFileChannel()
{
return fileChannel;
}
}