package com.sleepycat.bind.serial;
import com.sleepycat.util.FastOutputStream;
import de.ovgu.cide.jakutil.*;
/** 
 * A base class for serial bindings creators that provides control over the
 * allocation of the output buffer.
 * <p>
 * Serial bindings append data to a {@link FastOutputStream} instance. This
 * object has a byte array buffer that is resized when it is full. The
 * reallocation of this buffer can be a performance factor for some applications
 * using large objects. To manage this issue, the {@link #setSerialBufferSize}method may be used to control the initial size of the buffer, and the{@link #getSerialOutput} method may be overridden by subclasses to take over
 * creation of the FastOutputStream object.
 * </p>
 */
public class SerialBase {
  private int outputBufferSize;
  /** 
 * Initializes the initial output buffer size to zero.
 * <p>
 * Unless {@link #setSerialBufferSize} is called, the default {@link FastOutputStream#DEFAULT_INIT_SIZE} size will be used.
 * </p>
 */
  public SerialBase(){
    outputBufferSize=0;
  }
  /** 
 * Sets the initial byte size of the output buffer that is allocated by the
 * default implementation of {@link #getSerialOutput}.
 * <p>
 * If this property is zero (the default), the default {@link FastOutputStream#DEFAULT_INIT_SIZE} size is used.
 * </p>
 * @param byteSizethe initial byte size of the output buffer, or zero to use the
 * default size.
 */
  public void setSerialBufferSize(  int byteSize){
    outputBufferSize=byteSize;
  }
  /** 
 * Returns the initial byte size of the output buffer.
 * @return the initial byte size of the output buffer.
 * @see #setSerialBufferSize
 */
  public int getSerialBufferSize(){
    return outputBufferSize;
  }
  /** 
 * Returns an empty SerialOutput instance that will be used by the serial
 * binding or key creator.
 * <p>
 * The default implementation of this method creates a new SerialOutput with
 * an initial buffer size that can be changed using the {@link #setSerialBufferSize} method.
 * </p>
 * <p>
 * This method may be overridden to return a FastOutputStream instance. For
 * example, an instance per thread could be created and returned by this
 * method. If a FastOutputStream instance is reused, be sure to call its{@link FastOutputStream#reset} method before each use.
 * </p>
 * @param objectis the object to be written to the serial output, and may be
 * used by subclasses to determine the size of the output buffer.
 * @return an empty FastOutputStream instance.
 * @see #setSerialBufferSize
 */
  protected FastOutputStream getSerialOutput(  Object object){
    int byteSize=getSerialBufferSize();
    if (byteSize != 0) {
      return new FastOutputStream(byteSize);
    }
 else {
      return new FastOutputStream();
    }
  }
}
