package org.nocket.selenium.infrastructure; import java.io.IOException; import java.io.InputStream; import java.text.MessageFormat; import java.util.Properties; import org.apache.commons.io.IOUtils; import org.nocket.util.AssertionException; /** * Abstrakte Oberklasse alle Util-Klassen um Property-Dateien zu lesen und zu * cachen. * <P> * Eine Instanz soll mit einer Property-Datei verkn�pft sein. * * @author <a href="mailto:holze01@bertelsmann.de">holze01 </a> * @version $Revision: 3 $ - $Modtime: 10.08.05 12:13 $ ($Author: Ggdcc01 $) */ public abstract class AbstractProperties { /** Cache für die Properties (d.h. für den Inhalt einer Property-Datei). */ protected Properties fileProps = null; /** * Contructor ist private, damit nur über static-Methoden zugegriffen wird. */ protected AbstractProperties() { initFileProps(); } protected void initFileProps() { if (getPropertyFileName() != null) { readFileProps(); } } /** Liefert den Namen der zugeh�rigen Property-Datei. */ protected abstract String getPropertyFileName(); /** L�scht die gesetzten Properties. */ protected synchronized void deleteProps() { fileProps = new Properties(); } /** Liest die (ggf. neu) Properties ein. */ protected synchronized void readFileProps() { Properties props = new Properties(); ClassLoader cl = getClass().getClassLoader(); if (cl == null) { cl = ClassLoader.getSystemClassLoader(); } InputStream in = cl.getResourceAsStream(getPropertyFileName()); notNull(in, "InputStream is null for file: " + getPropertyFileName()); try { props.load(in); } catch (IOException e) { // Err.handler().processSevere(e, e + " caught. File was " + // getPropertyFileName()); } finally { IOUtils.closeQuietly(in); } fileProps = props; } /** * Liefert Wert aus den Properties. * * @see Properties#getProperty(java.lang.String) */ protected String _getProperty(String key) { return fileProps.getProperty(key); } /** * Liefert Wert aus den Properties. * * @see Properties#getProperty(java.lang.String,java.lang.String) */ protected String _getProperty(String key, String defaultValue) { return fileProps.getProperty(key, defaultValue); } /** * Ver�ndert oder erg�nzt einen Property-Wert. * <p> * Dieser Ver�nderung geschieht nur im Cache und wird nicht persistiert. */ protected void _setProperty(String key, String value) { fileProps.setProperty(key, value); } /** * Ersetzt alle Platzhalter in einer Property mit Hilfe von MessageFormat * durch die übergebenen Objekte. * <p> * Bsp: Der Property-Text "Hallo {0}!" wird durch übergabe des Arrays * {"Welt"} als "Hallo Welt!" zur�ckgegeben. Die Zahl in den geschweiften * Klammern entspricht dem Array-Index. Detaillierte Informationen zur * Nutzung können im JavaDoc zu MessageFormat nachgelesen werden. * * @param key * Schl�ssel zum gesuchten Property-Text * @param args * Array der Objekte, die für die Platzhalter eingesetzt werden * sollen. */ protected String _getProperty(String key, Object[] args) { String template = _getProperty(key); MessageFormat format = new MessageFormat(template); return format.format(args); } public static void notNull(Object obj, String message) { test(obj != null, message); } public static void test(boolean condition, String message) throws AssertionException { if (!condition) throw new AssertionException(message); } }