ch.emad.business.schuetu.BusinessImpl.java Source code

Java tutorial

Introduction

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

Source

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

import ch.emad.business.schuetu.bus.BusControllerOut;
import ch.emad.business.schuetu.controller.resultate.ResultateVerarbeiter;
import ch.emad.business.schuetu.dropbox.DropboxConnector;
import ch.emad.business.schuetu.turnierimport.ImportHandler;
import ch.emad.business.schuetu.vorbereitung.helper.SpielzeilenValidator;
import ch.emad.business.schuetu.xls.FromXLSLoader2;
import ch.emad.business.schuetu.zeit.Zeitgeber;
import ch.emad.model.common.model.DBAuthUser;
import ch.emad.model.common.model.File;
import ch.emad.model.common.model.Text;
import ch.emad.model.schuetu.model.*;
import ch.emad.model.schuetu.model.comperators.KategorieNameComperator;
import ch.emad.model.schuetu.model.enums.SpielPhasenEnum;
import ch.emad.model.schuetu.model.enums.SpielTageszeit;
import ch.emad.persistence.common.DBAuthUserRepository;
import ch.emad.persistence.common.FileRepository;
import ch.emad.persistence.common.TextRepository;
import ch.emad.persistence.schuetu.repository.*;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.text.DecimalFormat;
import java.util.*;

/**
 * @author $Author: marthaler.worb@gmail.com $
 * @since 0.7
 */
@Component(value = "business")
public class BusinessImpl implements Business {

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

    private static final int MITTAG = 12;
    private static final int SEC_PRO_MINUTE = 60;

    private boolean initialized = false;

    @Autowired
    BusControllerOut outSender;

    @Autowired
    private MannschaftRepository mannschaftRepo;

    @Autowired
    private KategorieRepository kategorieRepo;

    @Autowired
    private PenaltyRepository penaltyRepo;

    @Autowired
    private SpielZeilenRepository spielzeilenRepo;

    @Autowired
    private SpielRepository spielRepository;

    @Autowired
    private SpielEinstellungenRepository2 spielEinstellungenRepo;

    @Autowired
    private SpielzeilenValidator val;

    @Autowired
    private ResultateVerarbeiter verarbeiter;

    @Autowired
    private Zeitgeber zeitgeber;

    @Autowired
    private FromXLSLoader2 xls;

    @Autowired
    private MannschaftRepository mannschaftsRepo;

    @Autowired
    private KorrekturRepository korrekturRepository;

    @Autowired
    private DBAuthUserRepository userRepository;

    @Autowired
    private FileRepository fileRepo;

    @Autowired
    private ImportHandler importHandler;

    @Autowired
    private TextRepository trepo;

    @Autowired
    private KontaktRepository krepo;

    @Autowired
    private PenaltyRepository prepo;

    @Autowired
    @Qualifier("dropboxConnector2")
    private DropboxConnector dropbox;

    @Autowired
    private AsyncAtachementLoader2 attachementLoader;

    final Set<String> schulhaeuser = new HashSet<String>();

    final Set<String> namen = new HashSet<String>();

    final Set<String> emails = new HashSet<String>();

    public BusinessImpl() {

    }

    @PostConstruct //NOSONAR
    private void init() {
        SpielEinstellungen einstellungen = getSpielEinstellungen();
        if (einstellungen != null && einstellungen.isStartJetzt()) {
            this.startClock();
        }

        // Zeitgeber initialisieren

        if (isDBInitialized()) {
            zeitgeber.sendPuls();
        } else {
            LOG.info("sende keinen puls, da db noch nicht initialisiert ist [01]");
        }

        // autocompletes aus db initialisieren
        final List<Mannschaft> mannschaften = getMannschaften();
        updateAutocompletesMannschaften(mannschaften);

    }

