ch.emad.business.schuetu.spieldurchfuehrung.SpielDurchfuehrung.java Source code

Java tutorial

Introduction

Here is the source code for ch.emad.business.schuetu.spieldurchfuehrung.SpielDurchfuehrung.java

Source

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

import ch.emad.business.schuetu.Business;
import ch.emad.business.schuetu.controller.resultate.ResultateVerarbeiter;
import ch.emad.business.schuetu.print.PrintAgent;
import ch.emad.business.schuetu.print.SpielPrintManager;
import ch.emad.business.schuetu.websiteinfo.WebsiteInfoService;
import ch.emad.business.schuetu.zeit.Countdown;
import ch.emad.business.schuetu.zeit.ZeitPuls;
import ch.emad.business.schuetu.zeit.Zeitgeber;
import ch.emad.model.schuetu.model.Spiel;
import ch.emad.model.schuetu.model.SpielZeile;
import ch.emad.model.schuetu.model.enums.SpielEnum;
import ch.emad.model.schuetu.model.enums.SpielPhasenEnum;
import ch.emad.model.schuetu.model.enums.SpielZeilenPhaseEnum;
import ch.emad.persistence.schuetu.repository.SpielRepository;
import ch.emad.persistence.schuetu.repository.SpielZeilenRepository;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * @author $Author: marthaler.worb@gmail.com $
 * @since 0.7
 */
@Component
public class SpielDurchfuehrung implements ApplicationListener<ZeitPuls> {

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

    private int wartendSize = 3;
    private int minutenZumVorbereiten = 3;

    private String delim = System.getProperty("file.separator");

    @Autowired
    private WebsiteInfoService infoservice;

    @Autowired
    private ResultateVerarbeiter verarbeiter;

    @Autowired
    private SpielZeilenRepository spielzeilenRepo;

    @Autowired
    private SpielRepository spielRepo;

    @Autowired
    private Business business;

    @Autowired
    private Zeitgeber zeitgeber;

    @Autowired
    private PrintAgent agent;

    @Autowired
    private SpielPrintManager spielPrinter;

    private boolean endranglistegedruckt = false;

    private Countdown countdown;

    private Countdown countdownToStart;

    private ZeitPuls jetzt;

    private List<String> text = new ArrayList<String>();

    @Autowired
    @Qualifier("durchfuehrungDataDatabase")
    private SpielDurchfuehrungData data;

    private boolean init = false;

    public void onApplicationEvent(final ZeitPuls event) {

        //beim ersten aufruf, initialisierung
        if (!init) {
            init();
            init = true;
        }

        this.jetzt = event;

        if (this.countdown != null) {
            this.countdown.signalTime(event.getSpielZeit());
        }

        if (this.countdownToStart != null) {
            this.countdownToStart.signalTime(event.getSpielZeit());
        }

        if (this.business.getSpielEinstellungen().getPhase().equals(SpielPhasenEnum.F_SPIELEN)) {

            prepare1Wartend();

            prepare2ZumVorbereiten();

            prepare3WartenAufStart();

            prepare4Spielend();

            checkSpielende();

        }

        if (this.business.getSpielEinstellungen().getPhase().equals(SpielPhasenEnum.G_ABGESCHLOSSEN)) {

            checkSpielende();

        }

    }

    /*
     * dient dazu beim ersten aufruf die liste zu fuellen mit den zeilen aus der db
     */
    private synchronized void init() {
        data.getList2ZumVorbereiten().addAll(spielzeilenRepo.findBZurVorbereitung());
        data.getList3Vorbereitet().addAll(spielzeilenRepo.findCVorbereitet());
        data.getList4Spielend().addAll(spielzeilenRepo.findDSpielend());
    }

    private synchronized void prepare1Wartend() {
        // wartende auffuellen

    }

    private boolean pruefeObMannschaftenBeiFinalenSind(SpielZeile spielZeile) {
        // pruefung ob breits Mannschaften eingetragen sind bei den Finalen
        if (spielZeile.getA() != null && spielZeile.getA().getTyp() != SpielEnum.GRUPPE) {
            if (spielZeile.getA() != null) {
                if (spielZeile.getA().getMannschaftA() == null) {
                    return true;
                }
            }
            if (spielZeile.getB() != null) {
                if (spielZeile.getB().getMannschaftA() == null) {
                    return true;
                }
            }
            if (spielZeile.getC() != null) {
                if (spielZeile.getC().getMannschaftA() == null) {
                    return true;
                }
            }

        }
        return false;
    }

