dhbw.ka.mwi.businesshorizon2.ui.process.parameter.ParameterPresenter.java Source code

Java tutorial

Introduction

Here is the source code for dhbw.ka.mwi.businesshorizon2.ui.process.parameter.ParameterPresenter.java

Source

/*******************************************************************************
 * BusinessHorizon2
 *
 * Copyright (C) 
 * 2012-2013 Christian Gahlert, Florian Stier, Kai Westerholz,
 * Timo Belz, Daniel Dengler, Katharina Huber, Christian Scherer, Julius Hacker
 * 2013-2014 Marcel Rosenberger, Mirko Gpfrich, Annika Weis, Katharina Narlock, 
 * Volker Meier
 * 
 *
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package dhbw.ka.mwi.businesshorizon2.ui.process.parameter;

import java.util.Calendar;
import java.util.Iterator;
import java.util.SortedSet;

import javax.annotation.PostConstruct;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import com.mvplite.event.EventBus;
import com.mvplite.event.EventHandler;

import dhbw.ka.mwi.businesshorizon2.methods.AbstractDeterministicMethod;
import dhbw.ka.mwi.businesshorizon2.methods.AbstractStochasticMethod;
import dhbw.ka.mwi.businesshorizon2.services.proxies.ProjectProxy;
import dhbw.ka.mwi.businesshorizon2.ui.process.InvalidStateEvent;
import dhbw.ka.mwi.businesshorizon2.ui.process.ScreenPresenter;
import dhbw.ka.mwi.businesshorizon2.ui.process.ScreenSelectableEvent;
import dhbw.ka.mwi.businesshorizon2.ui.process.ShowErrorsOnScreenEvent;
import dhbw.ka.mwi.businesshorizon2.ui.process.ValidStateEvent;
import dhbw.ka.mwi.businesshorizon2.ui.process.ValidateContentStateEvent;
import dhbw.ka.mwi.businesshorizon2.ui.process.navigation.NavigationSteps;
import dhbw.ka.mwi.businesshorizon2.ui.process.parameter.ParameterViewInterface;

/**
 * Der Presenter fuer die Maske des Prozessschrittes zur Eingabe der Parameter.
 * 
 * @author Julius Hacker, Christian Scherer
 * 
 */

public class ParameterPresenter extends ScreenPresenter<ParameterViewInterface> {
    private static final long serialVersionUID = 1L;

    private static final Logger logger = Logger.getLogger("ParameterPresenter.class");

    @Autowired
    private EventBus eventBus;

    @Autowired
    private ProjectProxy projectProxy;

    private boolean iterationsValid;
    private boolean basisYearValid;
    private boolean periodsToForecastValid;
    private boolean periodsToForecast_deterministicValid; //Annika Weis
    private boolean relevantPastPeriodsValid;
    private boolean specifiedPastPeriodsValid;

    private boolean stochMethod;
    private boolean randomWalk;
    private boolean wienerProcess;
    private boolean timeSeries;

    private boolean detMethod;
    private boolean dcf;
    private boolean apv;

    private double cashFlowProbabilityOfRise;
    private double cashFlowStepRange;
    private double borrowedCapitalProbabilityOfRise;
    private double borrowedCapitalStepRange;

    private boolean firstCall;
    private boolean showError;

    private boolean cashFlowStepRangeValid;
    private boolean cashFlowProbabilityOfRiseValid;
    private boolean borrowedCapitalProbabilityOfRiseValid;
    private boolean borrowedCapitalStepRangeValid;

    private String errorMessageBasisYear;
    private String errorMessageCashFlowStepRange;
    private String errorMessageCashFlowProbabilityOfRise;
    private String errorMessageBorrowedCapitalStepRange;
    private String errorMessageBorrowedCapitalProbabilityOfRise;
    private String errorMessagePeriodsToForecast;
    private String errorMessagePeriodsToForecast_deterministic; //Annika Weis
    private String errorMessageSpecifiedPastPeriods;
    private String errorMessageRelevantPastPeriods;
    private String errorMessageIterations;

    private SortedSet<AbstractStochasticMethod> methods;
    private SortedSet<AbstractDeterministicMethod> methods_deterministic;//Annika Weis

    private Iterator<AbstractStochasticMethod> methodIterator;
    private Iterator<AbstractDeterministicMethod> method_deterministicIterator;//Annika Weis

    /**
     * Dies ist der Konstruktor, der von Spring nach der Initialierung der
     * Dependencies aufgerufen wird. Er registriert sich selbst als einen
     * EventHandler. Zudem werden die Validitaeten der Felder zunaechst auf
     * false gesetzt. Desweiteren wird der Wert der firstCall Variable auf true
     * gesetzt, sodass die erste Pruefung des screens noch keine Fehlermeldung
     * wirft, da der Benutzer den Screen auch noch nicht geoeffnet hat und die
     * showError Methode auf false. Letzere soll verhindern, dass schon bei
     * erstem Betreten des Screens der Benutzer von Fehlermeldungen 'erschlagen'
     * wird.
     * 
     * @author Julius Hacker, Christian SCherer
     */
    @PostConstruct
    public void init() {

        eventBus.addHandler(this);

        initializeErrorStrings();
        initializeVariableBooleans();

        firstCall = true;
        showError = false;

    }

    /**
     * Diese Methode initialisiert die Validitaetsvariablen der Eingabefelder.
     * Standardmaesig sind diese auf False gesetzt, damit leere Eingaben ebenso
     * zu einer Fehlermeldung fuehren. Ausnahmen sind jene Eingabefelder die 
     * einen Default Wert besitzen. Diese werden hier schon auf true gesetzt.
     * 
     * @author Christian Scherer
     */
    private void initializeVariableBooleans() {
        basisYearValid = false;
        periodsToForecastValid = false;
        cashFlowStepRangeValid = false;
        cashFlowProbabilityOfRiseValid = false;
        borrowedCapitalStepRangeValid = false;
        borrowedCapitalProbabilityOfRiseValid = false;

        iterationsValid = true;
        relevantPastPeriodsValid = true;
        specifiedPastPeriodsValid = true;

    }

