/*\
* Copyright 2006 Klaus Rogall, Hamburg, Germany (klaus.rogall@web.de). All rights reserved.
* _____________________________________________________________________________________________________________________
*
* This class is "Open Source" as defined by the Open Source Initiative (OSI). You can redistribute it and/or modify it
* under the terms of the BSD License. The license text is appended to the end of this file.
\*/
package de.klaro.base.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Locale;
import java.util.Properties;
/**
* Properties, die aus einer auf verschiedene Arten spezifizierbare Ressource geladen werden.
*
* Die Property-Schlssel knnen wahlweise lokalisiert werden, indem dem jeweiligen Schlssel die entsprechende Locale
* angehngt wird, z.B. "key[DE_de]=value". Damit ist es mglich, Lokalisierungen innerhalb einer einzigen
* Properties-Datei vorzunehmen, anstatt fr jede Locale eine separate Properties-Datei anzulegen. Diese Option ist
* standardmig deaktiviert und muss explizit aktiviert werden (Methode setKeyLocalization), wenn eine Methode ohne
* Locale-Parameter aufgerufen wird.
*
* Sofern eine Property nicht existiert, kann zustzlich zum Standardverhalten von Properties (Lieferung von 'null')
* bestimmt werden, dass eine Exception vom Typ MissingPropertyException erzeugt wird. Diese Option ist
* standardmig ausgeschlatet und muss explizit aktiviert werden (Methode setFailOnMissingProperty).
*
* @see Resources
*/
public class ResourceProperties extends Properties implements Serializable,Iterable<String>
{
/* ______________________________________________________________________________________________________________ *\
\* Konstanten */
/* ______________________________________________________________________________________________________________ *\
\* Klassenvariablen */
/* ______________________________________________________________________________________________________________ *\
\* Instanzvariablen */
private boolean keyLocalization$;
private boolean failOnMissingProperty$;
/* ______________________________________________________________________________________________________________ *\
\* Konstruktoren */
/**
* Erzeugt leere Properties.
*/
public ResourceProperties()
{
super();
keyLocalization$ = false;
failOnMissingProperty$ = false;
}
/**
* Erzeugt leere Properties mit Default-Properties.
*
* @param defaults Die Default-Properties
*/
public ResourceProperties(Properties defaults)
{
super(defaults);
keyLocalization$ = false;
failOnMissingProperty$ = false;
}
/**
* Erzeugt Properties, die aus der angegebenen Datei geladen werden.
*
* @param file Die Datei
* @throws FileNotFoundException Die Datei existiert nicht
* @throws IOException Die Datei konnte nicht gelesen werden
*/
public ResourceProperties(File file) throws FileNotFoundException, IOException
{
this(new FileInputStream(file));
}
/**
* Erzeugt Properties, die aus dem angegebenen Stream geladen werden.
*
* @param stream Der Stream
* @throws IOException Ser Stream konnte nicht gelesen werden
*/
public ResourceProperties(InputStream stream) throws IOException
{
super();
keyLocalization$ = false;
failOnMissingProperty$ = false;
load(stream);
}
/**
* Erzeugt Properties, die aus der angegebenen Ressource geladen werden.
*
* Die Daten werden aus einem vom Class-Loader gelieferten Input-Stream gelesen.
*
* Es kann sein, dass in aufeinander folgenden Aufrufen fr dieselbe Ressource dieselben Daten unverndert geliefert
* werden, auch wenn sich der Inhalt der Ressource gendert hat. On das Verhalten so ist oder nicht, hngt vom
* im jeweiligen Kontext laufenden Class-Loader ab.
*
* @param resource Der Name der Ressource
* @throws IOException Die Ressource konnte nicht geladen bzw. gelesen werden
*/
public ResourceProperties(String resource) throws IOException
{
this(resource,false);
}
/**
* Erzeugt Properties, die aus der angegebenen Ressource geladen werden.
*
* Wahlweise kann bestimmt werden, ob die Ressource als ein vom Class-Loader gelieferter Input-Stream verarbeitet
* wird, oder ob eine Datei benutzt wird. Im ersten Fall kann es mglich sein, dass der Class-Loader die Daten der
* Ressource zwischenspeichert, so dass in aufeinander folgenden Aufrufen fr dieselbe Ressource dieselben Daten
* geliefert werden, auch wenn sich der Inhalt der Ressource zwischenzeitlich gendert hat. Werden die Daten explizit
* ber eine Datei geladen, ist gesichert, dass immer die aktuellen Daten gelesen werden. Allerdings funktioniert das
* nur dann, wenn die Ressource tatschlich als Datei gelesen werden kann (vom Class-Loader also beispielsweise nicht
* ber das Netzwerk geladen wird). Sollte die Ressource nicht als Datei vorliegen, wird mit einer I/O-Exception
* reagiert.
*
* @param resource Der Name der Ressource
* @param forceFile Die Ressource wird aus einer Datei geladen
* @throws IOException Die Ressource konnte nicht geladen bzw. gelesen werden
*/
public ResourceProperties(String resource,boolean forceFile) throws IOException
{
this((forceFile)? new FileInputStream(Resources.getResourceAsFile(resource)):Resources.getResourceAsStream(resource));
}
/**
* Erzeugt Properties, die aus den Class-Properties der angegebenen Klasse geladen werden.
*
* @param clazz Die Klasse
* @throws IOException Die Class-Properties konnten nicht geladen bzw. gelesen werden
* @see Resources#getResourceStream(Class)
*/
public ResourceProperties(Class<?> clazz) throws IOException
{
this(Resources.getResourceStream(clazz));
}
/**
* Erzeugt Properties, die aus den Class-Properties der angegebenen Klasse geladen werden, wobei die
* Properties jedoch in einem anderen Package gesucht werden.
*
* @param packageName Der Package-Name, in der gesucht werden soll
* @param clazz Die Klasse
* @throws IOException Die Class-Properties konnten nicht geladen bzw. gelesen werden
* @see Resources#getResourceStream(Class)
*/
public ResourceProperties(String packageName,Class<?> clazz) throws IOException
{
this(Resources.getResourceStream(packageName,clazz));
}
/* ______________________________________________________________________________________________________________ *\
\* Instanzmethoden */
/**
* Liefert einen Iterator ber die Property-Schlssel.
*
* @return Der Iterator ber die Schlssel
*/
public Iterator<String> iterator()
{
return new EnumerationIterator(keys());
}
/**
* Fgt alle Eintrge einer anderen Property hinzu.
*
* @param properties Die hinzuzufgenden Properties
*/
public void addAll(Properties properties)
{
for (String key: new EnumerationIterator(properties.keys()))
{
putProperty(key, getProperty(key));
}
}
/**
* Bestimmt, ob beim Ermitteln nicht vorhandener Properties eine Exception erzeugt wird.
*
* Die Exception ist eine Runtime-Exception vom Typ MissingPropertyException.
*
* @param fail Beim Ermitteln nicht vorhandener Properties wird eine Exception erzeugt
* @see #getProperty(String)
* @see MissingPropertyException
*/
public void setFailOnMissingProperty(boolean fail)
{
failOnMissingProperty$ = fail;
}
/**
* Ermittelt, ob beim Ermitteln nicht vorhandener Properties eine Exception erzeugt wird.
*
* @return Beim Ermitteln nicht vorhandener Properties wird eine Exception erzeugt
* @see #getProperty(String)
*/
public boolean isFailOnMissingProperty()
{
return failOnMissingProperty$;
}
/**
* Bestimmt, ob die automatischen Lokalisierung von Property-Schlsseln vorgenommen werden soll.
*
* @param keyLocalization Die automatischen Lokalisierung von Property-Schlsseln soll vorgenommen werden
*/
public void setKeyLocalization(boolean keyLocalization)
{
keyLocalization$ = keyLocalization;
}
/**
* Prft, ob die automatischen Lokalisierung von Property-Schlsseln vorgenommen wird.
*
* @return Die automatischen Lokalisierung von Property-Schlsseln wird vorgenommen
*/
public boolean getKeyLocalization()
{
return keyLocalization$;
}
/**
* Convenience-Methode, um Strings zu speichern.
*
* @param key Der Property-Schlssel
* @param value Der Property-Wert
* @return Der Property-Wert, der zuvor unter dem Schlssel gespeichert war, oder 'null' falls keiner vorhanden war
*/
public Object putProperty(String key,String value)
{
return put(key,value);
}
/**
* Convenience-Methode, um numerische Werte (Integer) zu speichern.
*
* Der numersiche Wert wird als String abgelegt.
*
* @param key Der Property-Schlssel
* @param value Der Property-Wert
* @return Der Property-Wert, der zuvor unter dem Schlssel gespeichert war, oder 'null' falls keiner vorhanden war
*/
public Object putProperty(String key,int value)
{
return put(key,String.valueOf(value));
}
/**
* Convenience-Methode, um numerische Werte (Gleitkommawarte einfacher Genauigkeit) zu speichern.
*
* Der boolesche Wert wird als String abgelegt.
*
* @param key Der Property-Schlssel
* @param value Der Property-Wert
* @return Der Property-Wert, der zuvor unter dem Schlssel gespeichert war, oder 'null' falls keiner vorhanden war
*/
public Object putProperty(String key,float value)
{
return put(key,String.valueOf(value));
}
/**
* Convenience-Methode, um numerische Werte (Gleitkommawarte doppelter Genauigkeit) zu speichern.
*
* Der boolesche Wert wird als String abgelegt.
*
* @param key Der Property-Schlssel
* @param value Der Property-Wert
* @return Der Property-Wert, der zuvor unter dem Schlssel gespeichert war, oder 'null' falls keiner vorhanden war
*/
public Object putProperty(String key,double value)
{
return put(key,String.valueOf(value));
}
/**
* Convenience-Methode, um boolesche Werte zu speichern.
*
* Der boolesche Wert wird als String abgelegt.
*
* @param key Der Property-Schlssel
* @param value Der Property-Wert
* @return Der Property-Wert, der zuvor unter dem Schlssel gespeichert war, oder 'null' falls keiner vorhanden war
*/
public Object putProperty(String key,boolean value)
{
return put(key,String.valueOf(value));
}
/**
* Liefert den Wert des angegebenen Property-Schlssels.
*
* Diese Methode erzeugt eine Exception, wenn unter dem Schlssel kein Wert gespeichert ist und wenn das
* Erzeugen von Exceptions explizit aktiviert ist, ansonsten wird bei fehlendem Wert nur 'null' geliefert.
*
* Falls die automatische Lokalisierung der Schlssel eingeschaltet ist, wird dafr die Default-Locale benutzt.
* In dem Fall wird der Wert der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als Schlssel
* wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* @param key Der Property-Schlssel
* @return Der Property-Wert
* @throws MissingPropertyException Die Property existiert nicht
* @see #setFailOnMissingProperty(boolean)
*/
public String getProperty(String key) throws MissingPropertyException
{
return getProperty(key,(Locale)null);
}
/**
* Liefert den Wert des angegebenen Property-Schlssels.
*
* Diese Methode erzeugt eine Exception, wenn unter dem Schlssel kein Wert gespeichert ist und wenn das
* Erzeugen von Exceptions explizit aktiviert ist, ansonsten wird bei fehlendem Wert nur 'null' geliefert.
*
* Der Schlssel wird ungeachtet der Einstellungen fr die automatsiche Lokalisierung immer mit der angegebenen
* Locale lokalisiert. Dazu wird der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als
* Schlssel wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* @param key Der Property-Schlssel
* @param locale Die Locale fr die Schlssellokalisierung
* @return Der Property-Wert
* @throws MissingPropertyException Die Property existiert nicht
* @see #setFailOnMissingProperty(boolean)
*/
public String getProperty(String key,Locale locale) throws MissingPropertyException
{
return getProperty(key,locale,false);
}
/**
* Liefert den Wert des angegebenen Property-Schlssels.
*
* Der Schlssel wird ungeachtet der Einstellungen fr die automatsiche Lokalisierung immer mit der angegebenen
* Locale lokalisiert. Dazu wird der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als
* Schlssel wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* @param key Der Property-Schlssel
* @param locale Die Locale fr die Schlssellokalisierung
* @param disableException Die Erzeugung einer Exception aufgrund einer fehlenden Property wird grundstzlich verhindert
* @return Der Property-Wert
* @throws MissingPropertyException Die Property existiert nicht
* @see #setFailOnMissingProperty(boolean)
*/
private String getProperty(String key,Locale locale,boolean disableException) throws MissingPropertyException
{
String value;
if (locale == null && keyLocalization$)
locale = Locale.getDefault();
if (locale != null)
{
String variant = locale.getVariant();
String language = locale.getLanguage();
String country = locale.getCountry();
if ((value = super.getProperty(key + "[" + language + "_" + country + "_" + variant + "]")) != null) return value.trim();
if ((value = super.getProperty(key + "[" + language + "_" + country + "]")) != null) return value.trim();
if ((value = super.getProperty(key + "[" + language + "]")) != null) return value.trim();
}
value = super.getProperty(key);
if (value == null)
{
if (failOnMissingProperty$ && !disableException)
throw new MissingPropertyException(key);
}
else
{
value = value.trim();
}
return value;
}
/**
* Convenience-Methode, um String-Werte zu ermitteln.
*
* Falls die automatsiche Lokalisierung der Schlssel eingeschaltet ist, wird dafr die Default-Locale benutzt.
* In dem Fall wird der Wert der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als Schlssel
* wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, wird der angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @return Der Property-Wert
*/
public String getProperty(String key,String defaultValue)
{
return Strings.nullAsText(getProperty(key,null,true),defaultValue);
}
/**
* Convenience-Methode, um String-Werte zu ermitteln.
*
* Falls die automatsiche Lokalisierung der Schlssel eingeschaltet ist, wird dafr die Default-Locale benutzt.
* In dem Fall wird der Wert der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als Schlssel
* wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, wird der angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @param locale Die Locale fr die Schlssellokalisierung
* @return Der Property-Wert
*/
public String getProperty(String key,String defaultValue,Locale locale)
{
return Strings.nullAsText(getProperty(key,locale,true),defaultValue);
}
/**
* Convenience-Methode, um Integer-Werte zu ermitteln.
*
* Falls die automatsiche Lokalisierung der Schlssel eingeschaltet ist, wird dafr die Default-Locale benutzt.
* In dem Fall wird der Wert der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als Schlssel
* wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @return Der Property-Wert
*/
public int getProperty(String key,int defaultValue)
{
return Strings.parse(getProperty(key,null,true),defaultValue);
}
/**
* Convenience-Methode, um Integer-Werte zu ermitteln.
*
* Der Schlssel wird ungeachtet der Einstellungen fr die automatsiche Lokalisierung immer mit der angegebenen
* Locale lokalisiert. Dazu wird der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als
* Schlssel wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @param locale Die Locale fr die Schlssellokalisierung
* @return Der Property-Wert
*/
public int getProperty(String key,int defaultValue,Locale locale)
{
return Strings.parse(getProperty(key,locale,true),defaultValue);
}
/**
* Convenience-Methode, um Long-Werte zu ermitteln.
*
* Falls die automatsiche Lokalisierung der Schlssel eingeschaltet ist, wird dafr die Default-Locale benutzt.
* In dem Fall wird der Wert der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als Schlssel
* wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @return Der Property-Wert
*/
public long getProperty(String key,long defaultValue)
{
return Strings.parse(getProperty(key,null,true),defaultValue);
}
/**
* Convenience-Methode, um Long-Werte zu ermitteln.
*
* Der Schlssel wird ungeachtet der Einstellungen fr die automatsiche Lokalisierung immer mit der angegebenen
* Locale lokalisiert. Dazu wird der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als
* Schlssel wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @param locale Die Locale fr die Schlssellokalisierung
* @return Der Property-Wert
*/
public long getProperty(String key,long defaultValue,Locale locale)
{
return Strings.parse(getProperty(key,locale,true),defaultValue);
}
/**
* Convenience-Methode, um Float-Werte zu ermitteln.
*
* Falls die automatsiche Lokalisierung der Schlssel eingeschaltet ist, wird dafr die Default-Locale benutzt.
* In dem Fall wird der Wert der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als Schlssel
* wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @return Der Property-Wert
*/
public float getProperty(String key,float defaultValue)
{
return Strings.parse(getProperty(key,null,true),defaultValue);
}
/**
* Convenience-Methode, um Float-Werte zu ermitteln.
*
* Der Schlssel wird ungeachtet der Einstellungen fr die automatsiche Lokalisierung immer mit der angegebenen
* Locale lokalisiert. Dazu wird der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als
* Schlssel wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @param locale Die Locale fr die Schlssellokalisierung
* @return Der Property-Wert
*/
public float getProperty(String key,float defaultValue,Locale locale)
{
return Strings.parse(getProperty(key,locale,true),defaultValue);
}
/**
* Convenience-Methode, um Double-Werte zu ermitteln.
*
* Falls die automatsiche Lokalisierung der Schlssel eingeschaltet ist, wird dafr die Default-Locale benutzt.
* In dem Fall wird der Wert der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als Schlssel
* wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @return Der Property-Wert
*/
public double getProperty(String key,double defaultValue)
{
return Strings.parse(getProperty(key,null,true),defaultValue);
}
/**
* Convenience-Methode, um Double-Werte zu ermitteln.
*
* Der Schlssel wird ungeachtet der Einstellungen fr die automatsiche Lokalisierung immer mit der angegebenen
* Locale lokalisiert. Dazu wird der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als
* Schlssel wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @param locale Die Locale fr die Schlssellokalisierung
* @return Der Property-Wert
*/
public double getProperty(String key,double defaultValue,Locale locale)
{
return Strings.parse(getProperty(key,locale,true),defaultValue);
}
/**
* Convenience-Methode, um BiDecimal-Werte zu ermitteln.
*
* Falls die automatsiche Lokalisierung der Schlssel eingeschaltet ist, wird dafr die Default-Locale benutzt.
* In dem Fall wird der Wert der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als Schlssel
* wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @return Der Property-Wert
*/
public BigDecimal getProperty(String key,BigDecimal defaultValue)
{
return Strings.parse(getProperty(key,null,true),defaultValue);
}
/**
* Convenience-Methode, um BiDecimal-Werte zu ermitteln.
*
* Der Schlssel wird ungeachtet der Einstellungen fr die automatsiche Lokalisierung immer mit der angegebenen
* Locale lokalisiert. Dazu wird der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als
* Schlssel wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @param locale Die Locale fr die Schlssellokalisierung
* @return Der Property-Wert
*/
public BigDecimal getProperty(String key,BigDecimal defaultValue,Locale locale)
{
return Strings.parse(getProperty(key,locale,true),defaultValue);
}
/**
* Convenience-Methode, um Boolean-Werte zu ermitteln.
*
* Falls die automatsiche Lokalisierung der Schlssel eingeschaltet ist, wird dafr die Default-Locale benutzt.
* In dem Fall wird der Wert der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als Schlssel
* wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @return Der Property-Wert
*/
public boolean getProperty(String key,boolean defaultValue)
{
return Strings.parse(getProperty(key,null,true),defaultValue);
}
/**
* Convenience-Methode, um Boolean-Werte zu ermitteln.
*
* Der Schlssel wird ungeachtet der Einstellungen fr die automatsiche Lokalisierung immer mit der angegebenen
* Locale lokalisiert. Dazu wird der Reihe nach unter mehreren Schlsseleintrgen gesucht. Angenommen, als
* Schlssel wurde key angegeben, dann werden diese Eintrge propbiert, bis einer einen Wert liefert:
*
* - key[language_country_variant]
* - key[language_country]
* - key[language]
* - key
*
* language, country und variant stammen aus der Default-Locale.
*
* Falls kein Wert unter dem angegebenen Schlssel gespeichert ist, oder der Wert nicht numerisch ist, wird der
* angegebene Default-Wert geliefert.
*
* @param key Der Property-Schlssel
* @param defaultValue Der Default-Wert
* @param locale Die Locale fr die Schlssellokalisierung
* @return Der Property-Wert
*/
public boolean getProperty(String key,boolean defaultValue,Locale locale)
{
return Strings.parse(getProperty(key,locale,true),defaultValue);
}
/**
* Ldt Properties aus dem angegebenen Stream und schliesst den Stream danach.
*
* @param stream Der Stream
* @throws IOException Der Stream konnte nicht gelesen werden
*/
public void load(InputStream stream) throws IOException
{
if (stream == null)
throw new IOException("Invalid input stream");
super.load(stream);
stream.close();
}
/* ______________________________________________________________________________________________________________ *\
\* Klassenmethoden */
/**
* Liefert die Properties einer Klasse.
*
* Die Methode geht wie folgt vor:
*
* - Zunchst werden die Klassen-Properties der angegebenen Klasse geladen.
* - In diesen Properties wird der angegebene Schlssel benutzt, um den Wert einer anderen Properties-Ressource
* zu ermitteln
* - Diese ber den Schlssel ermittelten Properties werden als Ergebnis zurckgelifert
*
* Die Methode eignet sich gut dazu, die Ablage der Konfigurationsdaten einer Klasse flexibler zu gestalten als
* durch Klassen-Properties.
*
* @param clazz Die Klasse, fr die die Properties geladen werden
* @param key Der Schlssel in den Klassen-Properties, die den Namen der zu liefernden Properties-Ressource enthalten
* @return Die Properties
* @throws IOException Eine der Properties-Ressourcen existiert nicht
*/
public static ResourceProperties loadResourceProperties(Class<?> clazz,String key) throws IOException
{
ResourceProperties properties = new ResourceProperties(clazz);
return new ResourceProperties(properties.getProperty(key));
}
/* ______________________________________________________________________________________________________________ *\
\* Klassen */
/** Klasse, die eine Enumeration in einem Iterator kapselt.
*/
private static class EnumerationIterator extends Object implements Iterator<String>,Iterable<String>
{
private Enumeration<?> enumeration$;
/**
* Erzeugt eine Instanz dieser Klasse.
*
* @param enumeration Die zu kapselnde Enumeration
*/
public EnumerationIterator(Enumeration<?> enumeration)
{
super();
enumeration$ = enumeration;
}
/**
* Prft, ob es noch ein weiteres Element gibt.
*
* @return Es gibt noch ein weiteres Element
*/
public boolean hasNext()
{
return enumeration$.hasMoreElements();
}
/**
* Liefert das nchste Element.
*
* @return Das nchste Element
*/
public String next()
{
return (String)enumeration$.nextElement();
}
/**
* Lscht das aktuelle Element.
*
* Diese Operation ist in dieser Iterator-Implementierung nicht vorgesehen. Der Aufruf dieser Methode fhrt
* immer zu einer UnsupportedOperationException.
*/
public void remove()
{
throw new UnsupportedOperationException("remove is not supported");
}
/**
* Liefert einen Iterator.
*
* @return Der Iterator
*/
public Iterator<String> iterator()
{
return this;
}
}
}
/*\
* _____________________________________________________________________________________________________________________
*
* This software is distributed under the terms of the BSD License:
*
* Copyright 2006 Klaus Rogall, Hamburg, Germany (klaus.rogall@web.de). All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
* following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
* - Neither the name of the Klaus Rogall nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* _____________________________________________________________________________________________________________________
\*/