    /*
     * Update der Mannschafts autocomplete Sets
     */
    public void updateAutocompletesMannschaften(List<Mannschaft> mannschaften) {
        for (final Mannschaft mannschaft : mannschaften) {
            schulhaeuser.add(mannschaft.getSchulhaus());
            namen.add(mannschaft.getBegleitpersonName());
            namen.add(mannschaft.getCaptainName());
            emails.add(mannschaft.getBegleitpersonEmail());
            emails.add(mannschaft.getCaptainEmail());
        }
    }

    @Override
    public void updateAutocompletesMannschaft(Mannschaft mannschaft) {
        final List<Mannschaft> mannschaften = new ArrayList<Mannschaft>();
        mannschaften.add(mannschaft);
        updateAutocompletesMannschaften(mannschaften);
    }

    /*
     * (non-Javadoc)
     *
     * @see com.googlecode.madschuelerturnier.business.sdfdf#getSchulhausListe(java .lang.String)
     */
    public List<String> getSchulhausListe(final String query) {
        final Set<String> strings = new HashSet<String>();

        if (this.schulhaeuser.size() < 1) {
            updateAutocompletesMannschaften(getMannschaften());
        }

        for (final String schulhaus : this.schulhaeuser) {
            if (query == null || query.isEmpty() || schulhaus.toLowerCase().contains(query.toLowerCase())) {
                strings.add(schulhaus);
            }
        }

        return new ArrayList<String>(strings);
    }

    /*
    * (non-Javadoc)
    *
    * @see com.googlecode.madschuelerturnier.business.sdfdf#getSchulhausListe(java .lang.String)
    */
    public List<String> getEmailsListe(final String query) {
        final Set<String> strings = new HashSet<String>();

        if (emails.size() < 1) {
            this.updateAutocompletesMannschaften(getMannschaften());
        }

        for (final String mail : this.emails) {
            if (query == null || query.isEmpty() || mail.toLowerCase().contains(query.toLowerCase())) {
                strings.add(mail.toLowerCase());
            }
        }

        return new ArrayList<String>(strings);
    }

    /*
     * (non-Javadoc)
     *
     * @see com.googlecode.madschuelerturnier.business.sdfdf#getPersonenListe(java .lang.String)
     */
    public List<String> getPersonenListe(final String query) {
        final Set<String> strings = new HashSet<String>();

        if (namen.size() < 1) {
            this.updateAutocompletesMannschaften(getMannschaften());
        }

        for (final String name : namen) {
            if (query == null || query.isEmpty() || name.toLowerCase().contains(query.toLowerCase())) {
                strings.add(name);
            }
        }
        return new ArrayList<String>(strings);
    }

    /*
     * (non-Javadoc)
     *
     * @see com.googlecode.madschuelerturnier.business.sdfdf#getMannschaften()
     */
    public List<Mannschaft> getMannschaften() {

        final Iterable<Mannschaft> temp = this.mannschaftRepo.findAll();
        final List<Mannschaft> liste = new ArrayList<Mannschaft>();
        for (final Mannschaft mannschaft : temp) {
            liste.add(mannschaft);
        }
        return liste;
    }

    /*
     * (non-Javadoc)
     *
     * @see com.googlecode.madschuelerturnier.business.sdfdf#getKategorien()
     */
    public List<Kategorie> getKategorien() {
        final Iterable<Kategorie> temp = this.kategorieRepo.findAll();
        final List<Kategorie> liste = new ArrayList<Kategorie>();
        for (final Kategorie mannschaft : temp) {
            liste.add(mannschaft);
        }
        return liste;
    }

    /*
     * (non-Javadoc)
     *
     * @see com.googlecode.madschuelerturnier.business.sdfdf#getSpielEinstellungen()
     */
    public SpielEinstellungen getSpielEinstellungen() {
        SpielEinstellungen einstellungen = spielEinstellungenRepo.getEinstellungen();

        // einstellungen bereits im cache
        if (einstellungen != null) {

            if (verarbeiter.isFertig()) {
                einstellungen.setPhase(SpielPhasenEnum.G_ABGESCHLOSSEN);
                this.saveEinstellungen(einstellungen);
            }
        }
        return this.spielEinstellungenRepo.getEinstellungen();
    }

