view src/main/java/de/intevation/lada/exporter/laf/LafCreator.java @ 609:093bfdcdb09c

Added exporter impl. for laf file format.
author Raimund Renkert <raimund.renkert@intevation.de>
date Thu, 16 Apr 2015 15:48:27 +0200
parents
children 427db9da89b9
line wrap: on
line source
package de.intevation.lada.exporter.laf;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import de.intevation.lada.exporter.Creator;
import de.intevation.lada.model.land.LKommentarM;
import de.intevation.lada.model.land.LKommentarP;
import de.intevation.lada.model.land.LMessung;
import de.intevation.lada.model.land.LMesswert;
import de.intevation.lada.model.land.LOrt;
import de.intevation.lada.model.land.LProbe;
import de.intevation.lada.model.land.LZusatzWert;
import de.intevation.lada.model.land.ProbeTranslation;
import de.intevation.lada.util.annotation.RepositoryConfig;
import de.intevation.lada.util.data.QueryBuilder;
import de.intevation.lada.util.data.Repository;
import de.intevation.lada.util.data.RepositoryType;
import de.intevation.lada.util.rest.Response;

/**
 * This creator produces a LAF conform String containing all information about
 * a single {@link LProbe} object including subobjects like
 * {@link LMessung}, {@link LMesswert}, {@link LKommentarP}...
 *
 * @author <a href="mailto:rrenkert@intevation.de">Raimund Renkert</a>
 */
