FileInputStreamFilter.java

/**
 * $Id: FileInputStreamFilter.java,v 1.2 2002/05/31 14:43:23 feldman Exp $
 *
 * Framework for common utilities - filtered input stream.
 * Copyright 2002 Think Tank Corporate Consulting. All Rights Reserved.
 *
 * Use is subject to license terms.
 *
 */
package org.frameworks.util;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;


/**
 * Filtered InputStream - extends InputStream by adding replace function:
 * All keys from Hashtable filter are replaced by their values.
 *
 * @author   Alexander Feldman (updated by $Author: feldman $)
 * @created  2002-05-22 Alexander Feldman
 * @version  $Revision: 1.2 $
 *
 */
public class FileInputStreamFilter extends FileInputStream
{
  /** Buff with whole file read there. */
  String buff = "";

  /** Our pointer at buff for next read operation. */
  int buffOff = 0;

  /** Length of buff. */
  int buffLen = 0;


  /**
   * Constructor for Filtering InputStreams.
   *
   * @param file - File name for open.
   * @param filter - Hashtable with old/new values required to be replaced.
   * @throws FileNotFoundException in case file cannot be loaded.
   *
   */
  public FileInputStreamFilter(String file, Hashtable filter)
    throws FileNotFoundException
  {
    super(file);
    readFile();
    doFilter(filter);
    buffLen = buff.length();
  }


  /**
   * Filtering/replacing all keys by Hashtable filter to their values.
   *
   * @param filter - Hashtable with old/new values required to be replaced.
   *
   */
  private void doFilter(Hashtable filter)
  {
    Enumeration keys = filter.keys();
    while (keys.hasMoreElements())
    {
      String key = (String) keys.nextElement();
      String val = (String) filter.get(key);
      buff = StringsUtil.replace(buff, key, val);
    }
  }


  /**
   * Reads file into our internal buff.
   * @throws FileNotFoundException in case file cannot be loaded.
   *
   */
  private void readFile() throws FileNotFoundException
  {
    try
    {
      int readed = 0;
      for (byte [] b = new byte[1000]; (readed = super.read(b)) != -1; )
      {
        buff += new String(b, 0, readed);
      }
    }
    catch (IOException e)
    {
      throw new FileNotFoundException(e.toString());
    }
  }


  /**
   * Reads one byte from input stream.
   * This transparent function actually reads from our internal buff.
   *
   * @return Next byte from input stream.
   *
   */
  public int read()
  {
    if (buffOff < buffLen)
    {
      return buff.charAt(buffOff++);
    }
    return -1;
  }


  /**
   * Reads one byte from input stream.
   * This transparent function actually reads from our internal buff.
   *
   * @param b - byte array to store read bytes to.
   * @return Number of bytes actually read from input stream.
   *
   */
  public int read(byte [] b)
  {
    return read(b, 0, b.length);
  }


  /**
   * Reads one byte from input stream.
   * This transparent function actually reads from our internal buff.
   *
   * @param b - byte array to store read bytes to.
   * @param off - starting bytes offset at 'b' to store.
   * @param len - maximum bytes to read from input stream.
   *
   * @return Number of bytes actually read from input stream.
   *
   */
  public int read(byte [] b, int off, int len)
  {
    if (buffOff < buffLen)
    {
      int size = Math.min(buffLen - buffOff, len);
      System.arraycopy(buff.substring(buffOff, buffOff + size).getBytes(),
        0, b, off, size);
      buffOff += size;
      return size;
    }
    return -1;
  }

}