de.thkwalter.jsf.converter.CSVConverter.java Source code

Java tutorial

Introduction

Here is the source code for de.thkwalter.jsf.converter.CSVConverter.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.jsf.converter;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

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

/**
 * Dieser Konverter konvertiert zwischen einer Zeichenketten im CSV-Format und einem Feld von {@link Vector2D}-Objekten.
 * Zwei Datenstze der Zeichenkette sind jeweils durch einen Zeilenumbruch getrennt. Jeder Datensatz besteht aus zwei
 * Datenfeldern, die durch ein Komma getrennt sind. Jedes Datenfeld besteht aus einem double-Wert.
 *
 * @author Th. K. Walter
 */
@FacesConverter("CSVConverter")
public class CSVConverter implements Converter {
    /*
     * Der Logger dieser Klasse.
     */
    private static Logger logger = Logger.getLogger(CSVConverter.class.getName());

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

    /**
     * Diese Methode konvertiert eine Zeichenketten im CSV-Format in ein Feld von {@link Vector2D}-Objekten. Zwei Datenstze 
     * der Zeichenkette sind jeweils durch einen Zeilenumbruch getrennt. Jeder Datensatz besteht aus zwei Datenfeldern, die 
     * durch ein Komma getrennt sind. Jedes Datenfeld besteht aus einem double-Wert.
     *  
     * @param facesContext Das Kontext-Objekt
     * @param uiComponent Die UI-Komponente, welche die Quelle der Zeichenkette ist.
     * @param eingabe Die Zeichenkette, die konvertiert werden soll.
     * 
     * @return Ein Feld von {@link Vector2D}-Objekten.
     *  
     * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext, javax.faces.component.UIComponent, 
     * java.lang.String)
     */
    @Override
    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String eingabe) {
        // Das Feld, das die Vektoren speichern soll, wird deklariert.
        Vector2D[] vektoren = null;

        try {
            // Die Zeichenkette wird in Zeilen zerlegt.
            String[] zeilen = eingabe.trim().split("\n");

            // Das Feld, das die Vektoren speichern soll, wird erzeugt.
            vektoren = new Vector2D[zeilen.length];

            // Einige Variablen und Referenzen werden deklariert.
            String[] datenfelder = null;
            double x = Double.NaN;
            double y = Double.NaN;

            // In dieser Schleife werden die einzelnen Zeilen in Vektoren umgewandelt.
            for (int i = 0; i < zeilen.length; i++) {
                // Die einzelnen Zeilen werden in Datenfelder zerlegt.
                datenfelder = zeilen[i].split(",");

                // Die Zeichenketten der Datenfelder werden in double-Werte umgewandelt.
                x = Double.parseDouble(datenfelder[0].trim());
                y = Double.parseDouble(datenfelder[1].trim());

                // Ein Vektor wird erzeugt und dem Feld der Vektoren hinzugefgt.
                vektoren[i] = new Vector2D(x, y);

                // Der Vektor wird protokolliert.
                CSVConverter.logger.fine(vektoren[i].toString());
            }
        }

        // Falls eine Ausnahme geworfen worden ist, wird diese behandelt.
        catch (Exception exception) {
            // Die Fehlermeldung fr den Entwickler wird erzeugt und protokolliert.
            String fehlermeldung = "Die eingegebene Zeichenkette (" + eingabe
                    + ") besitzt nicht das richtige Format!";
            CSVConverter.logger.log(Level.SEVERE, fehlermeldung);

            // Die Meldung fr die Oberflche und eine Ausnahme werden erzeugt und mit der Fehlermeldung fr den Benutzer
            // initialisiert.
            String jsfMeldung = "Die Messpunkte wurden nicht im korrekten Format eingegeben! "
                    + "Korrigieren Sie bitte das Format ihrer Eingabe.";
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, jsfMeldung, ""));
            ConverterException converterException = new ConverterException(jsfMeldung);

            // Die ConverterException wird geworfen.
            throw converterException;
        }

        // Das Feld, das die Vektoren speichert, wird zurckgegeben.
        return vektoren;
    }

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

    /**
     * Diese Methode konvertiert ein Feld von {@link Vector2D}-Objekten in eine Zeichenketten im CSV-Format. Zwei Datenstze 
     * der Zeichenkette sind jeweils durch einen Zeilenumbruch getrennt. Jeder Datensatz besteht aus zwei Datenfeldern, die 
     * durch ein Komma getrennt sind. Jedes Datenfeld besteht aus einem double-Wert.
     *  
     * @param facesContext Das Kontext-Objekt
     * @param uiComponent Die UI-Komponente, welche das Ziel der Zeichenkette ist.
     * @param vektoren Das bergebene Feld von {@link Vector2D}-Objekten.
     * 
     * @return Eine Zeichenketten im CSV-Format.
     * 
     * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, 
     * java.lang.Object)
     */
    @Override
    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object vektoren) {
        // Der StringBuffer wird mit einer leeren Zeichenkette initialisiert.
        StringBuffer stringBuffer = new StringBuffer("");

        try {
            // Falls das Feld nicht null ist, wird es konvertiert.
            if (vektoren != null) {
                // Das bergebene Object wird in ein Feld von Vector2D-Objekten umgewandelt.
                Vector2D[] punkte = (Vector2D[]) vektoren;

                // In dieser Schleife werden alle Vektoren zu einer Zeichenkette verknpft.
                for (Vector2D punkt : punkte) {
                    stringBuffer.append(punkt.getX()).append(", ").append(punkt.getY()).append("\n");
                }
            }
        }

        // Falls eine Ausnahme geworfen worden ist, wird diese behandelt.
        catch (Exception exception) {
            // Die Fehlermeldung wird erstellt und protokolliert.
            String fehlermeldung = "Das Feld der Vektoren kann nicht konvertiert werden! Fehlertext: "
                    + exception.getMessage();
            CSVConverter.logger.log(Level.SEVERE, fehlermeldung);

            // Eine ConverterException wird geworfen.
            throw new ConverterException(exception.getMessage());
        }

        // Die zusammengebaute Zeichenkette wird zurckgegeben.
        return stringBuffer.toString();
    }

}