de.thkwalter.et.ortskurve.OrtskurveController.java Source code

Java tutorial

Introduction

Here is the source code for de.thkwalter.et.ortskurve.OrtskurveController.java

Source

/**
 *  Copyright 2013 Th. K. Walter, Nrnberg.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package de.thkwalter.et.ortskurve;

import java.util.HashSet;
import java.util.logging.Logger;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.math3.geometry.euclidean.twod.Vector2D;

import de.thkwalter.et.schlupfbezifferung.SchlupfbezifferungModell;
import de.thkwalter.jsf.ApplicationRuntimeException;

/**
 * Diese Klasse ist der Controller der Ortskurvenberechnung.
 *
 * @author Th. Walter
 */
@RequestScoped
@ManagedBean(name = "ausgleichsproblem")
public class OrtskurveController {
    /*
     * Der Logger dieser Klasse.
     */
    private static Logger logger = Logger.getLogger(OrtskurveController.class.getName());

    /**
     * Das Frontend-Modell der Ortskurvenberechnung.
     */
    @ManagedProperty(value = "#{ortskurveModell}")
    private OrtskurveModell ortskurveModell;

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Diese Methode lst das Ausgleichsproblem und berechnet den Mittelpunkt und den Radius des Kreises.
     * 
     * @return <tt>null</tt>
     */
    public String problemLoesen() {
        try {
            // Die Daten des Frontend-Modells werden protokolliert.
            OrtskurveController.logger.info(this.ortskurveModell.toString());

            // Die Ortskurve und der Leerlaufpunkt werden berechnet.
            this.ortskurveBerechnenIntern();

            // Die Daten des Frontend-Modells werden protokolliert.
            OrtskurveController.logger.info(this.ortskurveModell.toString());
        }

        // Falls eine Ausnahme geworfen worden ist, wird diese in eine FacesMessage umgewandelt.
        catch (ApplicationRuntimeException exception) {
            // Die Ortskurve wird zurckgesetzt, um ihre Anzeige zu vermeiden.
            this.ortskurveModell.setOrtskurve(null);

            // Eine Fehlermeldung fr die Oberflche wird erstellt.
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR, exception.getMessage(), ""));

