ch.emad.business.schuetu.zeit.Zeitgeber.java Source code

Java tutorial

Introduction

Here is the source code for ch.emad.business.schuetu.zeit.Zeitgeber.java

Source

/**
 * Apache License 2.0
 */
package ch.emad.business.schuetu.zeit;

import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * Gibt die Zeit in Sekundenpulsen vor und uebermittelt diese als Application Event
 *
 * @author $Author: marthaler.worb@gmail.com $
 * @since 0.7
 */
@Component
public class Zeitgeber implements ApplicationEventPublisherAware {

    private static final Logger LOG = Logger.getLogger(Zeitgeber.class);

    private ApplicationEventPublisher applicationEventPublisher = null;

    private long zeitJetzt = System.currentTimeMillis();

    private long abweichungZuSpielzeit;

    private int verschnellerungsfaktor = 1;

    private boolean clockRunning = false;

    private boolean gameRunning = false;

    public Zeitgeber() {

    }

    @Scheduled(fixedRate = 1000)
    public void run() {
        // falls nicht "started" weiter

        if (!clockRunning) {
            return;
        }

        if (!gameRunning) {
            this.abweichungZuSpielzeit = this.abweichungZuSpielzeit - (this.verschnellerungsfaktor * 1000);
        }

        sendPuls();
    }

    public synchronized void stopGame(String grund) {
        if (!isGameStarted()) {
            Zeitgeber.LOG.info("zeitgeber: stopGame() -> ohne effekt, weil bereits gestoppt:" + grund);
        } else {
            this.stopGame();
            Zeitgeber.LOG.info("zeitgeber: stopGame() -> mit Grund: " + grund);
            // eine einheit zurueck, weil stoppevent immer eine einheit zu spaet kommt
            abweichungZuSpielzeit = abweichungZuSpielzeit + (this.verschnellerungsfaktor * 1000);
            Zeitgeber.LOG.info("zeitgeber: pause: " + this.abweichungZuSpielzeit / 1000 + " sekunden abweichung");

        }

    }

    public synchronized void startGame(int seconds, String grund) {
        Zeitgeber.LOG.info("zeitgeber: startGame() -> aufholung:" + grund + " -> " + seconds);
        this.abweichungZuSpielzeit = this.abweichungZuSpielzeit + seconds * 1000;
        Zeitgeber.LOG.info("zeitgeber: startGame() -> aufholung von " + seconds + " sekunden = abweichung: "
                + this.abweichungZuSpielzeit / 1000 + " sekunden");
        startGame();
    }

    public synchronized void startClock(final DateTime richtigeZeit, final DateTime spielzeit,
            final Integer verschnellerung) {

        if (verschnellerung != null) {
            this.verschnellerungsfaktor = verschnellerung;
        } else {
            this.verschnellerungsfaktor = 1;
        }

        if (richtigeZeit != null) {
            zeitJetzt = richtigeZeit.getMillis();
        } else {
            zeitJetzt = new DateTime().getMillis();
        }

        if (spielzeit != null) {
            abweichungZuSpielzeit = spielzeit.getMillis() - this.zeitJetzt;
        } else {
            abweichungZuSpielzeit = 0;
        }

        this.startClock();
        this.startGame();

        Zeitgeber.LOG.info("zeitgeber: startClock() gestartet mit abweichung zur spielzeit: "
                + this.abweichungZuSpielzeit / 1000 + " sekunden");

    }

    // start & stop game
    public boolean isGameStarted() {
        return gameRunning;
    }

    public void stopGame() {
        gameRunning = false;
    }

    private void startGame() {
        gameRunning = true;
    }

    // start & stop ganze clock
    public boolean isClockStarted() {
        return clockRunning;
    }

    public void stopClock() {
        clockRunning = false;
    }

    private void startClock() {
        clockRunning = true;
    }

    public synchronized void sendPuls() {

        this.zeitJetzt = this.zeitJetzt + (this.verschnellerungsfaktor * 1000);

        final ZeitPuls puls = new ZeitPuls(this, new DateTime(this.zeitJetzt), this.verschnellerungsfaktor,
                gameRunning, this.abweichungZuSpielzeit);

        try {
            this.applicationEventPublisher.publishEvent(puls);
        } catch (final Exception e) {
            Zeitgeber.LOG.fatal(e, e);
        }
    }

    public void setApplicationEventPublisher(final ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

    public int getVerspaetung() {
        return (int) abweichungZuSpielzeit / 1000;
    }

}