ch.emad.business.schuetu.vorbereitung.E5Spielverteiler.java Source code

Java tutorial

Introduction

Here is the source code for ch.emad.business.schuetu.vorbereitung.E5Spielverteiler.java

Source

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

import ch.emad.business.schuetu.Business;
import ch.emad.business.schuetu.vorbereitung.helper.SpielverteilerHelper;
import ch.emad.business.schuetu.vorbereitung.helper.SpielzeilenValidator;
import ch.emad.model.schuetu.model.Kategorie;
import ch.emad.model.schuetu.model.Spiel;
import ch.emad.model.schuetu.model.SpielZeile;
import ch.emad.model.schuetu.model.comperators.KategorieKlasseUndGeschlechtComperator;
import ch.emad.model.schuetu.model.enums.PlatzEnum;
import ch.emad.model.schuetu.model.enums.SpielTageszeit;
import ch.emad.persistence.schuetu.repository.KategorieRepository;
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.stereotype.Component;

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

/**
 * @author $Author: marthaler.worb@gmail.com $
 * @since 0.7
 */
@Component
public class E5Spielverteiler {

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

    @Autowired
    private SpielZeilenRepository spielzeilenRepo;

    @Autowired
    private SpielRepository spielRepo;

    @Autowired
    private KategorieRepository katRepo;

    @Autowired
    private SpielzeilenValidator val;

    @Autowired
    private SpielverteilerHelper helper;

    @Autowired
    private Business business;

    public String spieleAutomatischVerteilen() {

        StringBuilder result = new StringBuilder();

        behandleFinalspielzeilen();

        SpielZeile vorherVorher = null;

        SpielZeile vorher = null;

        List<SpielZeile> gruppenSpieleZeilen = spielzeilenRepo.findGruppenSpielZeilen();

        List<Spiel> gruppenSpiele = spielRepo.findGruppenSpiel();

        helper.init(gruppenSpiele);

        for (SpielZeile zeileJetzt : gruppenSpieleZeilen) {

            if (zeileJetzt.isPause() && !isSamstagNachNeuekategoriesperre(zeileJetzt)) {
                vorherVorher = vorher;
                vorher = zeileJetzt;
                continue;
            }

            stopA(vorher, vorherVorher, gruppenSpiele, zeileJetzt);

            stopB(vorher, vorherVorher, gruppenSpiele, zeileJetzt);

            stopC(vorher, vorherVorher, gruppenSpiele, zeileJetzt);

            vorherVorher = vorher;

            vorher = spielzeilenRepo.save(zeileJetzt);

        }

        LOG.info("spiele verteilt ");
        if (gruppenSpiele.size() > 0) {
            result.append("NICHT ZUGEORDNETE SPIELE !!! " + gruppenSpiele.size());
            result.append("NICHT ZUGEORDNETE SPIELE --> " + gruppenSpiele);
            LOG.fatal(result.toString());
        }

        LOG.info("werde jetzt ueberzaehlige pausen loeschen");
        // sichern und Anfang und Schluss Pausen entfernen
        List<SpielZeile> zeilenSo = business.getSpielzeilen(true);
        List<SpielZeile> zeilenSa = business.getSpielzeilen(false);
        removeUeberschuss(zeilenSo);
        removeUeberschuss(zeilenSa);
        return result.toString();
    }

    private void stopA(SpielZeile vorher, SpielZeile vorherVorher, List<Spiel> gruppenSpiele, SpielZeile zeilen) {
        boolean stopA = false;

        int iA = 0;
        while (!stopA) {

            Spiel tempSpiel = this.getNextSpiel(zeilen, gruppenSpiele, iA);

            if (tempSpiel == null) {
                break;
            }

            tempSpiel.setPlatz(PlatzEnum.A);
            zeilen.setA(tempSpiel);
            tempSpiel.setStart(zeilen.getStart());
            zeilen.setKonfliktText(null);
            zeilen.setPause(false);

            String ret = "";
            ret = val.validateSpielZeilen(vorher, vorherVorher, zeilen);

            if (ret == null || ret.equals("")) {
                gruppenSpiele.remove(tempSpiel);
                helper.consumeSpiel(tempSpiel);
                spielRepo.save(tempSpiel);
                stopA = true;
            } else {
                zeilen.setA(null);
            }
            iA++;
        }
    }

