view src/main/java/de/intevation/lada/importer/laf/LafObjectMapper.java @ 1127:997899aba991

Do not try to persist Probe objects with validation errors. Validation errors are often in line with database constraints and thus trying to persist will result in an Internal Server Error.
author Tom Gottfried <tom@intevation.de>
date Mon, 31 Oct 2016 18:25:02 +0100
parents cbd34e671683
children 9964210da156
line wrap: on
line source
package de.intevation.lada.importer.laf;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.inject.Inject;
import javax.management.modelmbean.InvalidTargetObjectTypeException;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import de.intevation.lada.factory.ProbeFactory;
import de.intevation.lada.importer.Identified;
import de.intevation.lada.importer.Identifier;
import de.intevation.lada.importer.IdentifierConfig;
import de.intevation.lada.importer.ObjectMerger;
import de.intevation.lada.importer.ReportItem;
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.Probe;
import de.intevation.lada.model.land.StatusProtokoll;
import de.intevation.lada.model.land.ZusatzWert;
import de.intevation.lada.model.stammdaten.Datenbasis;
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.MessprogrammKategorie;
import de.intevation.lada.model.stammdaten.MessprogrammTransfer;
import de.intevation.lada.model.stammdaten.ProbenZusatz;
import de.intevation.lada.model.stammdaten.Probenart;
import de.intevation.lada.model.stammdaten.StatusKombi;
import de.intevation.lada.model.stammdaten.Umwelt;
import de.intevation.lada.util.annotation.AuthorizationConfig;
import de.intevation.lada.util.annotation.RepositoryConfig;
import de.intevation.lada.util.auth.Authorization;
import de.intevation.lada.util.auth.AuthorizationType;
import de.intevation.lada.util.auth.UserInfo;
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;
import de.intevation.lada.validation.Validator;
import de.intevation.lada.validation.Violation;
import de.intevation.lada.validation.annotation.ValidationConfig;

public class LafObjectMapper {

    @Inject
    private Logger logger;

    @Inject
    @AuthorizationConfig(type=AuthorizationType.HEADER)
    private Authorization authorizer;

    @Inject
    @ValidationConfig(type="Probe")
    private Validator probeValidator;

    @Inject
    @ValidationConfig(type="Messung")
    private Validator messungValidator;

    @Inject
    @IdentifierConfig(type="Probe")
    private Identifier probeIdentifier;

    @Inject
    @IdentifierConfig(type="Messung")
    private Identifier messungIdentifier;

    @Inject
    private ObjectMerger merger;

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

    @Inject
    private ProbeFactory factory;

    private Map<String, List<ReportItem>> errors;
    private Map<String, List<ReportItem>> warnings;
    private List<ReportItem> currentErrors;
    private List<ReportItem> currentWarnings;


    private UserInfo userInfo;

    public void mapObjects(LafRawData data) {
        errors = new HashMap<String, List<ReportItem>>();
        warnings = new HashMap<String, List<ReportItem>>();
        for (int i = 0; i < data.getProben().size(); i++) {
            create(data.getProben().get(i));
        }
    }