    public void setSpielEinstellungen(SpielEinstellungen einstellungenNeu) {
        saveEinstellungen(einstellungenNeu);
    }

    /*
     * (non-Javadoc)
     *
     * @see com.googlecode.madschuelerturnier.business.sdfdf#saveEinstellungen(com .googlecode.madschuelerturnier.model.helper.SpielEinstellungen)
     */
    public SpielEinstellungen saveEinstellungen(SpielEinstellungen einstellungenNeu) {

        if (einstellungenNeu == null) {
            return null;
        }

        if (verarbeiter.isFertig()) {
            einstellungenNeu.setPhase(SpielPhasenEnum.G_ABGESCHLOSSEN);
        }

        // spieldatum auf 0 Uhr zuruecksetzen
        DateTime time = new DateTime(einstellungenNeu.getStarttag());
        final int millis = time.getMillisOfDay();
        time = time.minusMillis(millis);
        einstellungenNeu.setStarttag(new Date(time.getMillis()));

        this.spielEinstellungenRepo.save(einstellungenNeu);

        return spielEinstellungenRepo.getEinstellungen();
    }

    public List<Kategorie> getKategorienMList() {
        final List<Kategorie> list = this.kategorieRepo.getKategorienMList();
        Collections.sort(list, new KategorieNameComperator());
        return list;
    }

    public List<Kategorie> getKategorienKList() {
        final List<Kategorie> list = this.kategorieRepo.getKategorienKList();
        Collections.sort(list, new KategorieNameComperator());
        return list;
    }

    public void toggleSpielwunschOnKategorie(final Long id) {
        final Kategorie k = this.kategorieRepo.findOne(id);
        final SpielTageszeit wunsch = k.getSpielwunsch();
        String spielwunsch = null;
        if (wunsch.equals(SpielTageszeit.EGAL)) {
            k.setSpielwunsch(SpielTageszeit.SAMSTAGMORGEN);
            spielwunsch = "morgen";
        } else if (wunsch.equals(SpielTageszeit.SAMSTAGMORGEN)) {
            k.setSpielwunsch(SpielTageszeit.SAMSTAGNACHMITTAG);
            spielwunsch = "nachmittag";
        } else if (wunsch.equals(SpielTageszeit.SAMSTAGNACHMITTAG)) {
            k.setSpielwunsch(SpielTageszeit.SONNTAGMORGEN);
            spielwunsch = "sonntag";
        }
        if (wunsch.equals(SpielTageszeit.SONNTAGMORGEN)) {
            k.setSpielwunsch(SpielTageszeit.EGAL);
            spielwunsch = "";
        }

        // nachfuehren der spielwunschhints auf den mannschaften der kategorie
        for (Mannschaft m : k.getMannschaften()) {
            m.setSpielWunschHint(spielwunsch);
            this.mannschaftRepo.save(m);
        }
        this.kategorieRepo.save(k);
    }

