package rmblworx.tools.timey; import java.util.concurrent.TimeUnit; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import rmblworx.tools.timey.exception.NullArgumentException; import rmblworx.tools.timey.vo.TimeDescriptor; /* * Copyright 2014-2015 Christian Raue * MIT License http://opensource.org/licenses/mit-license.php */ /** * Ermöglicht die Zeitmessung in Form eines Countdowns. * * @author mmatthies */ class Countdown implements ICountdown, ApplicationContextAware { /** * Spring-Kontext. */ private ApplicationContext context; /** * Die genutzte Zeitmessimplementierung. */ private ICountdownTimer countdownTimer; /** * Gibt die Maßzahl für die Zeiteinheit an. * * @see #timeUnit */ private final int delayPerThread; /** * Gibt die Zeiteinheit an in welchem der Intervall die gemessene Zeit geliefert wird. */ private final TimeUnit timeUnit; /** * Erweiterter Konstruktor. Ausschliesslich für Testzwecke. * * @param countdownTimer * Referenz auf die CountdownTimer-Implementierung. * @param delay * Ausführungsverzögerung des Zeitmessungs-Threads * @param unit * Zeiteinheit für die zuvor angegebene Ausführungsverzögerung */ Countdown(final ICountdownTimer countdownTimer, final int delay, final TimeUnit unit) { this(delay, unit); this.countdownTimer = countdownTimer; } /** * Konstruktor welcher eine Instanz dieses Receiver erzeugt. * * @param delay * Bestimmt den Intervall in welchem die vom Thread gemessene Zeit zurückgeliefert wird. * @param unit * Maßeinheit für den Intervall. */ public Countdown(final int delay, final TimeUnit unit) { this.delayPerThread = delay; this.timeUnit = unit; } /** * Instanziiert nach Bedarf die Timerimplementierung. */ private void initCountdownTimer() { if (this.countdownTimer == null) { this.countdownTimer = (ICountdownTimer) this.context.getBean("simpleCountdown"); } } @Override public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { this.context = applicationContext; } @Override public Boolean setCountdownTime(final TimeDescriptor descriptor) { this.initCountdownTimer(); if (descriptor == null) { throw new NullArgumentException(); } return this.countdownTimer.setCountdownTime(descriptor); } @Override public TimeDescriptor startCountdown() { this.initCountdownTimer(); return this.countdownTimer.startCountdown(this.delayPerThread, this.timeUnit); } @Override public Boolean stopCountdown() { this.initCountdownTimer(); return this.countdownTimer.stopCountdown(); } }