    private void create(LafRawData.Probe object) {
        currentWarnings = new ArrayList<ReportItem>();
        currentErrors = new ArrayList<ReportItem>();
        Probe probe = new Probe();

        // Fill the object with data
        for (Entry<String, String> attribute : object.getAttributes().entrySet()) {
            addProbeAttribute(attribute, probe);
        }
        // Use the deskriptor string to find the medium
        probe = factory.findMediaDesk(probe);
        //logProbe(probe);

        // Check if the user is authorized to create the probe
        boolean isAuthorized = authorizer.isAuthorized(userInfo, probe, Probe.class);
        if (!isAuthorized) {
            ReportItem err = new ReportItem();
            err.setCode(699);
            err.setKey(userInfo.getName());
            err.setValue(probe.getMstId());
            currentErrors.add(err);
            if (currentErrors.size() > 0) {
                List<ReportItem> copyErr = new ArrayList<ReportItem>(currentErrors);
                errors.put(probe.getIdAlt(), copyErr);
            }
            if (currentWarnings.size() > 0) {
                List<ReportItem> copyWarn = new ArrayList<ReportItem>(currentWarnings);
                warnings.put(probe.getIdAlt(), copyWarn);
            }
            return;
        }

        // Check for errors and warnings

        // Compare the probe with objects in the db
        Probe newProbe = null;
        try {
            Identified i = probeIdentifier.find(probe);
            Probe old = (Probe)probeIdentifier.getExisting();
            // Matching probe was found in the db. Update it!
            if(i == Identified.UPDATE) {
                merger.merge(old, probe);
                newProbe = old;
                Violation violation = probeValidator.validate(newProbe);
                for (Entry<String, List<Integer>> warn : violation.getWarnings().entrySet()) {
                    for (Integer code : warn.getValue()) {
                        currentWarnings.add(new ReportItem("validation", warn.getKey(), code));
                    }
                }
            }
            // Probe was found but some data does not match
            else if(i == Identified.REJECT){
                ReportItem err = new ReportItem();
                err.setCode(631);
                err.setKey("duplicate");
                err.setValue("");
                currentErrors.add(err);
                if (currentErrors.size() > 0) {
                    List<ReportItem> copyErr = new ArrayList<ReportItem>(currentErrors);
                    errors.put(probe.getIdAlt(), copyErr);
                }
                if (currentWarnings.size() > 0) {
                    List<ReportItem> copyWarn = new ArrayList<ReportItem>(currentWarnings);
                    warnings.put(probe.getIdAlt(), copyWarn);
                }
                return;
            }
            // It is a brand new probe!
            else if(i == Identified.NEW){
                Violation violation = probeValidator.validate(probe);
                for (Entry<String, List<Integer>> err : violation.getErrors().entrySet()) {
                    for (Integer code : err.getValue()) {
                        currentErrors.add(new ReportItem("validation", err.getKey(), code));
                    }
                }
                for (Entry<String, List<Integer>> warn : violation.getWarnings().entrySet()) {
                    for (Integer code : warn.getValue()) {
                        currentWarnings.add(new ReportItem("validation", warn.getKey(), code));
                    }
                }
                if (!violation.hasErrors()) {
                    Response created = repository.create(probe, "land");
                    newProbe = ((Probe)created.getData());
                }
            }
        } catch (InvalidTargetObjectTypeException e) {
            ReportItem err = new ReportItem();
            err.setCode(604);
            err.setKey("not known");
            err.setValue("No valid Probe Object");
            currentErrors.add(err);
            if (currentErrors.size() > 0) {
                List<ReportItem> copyErr = new ArrayList<ReportItem>(currentErrors);
                errors.put(probe.getIdAlt(), copyErr);
            }
            if (currentWarnings.size() > 0) {
                List<ReportItem> copyWarn = new ArrayList<ReportItem>(currentWarnings);
                warnings.put(probe.getIdAlt(), copyWarn);
            }
            return;
        }
        if (newProbe != null) {
            // Create kommentar objects
            List<KommentarP> kommentare = new ArrayList<KommentarP>();
            for (int i = 0; i < object.getKommentare().size(); i++) {
                KommentarP tmp = createProbeKommentar(
                    object.getKommentare().get(i), newProbe.getId());
                if (tmp != null) {
                    kommentare.add(tmp);
                }
            }
            // Persist kommentar objects
            merger.mergeKommentare(newProbe, kommentare);

            // Create zusatzwert objects
            List<ZusatzWert> zusatzwerte = new ArrayList<ZusatzWert>();
            for (int i = 0; i < object.getZusatzwerte().size(); i++) {
                ZusatzWert tmp = createZusatzwert(
                    object.getZusatzwerte().get(i), newProbe.getId());
                if (tmp != null) {
                    zusatzwerte.add(tmp);
                }
            }
            // Persist zusatzwert objects
            merger.mergeZusatzwerte(newProbe, zusatzwerte);

            // Create messung objects
            for (LafRawData.Messung messung : object.getMessungen()) {
                create(messung, newProbe.getId(), newProbe.getMstId());
            }
        }

        if (currentErrors.size() > 0) {
            List<ReportItem> copyErr = new ArrayList<ReportItem>(currentErrors);
            errors.put(probe.getIdAlt(), copyErr);
        }
        if (currentWarnings.size() > 0) {
            List<ReportItem> copyWarn = new ArrayList<ReportItem>(currentWarnings);
            warnings.put(probe.getIdAlt(), copyWarn);
        }
    }