    private void stopC(SpielZeile vorher, SpielZeile vorherVorher, List<Spiel> gruppenSpiele, SpielZeile zeilen) {
        boolean stopC = false;

        int iC = 0;
        while (!stopC) {

            Spiel tempSpiel = this.getNextSpiel(zeilen, gruppenSpiele, iC);
            if (tempSpiel == null) {
                break;
            }

            tempSpiel.setPlatz(PlatzEnum.C);
            zeilen.setC(tempSpiel);

            tempSpiel.setStart(zeilen.getStart());
            zeilen.setKonfliktText(null);
            zeilen.setPause(false);

            String ret = "";
            ret = val.validateSpielZeilen(vorher, vorherVorher, zeilen);

            if (ret == null || ret.equals("")) {
                helper.consumeSpiel(tempSpiel);
                gruppenSpiele.remove(tempSpiel);
                spielRepo.save(tempSpiel);
                stopC = true;
            } else {
                zeilen.setC(null);
            }
            iC++;
        }
    }

    private void stopB(SpielZeile vorher, SpielZeile vorherVorher, List<Spiel> gruppenSpiele, SpielZeile zeilen) {
        boolean stopB = false;

        int iB = 0;
        while (!stopB) {

            Spiel tempSpiel = this.getNextSpiel(zeilen, gruppenSpiele, iB);

            if (tempSpiel == null) {
                break;
            }

            tempSpiel.setPlatz(PlatzEnum.B);
            zeilen.setB(tempSpiel);
            tempSpiel.setStart(zeilen.getStart());
            zeilen.setKonfliktText(null);
            zeilen.setPause(false);

            String ret = "";
            ret = val.validateSpielZeilen(vorher, vorherVorher, zeilen);

            if (ret == null || ret.equals("")) {

                helper.consumeSpiel(tempSpiel);
                gruppenSpiele.remove(tempSpiel);
                spielRepo.save(tempSpiel);
                stopB = true;
            } else {
                zeilen.setB(null);
            }
            iB++;
        }
    }

    private void behandleFinalspielzeilen() {

        List<Kategorie> kategorien = katRepo.findAll();
        Collections.sort(kategorien, new KategorieKlasseUndGeschlechtComperator());

        List<SpielZeile> finalspieleZeilen = spielzeilenRepo.findFinalSpielZeilen();
        List<SpielZeile> finalspieleZeilenGeaendert = new ArrayList<SpielZeile>();
        List<Spiel> spieleGeaendert = new ArrayList<Spiel>();

        boolean first = true;
        Spiel letztesFinale = null;

        for (Kategorie k : kategorien) {

            SpielZeile zeile = finalspieleZeilen.remove(0);

            if (first) {
                mergeKleinerFinalToSpielzeile(spieleGeaendert, k, zeile);
                first = false;
            } else {
                mergeKleinerFinalToSpielzeile(spieleGeaendert, k, zeile);
                mergeGrosserFinalToSpielzeile(spieleGeaendert, zeile, letztesFinale);
            }

            letztesFinale = k.getGrosserFinal();
            finalspieleZeilenGeaendert.add(zeile);

        }

        SpielZeile zeile = finalspieleZeilen.remove(0);
        mergeGrosserFinalToSpielzeile(spieleGeaendert, zeile, letztesFinale);
        finalspieleZeilenGeaendert.add(zeile);

        spielRepo.save(spieleGeaendert);
        spielzeilenRepo.save(finalspieleZeilenGeaendert);

    }

    private void mergeKleinerFinalToSpielzeile(List<Spiel> spieleGeaendert, Kategorie k, SpielZeile zeile) {
        // kleiner finale
        if (k.getKleineFinal() != null) {
            zeile.setB(k.getKleineFinal());
            k.getKleineFinal().setPlatz(PlatzEnum.B);
            k.getKleineFinal().setStart(zeile.getStart());

            spieleGeaendert.add(k.getKleineFinal());
        }
    }