    private void prepare2ZumVorbereiten() {

        if (!this.data.getList1Wartend(this.wartendSize).isEmpty()) {
            // zum vorbereiten einstellen
            if ((this.data.getList2ZumVorbereiten().isEmpty())) {

                // pruefung ob nachste zeile bereits zur vorbereitung
                long naechste = this.data.getList1Wartend(wartendSize)
                        .get(this.data.getList1Wartend(wartendSize).size() - 1).getStart().getTime()
                        - (60L * minutenZumVorbereiten * 1000);
                long now = jetzt.getSpielZeit().getMillis();

                if (naechste < now) {
                    SpielZeile temp = this.data.getList1Wartend(wartendSize)
                            .remove(this.data.getList1Wartend(wartendSize).size() - 1);
                    temp.setPhase(SpielZeilenPhaseEnum.B_ZUR_VORBEREITUNG);
                    temp = spielezeileUpdatenBetreffendZeilenphaseAndSave(temp);
                    this.data.getList2ZumVorbereiten().add(temp);

                    // automatisches vorbereiten
                    if (this.business.getSpielEinstellungen().isAutomatischesVorbereiten()) {
                        this.vorbereitet();
                    }

                }
            }
        }

        // zeit anhalten, falls die spielzeit des zum vorbereitenden abgelaufen ist
        if (stopBecauseZumVorbereiten() && this.zeitgeber.isGameStarted()) {
            this.zeitgeber.stopGame("spielzeit des zu_vorbereitenden ist abgelaufen");
        }

        // zeit wieder starten, falls zum vorbereiten leer ist oder eine zeile mit start in der zukunft hat, falls evnet auf pause ist
        if (jetzt.isUnterbruch() && !stopBecauseWartenAufStart()) {
            if (this.data.getList2ZumVorbereiten().isEmpty() || jetzt.getSpielZeit()
                    .isBefore(new DateTime(data.getList2ZumVorbereiten().get(0).getStart()))) {
                this.zeitgeber.startGame(0, "liste mit zu_vorbereiteten ist wieder leer");
            }
        }

    }

    private SpielZeile spielezeileUpdatenBetreffendZeilenphaseAndSave(SpielZeile temp) {

        if (temp.getA() != null) {
            temp.getA().setSpielZeilenPhase(temp.getPhase());
        }
        if (temp.getB() != null) {
            temp.getB().setSpielZeilenPhase(temp.getPhase());
        }
        if (temp.getC() != null) {
            temp.getC().setSpielZeilenPhase(temp.getPhase());
        }
        return this.spielzeilenRepo.save(temp);
    }

    private boolean stopBecauseZumVorbereiten() {
        return !this.data.getList2ZumVorbereiten().isEmpty()
                && jetzt.getSpielZeit().isAfter(new DateTime(data.getList2ZumVorbereiten().get(0).getStart()));
    }

    private boolean stopBecauseWartenAufStart() {
        return !this.data.getList3Vorbereitet().isEmpty()
                && jetzt.getSpielZeit().isAfter(new DateTime(data.getList3Vorbereitet().get(0).getStart()));
    }

    private void prepare3WartenAufStart() {

        // zeit anhalten, falls die spielzeit des zum vorbereiten abgelaufen ist
        if (stopBecauseWartenAufStart()) {
            this.zeitgeber.stopGame("spielzeit des vorbereitenden ist abgelaufen");
        }

        // zeit wieder starten, falls vorbereiten leer ist oder eine zeile mit start in der zukunft hat, falls evnet auf pause ist
        if (jetzt.isUnterbruch() && !stopBecauseZumVorbereiten()) {
            if (this.data.getList3Vorbereitet().isEmpty()
                    || jetzt.getSpielZeit().isBefore(new DateTime(data.getList3Vorbereitet().get(0).getStart()))) {
                this.zeitgeber.startGame(0, "liste mit vorbereiteten ist wieder leer");
            }
        }
    }

    private void prepare4Spielend() {

        // keine spielenden
        if (this.getList4Spielend().isEmpty()) {
            return;
        }

        // beenden, falls zeit abgelaufen ist
        if (this.countdown != null && this.getCountdown().isFertig()) {
            this.beenden();
        }

    }

    private void checkSpielende() {
        LOG.debug("checkSpielende: start");
        if (!endranglistegedruckt
                && business.getSpielEinstellungen().getPhase() == SpielPhasenEnum.G_ABGESCHLOSSEN) {

            agent.saveFileToPrint("rangliste", verarbeiter.getRangliste());

            // letzte resultate drucken
            spielPrinter.printPage();

            String jahr = "" + new DateTime(this.business.getSpielEinstellungen().getStarttag()).getYear();

            this.infoservice.dumpJetzt(jahr);

            endranglistegedruckt = true;
            LOG.debug("checkSpielende: spiel abgeschlossen");
        }

    }

    public void vorbereitet() {
        SpielZeile temp = this.data.getList2ZumVorbereiten().remove(0);
        this.countdownToStart = new Countdown(this.jetzt.getSpielZeit(), new DateTime(temp.getStart()));
        temp.setPhase(SpielZeilenPhaseEnum.C_VORBEREITET);
        temp = spielezeileUpdatenBetreffendZeilenphaseAndSave(temp);
        List<SpielZeile> zeile = this.data.getList3Vorbereitet();
        zeile.add(temp);
        this.data.setList3Vorbereitet(zeile);
        // tts get
        generateText(temp);
    }

