package org.postgresql.util;


import java.io.InputStream;
import java.io.IOException;
import java.util.Properties;


/**
 * Provides a location to get properties that the driver should use
 * It looks in the /org/postgresql/psqlProps.properties file first, 
 * which should be set by developers of the PostgreSQL driver. The user
 * can override defaults by having a file in the toplevel of their 
 * classpath called /psqlProps.properties.  Users should not modify the
 * defaults that come with the driver directly.
 */
public class DefaultProperties {

    private static final String ourProperties ="/org/postgresql/psqlProps.properties";
    private static final String userProperties="/psqlProps.properties";

    private Properties psqlDefaults;

    public DefaultProperties() throws IOException{
        reload();
    }

    private static DefaultProperties self;
    public static synchronized DefaultProperties getDefaultProperties()  {
        try {
            if (self==null){
                self = new DefaultProperties();
            }
        } catch (IOException e){
            e.printStackTrace();
        }
        return self;
    }

    /**
     * This can be called to reload any changes that may have taken 
     * place.
     */
    public void reload() throws IOException{
        psqlDefaults = new Properties();
        InputStream is = getClass().getResourceAsStream(ourProperties);
        if (is!=null){
            psqlDefaults.load(is);
        }
        is = getClass().getResourceAsStream(userProperties);
        if (is!=null){
            psqlDefaults.load(is);
        }
    }

    
    public String getStringProperty(String name, String defaultValue){
        String value = psqlDefaults.getProperty(name,defaultValue);
        if (value==null){
            return defaultValue;
        } else {
            return value;
        }
    }
    
    public int getIntProperty(String name, int defaultValue){
        try {
            String value = psqlDefaults.getProperty(name);
            if (value==null){
                return defaultValue;
            } else {
                return Integer.parseInt(value);
            }
        } catch (NumberFormatException e){
            e.printStackTrace();
            return defaultValue;
        }
    }

    public long getLongProperty(String name, long defaultValue){
        try {
            String value = psqlDefaults.getProperty(name);
            if (value==null){
                return defaultValue;
            } else {
                return Long.parseLong(value);
            }
        } catch (NumberFormatException e){
            e.printStackTrace();
            return defaultValue;
        }
    }

    public double getDoubleProperty(String name, double defaultValue){
        try {
            String value = psqlDefaults.getProperty(name);
            if (value==null){
                return defaultValue;
            } else {
                return Double.parseDouble(value);
            }
        } catch (NumberFormatException e){
            e.printStackTrace();
            return defaultValue;
        }
    }
    
    public boolean getBooleanProperty(String name, boolean defaultValue){
        try {
            String value = psqlDefaults.getProperty(name);
            if (value==null){
                return defaultValue;
            } else {
                return Boolean.valueOf(value).booleanValue();
            }
        } catch (NumberFormatException e){
            e.printStackTrace();
            return defaultValue;
        }
    }

    public static void main(String[]argv){
        try {
            DefaultProperties dp = DefaultProperties.getDefaultProperties();
            for (int i=0;i<argv.length;i++){
                String result = dp.getStringProperty(argv[i],"undefined");
                System.out.println("["+argv[i]+"] = " + result);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    
}