    /**
     * Diese Methode initialisiert die Fehlermeldungen, die bei Falscheingabe
     * oder leer lassen der Felder angezeigt wird.
     * 
     * @author Christian Scherer
     */
    private void initializeErrorStrings() {
        errorMessageBasisYear = "Bitte geben Sie ein g\u00FCltiges Jahr an, jedoch gr\u00f6er als 1900. Beispiel: 2013";
        errorMessageCashFlowStepRange = "Bitte geben Sie die Schrittweite der Cashflows g\u00f6\u00dfrer oder gleich 0 an. Beispiel: 100000";
        errorMessageCashFlowProbabilityOfRise = "Bitte geben Sie die Wahrscheinlichkeit f\u00fcr steigende Cashflowentwicklung zwischen 0 und 100 an. Beispiel: 50";
        errorMessageBorrowedCapitalStepRange = "Bitte geben Sie die Schrittweite des Fremdkapital g\u00f6\u00dfrer oder gleich 0 an. Beispiel: 100000";
        errorMessageBorrowedCapitalProbabilityOfRise = "Bitte geben Sie die Wahrscheinlichkeit f\u00fcr steigende Fremdkapitalentwicklung zwischen 0 und 100 an. Beispiel: 50";
        errorMessagePeriodsToForecast = "Bitte geben Sie die Anzahl vorherzusehender Perioden in einer Ganzzahl gr\u00F6\u00DFer 0 an. Beispiel: 5";
        errorMessagePeriodsToForecast_deterministic = "Bitte geben Sie die Anzahl vorherzusehender Perioden (deterministische Verfahren) in einer Ganzzahl gr\u00F6\u00DFer 0 an. Beispiel: 5";
        errorMessageSpecifiedPastPeriods = "Bitte geben Sie die Anzahl der anzugebenden vergangenen Perioden in einer Ganzzahl gr\u00F6\u00DFer als 3 und als die Anzahl der einbezogenen vergangenen Perioden.";
        errorMessageRelevantPastPeriods = "Bitte geben Sie die Anzahl der relevanten vergangenen Perioden in einer Ganzzahl gr\u00F6\u00DFer 2 und kleiner als die Anzahl der angegebenen vergangenen Perioden an.";
        errorMessageIterations = "Bitte w\u00E4hlen Sie die Anzahl der Wiederholungen als Ganzzahl zwischen 1000 und 100000 an. Beispiel: 10000";
    }

    /**
     * Dies ist der Konstruktor, der von Spring nach der Initialierung der
     * Dependencies aufgerufen wird. Er registriert sich selbst als einen
     * EventHandler. Um zu pruefen welche Verfahren ausgewaehlt wurden, wird zum einen der Haken
     * am stochastischen Pfad ueberprueft und zum anderen die Haken an Zeitreihe,
     * Wiener Prozess und Random Walk. Je nach Vorbedingungen hier werden die 
     * Entsprechenden Felder durch die greyOut() Methode ausgegraut. Vor dem 
     * Ausgrauen werden jedoch noch die im Projekt-Objekt gespeicherten Werte 
     * gelesen und in die Felder gesetzt.
     * Desweiteren wird die firstCall Variable auf false gesetzt, sodass
     * ab jetzt bei jeder Validierungsanfrage alle Felder geprueft und ggf. als
     * unkorrekt mariert werden. Beim ersten Aufruf ist dies noch nicht
     * gewuenscht, da der Benutzer den Screen noch nicht geoffnet hatte. Als
     * letztes wird ein ScreenSelectable Event gefeuert, sodass gewaehrleistet
     * ist, dass der erste Durchgang zwar streng nach Reihenfloge geschieht,
     * danach aber jeder Screen frei angewaehlt werden kann.
     * 
     * 
     * @author Julius Hacker, Christian Scherer
     */
    @EventHandler
    public void onShowParameterScreen(ShowParameterViewEvent event) {

        getView().showParameterView();

        if (projectProxy.getSelectedProject().getBasisYear() == 0) {
            initializeBasisYear();
        }

        stochMethod = false;
        if (this.projectProxy.getSelectedProject().getProjectInputType() != null) {
            stochMethod = this.projectProxy.getSelectedProject().getProjectInputType().isStochastic();
        }

        //Annika Weis
        detMethod = false;
        if (this.projectProxy.getSelectedProject().getProjectInputType() != null) {
            detMethod = this.projectProxy.getSelectedProject().getProjectInputType().isDeterministic();
        }

        randomWalk = false;
        wienerProcess = false;
        timeSeries = false;
        methods = this.projectProxy.getSelectedProject().getMethods();
        methodIterator = methods.iterator();
        while (methodIterator.hasNext()) {
            AbstractStochasticMethod m = (AbstractStochasticMethod) methodIterator.next();
            if (m.getName().equals("Random Walk") && m.getSelected()) {
                randomWalk = true;
            } else if (m.getName().equals("Wiener Prozess") && m.getSelected()) {
                wienerProcess = true;
            } else if (m.getName().equals("Zeitreihenanalyse") && m.getSelected()) {
                timeSeries = true;
            }
        }

        /* 
         * Annika Weis
         * ausgewhlte deterministische Methoden berprfen
         */
        dcf = false;
        apv = false;
        methods_deterministic = this.projectProxy.getSelectedProject().getMethods_deterministic();
        method_deterministicIterator = methods_deterministic.iterator();
        while (method_deterministicIterator.hasNext()) {
            AbstractDeterministicMethod m_d = (AbstractDeterministicMethod) method_deterministicIterator.next();
            if (m_d.getName().equals("Flow-to-Equity (FTE)") && m_d.getSelected()) {
                dcf = true;
            } else if (m_d.getName().equals("Adjusted-Present-Value (APV)") && m_d.getSelected()) {
                apv = true;
            }
        }

        this.setValues();
        this.greyOut();
        firstCall = false;
        eventBus.fireEvent(new ScreenSelectableEvent(NavigationSteps.PARAMETER, true));

    }

