/*
 * Copyright (C) 2008 Steve Ratcliffe
 * 
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 * 
 * Author: Steve Ratcliffe
 * Create date: May 17, 2008
 */
package uk.me.parabola.util;

import java.util.Enumeration;
import java.util.Properties;

/**
 * Wrapper that behaves as an enhanced properties class that has getProperty
 * calls for different data types.
 *
 * @author Steve Ratcliffe
 */
public class EnhancedProperties extends Properties {
	
	public EnhancedProperties() {
	}

	public EnhancedProperties(Properties defaults) {
		// We copy values, rather than making them default values so that
		// we can enumerate all the options.
		Enumeration<?> en = defaults.propertyNames();
		while (en.hasMoreElements()) {
			String key = (String) en.nextElement();
			setProperty(key, defaults.getProperty(key));
		}
	}

	/**
	 * Get a property as an integer value.  If the property does not exist
	 * or the value is not a valid integer, then the default value is returned
	 * instead.
	 * @param key The property name to retrieve.
	 * @param def The Default value to use if the property does not exist or
	 * if the value is not a valid integer.
	 * @return The value of the property as an integer, or the default value.
	 */
	public int getProperty(String key, int def) {
		try {
			String s = getProperty(key);
			return s == null ? def : Integer.parseInt(s);
		} catch (NumberFormatException e) {
			return def;
		}
	}

	/**
	 * Get a property as a boolean value.  If the value of the property
	 * begins with a '1', a 'y' or a 't' (for 1, yes, true) then true is
	 * returned.  If the property does not exist then the given default
	 * value is returned.
	 *
	 * @param key The property name to get.
	 * @param def The default value that is returned if property does not
	 * exist.
	 * @return The value of the property as a boolean.  If the property does
	 * not exist then the value of 'def'.
	 */
	public boolean getProperty(String key, boolean def) {
		String s = getProperty(key);
		if (s != null) {
			if (s.isEmpty())
				return true;
			char c = s.toLowerCase().charAt(0);
			return  (c == '1' || c == 'y' || c == 't');
		}
		return def;
	}

	/**
	 * Return a property as a double value.  If the property does not
	 * exist or is not a valid double, then the given default value
	 * is returned instead.
	 * @param key The property name.
	 * @param def The default value to return if no valid value.
	 * @return The value of the property as a double.
	 */
	public double getProperty(String key, double def) {
		try {
			String s = getProperty(key);
			return s == null ? def : Double.parseDouble(s);
		} catch (NumberFormatException e) {
			return def;
		}
	}
}