    private void mergeGrosserFinalToSpielzeile(List<Spiel> spieleGeaendert, SpielZeile zeile, Spiel grosserFinal) {
        // grosser finale
        zeile.setA(grosserFinal);
        grosserFinal.setPlatz(PlatzEnum.A);
        grosserFinal.setStart(zeile.getStart());

        spieleGeaendert.add(grosserFinal);
    }

    private void behandleFinalspielzeilenAlt() {
        int i = 0;
        List<Spiel> finalSpiele = spielRepo.findFinalSpiel();

        List<SpielZeile> finalspieleZeilen = spielzeilenRepo.findFinalSpielZeilen();

        for (SpielZeile zeilen : finalspieleZeilen) {
            if (zeilen.isPause()) {
                continue;
            }

            try {
                zeilen.setA(finalSpiele.get(i));
                finalSpiele.get(i).setPlatz(PlatzEnum.A);
                finalSpiele.get(i).setStart(zeilen.getStart());
                spielRepo.save(finalSpiele.get(i));
                i++;

                zeilen = spielzeilenRepo.save(zeilen);
                zeilen.setB(finalSpiele.get(i));
                finalSpiele.get(i).setPlatz(PlatzEnum.B);
                finalSpiele.get(i).setStart(zeilen.getStart());
                spielRepo.save(finalSpiele.get(i));
                i++;
                spielzeilenRepo.save(zeilen);
            } catch (IndexOutOfBoundsException e) {
                LOG.info("index wurde ueberschritten Finalspiel");
            }
        }
    }

    private Spiel getNextSpiel(SpielZeile zeile, List<Spiel> gruppenSpiele, int iB) { // NOSONAR

        Spiel firstEgal = null;
        int ieg = 0;
        int ineg = 0;
        for (Spiel spiel : gruppenSpiele) {

            if (firstEgal == null
                    && spiel.getMannschaftA().getKategorie().getSpielwunsch() == SpielTageszeit.EGAL) {

                if (ieg == iB) {

                    // falls bereits spaeter als 16 uhr am Samstag, keine neue Kategorie mehr verplanen
                    if (isSamstagNachNeuekategoriesperre(zeile)) {
                        if (!helper.isFirstSpielInGruppe(spiel)) {
                            firstEgal = spiel;
                        }
                    } else {
                        firstEgal = spiel;
                    }
                }
                ieg++;
            }

            if (zeile.getSpieltageszeit() == spiel.getMannschaftA().getKategorie().getSpielwunsch()) {
                if (ineg == iB) {

                    // falls bereits spaeter als 16 uhr am Samstag, keine neue Kategorie mehr verplanen
                    if (isSamstagNachNeuekategoriesperre(zeile)) {
                        if (!helper.isFirstSpielInGruppe(spiel)) {
                            return spiel;
                        }
                    } else {
                        firstEgal = spiel;
                    }
                }
                ineg++;
            }
        }
        return firstEgal;
    }

    private boolean isSamstagNachNeuekategoriesperre(SpielZeile zeile) {
        DateTime start = new DateTime(zeile.getStart());
        return zeile.getSpieltageszeit() == SpielTageszeit.SAMSTAGNACHMITTAG && start.getHourOfDay() > 17;
    }

    private void removeUeberschuss(List<SpielZeile> zeilen) {

        List<SpielZeile> remove = new ArrayList<SpielZeile>();
        for (SpielZeile spielZeile : zeilen) {
            if (spielZeile.isPause()) {
                remove.add(spielZeile);
            } else {
                break;
            }
        }

        for (int i = zeilen.size() - 1; i > 0; i--) {
            if (zeilen.get(i).isPause()) {
                remove.add(zeilen.get(i));
            } else {
                break;
            }
        }

        spielzeilenRepo.delete(remove);

    }

}