/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  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.jena.tdb.base.recordbuffer;

import org.apache.jena.tdb.base.block.Block ;
import org.apache.jena.tdb.base.page.Page ;
import org.apache.jena.tdb.base.record.RecordFactory ;
import org.apache.jena.tdb.sys.SystemTDB ;

/**
 * B+Tree records nodes and hash buckets.
 * Add link field to a RecordBufferPageBase
 */

public final class RecordBufferPage extends RecordBufferPageBase
{
    // Why not straight to BPlusTreeRecords?
    // 1 - this may be useful in its own right as a seqeunce of records on-disk.
    // 2 - BPlusTreeRecords inherits from BPlusTreePage
    //
    // Could combine with HashBuck and just have an unused link area in a HashBucket
    
    
    // To Constants
    // Offsets
//    final public static int COUNT      = 0 ;
    final public static int LINK            = 4 ;
    final private static int FIELD_LENGTH   = SystemTDB.SizeOfInt ; // Length of the space needed here (not count)

    private int link = Page.NO_ID ;
    
    public final int getLink() { return link ; }
    
    public void setLink(int link)
    { 
        this.link = link ;
        getBackingBlock().getByteBuffer().putInt(LINK, link) ;
    }
    
    @Override
    protected void _reset(Block block)
    { 
        super.reset(block, this.getCount()) ;
        this.link = block.getByteBuffer().getInt(LINK) ;
    }

    public static int calcRecordSize(RecordFactory factory, int blkSize)
    { return RecordBufferPageBase.calcRecordSize(factory, blkSize, FIELD_LENGTH) ; }
    
    public static int calcBlockSize(RecordFactory factory, int maxRec)
    { return RecordBufferPageBase.calcBlockSize(factory, maxRec, FIELD_LENGTH) ; }
    
    /** The construction methods */
    public static RecordBufferPage createBlank(Block block,RecordFactory factory)
    {
        int count = 0 ;
        int linkId = NO_ID ;
        return new RecordBufferPage(block, factory, count, linkId) ;
    }

    public static RecordBufferPage format(Block block, RecordFactory factory)
    {
        int count = block.getByteBuffer().getInt(COUNT) ;
        int linkId = block.getByteBuffer().getInt(LINK) ;
        return new RecordBufferPage(block, factory, count, linkId) ;
    } 
        
    
    private RecordBufferPage(Block block, RecordFactory factory, int count, int linkId)  
    {
        super(block, FIELD_LENGTH, factory, count) ;
        this.link = linkId ;
    }
    
    @Override
    public String toString()
    { return String.format("RecordBufferPage[id=%d,link=%d]: %s", getBackingBlock().getId(), getLink(), recBuff) ; }

}