    public void manuelleZuordnungDurchziehen(final String mannschaftName, final String zielKategorieKey) {

        List<Kategorie> katListe;

        if (mannschaftName.toLowerCase().contains("m")) {
            katListe = this.getKategorienMList();
        } else {
            katListe = this.getKategorienKList();
        }

        Kategorie quelle = null;
        Kategorie ziel = null;

        Collections.sort(katListe, new KategorieNameComperator());

        Mannschaft verschieben = null;

        for (int i = 0; i < katListe.size(); i++) {
            final List<Mannschaft> mannschaften = katListe.get(i).getMannschaften();
            for (final Mannschaft mannschaft : mannschaften) {
                if (mannschaft.getName().equals(mannschaftName)) {
                    verschieben = mannschaft;
                    quelle = katListe.get(i);

                    if (zielKategorieKey.equals("+")) {
                        ziel = katListe.get(i + 1);
                    } else {
                        ziel = katListe.get(i - 1);
                    }

                }
            }
        }

        if (quelle == null) {
            BusinessImpl.LOG
                    .fatal("!!! bei mannschaftszuordnungs korrektur quelle nicht gefunden: " + mannschaftName);
        }

        quelle.getGruppeA().getMannschaften().remove(verschieben);
        if (verschieben != null) {
            verschieben.setGruppe(ziel.getGruppeA());
        }
        verschieben = this.mannschaftRepo.save(verschieben);
        if (ziel != null) {
            ziel.getGruppeA().getMannschaften().add(verschieben);
        }

        quelle = this.kategorieRepo.save(quelle);
        this.kategorieRepo.save(ziel);

        if ((quelle.getGruppeA().getMannschaften() == null) || (quelle.getGruppeA().getMannschaften().size() < 1)) {
            quelle.getGruppeA().setKategorie(null);
            this.kategorieRepo.delete(quelle);
        }

    }

    public List<SpielZeile> getSpielzeilen(final boolean sonntag) {

        List<SpielZeile> ret;
        if (!sonntag) {
            ret = this.spielzeilenRepo.findSpieleSamstag();

        } else {
            ret = this.spielzeilenRepo.findSpieleSonntag();
        }

        SpielZeile vorher = null;
        SpielZeile vorVorher = null;

        for (final SpielZeile spielZeile : ret) {
            this.val.validateSpielZeilen(vorher, vorVorher, spielZeile);
            vorVorher = vorher;
            vorher = spielZeile;
        }

        return ret;

    }

    public void initZeilen(final boolean sonntag) {

        DateTime start;

        List<SpielZeile> zeilen;

        BusinessImpl.LOG.info("date: starttag -->" + this.getSpielEinstellungen().getStarttag());
        final DateTime start2 = new DateTime(this.getSpielEinstellungen().getStart(),
                DateTimeZone.forID("Europe/Zurich"));
        BusinessImpl.LOG.info("date: starttag Europe/Zurich -->" + start2);

        if (!sonntag) {
            start = new DateTime(start2);

            zeilen = createZeilen(start, false);
        } else {
            start = new DateTime(start2);
            start = start.plusDays(1);
            zeilen = createZeilen(start, true);
        }

        BusinessImpl.LOG.info("-->" + zeilen);

        this.spielzeilenRepo.save(zeilen);

    }

    private List<SpielZeile> createZeilen(DateTime startIn, final boolean sonntag) {
        DateTime start = startIn;

        final int millis = start.getMillisOfDay();

        start = start.minusMillis(millis);

        start = start.plusHours(8);

        final DateTime end = start.plusHours(11);

        final List<SpielZeile> zeilen = new ArrayList<SpielZeile>();
        while (start.isBefore(end.getMillis())) {
            final SpielZeile zeile = new SpielZeile();

            if (start.getHourOfDay() == 8) {
                zeile.setPause(true);
            }

            if (start.getHourOfDay() == MITTAG) {
                zeile.setPause(true);
            }

            if ((start.getHourOfDay() > MITTAG) && sonntag) {
                zeile.setFinale(true);
            }

            // wunsch enum wird gesetzt um spaeter die kategorie gegenpruefen zu koennen
            if (sonntag && (start.getHourOfDay() <= MITTAG)) {
                zeile.setSpieltageszeit(SpielTageszeit.SONNTAGMORGEN);
            }
            if (!sonntag && (start.getHourOfDay() < MITTAG)) {
                zeile.setSpieltageszeit(SpielTageszeit.SAMSTAGMORGEN);
            }
            if (!sonntag && (start.getHourOfDay() > MITTAG)) {
                zeile.setSpieltageszeit(SpielTageszeit.SAMSTAGNACHMITTAG);
            }

            zeile.setStart(start.toDate());
            zeilen.add(zeile);

            final DateTimeZone zone = start.getZone();
            BusinessImpl.LOG.info("zone: " + zone + " date: " + start.toDate());

            zeile.setSonntag(sonntag);

            start = start.plusMinutes(
                    this.getSpielEinstellungen().getPause() + this.getSpielEinstellungen().getSpiellaenge());
        }
        return zeilen;
    }