    public void spielen() {

        gong();

        this.countdown = new Countdown(this.jetzt.getSpielZeit(), 10 * 60);
        SpielZeile temp = this.data.getList3Vorbereitet().remove(0);
        temp.setPhase(SpielZeilenPhaseEnum.D_SPIELEND);
        if (temp.getA() != null) {
            temp.getA().setAmSpielen(true);
        }
        if (temp.getB() != null) {
            temp.getB().setAmSpielen(true);
        }
        if (temp.getC() != null) {
            temp.getC().setAmSpielen(true);
        }
        temp = spielezeileUpdatenBetreffendZeilenphaseAndSave(temp);
        this.data.getList4Spielend().add(temp);

        // zeit aufholen, falls eingestellt auf automatisch
        if (this.business.getSpielEinstellungen().isAutomatischesAufholen()) {
            this.business.spielzeitEinholen(this.business.getSpielEinstellungen().getAufholzeitInSekunden());
        }
    }

    public synchronized void beenden() {
        SpielZeile temp = this.data.getList4Spielend().remove(0);
        temp.setPhase(SpielZeilenPhaseEnum.E_BEENDET);

        this.data.getList5Beendet().add(temp);

        // einzutragende spiele vorbereiten
        if (temp.getA() != null) {
            Spiel spiel = temp.getA();
            spiel.setAmSpielen(false);
            spiel.setFertigGespielt(true);
            spielRepo.save(spiel);
        }
        if (temp.getB() != null) {
            Spiel spiel = temp.getB();
            spiel.setAmSpielen(false);
            spiel.setFertigGespielt(true);
            spielRepo.save(spiel);
        }
        if (temp.getC() != null) {
            Spiel spiel = temp.getC();
            spiel.setAmSpielen(false);
            spiel.setFertigGespielt(true);
            spielRepo.save(spiel);
        }
        temp = spielezeileUpdatenBetreffendZeilenphaseAndSave(temp);
        gong();
    }

    public synchronized List<SpielZeile> getList1Wartend() {
        return this.data.getList1Wartend(this.wartendSize);
    }

    public String getText() {
        if (text.size() > 0) {
            return this.text.remove(0);
        }
        return null;
    }

    private void gong() {
        // bell setzen
        if (business.getSpielEinstellungen().isGongEinschalten()) {
            text.add("resources" + delim + "sound" + delim + "bell01.mov");
        }
    }

    public int countText() {
        if (text.size() > 0) {
            return this.text.get(0).length();
        }
        return 0;
    }

    public String getWait() {

        // 15 Sekunden default
        int millis = 15000;

        // countdown
        if (countdown != null && !countdown.isFertig()) {
            if (millis > (countdown.getSecondsPlus2() * 1000)) {
                millis = (countdown.getSecondsPlus2() * 1000);
            }
        }

        // countdownToStart
        if (countdownToStart != null && !countdownToStart.isFertig()) {
            if (millis > (countdownToStart.getSecondsPlus2() * 1000)) {
                millis = (countdownToStart.getSecondsPlus2() * 1000);
            }
        }

        // ansagetext fuer platze
        if (isTextAvailable() && this.text.get(0).contains(".mp3")) {
            if (millis < 25000) {
                millis = 25000;
            }
        }

        // bell
        if (isTextAvailable() && this.text.get(0).contains("bell")) {
            millis = 6000;
        }

        if (millis < 5000) {
            millis = 5000;
        }

        return "" + millis;
    }

    public boolean isTextAvailable() {
        if (this.text.size() > 0) {
            return true;
        }
        return false;
    }

    public void generateText(SpielZeile zeile) {
        if (this.business.getSpielEinstellungen().isAutomatischesAnsagen()) {
            text.add("/app/tts/spielansage/id/" + zeile.getId());
        }
    }

    // getter & setter

    public boolean getReadyToVorbereiten() {
        return this.data.getList3Vorbereitet().isEmpty();
    }

    public boolean getReadyToSpielen() {
        return this.data.getList4Spielend().isEmpty();
    }

    public List<SpielZeile> getList2ZumVorbereiten() {
        return this.data.getList2ZumVorbereiten();
    }

    public List<SpielZeile> getList3Vorbereitet() {
        return this.data.getList3Vorbereitet();
    }

    public List<SpielZeile> getList4Spielend() {
        return this.data.getList4Spielend();
    }

    public List<SpielZeile> getList5Beendet() {
        return this.data.getList5Beendet();
    }

    public Countdown getCountdown() {
        return this.countdown;
    }

    public Countdown getCountdownToStart() {
        return countdownToStart;
    }

    public void fertigesSpiel(Spiel spiel) {
        this.verarbeiter.signalFertigesSpiel(spiel.getId());
    }

    public int getWartendSize() {
        return wartendSize;
    }

    public void setWartendSize(int wartendSize) {
        this.wartendSize = wartendSize;
    }

    public int getMinutenZumVorbereiten() {
        return minutenZumVorbereiten;
    }

    public void setMinutenZumVorbereiten(int minutenZumVorbereiten) {
        this.minutenZumVorbereiten = minutenZumVorbereiten;
    }

}