package org.kapott.hbci.concurrent; import java.util.Properties; import org.kapott.hbci.callback.HBCICallback; import org.kapott.hbci.manager.HBCIHandler; import org.kapott.hbci.manager.HBCIUtils; import org.kapott.hbci.passport.HBCIPassport; /** * Basis-Klasse f�r Implementierungen von {@link Runnable}, die typische Aufgaben mit einem {@link HBCIPassport} * ausf�hren sollen. * * <p>Implementierungen m�ssen die Methode {@link #execute()} erg�nzen.</p> * * <p>Bei Ausf�hrung einer solchen {@link Runnable} passiert folgendes:</p> * * <ol> * <li>{@link HBCIUtils.initThread(properties, callback)} wird mit den Parametern aus dem Constructor aufgerufen.</li> * <li>Das Passport wird von der {@link HBCIPassportFactory} abgefragt und dar�ber wird der {@link HBCIHandler} erzeugt.</li> * <li>{@link #execute()} wird aufgerufen.</li> * {@link HBCIPassport} und {@link HBCIHandler} sind �ber die Variablen <code>passport</code> bzw. <code>handler</code> verf�gbar.</li> * <li>Abschlie�end werden Handler und Passport geschlossen, sowie {@link HBCIUtils#doneThread()} aufgerufen.</li> * </ol> * * @author Hendrik Schnepel */ public abstract class HBCIRunnable implements Runnable { private final Properties properties; private final HBCICallback callback; private HBCIPassportFactory passportFactory; protected HBCIPassport passport = null; protected HBCIHandler handler = null; public HBCIRunnable(Properties properties, HBCICallback callback, HBCIPassportFactory passportFactory) { this.properties = properties; this.callback = callback; this.passportFactory = passportFactory; } @Override public final void run() { init(); try { prepare(); execute(); } catch (Exception e) { HBCIUtils.log(e); } finally { done(); } } private void init() { HBCIUtils.initThread(properties, callback); } private void prepare() throws Exception { passport = passportFactory.createPassport(); if (passport != null) { String version = passport.getHBCIVersion(); handler = new HBCIHandler((version.length() != 0) ? version : "plus", passport); } } protected abstract void execute() throws Exception; private void done() { if (handler != null) { handler.close(); } if (passport != null) { passport.close(); } HBCIUtils.doneThread(); } }