    public void startClock() {

        if (this.getSpielEinstellungen().getPhase() == SpielPhasenEnum.E_SPIELBEREIT
                || this.getSpielEinstellungen().getPhase() == SpielPhasenEnum.F_SPIELEN) {
            if (this.getSpielEinstellungen().isStartJetzt()) {
                this.zeitgeber.startClock(null, null, 1);
            } else {
                this.zeitgeber.startClock(new DateTime(this.getSpielEinstellungen().getStart()),
                        new DateTime(this.getSpielEinstellungen().getStart()),
                        this.getSpielEinstellungen().getVerschnellerungsFaktor());
            }
            final SpielEinstellungen einst = this.getSpielEinstellungen();
            einst.setPhase(SpielPhasenEnum.F_SPIELEN);
            this.saveEinstellungen(einst);

        } else {
            BusinessImpl.LOG
                    .error("starten nicht moeglich, falsch phase: " + this.getSpielEinstellungen().getPhase());
        }

        this.zeitgeber.startGame(0, "nach neustart der clock");

    }

    public void stopClock() {

        this.zeitgeber.stopGame("stopSpiel wurde aufgerufen");

        final SpielEinstellungen einst = this.getSpielEinstellungen();
        einst.setPhase(SpielPhasenEnum.E_SPIELBEREIT);
        this.zeitgeber.stopClock();
        this.saveEinstellungen(einst);
        BusinessImpl.LOG.info("spiel angehalten ");

    }

    public void spielzeitEinholen(int seconds) {
        int effVerspaetung = this.zeitgeber.getVerspaetung();
        effVerspaetung = Math.abs(effVerspaetung);
        if (effVerspaetung < 1) {
            return;
        }

        if (effVerspaetung >= seconds) {
            this.zeitgeber.startGame(seconds, "einholung: " + seconds);
        } else {
            this.zeitgeber.startGame(effVerspaetung, "einholung effektiv: " + effVerspaetung);
        }

    }

    public String spielzeitVerspaetung() {
        int sekunden = Math.abs(this.zeitgeber.getVerspaetung());

        int rest = sekunden % SEC_PRO_MINUTE;
        int minuten = sekunden / SEC_PRO_MINUTE;

        DecimalFormat df2 = new DecimalFormat("00");

        return df2.format(minuten) + ":" + df2.format(rest);
    }

    public void resumeSpiel() {

        this.zeitgeber.startGame(0, "resumeSpiel wurde aufgerufen");

        final SpielEinstellungen einst = this.getSpielEinstellungen();
        einst.setPhase(SpielPhasenEnum.F_SPIELEN);
        this.saveEinstellungen(einst);
        BusinessImpl.LOG.info("spiel resumed ");

    }

    public List<Penalty> anstehendePenalty() {
        List<Penalty> alle = penaltyRepo.findAll();
        List<Penalty> result = new ArrayList<Penalty>();
        for (Penalty p : alle) {
            if (!p.isBestaetigt() && !p.isGespielt()) {
                result.add(p);
            }
        }
        return result;
    }

    public List<Penalty> gespieltePenalty() {
        List<Penalty> alle = penaltyRepo.findAll();
        List<Penalty> result = new ArrayList<Penalty>();
        for (Penalty p : alle) {
            if (!p.isBestaetigt() && p.isGespielt()) {
                result.add(p);
                // sofort zurueckgeben, weil immer nur ein eintrag in der liste erscheinen soll
                return result;
            }
        }
        return result;
    }

