package rmblworx.tools.timey; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import rmblworx.tools.timey.event.CountdownExpiredEvent; import rmblworx.tools.timey.event.TimeyEventDispatcher; import rmblworx.tools.timey.vo.TimeDescriptor; /* * Copyright 2014-2015 Christian Raue * MIT License http://opensource.org/licenses/mit-license.php */ /** * Diese Thread-sichere Implementierung setzt einen Countdown-Zähler um. Zeitnahme findet in Millisekunden statt. * * @author mmatthies */ class CountdownRunnable extends TimeyTimeRunnable implements ApplicationContextAware { /** * Spring-Anwendugnskontext. */ private ApplicationContext springContext; /** * Die vom Nutzer gesetzte, herunter zu zählende Zeit in Millisekunden. */ private final long timeCountdown; /** * Merker. Gibt Auskunft darüber ob das Event bereits gefeuert wurde. */ private boolean wasEventFired = false; /** * @param descriptor * Referenz auf das Wertobjekt das die Zeit in * Millisekunden an die konsumierende Implementierung * liefern soll. * @param passedTime * Vergangene Zeit in Millisekunden. */ public CountdownRunnable(final TimeDescriptor descriptor, final long passedTime) { super(descriptor, passedTime, System.currentTimeMillis()); this.timeCountdown = descriptor.getMilliSeconds(); } /** * Berechnet und schreibt die noch verbleibende Countdown-Zeit in Millisekunden in das * Wertobjekt. */ @Override protected void computeTime() { this.timeDelta = 0; final long currentTimeMillis = System.currentTimeMillis(); this.timeDelta = this.timeStarted - currentTimeMillis; this.timeDescriptor.setMilliSeconds(this.timeCountdown + this.timeDelta); } @Override public void run() { Thread.currentThread().setName("timey-Countdown"); this.lock.lock(); try { if (this.timeDescriptor.getMilliSeconds() > 0) { this.computeTime(); } else { if (!this.wasEventFired) { final CountdownExpiredEvent countdownExpiredEvent = (CountdownExpiredEvent) this.springContext .getBean("countdownExpiredEvent"); final TimeyEventDispatcher eventDispatcher = (TimeyEventDispatcher) this.springContext .getBean("timeyEventDispatcher"); eventDispatcher.dispatchEvent(countdownExpiredEvent); this.wasEventFired = true; } } } finally { this.lock.unlock(); } } @Override public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException { this.springContext = applicationContext; } }