@Named("lafcreator")
public class LafCreator
implements Creator
{
    @Inject
    private Logger logger;

    @Inject
    @RepositoryConfig(type=RepositoryType.RO)
    private Repository repository;

    /**
     * Create the LAF conform String.
     *
     * @param probeId   The {@link LProbe} id.
     */
    @Override
    public String create(String probeId) {
        String lafProbe = "%PROBE%\n";
        lafProbe += probeToLAF(probeId);
        return lafProbe;
    }

    /**
     * Find the {@link LProbe} object and produce the LAF conform string.
     * @param probeId The {@link LProbe} id.
     * @return LAF conform string.
     */
    private String probeToLAF(String probeId) {
        Response found = repository.getById(LProbe.class, Integer.valueOf(probeId), "land");
        if (found.getData() == null) {
            return null;
        }
        LProbe aProbe = (LProbe)found.getData();
        String lafProbe = writeAttributes(aProbe);
        return lafProbe;
    }

    /**
     * Write the attributes and subobjects.
     *
     * @param probe The {@link LProbeInfo} object.
     * @return LAF conform string.
     */
    private String writeAttributes(LProbe probe) {
        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
        QueryBuilder<LKommentarP> kommBuilder =
            new QueryBuilder<LKommentarP>(
                repository.entityManager("land"), LKommentarP.class);
        kommBuilder.and("probeId", probe.getId());
        Response kommentar = repository.filter(kommBuilder.getQuery(), "land");
        List<LKommentarP> kommentare = (List<LKommentarP>)kommentar.getData();

        String nativeQuery = "select probenart from stammdaten.probenart where id= '";
        nativeQuery += probe.getProbenartId() + "'";
        Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
        List<String> result = query.getResultList();
        String probenart = result.get(0);//[0].toString();

        QueryBuilder<LZusatzWert> zusatzBuilder =
            new QueryBuilder<LZusatzWert>(
                repository.entityManager("land"), LZusatzWert.class);
        zusatzBuilder.and("probeId", probe.getId());
        Response zusatz = repository.filter(zusatzBuilder.getQuery(), "land");
        List<LZusatzWert> zusatzwerte = (List<LZusatzWert>)zusatz.getData();

        QueryBuilder<ProbeTranslation> transBuilder =
            new QueryBuilder<ProbeTranslation>(
                repository.entityManager("land"), ProbeTranslation.class);
        transBuilder.and("probe", probe.getId());
        Response trans = repository.filter(transBuilder.getQuery(), "land");
        List<ProbeTranslation> translation = (List<ProbeTranslation>)trans.getData();
        String laf = "";
        laf += probe.getDatenbasisId() == null ?
            "": lafLine("DATENBASIS_S", probe.getDatenbasisId().toString());
        laf += probe.getNetzbetreiberId() == null ?
            "" : lafLine("NETZKENNUNG", probe.getNetzbetreiberId());
        laf += probe.getMstId() == null ?
            "" : lafLine("MESSSTELLE", probe.getMstId());
        laf += lafLine("PROBE_ID", translation.get(0).getProbeIdAlt());
        laf += lafLine("HAUPTPROBENNUMMER", probe.getHauptprobenNr());
        laf += probe.getBaId() == null ?
            "" : lafLine("MESSPROGRAMM_S", "\"" + probe.getBaId() + "\"");
        laf += probe.getProbenartId() == null ?
            "" : lafLine("PROBENART",
                "\"" + probenart + "\"");
        laf += probe.getSolldatumBeginn() == null ?
            "" : lafLine("SOLL_DATUM_UHRZEIT_A",
                format.format(probe.getSolldatumBeginn()));
        laf += probe.getSolldatumEnde() == null ?
            "" : lafLine("SOLL_DATUM_UHRZEIT_E",
                format.format(probe.getSolldatumEnde()));
        laf += probe.getProbeentnahmeBeginn() == null ?
            "" : lafLine("PROBENAHME_DATUM_UHRZEIT_A",
                format.format(probe.getProbeentnahmeBeginn()));
        laf += probe.getProbeentnahmeEnde() == null ?
            "" : lafLine("PROBENAHME_DATUM_UHRZEIT_E",
                format.format(probe.getProbeentnahmeEnde()));
        laf += probe.getUmwId() == null ?
            "" : lafLine("UMWELTBEREICH_S", probe.getUmwId());
        laf += probe.getMedia() == null ?
            "" : lafLine("MEDIUM", "\"" + probe.getMedia() + "\"");
        laf += probe.getMediaDesk() == null ?
            "" : lafLine("DESKRIPTOREN", "\"" + probe.getMediaDesk() + "\"");
        laf += probe.getTest() == Boolean.TRUE ?
            lafLine("TESTDATEN", "1") : lafLine("TESTDATEN", "0");
        for (LZusatzWert zw : zusatzwerte) {
            laf += writeZusatzwert(zw);
        }
        for (LKommentarP kp : kommentare) {
            laf += writeKommentar(kp);
        }
        laf += writeMessung(probe);
        laf += writeOrt(probe);
        return laf;
    }

    /**
     * Write {@link LZusatzWert} attributes.
     *
     * @param zw    The {@link LZusatzWert}.
     * @return Single LAF line.
     */
    private String writeZusatzwert(LZusatzWert zw) {
        String nativeQuery = "select beschreibung, meh_id from stammdaten.proben_zusatz where pzs_id = '";
        nativeQuery += zw.getPzsId() + "'";
        Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
        List<Object[]> result = query.getResultList();

        String value = "\"" + result.get(0)[0].toString() + "\"";
        value += " " + zw.getMesswertPzs();
        value += " " + result.get(0)[1].toString();
        value += " " + zw.getMessfehler();
        return lafLine("PZB_S", value);
    }

    /**
     * Write {@link LOrt} attributes.
     *
     * @param probe The {@link LProbeInfo} object.
     * @return LAF conform string
     */
    private String writeOrt(LProbe probe) {
        QueryBuilder<LOrt> builder =
            new QueryBuilder<LOrt>(
                repository.entityManager("land"),
                LOrt.class);
        builder.and("probeId", probe.getId());
        Response objects = repository.filter(builder.getQuery(), "land");
        List<LOrt> orte = (List<LOrt>)objects.getData();

        String laf = "";
        for(LOrt o : orte) {
            laf += "%ORT%\n";
            String nativeQuery = "select bezeichnung, staat_id, longitude, latitude, gem_id from stammdaten.ort where id = '";
            nativeQuery += o.getOrt() + "'";
            Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
            List<Object[]> result = query.getResultList();

            laf += lafLine("ORT_CODE",
                "\"" + result.get(0)[0].toString() + "\"");
            laf += lafLine("ORT_TYP", "\"" + o.getOrtsTyp() + "\"");
            laf += o.getOrtszusatztext() == null ? "":
                lafLine("ORT_ZUSATZTEXT", "\"" + o.getOrtszusatztext() + "\"");
            laf += lafLine("ORT_LAND_S", String.valueOf(result.get(0)[1].toString()));
            String koord = "";
            koord += "05 ";
            koord += result.get(0)[2].toString() + " ";
            koord += result.get(0)[3].toString();
            //TODO: use table koordinatenart and koord*extern!
            laf += lafLine("ORT_KOORDINATEN_S", koord);
            laf += lafLine("ORT_GEMEINDESCHLUESSEL", result.get(0)[4].toString());
        }
        return laf;
    }

    /**
     * Write {@link LKommentarP} attributes.
     *
     * @param kp    The {@link LKommentarP} object.
     * @return Single LAF line.
     */
    private String writeKommentar(LKommentarP kp) {
        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
        String value = "\"" + kp.getErzeuger() + "\" " +
            format.format(kp.getDatum()) + " " +
            "\"" + kp.getText() + "\"";
        return lafLine("PROBENKOMMENTAR", value);
    }

    /**
     * Write {@link LMessung} attributes.
     *
     * @param probe The {@link LProbeInfo} object.
     * @return LAF conform string.
     */
    private String writeMessung(LProbe probe) {
        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
        // Get all messungen
        QueryBuilder<LMessung> builder =
            new QueryBuilder<LMessung>(
                repository.entityManager("land"),
                LMessung.class);
        builder.and("probeId", probe.getId());
        Response objects = repository.filter(builder.getQuery(), "land");
        List<LMessung> mess = (List<LMessung>)objects.getData();

        String laf = "";
        for(LMessung m : mess) {
            laf += "%MESSUNG%\n";
            QueryBuilder<LMesswert> wertBuilder =
                new QueryBuilder<LMesswert>(
                    repository.entityManager("land"), LMesswert.class);
            wertBuilder.and("messungsId", m.getId());
            Response messw = repository.filter(wertBuilder.getQuery(), "land");
            List<LMesswert> werte = (List<LMesswert>)messw.getData();
            QueryBuilder<LKommentarM> kommBuilder =
                new QueryBuilder<LKommentarM>(
                    repository.entityManager("land"), LKommentarM.class);
            kommBuilder.and("messungsId", m.getId());
            Response kommentar = repository.filter(kommBuilder.getQuery(), "land");
            List<LKommentarM> kommentare = (List<LKommentarM>)kommentar.getData();
            laf += lafLine("MESSUNGS_ID", m.getId().toString());
            laf += lafLine("NEBENPROBENNUMMER", m.getNebenprobenNr());
            laf += m.getMesszeitpunkt() == null ?
                "" : lafLine(
                    "MESS_DATUM_UHRZEIT",
                    format.format(m.getMesszeitpunkt()));
            laf += m.getMessdauer() == null ?
                "" : lafLine("MESSZEIT_SEKUNDEN", m.getMessdauer().toString());
            laf += m.getMmtId() == null ?
                "" : lafLine("MESSMETHODE_S", m.getMmtId());
            for (LMesswert mw : werte) {
                laf += writeMesswert(mw);
            }
            for (LKommentarM mk: kommentare) {
                laf += writeKommentar(mk);
            }
        }
        return laf;
    }

    /**
     * Write {@link LKommentarM} attributes.
     * @param mk    The {@link LKommentarM} object.
     * @return Single LAF line.
     */
    private String writeKommentar(LKommentarM mk) {
        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
        String value = "\"" + mk.getErzeuger() + "\" " +
            format.format(mk.getDatum()) + " " +
            "\"" + mk.getText() + "\"";
        return lafLine("KOMMENTAR", value);
    }

    /**
     * Write {@link LMesswert} attributes.
     * @param mw    The {@link LMesswert} object.
     * @return Single LAF line.
     */
    private String writeMesswert(LMesswert mw) {
        String nativeQuery = "select messgroesse from stammdaten.messgroesse where id = '";
        nativeQuery += mw.getMessgroesseId() + "'";
        Query query = repository.entityManager("land").createNativeQuery(nativeQuery);
        List<Object[]> result = query.getResultList();

        String nativeQuery2 = "select einheit from stammdaten.mess_einheit where id = '";
        nativeQuery2 += mw.getMehId() + "'";
        Query query2 = repository.entityManager("land").createNativeQuery(nativeQuery2);
        List<Object[]> result2 = query2.getResultList();

        String value = "\"" + result.get(0) + "\"";
        if (mw.getGrenzwertueberschreitung() != null &&
            !mw.getGrenzwertueberschreitung()) {
            value += " <";
        }
        else {
            value += " ";
        }
        value += mw.getMesswert();
        value += " \"" + result2.get(0) + "\"";
        value += mw.getMessfehler() == null ? " NULL" : " " + mw.getMessfehler();
        value += mw.getNwgZuMesswert() == null ? " NULL" : " " + mw.getNwgZuMesswert();
        value += mw.getGrenzwertueberschreitung() == null ? " N" :
            mw.getGrenzwertueberschreitung() ? " Y" : " N";
        return lafLine("MESSWERT", value);
    }

    /**
     * Write a single LAF conform line from key and value.
     *
     * @param key   The key.
     * @param value The value.
     * @return LAF conform line.
     */
    private String lafLine(String key, String value) {
        for (int i = key.length(); i < 30; i++) {
            key += " ";
        }
        return key + value + "\n";
    }
}
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)