    private void create(LafRawData.Messung object, int probeId, String mstId) {
        Messung messung = new Messung();
        messung.setProbeId(probeId);

        // Fill the new messung with data
        for (Entry<String, String> attribute : object.getAttributes().entrySet()) {
            addMessungAttribute(attribute, messung);
        }

        // Check if the user is authorized to create the object
        if (!authorizer.isAuthorizedOnNew(userInfo, messung, Messung.class)) {
            ReportItem warn = new ReportItem();
            warn.setCode(699);
            warn.setKey(userInfo.getName());
            warn.setValue("Messung: " + messung.getNebenprobenNr());
            currentErrors.add(warn);
            return;
        }


        // Compare with messung objects in the db
        Messung newMessung = null;
        try {
            Identified i = messungIdentifier.find(messung);
            Messung old = (Messung)messungIdentifier.getExisting();
            if (i == Identified.UPDATE) {
                merger.mergeMessung(old, messung);
                newMessung = old;
                // We do not import the status. Doing this can cause an
                // inconsistent status protocol.
            }
            else if (i == Identified.REJECT) {
                ReportItem warn = new ReportItem();
                warn.setCode(631);
                warn.setKey("duplicate");
                warn.setValue("Messung: " + messung.getNebenprobenNr());
                currentWarnings.add(warn);
                return;
            }
            else if (i == Identified.NEW) {
                // Create a new messung and the first status
                Response created = repository.create(messung, "land");
                newMessung = ((Messung)created.getData());
                created = repository.getById(Messung.class, newMessung.getId(), "land");
                newMessung = ((Messung)created.getData());
                StatusProtokoll status = new StatusProtokoll();
                status.setDatum(new Timestamp(new Date().getTime()));
                status.setMessungsId(newMessung.getId());
                status.setMstId(mstId);
                status.setStatusKombi(1);
                Response st = repository.create(status, "land");
                newMessung.setStatus(((StatusProtokoll)st.getData()).getId());
                repository.update(newMessung, "land");
                if (object.getAttributes().containsKey("BEARBEITUNGSSTATUS")) {
                    createStatusProtokoll(object.getAttributes().get("BEARBEITUNGSSTATUS"), newMessung, mstId);
                }
            }
        }
        catch(InvalidTargetObjectTypeException e) {
            ReportItem err = new ReportItem();
            err.setCode(604);
            err.setKey("not valid");
            err.setValue("Messung: " + messung.getNebenprobenNr());
            currentErrors.add(err);
            return;
        }
        List<KommentarM> kommentare = new ArrayList<KommentarM>();
        for (int i = 0; i < object.getKommentare().size(); i++) {
            KommentarM tmp = createMessungKommentar(object.getKommentare().get(i), newMessung.getId());
            if (tmp != null) {
                kommentare.add(tmp);
            }
        }
        merger.mergeMessungKommentare(newMessung, kommentare);
        List<Messwert> messwerte = new ArrayList<Messwert>();
        for (int i = 0; i < object.getMesswerte().size(); i++) {
            Messwert tmp = createMesswert(object.getMesswerte().get(i), newMessung.getId());
            if (tmp != null) {
                messwerte.add(tmp);
            }
        }
        merger.mergeMesswerte(newMessung, messwerte);
        // Check for warnings and errors
        Violation violation = messungValidator.validate(newMessung);
        for (Entry<String, List<Integer>> err : violation.getErrors().entrySet()) {
            for (Integer code : err.getValue()) {
                currentErrors.add(new ReportItem("validation", err.getKey(), code));
            }
        }
        for (Entry<String, List<Integer>> warn : violation.getWarnings().entrySet()) {
            for (Integer code : warn.getValue()) {
                currentWarnings.add(new ReportItem("validation", warn.getKey(), code));
            }
        }
    }

