ResourceBundle that gets it
 * resources from a property file.  This implies that the resources are
 * strings. For more information about resource bundles see the class
 * ResourceBundle.
 *
 * You should not use this class directly, or subclass it, but you get
 * an object of this class automatically when you call
 * ResourceBundle.getBundle() and there is a properties
 * file.
 *
 * If there is also a class for this resource and the same locale, the
 * class does win.
 *
 * The properties file should have the name of the resource bundle,
 * appended with the locale (e.g. _de.properties.  The file should have the same format
 * as for Properties.load()
 *
 * XXX- move this to properties.
 * The file should have the following
 * format: An empty line or a line starting with # is
 * ignored.  An backslash (\) at the end of the line
 * makes the line continueing on the next line.  Otherwise, each line
 * describes a key/value pair.  The chars up to the first whitespace,
 * = or : are the key.  The key is followed by one or more
 * whitespaces, = or :.  The rest of the
 * line is the resource belonging to the key.  You can give unicode
 * characters with the \\uxxxx notation, where
 * xxxx is the hex encoding of the 16 bit unicode char
 * number.
 *
 * An example of a properties file for the german language is given
 * here.  This extends the example given in ListResourceBundle.
 * Create a file MyResource_de.properties with the following contents
 * and put it in the CLASSPATH.  (The char \u00e4 is the 
 * german ä)
 * 
 * 
 * s1=3
 * s2=MeineDisk
 * s3=3. M\u00e4rz 96
 * s4=Die Diskette ''{1}'' enth\u00e4lt {0} in {2}.
 * s5=0
 * s6=keine Dateien
 * s7=1
 * s8=eine Datei
 * s9=2
 * s10={0,number} Dateien
 * s11=Die Formatierung warf eine Exception: {0}
 * s12=FEHLER
 * s13=Ergebnis
 * s14=Dialog
 * s15=Auswahlkriterium
 * s16=1,3
 * 
 *
 * @see ResourceBundle
 * @see ListResourceBundle
 * @see Properties#load()
 * @author Jochen Hoenicke */
public class PropertyResourceBundle extends ResourceBundle
{
  Properties properties;
  /**
   * Creates a new property resource bundle.
   * @param stream An input stream, where the resources are read from.
   */
  public PropertyResourceBundle(java.io.InputStream stream)
    throws java.io.IOException
  {
    properties = new Properties();
    properties.load(stream);
  }
  /**
   * Called by getObject when a resource is needed.  This
   * returns the resource given by the key.
   * @param key The key of the resource.
   * @return The resource for the key or null if it doesn't exists.
   */
  public Object handleGetObject(String key)
  {
    return properties.getProperty(key);
  }
  /**
   * This method should return all keys for which a resource exists.
   * @return An enumeration of the keys.
   */
  public Enumeration getKeys()
  {
    // We must also return the keys of our parent.
    if (parent != null)
      {
	return new DoubleEnumeration(properties.propertyNames(),
				     parent.getKeys());
      }
    return properties.propertyNames();
  }
}