view src/main/java/de/intevation/lada/exporter/laf/LafCreator.java @ 1187:3c24d33bf0db

Export the id according to the specification for PZB_S.
author Raimund Renkert <raimund.renkert@intevation.de>
date Mon, 21 Nov 2016 14:54:09 +0100
parents 4c612aaba378
children
line wrap: on
line source
/* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU GPL (v>=3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out
 * the documentation coming with IMIS-Labordaten-Application for details.
 */
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 org.apache.log4j.Logger;

import de.intevation.lada.exporter.Creator;
import de.intevation.lada.model.land.KommentarM;
import de.intevation.lada.model.land.KommentarP;
import de.intevation.lada.model.land.Messung;
import de.intevation.lada.model.land.Messwert;
import de.intevation.lada.model.land.Ortszuordnung;
import de.intevation.lada.model.land.Probe;
import de.intevation.lada.model.land.ZusatzWert;
import de.intevation.lada.model.stammdaten.MessEinheit;
import de.intevation.lada.model.stammdaten.MessStelle;
import de.intevation.lada.model.stammdaten.Messgroesse;
import de.intevation.lada.model.stammdaten.Ort;
import de.intevation.lada.model.stammdaten.ProbenZusatz;
import de.intevation.lada.model.stammdaten.Probenart;
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
{
    // Some format strings corresponding to LAF notation
    private static final String KEY_FORMAT = "%-30s";
    private static final String DEFAULT_FORMAT = "%s";
    private static final String CN = "\"%s\""; // cn, mcn, scn

    @Inject
    private Logger logger;
    /**
     * The repository used to read data.
     */
    @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 += lafLine("UEBERTRAGUNGSFORMAT", "7", CN);
        lafProbe += lafLine("VERSION", "0084", CN);
        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(Probe.class, Integer.valueOf(probeId), "land");
        if (found.getData() == null) {
            return null;
        }
        Probe aProbe = (Probe)found.getData();
        String lafProbe = writeAttributes(aProbe);
        return lafProbe;
    }

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

        QueryBuilder<Probenart> builder =
            new QueryBuilder<Probenart>(
                repository.entityManager("stamm"),
                Probenart.class);
        builder.and("id", probe.getProbenartId());
        List<Probenart> probenarten =
            (List<Probenart>)repository.filter(
                builder.getQuery(),
                "stamm").getData();
        String probenart = probenarten.get(0).getProbenart();

        MessStelle messstelle =
            repository.getByIdPlain(MessStelle.class, probe.getMstId(), "stamm");

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

        String laf = "";
        laf += probe.getDatenbasisId() == null ?
            "": lafLine("DATENBASIS_S",
                String.format("%02d", probe.getDatenbasisId()));
        laf += messstelle == null ?
            "" : lafLine("NETZKENNUNG", messstelle.getNetzbetreiberId(), CN);
        laf += probe.getMstId() == null ?
            "" : lafLine("MESSSTELLE", probe.getMstId(), CN);
        laf += probe.getLaborMstId() == null ?
            "" : lafLine("MESSLABOR", probe.getLaborMstId(), CN);
        laf += lafLine("PROBE_ID", probe.getIdAlt(), CN);
        laf += probe.getHauptprobenNr() == null ?
            "" : lafLine("HAUPTPROBENNUMMER", probe.getHauptprobenNr(), CN);
        laf += probe.getBaId() == null ?
            "" : lafLine("MESSPROGRAMM_S", probe.getBaId(), CN);
        laf += probe.getProbenartId() == null ?
            "" : lafLine("PROBENART", probenart, CN);
        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(), CN);
        laf += probe.getMediaDesk() == null ?
            "" : lafLine("DESKRIPTOREN",
                probe.getMediaDesk().replaceAll(" ", "").substring(2), CN);
        laf += probe.getTest() == Boolean.TRUE ?
            lafLine("TESTDATEN", "1") : lafLine("TESTDATEN", "0");
        laf += writeOrt(probe);
        for (ZusatzWert zw : zusatzwerte) {
            laf += writeZusatzwert(zw);
        }
        for (KommentarP kp : kommentare) {
            laf += writeKommentar(kp);
        }
        laf += writeMessung(probe);
        return laf;
    }

    /**
     * Write {@link LZusatzWert} attributes.
     *
     * @param zw    The {@link LZusatzWert}.
     * @return Single LAF line.
     */
    @SuppressWarnings("unchecked")
    private String writeZusatzwert(ZusatzWert zw) {
        QueryBuilder<ProbenZusatz> builder =
            new QueryBuilder<ProbenZusatz>(
                repository.entityManager("stamm"),
                ProbenZusatz.class);
        builder.and("id", zw.getPzsId());
        List<ProbenZusatz> zusatz =
            (List<ProbenZusatz>)repository.filter(
                builder.getQuery(),
                "stamm").getData();

        String value = "\"" + zusatz.get(0).getId() + "\"";
        value += " " + zw.getMesswertPzs();
        value += " " + zusatz.get(0).getMessEinheitId();
        value += " " + zw.getMessfehler();
        return lafLine("PZB_S", value);
    }

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

        String laf = "";
        for(Ortszuordnung o : orte) {
            String type = "";
            if ("E".equals(o.getOrtszuordnungTyp())) {
                type = "P_";
            }
            else if ("U".equals(o.getOrtszuordnungTyp())) {
                type = "U_";
                laf += "%URSPRUNGSORT%\n";
            }
            else {
                continue;
            }
            if (o.getOrtszusatztext() != null &&
                o.getOrtszusatztext().length() > 0) {
                laf += lafLine(type + "ORTS_ZUSATZTEXT",
                    o.getOrtszusatztext(), CN);
            }
            QueryBuilder<Ort> oBuilder =
                new QueryBuilder<Ort>(
                    repository.entityManager("stamm"),
                    Ort.class);
            oBuilder.and("id", o.getOrtId());
            List<Ort> sOrte=
                (List<Ort>)repository.filter(
                    oBuilder.getQuery(),
                    "stamm").getData();

            if (sOrte.get(0).getStaatId() != null) {
                laf += lafLine(type + "HERKUNFTSLAND_S",
                    String.format("%08d", sOrte.get(0).getStaatId()));
            }

            if (sOrte.get(0).getGemId() != null &&
                sOrte.get(0).getGemId().length() > 0) {
                laf += lafLine(type + "GEMEINDESCHLUESSEL",
                    sOrte.get(0).getGemId());
            }

            String koord = String.format("%02d", sOrte.get(0).getKdaId());
            koord += " \"";
            koord += sOrte.get(0).getKoordXExtern() + "\" \"";
            koord += sOrte.get(0).getKoordYExtern() + "\"";
            laf += lafLine(type + "KOORDINATEN_S", koord);

            if (sOrte.get(0).getOzId() != null &&
                sOrte.get(0).getOzId().length() > 0) {
                laf += lafLine(type + "ORTS_ZUSATZCODE",
                    sOrte.get(0).getOzId(), CN);
            }
            if (sOrte.get(0).getHoeheUeberNn() != null) {
                laf += lafLine(type + "HOEHE_NN",
                    String.format("%f", sOrte.get(0).getHoeheUeberNn()));
            }
        }
        return laf;
    }

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

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

        String laf = "";
        for(Messung m : mess) {
            laf += "%MESSUNG%\n";
            QueryBuilder<Messwert> wertBuilder =
                new QueryBuilder<Messwert>(
                    repository.entityManager("land"), Messwert.class);
            wertBuilder.and("messungsId", m.getId());
            Response messw = repository.filter(wertBuilder.getQuery(), "land");
            List<Messwert> werte = (List<Messwert>)messw.getData();
            QueryBuilder<KommentarM> kommBuilder =
                new QueryBuilder<KommentarM>(
                    repository.entityManager("land"), KommentarM.class);
            kommBuilder.and("messungsId", m.getId());
            Response kommentar = repository.filter(kommBuilder.getQuery(), "land");
            List<KommentarM> kommentare = (List<KommentarM>)kommentar.getData();
            laf += lafLine("MESSUNGS_ID", m.getIdAlt().toString());
            laf += lafLine("NEBENPROBENNUMMER", m.getNebenprobenNr(), CN);
            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(), CN);
            laf += lafLine("ERFASSUNG_ABGESCHLOSSEN", (m.getFertig() ? "1" : "0"));
            for (Messwert mw : werte) {
                laf += writeMesswert(mw);
            }
            for (KommentarM mk: kommentare) {
                laf += writeKommentar(mk);
            }
        }
        return laf;
    }

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

    /**
     * Write {@link LMesswert} attributes.
     * @param mw    The {@link LMesswert} object.
     * @return Single LAF line.
     */
    @SuppressWarnings("unchecked")
    private String writeMesswert(Messwert mw) {
        QueryBuilder<Messgroesse> builder =
            new QueryBuilder<Messgroesse>(
                repository.entityManager("stamm"),
                Messgroesse.class);
        builder.and("id", mw.getMessgroesseId());
        List<Messgroesse> groessen =
            (List<Messgroesse>)repository.filter(
                builder.getQuery(),
                "stamm").getData();

        QueryBuilder<MessEinheit> eBuilder =
            new QueryBuilder<MessEinheit>(
                repository.entityManager("stamm"),
                MessEinheit.class);
        eBuilder.and("id", mw.getMehId());
        List<MessEinheit> einheiten =
            (List<MessEinheit>)repository.filter(
                eBuilder.getQuery(),
                "stamm").getData();

        String tag = "MESSWERT";
        String value = "\"" + groessen.get(0).getMessgroesse() + "\"";
        value += " ";
        value += mw.getMesswertNwg() == null ? " " : mw.getMesswertNwg();
        value += mw.getMesswert();
        value += " \"" + einheiten.get(0).getEinheit() + "\"";
        value += mw.getMessfehler() == null ? " 0.0" : " " + mw.getMessfehler();
        if (mw.getGrenzwertueberschreitung() == null ||
            !mw.getGrenzwertueberschreitung()) {
            if (mw.getNwgZuMesswert() != null) {
                tag += "_NWG";
                value += " " + mw.getNwgZuMesswert();
            }
        }
        else {
            tag += "_NWG_G";
            value += " " + mw.getNwgZuMesswert() == null ? "0.0": mw.getNwgZuMesswert();
            value += " " + mw.getGrenzwertueberschreitung() == null ? " N" :
                mw.getGrenzwertueberschreitung() ? " J" : " N";
        }
        return lafLine(tag, 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) {
        return lafLine(key, value, DEFAULT_FORMAT);
    }

    /**
     * Write a single LAF conform line from key and value.
     *
     * @param key    The key.
     * @param value  The value.
     * @param format A format string for the value
     * @return LAF conform line.
     */
    private String lafLine(String key, Object value, String format) {
        return String.format(KEY_FORMAT, key)
            + String.format(format, value)
            + "\n";
    }

}
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)