    private KommentarP createProbeKommentar(Map<String, String> attributes, int probeId) {
        KommentarP kommentar = new KommentarP();
        kommentar.setProbeId(probeId);
        kommentar.setMstId(attributes.get("MST_ID"));
        kommentar.setText(attributes.get("TEXT"));
        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
        String date = attributes.get("DATE") + " " + attributes.get("TIME");
        Date d;
        try {
            d = format.parse(date);
            kommentar.setDatum(new Timestamp(d.getTime()));
        }
        catch (ParseException e) {
            ReportItem warn = new ReportItem();
            warn.setCode(674);
            warn.setKey("not valid");
            warn.setValue("Date: " + date);
            currentWarnings.add(warn);
        }
        if (!userInfo.getMessstellen().contains(kommentar.getMstId())) {
            ReportItem warn = new ReportItem();
            warn.setCode(699);
            warn.setKey(userInfo.getName());
            warn.setValue("Kommentar: " + kommentar.getMstId());
            currentWarnings.add(warn);
            return null;
        }
        return kommentar;
    }

    private ZusatzWert createZusatzwert(Map<String, String> attributes, int probeId) {
        ZusatzWert zusatzwert = new ZusatzWert();
        zusatzwert.setProbeId(probeId);
        zusatzwert.setMessfehler(Float.valueOf(attributes.get("MESSFEHLER")));
        zusatzwert.setMesswertPzs(Double.valueOf(attributes.get("MESSWERT_PZS")));
        QueryBuilder<ProbenZusatz> builder =
            new QueryBuilder<ProbenZusatz>(
                repository.entityManager("stamm"),
                ProbenZusatz.class);
        builder.and("zusatzwert", attributes.get("PZS"));
        List<ProbenZusatz> zusatz =
            (List<ProbenZusatz>)repository.filter(
                builder.getQuery(),
                "stamm").getData();

        if (zusatz == null || zusatz.isEmpty()) {
            ReportItem warn = new ReportItem();
            warn.setCode(673);
            warn.setKey("zusatzwert");
            warn.setValue(attributes.get("PZS"));
            currentWarnings.add(warn);
            return null;
        }
        zusatzwert.setPzsId(zusatz.get(0).getId());
        return zusatzwert;
    }