    /**
     * In dieser Methode werden die Werte des Objekts (falls nicht null)
     * gelesen und in die Eingabefelder gesetzt.
     * 
     * @author Christian Scherer
     */
    private void setValues() {

        if (this.projectProxy.getSelectedProject().getBasisYear() != 0) {
            getView().setValueBasisYear("" + this.projectProxy.getSelectedProject().getBasisYear());
        }
        if (this.projectProxy.getSelectedProject().getPeriodsToForecast() != 0) {
            getView().setPeriodsToForecast("" + this.projectProxy.getSelectedProject().getPeriodsToForecast());
        }
        if (this.projectProxy.getSelectedProject().getIterations() != 0) {
            getView().setIterations("" + this.projectProxy.getSelectedProject().getIterations());
        }
        if (this.projectProxy.getSelectedProject().getSpecifiedPastPeriods() != 0) {
            getView()
                    .setSpecifiedPastPeriods("" + this.projectProxy.getSelectedProject().getSpecifiedPastPeriods());
        }
        if (this.projectProxy.getSelectedProject().getRelevantPastPeriods() != 0) {
            getView().setRelevantPastPeriods("" + this.projectProxy.getSelectedProject().getRelevantPastPeriods());
        }
        if (this.projectProxy.getSelectedProject().getCashFlowStepRange() != 0) {
            //Verhindern einer fehlerhaften Double-Konvertierung auf 4 Nachkommastellen genau
            getView().setCashFlowStepRange("" + (((double) Math
                    .round(10000 * (this.projectProxy.getSelectedProject().getCashFlowStepRange()))) / 10000));
        }
        if (this.projectProxy.getSelectedProject().getCashFlowProbabilityOfRise() != 0) {
            //Rueckumwandlung des 0-1 Werts zu einem 0-100 % Wert und verhindern einer fehlerhaften Double-Konvertierung auf 4 Nachkommastellen genau
            getView().setCashFlowProbabilityOfRise("" + (((double) Math
                    .round(10000 * (100 * this.projectProxy.getSelectedProject().getCashFlowProbabilityOfRise())))
                    / 10000));
        }
        if (this.projectProxy.getSelectedProject().getBorrowedCapitalStepRange() != 0) {
            //Verhindern einer fehlerhaften Double-Konvertierung auf 4 Nachkommastellen genau
            getView().setBorrowedCapitalStepRange("" + (((double) Math
                    .round(10000 * (this.projectProxy.getSelectedProject().getBorrowedCapitalStepRange())))
                    / 10000));
        }
        if (this.projectProxy.getSelectedProject().getBorrowedCapitalProbabilityOfRise() != 0) {
            //Rueckumwandlung des 0-1 Werts zu einem 0-100 % Wert und verhindern einer fehlerhaften Double-Konvertierung auf 4 Nachkommastellen genau
            getView().setBorrowedCapitalProbabilityOfRise("" + (((double) Math.round(
                    10000 * (100 * this.projectProxy.getSelectedProject().getBorrowedCapitalProbabilityOfRise())))
                    / 10000));
        }
        if (this.projectProxy.getSelectedProject().getPeriodsToForecast_deterministic() != 0) {
            getView().setPeriodsToForecast_deterministic(
                    "" + this.projectProxy.getSelectedProject().getPeriodsToForecast_deterministic());
        }

    }

    /**
     * In dieser Methode werden alle Eingabefelder auf Validitaet geprueft. Sie
     * wird auch von anderen Screens aufzurufen um sicherzustellen, dass bei
     * Aenderungen in anderen Screens diese Eingabe immer noch valide sind.
     * Falls der Screen nicht mehr valide ist, muss zudem geprueft werden welche
     * Felder nicht mehr gueltig sind und diese mit einem ComponentenError
     * (rotem Ausrufezeichen) markiert werden. Zudem wird der Sonderfall
     * behandelt, dass es der erste Aufruf ist, dann wird sofort true
     * zurueckgegeben, da der Nutzer noch nicht die Moeglichkeit hatte korrekte
     * Angaben einzugeben
     * 
     * @author Christian Scherer
     * @return Ob alle Validierungspruefungen der Eingabefelder positiv gelaufen
     *         verlaufen ist
     */
    @Override
    public boolean isValid() {

        boolean valid = true;

        if (firstCall) {
            return true;
        }

        if (!basisYearValid) {
            if (showError) {
                getView().setComponentError(true, "basisYear", errorMessageBasisYear);
            }
            valid = false;
        }

        //falls mindestens eine stochastische Methode aktiv
        if (stochMethod && (timeSeries || randomWalk || wienerProcess)) {
            if (!periodsToForecastValid) {
                if (showError) {
                    getView().setComponentError(true, "periodsToForecast", errorMessagePeriodsToForecast);
                }
                valid = false;
            }
            if (!iterationsValid) {
                if (showError) {
                    getView().setComponentError(true, "iterations", errorMessageIterations);
                }
                valid = false;
            }
        }

        //falls Zeitreihe aktiv
        if (timeSeries && stochMethod) {
            if (!relevantPastPeriodsValid) {
                if (showError) {
                    getView().setComponentError(true, "relevantPastPeriods", errorMessageRelevantPastPeriods);
                }
                valid = false;
            }
            if (!specifiedPastPeriodsValid) {
                if (showError) {
                    getView().setComponentError(true, "specifiedPastPeriods", errorMessageSpecifiedPastPeriods);
                }
                valid = false;
            }
        }

        //falls RandomWalk aktiv
        if (randomWalk && stochMethod) {
            if (!cashFlowStepRangeValid) {
                if (showError) {
                    getView().setComponentError(true, "cashFlowStepRange", errorMessageCashFlowStepRange);
                }
                valid = false;
            }
            if (!cashFlowProbabilityOfRiseValid) {
                if (showError) {
                    getView().setComponentError(true, "cashFlowProbabilityOfRise",
                            errorMessageCashFlowProbabilityOfRise);
                }
                valid = false;
            }
            if (!borrowedCapitalStepRangeValid) {
                if (showError) {
                    getView().setComponentError(true, "borrowedCapitalStepRange", errorMessageCashFlowStepRange);
                }
                valid = false;
            }
            if (!borrowedCapitalProbabilityOfRiseValid) {
                if (showError) {
                    getView().setComponentError(true, "borrowedCapitalProbabilityOfRise",
                            errorMessageCashFlowProbabilityOfRise);
                }
                valid = false;
            }
        }

        //falls mindestens eine deterministische Methode aktiv
        // TODO
        if (detMethod && (dcf || apv)) {
            if (!periodsToForecast_deterministicValid) {
                if (showError) {
                    getView().setComponentError(true, "periodsToForecast_deterministic",
                            errorMessagePeriodsToForecast_deterministic);
                }
                valid = false;
            }

        }

        return valid;
    }