    public void penaltyEintragen(List<Penalty> list) {

        for (Penalty p : list) {
            if (p.getReihenfolge() != null && !p.getReihenfolge().isEmpty()) {

                if (p.isBestaetigt() && p.isGespielt()) {
                    continue;
                }

                if (p.getReihenfolge().equals(Penalty.getLeer())) {
                    continue;
                }

                p.setGespielt(true);
                p.setBestaetigt(true);
                p = this.penaltyRepo.save(p);

                this.verarbeiter.signalPenalty(p);

            }
        }
    }

    public List<Penalty> eingetragenePenalty() {
        List<Penalty> alle = penaltyRepo.findAll();
        List<Penalty> result = new ArrayList<Penalty>();
        for (Penalty p : alle) {
            if (p.isBestaetigt() && p.isGespielt()) {
                result.add(p);
            }
        }
        return result;
    }

    @Override
    public boolean isDBInitialized() {
        return spielEinstellungenRepo.isInitialized();
    }

    @Override
    public void initializeDB() {
        SpielEinstellungen einst = getSpielEinstellungen();
        if (einst != null) {
            BusinessImpl.LOG.info(
                    "achtung versuch spiel einstellungen zu initialisieren obwohl bereits in der db vorhanden ");
        } else {
            SpielEinstellungen eins = new SpielEinstellungen();
            this.spielEinstellungenRepo.save(eins);
        }
    }

    public void sendDumpToRemotes() {
        // todo !!! weg !!!
    }

    public void generateSpielFromXLS(byte[] xlsIn) {

        if (this.initialized) {
            LOG.info("generateSpielFromXLS: ist aber bereits initialisiert, mache nichts");
            return;
        }

        this.initialized = true;

        // Texte sichern
        List<Text> text2 = xls.convertXLSToTexte(xlsIn);
        trepo.save(text2);
        LOG.info("texte gespeicher: " + text2);

        // Mannschaften laden und updaten
        List<Mannschaft> mannschaftsliste = xls.convertXLSToMannschaften(xlsIn);
        for (Mannschaft m : mannschaftsliste) {
            m = mannschaftsRepo.save(m);
            LOG.info("mannschaft gespeicher: " + m);
        }

        // Korrekturen laden und updaten
        List<Korrektur> korrekturen = xls.convertXLSToKorrektur(xlsIn);
        for (Korrektur k : korrekturen) {
            korrekturRepository.save(k);
            LOG.info("korrektur gespeicher: " + k);
        }

        // Benutzer laden und updaten
        List<DBAuthUser> user = xls.convertXLSToDBAuthUsers(xlsIn);
        LOG.info("dbauthuser geladen: " + user.size());
        for (DBAuthUser u : user) {
            userRepository.save(u);
            LOG.info("dbauthuser gespeicher: " + u);
        }

        // Attachements laden und updaten
        List<File> attachements = xls.convertXLSToFiles(xlsIn);
        this.attachementLoader.loadfiles(attachements);

        // Penalty laden und updaten
        List<Penalty> penalty = xls.convertXLSToPenalty(xlsIn);
        if (penalty != null) {
            LOG.info("penaltys geladen: " + penalty.size());
        } else {
            LOG.info("penaltys geladen: KEINE");
        }

        for (Penalty p : penalty) {
            prepo.save(p);
            LOG.info("attachements gespeicher: " + p);
        }

        // Spiele laden und updaten
        List<Spiel> spiele = xls.convertXLSToSpiele(xlsIn);
        LOG.info("spiele geladen: " + spiele.size());
        // NICHT! spiele = spielRepository.save(spiele);
        importHandler.turnierHerstellen(spiele);

        // Kontakte laden und updaten
        List<Kontakt> kontakte = xls.convertXLSToKontakt(xlsIn);
        LOG.info("kontakte geladen: " + kontakte.size());
        krepo.save(kontakte);

        this.initializeDB();

    }

    @Override
    public void initializeDropbox(String file) {
        byte[] xls = dropbox.selectGame(file);
        if (xls == null) {
            this.initializeDB();
        } else {
            generateSpielFromXLS(xls);
        }
    }
}