/**
 * 
 */
package at.gv.egiz.pdfas.io;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import at.gv.egiz.pdfas.api.io.DataSource;
import at.gv.egiz.pdfas.api.io.FileBased;
import at.gv.egiz.pdfas.impl.input.helper.DataSourceHelper;

/**
 * A FileBased DataSource implementation.
 * 
 * @author wprinz
 */
public class FileBasedDataSource implements DataSource, FileBased
{
  protected File file = null;

  protected String mimeType = null;

  protected String characterEncoding = null;

  protected byte[] cache = null;

  /**
   * @param file
   * @param mimeType
   * @throws IOException
   */
  public FileBasedDataSource(File file, String mimeType) throws IOException
  {
    this(file, mimeType, null);
  }

  /**
   * @param file
   * @param mimeType
   * @param characterEncoding
   * @throws IOException
   */
  public FileBasedDataSource(File file, String mimeType, String characterEncoding) throws IOException
  {
    if (file == null)
    {
      throw new IllegalArgumentException("The file must not be null.");
    }
    if (mimeType == null)
    {
      throw new IllegalArgumentException("The mimeType must not be null.");
    }
    if (!file.exists())
    {
      throw new FileNotFoundException("The file '" + file + "' does not exist.");
    }
    if (!file.canRead())
    {
      throw new IOException("The file '" + file + "' cannot be read.");
    }

    this.file = file;
    this.mimeType = mimeType;
    this.characterEncoding = characterEncoding;
    this.cache = DataSourceHelper.convertInputStreamToByteArrayIOEx(new FileInputStream(this.file));
  }

  /**
   * @see at.gv.egiz.pdfas.api.io.DataSource#createInputStream()
   */
  public InputStream createInputStream()
  {
    return new ByteArrayInputStream(this.cache);
  }

  /**
   * @see at.gv.egiz.pdfas.api.io.DataSource#getAsByteArray()
   */
  public byte[] getAsByteArray()
  {
    return this.cache;
  }

  /**
   * @see at.gv.egiz.pdfas.api.io.DataSource#getLength()
   */
  public int getLength()
  {
    return this.cache.length;
  }

  /**
   * @see at.gv.egiz.pdfas.api.io.DataSource#getMimeType()
   */
  public String getMimeType()
  {
    return this.mimeType;
  }

  /**
   * @see at.gv.egiz.pdfas.api.io.DataSource#getCharacterEncoding()
   */
  public String getCharacterEncoding()
  {
    return this.characterEncoding;
  }

  /**
   * @see at.gv.egiz.pdfas.api.io.FileBased#getFile()
   */
  public File getFile()
  {
    return this.file;
  }

}