    /**
     * Methode die sich nach der Auswahl der Iteration um die davon abhaengigen
     * Objekte kuemmert.  Konkret wird aus dem String des
     * Eingabefelds der Integer-Wert gezogen und geprueft ob der eingegebene
     * Wert groesser 1990 ist. Ist einer der beiden Kriterien nicht erfuellt wird
     * eine ClassCastException geworfen, die zu einer Fehlermeldung auf der
     * Benutzeroberflaecher fuehrt.
     * 
     * 
     * @author Christian Scherer
     * @param iterations
     *            Anzahl der ausgewaehlten Wiederholungen(Iterationen)
     */
    public void iterationChosen(String iterationsString) {

        int iterations;
        try {
            iterations = Integer.parseInt(iterationsString);
            if (iterations >= 1000 && iterations <= 100000) {
                iterationsValid = true;
                getView().setComponentError(false, "iterations", "");
                this.projectProxy.getSelectedProject().setIterations(iterations);
                logger.debug(
                        "Iterationen in Objekten gesetzt: " + this.projectProxy.getSelectedProject().getName());

            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            iterationsValid = false;
            getView().setComponentError(true, "iterations", errorMessageIterations);
            getView().showErrorMessage(errorMessageIterations);
            logger.debug("Keine gueltige Eingabe in Feld 'Wiederholungen'");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Auswahl der zu Vorherzusagenden Perioden um die
     * davon abhaengigen Objekte kuemmert. Konkret wird aus dem String des
     * Eingabefelds der Integer-Wert gezogen und geprueft ob der eingegebene
     * Wert groesser 0 ist. Ist einer der beiden Kriterien nicht erfuellt wird
     * eine ClassCastException geworfen, die zu einer Fehlermeldung auf der
     * Benutzeroberflaecher fuehrt.
     * 
     * @author Christian Scherer
     * @param numberPeriodsToForecast
     *            Anzahl der Perioden die in die Vorhergesagt werden sollen
     */
    public void numberPeriodsToForecastChosen(String periodsToForecast) {
        logger.debug("Anwender-Eingabe zu Perioden die vorherzusagen sind");

        int periodsToForecastInt;
        try {
            periodsToForecastInt = Integer.parseInt(periodsToForecast);
            if (periodsToForecastInt > 0) {
                periodsToForecastValid = true;
                getView().setComponentError(false, "periodsToForecast", "");
                this.projectProxy.getSelectedProject().setPeriodsToForecast(periodsToForecastInt);
                logger.debug("Anzahl Perioden die vorherzusagen sind in das Projekt-Objekten gesetzt");
            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            periodsToForecastValid = false;
            getView().setComponentError(true, "periodsToForecast", errorMessagePeriodsToForecast);
            getView().showErrorMessage(errorMessagePeriodsToForecast);
            logger.debug("Keine gueltige Eingabe in Feld 'Anzahl zu prognostizierender Perioden'");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    //Annika Weis
    /**
     * Methode die sich nach der Auswahl der zu Vorherzusagenden Perioden um die
     * davon abhaengigen Objekte kuemmert. Konkret wird aus dem String des
     * Eingabefelds der Integer-Wert gezogen und geprueft ob der eingegebene
     * Wert groesser 0 ist. Ist einer der beiden Kriterien nicht erfuellt wird
     * eine ClassCastException geworfen, die zu einer Fehlermeldung auf der
     * Benutzeroberflaecher fuehrt.
     * 
     * @author Christian Scherer
     * @param numberPeriodsToForecast
     *            Anzahl der Perioden die in die Vorhergesagt werden sollen
     */
    public void numberPeriodsToForecastChosen_deterministic(String periodsToForecast_deterministic) {
        logger.debug("Anwender-Eingabe zu deterministischen Perioden die vorherzusagen sind");

        int periodsToForecast_deterministicInt;
        try {
            periodsToForecast_deterministicInt = Integer.parseInt(periodsToForecast_deterministic);
            if (periodsToForecast_deterministicInt > 0) {
                periodsToForecast_deterministicValid = true;
                getView().setComponentError(false, "periodsToForecast_deterministic", "");
                this.projectProxy.getSelectedProject()
                        .setPeriodsToForecast_deterministic(periodsToForecast_deterministicInt);
                logger.debug("Anzahl Perioden die vorherzusagen sind in das Projekt-Objekten gesetzt");
            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            periodsToForecast_deterministicValid = false;
            getView().setComponentError(true, "periodsToForecast_deterministic",
                    errorMessagePeriodsToForecast_deterministic);
            getView().showErrorMessage(errorMessagePeriodsToForecast_deterministic);
            logger.debug(
                    "Keine gueltige Eingabe in Feld 'Anzahl zu prognostizierender Perioden' bei den deterministischen Verfahren");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Auswahl der anzugebenden vergangenen
     * Perioden um die davon abhaengigen Objekte kuemmert. Diese muessen laut
     * Fachkonzept groesser 3 Perioden betragen und groesser als die Anzahl
     * einbezogener Perioden sein
     * 
     * @author Marcel Rosenberger
     * @param specifiedPastPeriods
     *            die Anzahl der Perioden der Vergangenheit die angegeben werden mssen
     */
    public void specifiedPastPeriodsChosen(String specifiedPastPeriods) {
        logger.debug("Anwender-Eingabe zu anzugebenden Perioden der Vergangenheit ");

        int specifiedPastPeriodsInt;
        int relevantPastPeriodsInt;
        try {
            specifiedPastPeriodsInt = Integer.parseInt(specifiedPastPeriods);
            relevantPastPeriodsInt = this.projectProxy.getSelectedProject().getRelevantPastPeriods();
            if (specifiedPastPeriodsInt > 3 && specifiedPastPeriodsInt > relevantPastPeriodsInt) {
                specifiedPastPeriodsValid = true;
                getView().setComponentError(false, "specifiedPastPeriods", "");
                this.projectProxy.getSelectedProject().setSpecifiedPastPeriods(specifiedPastPeriodsInt);
                logger.debug("Anzahl anzugebender Vergangenheits-Perioden sind in das Projekt-Objekten gesetzt");
            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            specifiedPastPeriodsValid = false;
            getView().setComponentError(true, "specifiedPastPeriods", errorMessageSpecifiedPastPeriods);
            getView().showErrorMessage(errorMessageSpecifiedPastPeriods);
            logger.debug("Keine gueltige Eingabe in Feld 'Anzahl anzugebender, vergangener Perioden'");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Auswahl der zu beachtenenden vergangenen
     * Perioden um die davon abhaengigen Objekte kuemmert. Diese muessen laut
     * Fachkonzept groesser 2 Perioden betragen und kleiner als die 
     * Anzahl anzugebender Perioden sein.
     * 
     * @author Christian Scherer, Marcel Rosenberger
     * @param relevantPastPeriods
     *            die Anzahl der Perioden der Vergangenheit die einbezogen
     *            werden sollen
     */
    public void relevantPastPeriodsChosen(String relevantPastPeriods) {
        logger.debug("Anwender-Eingabe zu relevanter Perioden der Vergangenheit ");

        int relevantPastPeriodsInt;
        int specifiedPastPeriodsInt;
        try {
            relevantPastPeriodsInt = Integer.parseInt(relevantPastPeriods);
            specifiedPastPeriodsInt = this.projectProxy.getSelectedProject().getSpecifiedPastPeriods();
            if (relevantPastPeriodsInt > 2 && specifiedPastPeriodsInt > relevantPastPeriodsInt) {
                relevantPastPeriodsValid = true;
                getView().setComponentError(false, "relevantPastPeriods", "");
                this.projectProxy.getSelectedProject().setRelevantPastPeriods(relevantPastPeriodsInt);
                logger.debug("Anzahl relevanter Perioden der Vergangenheit sind in das Projekt-Objekten gesetzt");
            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            relevantPastPeriodsValid = false;
            getView().setComponentError(true, "relevantPastPeriods", errorMessageRelevantPastPeriods);
            getView().showErrorMessage(errorMessageRelevantPastPeriods);
            logger.debug("Keine gueltige Eingabe in Feld 'Anzahl einbezogener, vergangener Perioden'");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Auswahl des Basisjahrs um die davon abhaengigen
     * Objekte kuemmert. Wenn ein int Wert vorliegt wird geprueft ob es sich bei
     * der Eingegebenen Zahl um ein Jahr groesser dem aktuellen Jahr-1 handelt
     * 
     * @author Christian Scherer
     * @param basisYear
     *            das Basis-Jahr, auf das die Cashflows abgezinst werden
     */
    public void basisYearChosen(String basisYear) {
        logger.debug("Anwender-Eingabe zu relevanter Perioden der Vergangenheit ");

        int basisYearInt;
        try {
            basisYearInt = Integer.parseInt(basisYear);

            if (basisYearInt > 1900) {
                basisYearValid = true;
                getView().setComponentError(false, "basisYear", "");
                this.projectProxy.getSelectedProject().setBasisYear(basisYearInt);
                logger.debug("Basisjahr in das Projekt-Objekten gesetzt");
            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            basisYearValid = false;
            getView().setComponentError(true, "basisYear", errorMessageBasisYear);
            getView().showErrorMessage(errorMessageBasisYear);
            logger.debug("Keine gueltige Eingabe in Feld 'Wahl des Basisjahr'");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Aenderung des Wertes der Checkbox fuer die
     * Branchenstellvertreter um die weiter Logik kuemmert. Hier muesste nun die
     * Liste der Branchenvertreter aktiviert werden, die standardmaessig
     * ausgegrautist. Derzeit werden die Branchenvertreter jedoch nicht genutzt
     * und somit hier auch nicht weiter behandelt. Eine spaetere
     * ausimplementierung kann hier folgen
     * 
     * @author Christian Scherer
     * @param selected
     *            "true" wenn der Haken ausgewaehlt wurde, "false" wenn der
     *            Haken entfernt wurde
     */
    public void industryRepresentativeCheckBoxSelected(boolean selected) {
        if (selected) {
            // Liste aktivieren
        } else {
            // Liste deaktivieren
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Auswahl in der Liste der Branchenvertreter um
     * die weiter Logik kuemmert. Derzeit nicht genutzt - kann jedoch spaeter
     * hier ausprogrammiert werden.
     * 
     * @author Christian Scherer
     * @param selected
     *            String mit Namen des gewaehlten Branchenvertreters
     */
    public void industryRepresentativeListItemChosen(String selected) {
        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Auswahl der Schrittgroesse fuer die Cashflows
     * kuemmert. Konkret wird aus dem String des Eingabefelds der Double-Wert
     * gezogen und geprueft ob dieser groesser 0 ist. Falls nicht wird eine
     * ClassCastException geworfen, die eine Fehlermeldung auf der
     * Benutzeroberflaecher angezeigt und ein ComponentError generiert.
     * 
     * @author Christian Scherer
     * @param cashFlowStepRangeString
     *            Schrittgre der Cashflows fuer die RandomWalk Methode
     */
    public void cashFlowStepRangeChosen(String cashFlowStepRangeString) {
        logger.debug("Anwender-Eingabe zu Schrittweite Cashflow");

        try {
            cashFlowStepRange = Double.parseDouble(cashFlowStepRangeString);
            if (cashFlowStepRange >= 0) {
                cashFlowStepRangeValid = true;
                getView().setComponentError(false, "cashFlowStepRange", "");
                this.projectProxy.getSelectedProject().setCashFlowStepRange(this.cashFlowStepRange);
                logger.debug("Schrittweite des Cashflows in das Projekt-Objekten gesetzt");
            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            cashFlowStepRangeValid = false;
            getView().setComponentError(true, "cashFlowStepRange", errorMessageCashFlowStepRange);
            getView().showErrorMessage(errorMessageCashFlowStepRange);
            logger.debug("Keine gueltige Eingabe in Feld 'Schrittweite Cashflows'");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Auswahl der Wahrscheinlichkeit fuer eine
     * positive Cashflows-Entwicklung kuemmert. Konkret wird aus dem String des
     * Eingabefelds der Double-Wert gezogen und geprueft ob der Wert zwischen 0
     * und 100 liegt. Vor der Uebergabe wird der uebergebene an das Project-Objekt
     * wird der Wert noch durch 100 geteilt, da die Rechenlogig mit einem 
     * Wert zwischen 0 und 1 arbeitet. Falls nicht wird eine ClassCastException 
     * geworfen, die eine Fehlermeldung auf der Benutzeroberflaecher angezeigt und ein
     * ComponentError generiert. 
     * 
     * @author Christian Scherer
     * @param cashFlowProbabilityOfRiseString
     *            Wahrscheinlichkeit fuer eine positive Cashflows-Entwicklung
     *            fuer die RandomWalk Methode
     */
    public void cashFlowProbabilityOfRiseChosen(String cashFlowProbabilityOfRiseString) {
        logger.debug("Anwender-Eingabe zu Wahrscheinlichkeit f\u00fcr steigende Cashflowentwicklung");

        try {
            cashFlowProbabilityOfRise = Double.parseDouble(cashFlowProbabilityOfRiseString);
            if (cashFlowProbabilityOfRise >= 0 && cashFlowProbabilityOfRise <= 100) {
                cashFlowProbabilityOfRiseValid = true;
                getView().setComponentError(false, "cashFlowProbabilityOfRise", "");
                this.projectProxy.getSelectedProject()
                        .setCashFlowProbabilityOfRise((this.cashFlowProbabilityOfRise / 100));
                logger.debug(
                        "Wahrscheinlichkeit f\u00fcr steigende Cashflowentwicklung in das Projekt-Objekten gesetzt");
            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            cashFlowProbabilityOfRiseValid = false;
            getView().setComponentError(true, "cashFlowProbabilityOfRise", errorMessageCashFlowProbabilityOfRise);
            getView().showErrorMessage(errorMessageCashFlowProbabilityOfRise);
            logger.debug(
                    "Keine gueltige Eingabe in Feld 'Wahrscheinlichkeit f\u00fcr steigende Cashflowentwicklung");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Auswahl der Schrittgroesse fuer das
     * Fremdkapital kuemmert. Konkret wird aus dem String des Eingabefelds der
     * Double-Wert gezogen und ueberprueft ob dieser groesser oder gleich 0 ist.
     * Falls nicht wird eine ClassCastException geworfen, die eine Fehlermeldung
     * auf der Benutzeroberflaecher angezeigt und ein ComponentError generiert.
     * 
     * @author Christian Scherer
     * @param cashFlowStepRangeString
     *            Schrittgre das Fremdkapital fuer die RandomWalk Methode
     */
    public void borrowedCapitalStepRangeChosen(String borrowedCapitalStepRangeString) {
        logger.debug("Anwender-Eingabe zu Schrittweite Cashflow");

        try {
            borrowedCapitalStepRange = Double.parseDouble(borrowedCapitalStepRangeString);
            if (borrowedCapitalStepRange >= 0) {
                borrowedCapitalStepRangeValid = true;
                getView().setComponentError(false, "borrowedCapitalStepRange", "");
                this.projectProxy.getSelectedProject().setBorrowedCapitalStepRange(this.borrowedCapitalStepRange);
                logger.debug("Schrittweite des Fremdkapital in das Projekt-Objekten gesetzt");
            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            borrowedCapitalStepRangeValid = false;
            getView().setComponentError(true, "borrowedCapitalStepRange", errorMessageBorrowedCapitalStepRange);
            getView().showErrorMessage(errorMessageBorrowedCapitalStepRange);
            logger.debug("Keine gueltige Eingabe in Feld 'Schrittweite Fremdkapital'");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich nach der Auswahl der Wahrscheinlichkeit fuer eine
     * positive Fremdkapitalentwicklung kuemmert. Konkret wird aus dem String
     * des Eingabefelds der Double-Wert gezogen und geprueft ob der Wert
     * zwischen 0 und 100 liegt. Vor der Uebergabe wird der uebergebene an das 
     * Project-Objekt wird der Wert noch durch 100 geteilt, da die Rechenlogig 
     * mit einem Wert zwischen 0 und 1 arbeitet. Falls nicht wird eine ClassCastException
     * geworfen, die eine Fehlermeldung auf der Benutzeroberflaecher angezeigt
     * und ein ComponentError generiert.
     * 
     * @author Christian Scherer
     * @param borrowedCapitalProbabilityOfRiseString
     *            Wahrscheinlichkeit fuer eine positive Fremdkapitalentwicklung
     *            fuer die RandomWalk Methode
     */
    public void borrowedCapitalProbabilityOfRiseChosen(String borrowedCapitalProbabilityOfRiseString) {
        logger.debug("Anwender-Eingabe zu Wahrscheinlichkeit f\u00fcr steigende Fremdkapitalentwicklung");

        try {
            borrowedCapitalProbabilityOfRise = Double.parseDouble(borrowedCapitalProbabilityOfRiseString);
            if (borrowedCapitalProbabilityOfRise >= 0 && borrowedCapitalProbabilityOfRise <= 100) {
                borrowedCapitalProbabilityOfRiseValid = true;
                getView().setComponentError(false, "borrowedCapitalProbabilityOfRise", "");
                this.projectProxy.getSelectedProject()
                        .setBorrowedCapitalProbabilityOfRise((this.borrowedCapitalProbabilityOfRise / 100));
                logger.debug(
                        "Wahrscheinlichkeit f\u00fcr steigende Fremdkapitalentwicklung in das Projekt-Objekten gesetzt");
            } else {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException nfe) {
            borrowedCapitalProbabilityOfRiseValid = false;
            getView().setComponentError(true, "borrowedCapitalProbabilityOfRise",
                    errorMessageBorrowedCapitalProbabilityOfRise);
            getView().showErrorMessage(errorMessageBorrowedCapitalProbabilityOfRise);
            logger.debug(
                    "Keine gueltige Eingabe in Feld 'Wahrscheinlichkeit f\u00fcr steigende Fremdkapitalentwicklung");
        }

        eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * Methode die sich um das Ausgrauen unrelevanter Komponenten. In unserem
     * Fall die Branchenstellvertreter und Wiener Prozess, die noch nicht implementiert 
     * sind. Zusaetzlich muessen je nach Eingabe die nicht ausgewaehlten Bereiche 
     * ausgegraut werden. Beim ausgrauen sind ggf. gesetzete ComponentErrors aufzuheben
     * 
     * @author Christian Scherer
     * 
     */
    public void greyOut() {
        //Branchenvertreter ausgrauen
        //getView().activateCheckboxIndustryRepresentative(false);
        //getView().activateComboBoxRepresentatives(false);
        /**
        //Wienerprozess ausgrauen
        getView().activateRiseOfPeriods(false);
        getView().activateRiseOfPeriodsCheckbox(false);
        getView().activateDeviation(false);
        getView().activateDeviationCheckbox(false);
        //Bisher nicht verwendetes Feld
        getView().activateStepsPerPeriod(false);
        getView().activateStepRange(false);
        getView().activateProbability(false);
        getView().activateCalculateStepRange(false);
        */

        //Keine Stochastische Methode aktiv / mindestens eine aktiv
        if (!stochMethod) {
            getView().activatePeriodsToForecast(false);
            getView().activateIterations(false);
            getView().setComponentError(false, "iterations", null);
            getView().setComponentError(false, "periodsToForecast", null);
        } else {
            getView().activatePeriodsToForecast(true);
            getView().activateIterations(true);
        }

        //Zeitreihe nicht aktiv / aktiv
        if (!stochMethod || !timeSeries) {
            getView().activateRelevantPastPeriods(false);
            getView().activateSpecifiedPastPeriods(false);
            getView().setComponentError(false, "relevantPastPeriods", null);
            getView().setComponentError(false, "specifiedPastPeriods", null);
        } else {
            getView().activateRelevantPastPeriods(true);
            getView().activateSpecifiedPastPeriods(true);
        }

        /**
        //RandomWalk nicht aktiv / aktiv
        if(!stochMethod||!randomWalk){
           getView().activateCashFlowStepRang(false);
           getView().activateCashFlowProbabilityOfRise(false);
           getView().activateBorrowedCapitalProbabilityOfRise(false);
           getView().activateBorrowedCapitalStepRange(false);
           getView().setComponentError(false, "borrowedCapitalProbabilityOfRise", null);
           getView().setComponentError(false, "borrowedCapitalStepRange", null);
           getView().setComponentError(false, "cashFlowStepRange", null);
           getView().setComponentError(false, "cashFlowProbabilityOfRise", null);
            
               
        } else {
           getView().activateCashFlowStepRang(true);
           getView().activateCashFlowProbabilityOfRise(true);
           getView().activateBorrowedCapitalProbabilityOfRise(true);
           getView().activateBorrowedCapitalStepRange(true);
        }
         */

        //Annika Weis
        //Keine deterministische Methode aktiv / mindestens eine aktiv
        if (!detMethod) {
            getView().activatePeriodsToForecast_deterministic(false);
            getView().setComponentError(false, "iterations", null);
            getView().setComponentError(false, "periodsToForecast_deterministic", null);
        } else {
            getView().activatePeriodsToForecast_deterministic(true);
        }
    }

    /**
     * Initialisiert das Basisjahr mit dem aktuellem Jahr-1
     * 
     * @author Christian Scherer
     * 
     */
    public void initializeBasisYear() {
        Calendar now = Calendar.getInstance();
        getView().setValueBasisYear("" + (now.get(Calendar.YEAR) - 1));
        basisYearValid = true;
        logger.debug("Initialjahr " + (now.get(Calendar.YEAR) - 1) + " gesetzt.");

    }

    /**
     * 
     * Eventhandler der zuerst prueft ob sich Vorbedingungen geaendert haben,
     * die Auswierkungen auf den ParameterScreen haben. Daraufhin wird geprueft
     * ob es sich um den ersten Aufruf handelt, also der Anwender noch keine
     * Moeglichkeit hatte die Felder korrekt zu befuellen. Ist dem so wird der
     * Screen noch als valide gewertet. Erst nach dem ersten Aufrufen des
     * Screens wird dann die Pruefung bei falschen Eintraegen auch ein Invalid
     * Event feuern.
     * 
     * @author Christian Scherer
     */
    @Override
    @EventHandler
    public void validate(ValidateContentStateEvent event) {

        stochMethod = false;
        if (this.projectProxy.getSelectedProject().getProjectInputType() != null) {
            stochMethod = this.projectProxy.getSelectedProject().getProjectInputType().isStochastic();
        }

        randomWalk = false;
        wienerProcess = false;
        timeSeries = false;
        methods = this.projectProxy.getSelectedProject().getMethods();
        methodIterator = methods.iterator();
        while (methodIterator.hasNext()) {
            AbstractStochasticMethod m = (AbstractStochasticMethod) methodIterator.next();
            if (m.getName().equals("Random Walk") && m.getSelected()) {
                randomWalk = true;
            } else if (m.getName().equals("Wiener Prozess") && m.getSelected()) {
                wienerProcess = true;
            } else if (m.getName().equals("Zeitreihenanalyse") && m.getSelected()) {
                timeSeries = true;
            }
        }

        if (!firstCall && !isValid()) {
            eventBus.fireEvent(new InvalidStateEvent(NavigationSteps.PARAMETER, showError));
            logger.debug("Parameter not valid, InvalidStateEvent fired");
        } else {
            eventBus.fireEvent(new ValidStateEvent(NavigationSteps.PARAMETER));
            logger.debug("Parameter valid, ValidStateEvent fired");
        }
    }

    /**
     * 
     * Eventhandler der zuerst prueft ob dieser Screen her angesprochen wird.
     * Falls ja soll die showError auf true gesetzt werden, die ermoeglicht,
     * dass die Fehlermeldungen in der isValid-Methode angezeigt werden.
     * 
     * @author Christian Scherer
     */
    @Override
    @EventHandler
    public void handleShowErrors(ShowErrorsOnScreenEvent event) {
        if (event.getStep() == NavigationSteps.PARAMETER) {
            showError = true;
        }
    }

    /**
     * Methode die sich nach der Auswahl der Schritte pro Periode
     * um die davon abhaengigen Objekte kuemmert. Derzeit nicht in 
     * Benutzung
     * 
     * @author Christian Scherer
     * @param relevantPastPeriods
     *            die Anzahl der Perioden der Vergangenheit die einbezogen
     *            werden sollen
     */
    public void stepsPerPeriodChosen(String stepsPerPeriodString) {

        //      int stepsPerPeriod;
        //      try {
        //         stepsPerPeriod = Integer.parseInt(stepsPerPeriodString);
        //
        //         if (stepsPerPeriod > 0) {
        //            stepsPerPeriodValid = true;
        //            getView().setComponentError(false, "stepsPerPeriod", "");
        //            this.projectProxy.getSelectedProject().setStepsPerPeriod(
        //                  stepsPerPeriod);
        //            logger.debug("Schritte pro Periode in das Projekt-Objekten gesetzt");
        //         } else {
        //            throw new NumberFormatException();
        //         }
        //      } catch (NumberFormatException nfe) {
        //         stepsPerPeriodValid = false;
        //         getView()
        //               .setComponentError(
        //                     true,
        //                     "stepsPerPeriod", errorMessageStepsPerPeriod);
        //         getView()
        //               .showErrorMessage(errorMessageStepsPerPeriod);
        //         logger.debug("Keine gueltige Eingabe in Feld 'Schritte pro Periode'");
        //      }
        //
        //      eventBus.fireEvent(new ValidateContentStateEvent());
    }

    /**
     * 
     * Derzeit noch nicht im Einsatz und daher auch nicht ausprogrammiert.
     * 
     * @author Christian Scherer
     */
    public void riseOfPeriodsCheckBoxSelected(boolean booleanValue) {

    }

    /**
     * 
     * Derzeit noch nicht im Einsatz und daher auch nicht ausprogrammiert.
     * 
     * @author Christian Scherer
     */
    public void riseOfPeriodsChosen(String value) {

    }

    /**
     * 
     * Derzeit noch nicht im Einsatz und daher auch nicht ausprogrammiert.
     * 
     * @author Christian Scherer
     */
    public void deviationOfPeriodsCheckBoxSelected(boolean booleanValue) {

    }

    /**
     * 
     * Derzeit noch nicht im Einsatz und daher auch nicht ausprogrammiert.
     * 
     * @author Christian Scherer
     */
    public void deviationChosen(String value) {

    }

    /**
     * 
     * Derzeit noch nicht im Einsatz und daher auch nicht ausprogrammiert.
     * 
     * @author Christian Scherer
     * @param calculateStepRange
     *             Ob das Errechnen der Schrittweise automatisch (=true) oder 
     *           nicht (false) geschehen soll
     */
    public void calculateStepRangeCheckBoxSelected(boolean calculateStepRange) {

    }

    /**
     * 
     * Derzeit noch nicht im Einsatz und daher auch nicht ausprogrammiert.
     * 
     * @author Christian Scherer
     * @param probabiltiyString
     *             Eingegebene Wahrscheinlichkeit
     */
    public void probablityChosen(Object probabiltiyString) {

    }

    /**
     * 
     * Derzeit noch nicht im Einsatz und daher auch nicht ausprogrammiert.
     * 
     * @author Christian Scherer
     * @param steRangeString
     *             Eingegebene Schrittweite
     */
    public void StepRangeChosen(String stepRangeString) {

    }
}