//===---------------------- BuildTimeConfig.java --------------------------===//
//
//                            The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

package org.j3.mmtk;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import org.j3.runtime.VM;
import org.j3.config.Selected;

/**
 * Read build-time configuration information for MMTk from a Java properties
 * file.  Properties read through this mechanism should be read at build time
 * and saved in static final fields.
 *
 * This is a wrapper for a java.util.Properties object.
 */
public final class BuildTimeConfig extends org.mmtk.vm.BuildTimeConfig {

  /**
   * The underlying properties object
   */
  private Properties props;

  public BuildTimeConfig(String property_file_property, String default_property_file) {
    props = getProperties(property_file_property,default_property_file);
  }

  public BuildTimeConfig(String property_file_property) {
    props = getProperties(property_file_property,null);
  }

  /**
   * @param property_file_property The name of the property that sets
   * the location of the properties file
   * @param default_property_file The default properties file.
   *
   */
  private Properties getProperties(String property_file_property, String default_property_file) {
    Properties props = new Properties();
    String propFileName;
    if (default_property_file == null) {
      propFileName = System.getProperty(property_file_property);
      if (propFileName == null) {
        //System.err.println(property_file_property+" must specify a properties file");
        VM.sysExit(1);
      }   
    } else {
      propFileName = System.getProperty(property_file_property, default_property_file);
    }   
    File propFile = new File(propFileName);

    try {
      BufferedInputStream propFileStream = new BufferedInputStream(new FileInputStream(propFile));
      props.load(propFileStream);
      propFileStream.close();
    } catch (FileNotFoundException e) {
      if (!propFileName.equals(default_property_file)) {
        //System.err.println(propFileName+" not found.");
        VM.sysExit(1);
      }   
    } catch (IOException e) {
      e.printStackTrace();
      VM.sysExit(1);
    }   
    return props;
  }

  @Override
  public String getPlanName() {
    return Selected.name;
  }

  @Override
  public boolean getBooleanProperty(String name, boolean dflt) {
    String value = props.getProperty(name,Boolean.toString(dflt));
    return Boolean.valueOf(value);
  }

  @Override
  public boolean getBooleanProperty(String name) {
    String value = props.getProperty(name);
    if (value == null)
      throw new RuntimeException("Undefined property "+name);
    return Boolean.valueOf(value);
  }

  @Override
  public int getIntProperty(String name, int dflt) {
    String value = props.getProperty(name,Integer.toString(dflt));
    return Integer.valueOf(value);
  }

  @Override
  public int getIntProperty(String name) {
    String value = props.getProperty(name);
    if (value == null)
      throw new RuntimeException("Undefined property "+name);
    return Integer.valueOf(value);
  }

  @Override
  public String getStringProperty(String name, String dflt) {
    return props.getProperty(name,dflt);
  }

  @Override
  public String getStringProperty(String name) {
    String value = props.getProperty(name);
    if (value == null)
      throw new RuntimeException("Undefined property "+name);
    return value;
  }


}