    private Messwert createMesswert(Map<String, String> attributes, int messungsId) {
        Messwert messwert = new Messwert();
        messwert.setMessungsId(messungsId);
        if (attributes.containsKey("MESSGROESSE_ID")) {
            messwert.setMessgroesseId(Integer.valueOf(attributes.get("MESSGROESSE_ID")));
        }
        else if (attributes.containsKey("MESSGROESSE")) {
            QueryBuilder<Messgroesse> builder =
                new QueryBuilder<Messgroesse>(
                    repository.entityManager("stamm"),
                    Messgroesse.class);
            builder.and("messgroesse", attributes.get("MESSGROESSE"));
            List<Messgroesse> groesse =
                (List<Messgroesse>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();

            if (groesse == null || groesse.isEmpty()) {
                ReportItem warn = new ReportItem();
                warn.setCode(673);
                warn.setKey("messwert");
                warn.setValue(attributes.get("MESSGROESSE"));
                currentWarnings.add(warn);
                return null;
            }
            messwert.setMessgroesseId(groesse.get(0).getId());
        }
        if (attributes.containsKey("MEH_ID")) {
            messwert.setMehId(Integer.valueOf(attributes.get("MEH_ID")));
        }
        else if (attributes.containsKey("MEH")) {
            QueryBuilder<MessEinheit> builder =
                new QueryBuilder<MessEinheit>(
                    repository.entityManager("stamm"),
                    MessEinheit.class);
            builder.and("einheit", attributes.get("MEH"));
            List<MessEinheit> einheit =
                (List<MessEinheit>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();

            if (einheit == null || einheit.isEmpty()) {
                ReportItem warn = new ReportItem();
                warn.setCode(673);
                warn.setKey("messwert");
                warn.setValue(attributes.get("MEH"));
                currentWarnings.add(warn);
                return null;
            }
            messwert.setMehId(einheit.get(0).getId());
        }

        String wert = attributes.get("MESSWERT");
        if (wert.startsWith("<")) {
            wert = wert.substring(1);
            messwert.setMesswertNwg("<");
        }
        messwert.setMesswert(Double.valueOf(wert));
        messwert.setMessfehler(Double.valueOf(attributes.get("MESSFEHLER")).floatValue());
        if (attributes.containsKey("NWG")) {
            messwert.setNwgZuMesswert(Double.valueOf(attributes.get("NWG")));
        }
        if (attributes.containsKey("GRENZWERT")) {
            messwert.setGrenzwertueberschreitung(attributes.get("GRENZWERT").toUpperCase() == "J" ? true : false);
        }
        return messwert;
    }

    private KommentarM createMessungKommentar(Map<String, String> attributes, int messungsId) {
        KommentarM kommentar = new KommentarM();
        kommentar.setMessungsId(messungsId);
        kommentar.setMstId(attributes.get("MST_ID"));
        kommentar.setText(attributes.get("TEXT"));
        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
        String date = attributes.get("DATE") + " " + attributes.get("TIME");
        Date d;
        try {
            d = format.parse(date);
            kommentar.setDatum(new Timestamp(d.getTime()));
        }
        catch (ParseException e) {
            ReportItem warn = new ReportItem();
            warn.setCode(674);
            warn.setKey("kommentar");
            warn.setValue("Date: " + date);
            currentWarnings.add(warn);
        }
        if (!userInfo.getMessstellen().contains(kommentar.getMstId())) {
            return null;
        }
        return kommentar;
    }

    private void createStatusProtokoll(String status, Messung messung, String mstId) {
        int mst = Integer.valueOf(status.substring(0, 1));
        int land = Integer.valueOf(status.substring(1, 2));
        int lst = Integer.valueOf(status.substring(2, 3));

        boolean hasMst = false;
        boolean hasLand = false;

        StatusProtokoll last = null;
        if (userInfo.getFunktionenForMst(mstId).contains(1)) {
            QueryBuilder<StatusKombi> builder =
                new QueryBuilder<StatusKombi>(
                    repository.entityManager("stamm"),
                    StatusKombi.class);
            builder.and("statusWert", mst);
            builder.and("statusStufe", 1);
            List<StatusKombi> kombi =
                (List<StatusKombi>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();
            if (kombi != null && !kombi.isEmpty()) {
                StatusProtokoll statusMst = new StatusProtokoll();
                statusMst.setDatum(new Timestamp(new Date().getTime()));
                statusMst.setMessungsId(messung.getId());
                statusMst.setMstId(mstId);
                statusMst.setStatusKombi(kombi.get(0).getId());
                Response r = repository.create(statusMst, "land");
                last = (StatusProtokoll)r.getData();
            }
            hasMst = true;
        }
        MessStelle messStelle = repository.getByIdPlain(MessStelle.class, mstId, "stamm");
        if (userInfo.getNetzbetreiber().contains(messStelle.getNetzbetreiberId()) &&
            userInfo.getFunktionenForNetzbetreiber(messStelle.getNetzbetreiberId()).contains(2) &&
            hasMst) {
                // Set status for stufe land.
            QueryBuilder<StatusKombi> builder =
                new QueryBuilder<StatusKombi>(
                    repository.entityManager("stamm"),
                    StatusKombi.class);
            builder.and("statusWert", land);
            builder.and("statusStufe", 2);
            List<StatusKombi> kombi =
                (List<StatusKombi>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();
            if (kombi != null && !kombi.isEmpty()) {
                StatusProtokoll statusLand = new StatusProtokoll();
                statusLand.setDatum(new Timestamp(new Date().getTime()));
                statusLand.setMessungsId(messung.getId());
                statusLand.setMstId(mstId);
                statusLand.setStatusKombi(kombi.get(0).getId());
                Response r = repository.create(statusLand, "land");
                last = (StatusProtokoll)r.getData();
            }
        }
        if (userInfo.getFunktionen().contains(3) &&
            hasLand) {
            // Set status for stufe lst.
            QueryBuilder<StatusKombi> builder =
                new QueryBuilder<StatusKombi>(
                    repository.entityManager("stamm"),
                    StatusKombi.class);
            builder.and("statusWert", lst);
            builder.and("statusStufe", 3);
            List<StatusKombi> kombi =
                (List<StatusKombi>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();
            if (kombi != null && !kombi.isEmpty()) {
                StatusProtokoll statusLst = new StatusProtokoll();
                statusLst.setDatum(new Timestamp(new Date().getTime()));
                statusLst.setMessungsId(messung.getId());
                statusLst.setMstId(mstId);
                statusLst.setStatusKombi(kombi.get(0).getId());
                Response r = repository.create(statusLst, "land");
                last = (StatusProtokoll)r.getData();
            }
        }
        if (last != null) {
            messung.setStatus(last.getId());
            repository.update(messung, "land");
        }
    }

    private void logProbe(Probe probe) {
        logger.debug("%PROBE%");
        logger.debug("datenbasis: " + probe.getDatenbasisId());
        logger.debug("betriebsart: " + probe.getBaId());
        logger.debug("erzeuger: " + probe.getErzeugerId());
        logger.debug("hauptprobennummer: " + probe.getHauptprobenNr());
        logger.debug("idalt: " + probe.getIdAlt());
        logger.debug("labor: " + probe.getLaborMstId());
        logger.debug("deskriptoren: " + probe.getMediaDesk());
        logger.debug("media: " + probe.getMedia());
        logger.debug("mittelung: " + probe.getMittelungsdauer());
        logger.debug("mpl: " + probe.getMplId());
        logger.debug("mpr: " + probe.getMprId());
        logger.debug("mst: " + probe.getMstId());
        logger.debug("pnbeginn: " + probe.getProbeentnahmeBeginn());
        logger.debug("pnende: " + probe.getProbeentnahmeEnde());
        logger.debug("probenart: " + probe.getProbenartId());
        logger.debug("probenehmer: " + probe.getProbeNehmerId());
        logger.debug("sbeginn: " + probe.getSolldatumBeginn());
        logger.debug("sende: " + probe.getSolldatumEnde());
        logger.debug("test: " + probe.getTest());
        logger.debug("umw: " + probe.getUmwId());
    }

    private void addProbeAttribute(Entry<String, String> attribute, Probe probe) {
        String key = attribute.getKey();
        String value = attribute.getValue();

        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
        if ("DATENBASIS_S".equals(key) && probe.getDatenbasisId() == null) {
            Integer v = Integer.valueOf(value.toString());
            probe.setDatenbasisId(v);
        }
        else if ("DATENBASIS_S".equals(key) && probe.getDatenbasisId() != null){
            currentWarnings.add(new ReportItem(key, value.toString(), 672));
        }


        if ("DATENBASIS".equals(key) && probe.getDatenbasisId() == null) {
            QueryBuilder<Datenbasis> builder =
                new QueryBuilder<Datenbasis>(
                    repository.entityManager("stamm"),
                    Datenbasis.class);
            builder.and("datenbasis", value.toString());
            List<Datenbasis> datenbasis =
                (List<Datenbasis>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();
            if (datenbasis == null || datenbasis.isEmpty()) {
                ReportItem err = new ReportItem();
                err.setCode(673);
                err.setKey("datenbasis");
                err.setValue(key);
                currentErrors.add(err);
                return;
            }
            Integer v = datenbasis.get(0).getId();
            probe.setDatenbasisId(v);
        }
        else if ("DATENBASIS".equals(key) && probe.getDatenbasisId() != null){
            currentWarnings.add(new ReportItem(key, value.toString(), 672));
        }

        if ("PROBE_ID".equals(key)) {
            probe.setIdAlt(value);
        }

        if ("HAUPTPROBENNUMMER".equals(key)) {
            probe.setHauptprobenNr(value.toString());
        }

        if ("MPR_ID".equals(key)) {
            Integer v = Integer.valueOf(value.toString());
            probe.setMprId(v);
        }

        if ("MESSSTELLE".equals(key)) {
            probe.setMstId(value.toString());

            /* MESSLABOR is optional in LAF but probe.labor_mst_id is
             * NOT NULL in the LADA database */
            if (probe.getLaborMstId() == null) {
                probe.setLaborMstId(value.toString());
            }
        }

        if ("MESSLABOR".equals(key)) {
            probe.setLaborMstId(value.toString());
        }

        if ("MESSPROGRAMM_S".equals(key) && probe.getBaId() == null) {
            QueryBuilder<MessprogrammTransfer> builder =
                new QueryBuilder<MessprogrammTransfer>(
                    repository.entityManager("stamm"),
                    MessprogrammTransfer.class);
            builder.and("messprogrammS", value);
            List<MessprogrammTransfer> transfer=
                (List<MessprogrammTransfer>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();
            if (transfer == null || transfer.isEmpty()) {
                ReportItem warn = new ReportItem();
                warn.setCode(673);
                warn.setKey("messprogramm");
                warn.setValue(key);
                currentWarnings.add(warn);
                return;
            }
            probe.setBaId(transfer.get(0).getBaId());
        }
        if ("MESSPROGRAMM_C".equals(key)){
            QueryBuilder<MessprogrammTransfer> builder =
                new QueryBuilder<MessprogrammTransfer>(
                    repository.entityManager("stamm"),
                    MessprogrammTransfer.class);
            builder.and("messprogrammC", value);
            List<MessprogrammTransfer> transfer=
                (List<MessprogrammTransfer>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();
            if (transfer == null || transfer.isEmpty()) {
                ReportItem warn = new ReportItem();
                warn.setCode(673);
                warn.setKey("messprogramm");
                warn.setValue(key);
                currentWarnings.add(warn);
                return;
            }
            probe.setBaId(transfer.get(0).getBaId());
        }

        if ("MESSPROGRAMM_LAND".equals(key)) {
            QueryBuilder<MessprogrammKategorie> builder =
                new QueryBuilder<MessprogrammKategorie>(
                    repository.entityManager("stamm"),
                    MessprogrammKategorie.class);
            builder.or("netzbetreiberId", userInfo.getNetzbetreiber());
            builder.and("code", value);
            List<MessprogrammKategorie> kategorie =
                (List<MessprogrammKategorie>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();
            if (kategorie == null || kategorie.isEmpty()) {
                ReportItem warn = new ReportItem();
                warn.setCode(673);
                warn.setKey("messprogramm_land");
                warn.setValue(key);
                currentWarnings.add(warn);
                return;
            }
            probe.setMplId(kategorie.get(0).getId());
        }

        if ("SOLL_DATUM_UHRZEIT_A".equals(key)) {
            try {
                Date d = format.parse(value.toString());
                probe.setSolldatumBeginn(new Timestamp(d.getTime()));
            }
            catch (ParseException e) {
                currentWarnings.add(new ReportItem(key, value.toString(), 674));
            }
        }
        if ("SOLL_DATUM_UHRZEIT_E".equals(key)) {
            try {
                Date d = format.parse(value.toString());
                probe.setSolldatumEnde(new Timestamp(d.getTime()));
            }
            catch (ParseException e) {
                currentWarnings.add(new ReportItem(key, value.toString(), 674));
            }
        }
        if ("PROBENAHME_DATUM_UHRZEIT_A".equals(key)) {
            try {
                Date d = format.parse(value.toString());
                probe.setProbeentnahmeBeginn(new Timestamp(d.getTime()));
            }
            catch (ParseException e) {
                currentWarnings.add(new ReportItem(key, value.toString(), 674));
            }
        }
        if ("PROBENAHME_DATUM_UHRZEIT_E".equals(key)) {
            try {
                Date d = format.parse(value.toString());
                probe.setProbeentnahmeEnde(new Timestamp(d.getTime()));
            }
            catch (ParseException e) {
                currentWarnings.add(new ReportItem(key, value.toString(), 674));
            }
        }

        if ("UMWELTBEREICH_S".equals(key) && probe.getUmwId() == null) {
            probe.setUmwId(value.toString());
        }
        else if ("UMWELTBEREICH_S".equals(key) && probe.getUmwId() != null){
            currentWarnings.add(new ReportItem(key, value.toString(), 672));
        }
        if ("UMWELTBEREICH_C".equals(key) && probe.getUmwId() == null) {
            QueryBuilder<Umwelt> builder =
                new QueryBuilder<Umwelt>(
                    repository.entityManager("stamm"),
                    Umwelt.class);
            int length = value.toString().length() > 80 ? 80 : value.toString().length();
            builder.and("umweltBereich", value.toString().substring(0, length));
            List<Umwelt> umwelt =
                (List<Umwelt>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();
            if (umwelt == null || umwelt.isEmpty()) {
                ReportItem warn = new ReportItem();
                warn.setCode(673);
                warn.setKey("umwelt");
                warn.setValue(key);
                currentWarnings.add(warn);
                return;
            }
            probe.setUmwId(umwelt.get(0).getId());
        }
        else if ("UMWELTBEREICH_C".equals(key) && probe.getUmwId() != null){
            currentWarnings.add(new ReportItem(key, value.toString(), 672));
        }

        if ("DESKRIPTOREN".equals(key)) {
            value = value.replace(" ", "0");
            List<String> tmp = new ArrayList<String>();
            tmp.add("D:");
            for (int i =  0; i < value.length() - 2; i += 2) {
                tmp.add(value.substring(i, i+2));
            }
            probe.setMediaDesk(StringUtils.join(tmp.toArray(), " "));
        }

        if ("TESTDATEN".equals(key)) {
            if (!value.toString().equals("0")) {
                probe.setTest(true);
            }
            else {
                probe.setTest(false);
            }
        }

        if ("MEDIUM".equals(key)) {
            probe.setMedia(value.toString());
        }

        if ("PROBENART".equals(key)) {
            QueryBuilder<Probenart> builder =
                new QueryBuilder<Probenart>(
                    repository.entityManager("stamm"),
                    Probenart.class);
            builder.and("probenart", value.toString());
            List<Probenart> probenart =
                (List<Probenart>)repository.filter(
                    builder.getQuery(),
                    "stamm").getData();
            if (probenart == null || probenart.isEmpty()) {
                ReportItem warn = new ReportItem();
                warn.setCode(673);
                warn.setKey("probenart");
                warn.setValue(key);
                currentWarnings.add(warn);
                return;
            }
            probe.setProbenartId(probenart.get(0).getId());
        }
    }
    /**
     * Add an attribute to the given LMessung object.
     *
     * @param key       The key mapping to a object member.
     * @param value     The value to set.
     * @param messung   The entity object.
     * @return The updated entity object.
     */
    public Messung addMessungAttribute(
        Entry<String, String> attribute,
        Messung messung
    ) {
        String key = attribute.getKey();
        String value = attribute.getValue();
        DateFormat format = new SimpleDateFormat("yyyyMMdd HHmm");
        if ("MESSUNGS_ID".equals(key)) {
            messung.setIdAlt(Integer.valueOf(value));
        }
        if ("NEBENPROBENNUMMER".equals(key)) {
            messung.setNebenprobenNr(value.toString());
        }
        else if ("MESS_DATUM_UHRZEIT".equals(key)) {
            try {
                Date d = format.parse(value.toString());
                messung.setMesszeitpunkt(new Timestamp(d.getTime()));
            }
            catch (ParseException e) {
                currentWarnings.add(new ReportItem(key, value.toString(), 674));
            }
        }
        else if ("MESSZEIT_SEKUNDEN".equals(key)) {
            Integer i = Integer.valueOf(value.toString());
            messung.setMessdauer(i);
        }
        else if ("MESSMETHODE_S".equals(key)) {
            messung.setMmtId(value.toString());
        }
        else if ("ERFASSUNG_ABGESCHLOSSEN".equals(key)) {
            if(!value.toString().equals("0")) {
                messung.setFertig(true);
            }
            else {
                messung.setFertig(false);
            }
        }
        return messung;
    }

    /**
     * @return the errors
     */
    public Map<String, List<ReportItem>> getErrors() {
        return errors;
    }

    /**
     * @return the errors
     */
    public Map<String, List<ReportItem>> getWarnings() {
        return warnings;
    }

    /**
     * @return the userInfo
     */
    public UserInfo getUserInfo() {
        return userInfo;
    }

    /**
     * @param userInfo the userInfo to set
     */
    public void setUserInfo(UserInfo userInfo) {
        this.userInfo = userInfo;
    }
}


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