            // Der Nachrichtentext der Ausnahme wird protokolliert.
            OrtskurveController.logger.severe(exception.getMessage());
        }

        // Die Startseite wird wieder angezeigt.
        return null;
    }

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Die Ortskurve und der Leerlaufpunkt werden berechnet.
     */
    private void ortskurveBerechnenIntern() {
        // Der optimale Ausgleichskreis muss manuell zurckgesetzt werden, da er nicht jedesmal neu berechnet wird.
        this.ortskurveModell.setOptimalerAusgleichskreis(null);

        // Die Messpunkte werden aus dem Frontend-Modell gelesen.
        Vector2D[] messpunkte = this.ortskurveModell.getMesspunkte();

        // Die eingegebenen Messpunkte werden validiert.
        this.messpunkteValidieren(messpunkte);

        // Die Startparameter werden bestimmt.
        double[] startpunkt = Startpunktbestimmung.startpunktBerechnen(messpunkte);

        // Die Ortskurve wird bestimmt.    
        Ortskurve ortskurve = this.ortskurveBestimmen(messpunkte, startpunkt);

        // Die Ortskurve wird im Datenmodell gespeichert.
        this.ortskurveModell.setOrtskurve(ortskurve);

        // Falls der Mittelpunkt einen negativen Realteil besitzt, wird das Ausgleichsproblem noch einmal unter der Rand-
        // bedingung gelst, dass der Mittelpunkt auf der imaginren Achse liegt.
        if (ortskurve.getMittelpunktOrtskurve().getY() < 0) {
            // Der Startpunkt fr die Lsung des 2d-Ausgleichsproblems wird festgelegt.
            double[] startpunkt2d = new double[] { ortskurve.getMittelpunktOrtskurve().getX(),
                    ortskurve.getRadiusOrtskurve() };

            // Das 2d-Ausgleichsproblem word gelst.
            Ausgleichsproblem ausgleichsproblem = new Ausgleichsproblem(messpunkte);
            Ortskurve ortskurve2d = ausgleichsproblem.ausgleichsproblemLoesen(startpunkt2d,
                    Ausgleichsproblemtyp.ORTSKURVE_2d);

            // Die berechnete Ortskurve wird protokolliert.
            OrtskurveController.logger.info(ortskurve2d.toString());

            // Der optimale Ausgleichskreis mit negativem Realteil wird umgespeichert.
            this.ortskurveModell.setOptimalerAusgleichskreis(this.ortskurveModell.getOrtskurve());

            // Die Ortskurve mit Mittelpunkt auf der Imaginrachse wird im Frontend-Modell gespeichert.
            this.ortskurveModell.setOrtskurve(ortskurve2d);
        }

        // Die Daten der Grafik der Ortskurve werden berechnet.
        this.ortskurveModell.grafikdatenBerechnen();
    }

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Diese Methode speichert das bergebene Datenmodell der Ortskurve in diesem Objekt.
     * 
     * @param ortskurveModell Das Datenmodell der Ortskurve
     */
    public void setOrtskurveModell(OrtskurveModell ortskurveModell) {
        // Das Datenmodell der Ortskurve wird gespeichert.
        this.ortskurveModell = ortskurveModell;
    }

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Diese Methode gibt das Datenmodell der Ortskurvenberechnung zurck.
     * 
     * @return Das Datenmodell der Ortskurvenberechnung
     */
    public OrtskurveModell getOrtskurveModell() {
        // Das Datenmodell der Ortskurvenberechnung wird zurckgegeben.
        return this.ortskurveModell;
    }

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Diese Methode bestimmt die Ortskurve.
     * 
     * @param messpunkte Die Messpunkte
     * @param startpunkt Das erste Element ist die x-Komponente des Mittelpunkts, das zweite Element die y-Komponente des 
     * Mittelpunkts, das dritte Element der Radius.
     * 
     * @return Die Ortskurve
     */
    private Ortskurve ortskurveBestimmen(Vector2D[] messpunkte, double[] startpunkt) {
        // Die Referenz auf die Ortskurve wird deklariert.
        Ortskurve ortskurve = null;

        // Falls nur drei Messpunkte eingegeben worden sind, entspricht der Startpunkt der Lsung.
        if (messpunkte.length == 3) {
            ortskurve = new Ortskurve(new Vector2D(startpunkt[0], startpunkt[1]), startpunkt[2]);
        }

        // Falls mehr als drei Messpunkte eingegeben worden sind, muss die Lsung durch eine nicht-lineare 
        // Ausgleichsrechnung bestimmt werden.
        else {
            Ausgleichsproblem ausgleichsproblem = new Ausgleichsproblem(messpunkte);
            ortskurve = ausgleichsproblem.ausgleichsproblemLoesen(startpunkt, Ausgleichsproblemtyp.ORTSKURVE_3d);
        }

        // Die berechnete Ortskurve wird protokolliert.
        OrtskurveController.logger.info(ortskurve.toString());

        // Die berechnete Ortskurve wird zurckgegeben.
        return ortskurve;
    }

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Diese Methode validiert die eingegebenen Messpunkte. Falls die eingegebenen Messpunkte nicht valide sind, wird eine
     * Ausnahme geworfen.
     * 
     * @param messpunkte Die Messpunkte
     */
    private void messpunkteValidieren(Vector2D[] messpunkte) {
        // Alle Messpunkte werden in ein HashSet eingefgt.
        HashSet<Vector2D> messpunktSet = new HashSet<Vector2D>();
        for (Vector2D messpunkt : messpunkte) {
            messpunktSet.add(messpunkt);
        }

        // Falls die Anzahl der Punkte im HashSet kleiner ist als die Anzahl der eingegebenen Messpunkte, so wurden 
        // Messpunkte doppelt eingegeben. 
        if (messpunktSet.size() < messpunkte.length) {
            // Die Fehlermeldung fr den Entwickler wird erzeugt und protokolliert.
            String fehlermeldung = "Es wurden " + (messpunkte.length - messpunktSet.size()) + " Messpunkte doppelt "
                    + " eingegeben!";
            OrtskurveController.logger.severe(fehlermeldung);

            // Die Zeichenkette fr die Fehlermeldung wird deklariert.
            String jsfMeldung = "";

            // Falls nur ein Messpunkt doppelt eingegeben worden ist, ...
            if (messpunkte.length - messpunktSet.size() == 1) {
                // Die Zeichenkette fr die Fehlermeldung wird festgelegt.
                jsfMeldung = "Sie haben einen Messpunkt doppelt eingegeben! Entfernen Sie bitte den doppelt eingegebenen "
                        + "Messpunkt.";
            }

            // Falls mehrere Messpunkte doppelt eingegeben worden sind, ...
            else {
                // Die Zeichenkette fr die Fehlermeldung wird festgelegt.
                jsfMeldung = "Sie haben " + (messpunkte.length - messpunktSet.size()) + " Messpunkte "
                        + "doppelt eingegeben! Entfernen Sie bitte die doppelt eingegebenen Messpunkte.";
            }

            // Die Ausnahme wird erzeugt und geworfen.         
            throw new ApplicationRuntimeException(jsfMeldung);
        }
    }

    // =====================================================================================================================
    // =====================================================================================================================

    /**
     * Die Daten werden an die Ersatzschaltbildberechnung bergeben, anschlieend wird zur Ersatzschaltberechnung
     * weitergeleitet.
     * 
     * @return Die Zeichenkette "ersatzschaltbild"
     */
    public String schlupfbezifferungAufrufen() {
        // Der FacesContext wird gelesen.
        FacesContext facesContext = FacesContext.getCurrentInstance();

        // Das Datenmodell der Schlupfbezifferungbestimmung wird gelesen.
        SchlupfbezifferungModell schlupfbezifferungsModell = (SchlupfbezifferungModell) facesContext
                .getApplication()
                .evaluateExpressionGet(facesContext, "#{schlupfbezifferungModell}", SchlupfbezifferungModell.class);

        // Die bentigten Daten werden an das Datenmodell der Schlupfbezifferungbestimmung bergeben.
        schlupfbezifferungsModell.datenUebernehmen(this.ortskurveModell);

        // Die Zeichenkette, die zur Weiterleitung zur Ersatzschaltbildberechnung fhrt, wird zurckgegeben.
        return "schlupfbezifferung";
    }
}