# HG changeset patch # User Raimund Renkert # Date 1474280041 -7200 # Node ID 625b0adcba45557a26aa02b5f8b2bd2fdecc274e # Parent 6960275c4609bd171eeede6b411f9942654b9d20 Added class to merge/update objects coming from the importer. diff -r 6960275c4609 -r 625b0adcba45 src/main/java/de/intevation/lada/importer/ObjectMerger.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/de/intevation/lada/importer/ObjectMerger.java Mon Sep 19 12:14:01 2016 +0200 @@ -0,0 +1,220 @@ +/* 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.importer; + +import java.util.List; + +import javax.ejb.TransactionAttribute; +import javax.ejb.TransactionAttributeType; +import javax.inject.Inject; +import javax.naming.InitialContext; +import javax.naming.NamingException; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceException; +import javax.transaction.HeuristicMixedException; +import javax.transaction.HeuristicRollbackException; +import javax.transaction.NotSupportedException; +import javax.transaction.RollbackException; +import javax.transaction.SystemException; +import javax.transaction.UserTransaction; + +import org.apache.log4j.Logger; + +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.util.annotation.RepositoryConfig; +import de.intevation.lada.util.data.QueryBuilder; +import de.intevation.lada.util.data.Repository; +import de.intevation.lada.util.data.RepositoryType; + +public class ObjectMerger { + + @Inject + Logger logger; + + @Inject + @RepositoryConfig(type=RepositoryType.RW) + private Repository repository; + +// @Inject +// private UserTransaction userTransaction; +// @Resource +// private TransactionManager transactionManager; + //@PersistenceContext(unitName="land") + //private EntityManager entityManager; + + public ObjectMerger merge(Probe target, Probe src) { + target.setBaId(src.getBaId()); + target.setDatenbasisId(src.getDatenbasisId()); + target.setErzeugerId(src.getErzeugerId()); + if (!src.getHauptprobenNr().isEmpty()) { + target.setHauptprobenNr(src.getHauptprobenNr()); + } + target.setLaborMstId(src.getLaborMstId()); + target.setMedia(src.getMedia()); + target.setMediaDesk(src.getMediaDesk()); + target.setMittelungsdauer(src.getMittelungsdauer()); + target.setMplId(src.getMplId()); + target.setMprId(src.getMprId()); + target.setProbeentnahmeBeginn(src.getProbeentnahmeBeginn()); + target.setProbeentnahmeEnde(src.getProbeentnahmeEnde()); + target.setProbenartId(src.getProbenartId()); + target.setProbeNehmerId(src.getProbeNehmerId()); + target.setSolldatumBeginn(src.getSolldatumBeginn()); + target.setSolldatumEnde(src.getSolldatumEnde()); + target.setTest(src.getTest()); + target.setUmwId(src.getUmwId()); + repository.update(target, "land"); + return this; + } + + public ObjectMerger mergeMessung(Messung target, Messung src) { + if (target.getNebenprobenNr().isEmpty()) { + target.setNebenprobenNr(src.getNebenprobenNr()); + } + target.setFertig(src.getFertig()); + target.setGeplant(src.getGeplant()); + target.setMessdauer(src.getMessdauer()); + target.setMesszeitpunkt(src.getMesszeitpunkt()); + target.setMmtId(src.getMmtId()); + target.setStatus(src.getStatus()); + repository.update(target, "land"); + return this; + } + + public ObjectMerger mergeZusatzwerte( + Probe target, + List zusatzwerte + ) { + QueryBuilder builder = new QueryBuilder( + repository.entityManager("land"), + ZusatzWert.class); + for (int i = 0; i < zusatzwerte.size(); i++) { + builder.and("probeId", target.getId()); + builder.and("pzsId", zusatzwerte.get(i).getPzsId()); + List found = + repository.filterPlain(builder.getQuery(), "land"); + if (found.isEmpty()) { + repository.create(zusatzwerte.get(i), "land"); + continue; + } + else if (found.size() > 1) { + // something is wrong (probeId and pzsId should be unique). + // Continue and skip this zusatzwert. + continue; + } + // Update the objects. + // direktly update the db or update the list!? + // Updating the list could be a problem. List objects are detatched. + // + // Current solution: + // Remove all db objects to be able to create new ones. + found.get(0).setMessfehler(zusatzwerte.get(i).getMessfehler()); + found.get(0).setMesswertPzs(zusatzwerte.get(i).getMesswertPzs()); + found.get(0).setNwgZuMesswert(zusatzwerte.get(i).getNwgZuMesswert()); + repository.update(found.get(0), "land"); + } + return this; + } + + public ObjectMerger mergeKommentare( + Probe target, + List kommentare + ) { + QueryBuilder builder = new QueryBuilder( + repository.entityManager("land"), + KommentarP.class); + for (int i = 0; i < kommentare.size(); i++) { + builder.and("probeId", target.getId()); + builder.and("mstId", kommentare.get(i).getMstId()); + builder.and("datum", kommentare.get(i).getDatum()); + List found = + repository.filterPlain(builder.getQuery(), "land"); + if (found.isEmpty()) { + repository.create(kommentare.get(i), "land"); + continue; + } + else if (found.size() > 1) { + // something is wrong (probeId and mstId and datum should be unique). + // Continue and skip this zusatzwert. + continue; + } + } + return this; + } + + public ObjectMerger mergeOrte(Probe target, List orte) { + // TODO implement me + return this; + } + + public ObjectMerger mergeKommentare( + Messung target, + List kommentare + ) { + QueryBuilder builder = new QueryBuilder( + repository.entityManager("land"), + KommentarM.class); + for (int i = 0; i < kommentare.size(); i++) { + builder.and("messungsId", target.getId()); + builder.and("mstId", kommentare.get(i).getMstId()); + builder.and("datum", kommentare.get(i).getDatum()); + List found = + repository.filterPlain(builder.getQuery(), "land"); + if (found.isEmpty()) { + repository.create(kommentare.get(i), "land"); + continue; + } + else if (found.size() > 1) { + // something is wrong (probeId and mstId and datum should be unique). + // Continue and skip this zusatzwert. + continue; + } + } + return this; + } + + public ObjectMerger mergeMesswerte( + Messung target, + List messwerte + ) { + QueryBuilder builder = new QueryBuilder( + repository.entityManager("land"), + Messwert.class); + builder.and("messungsId", target.getId()); + List found = + repository.filterPlain(builder.getQuery(), "land"); + if (found.isEmpty()) { + return this; + } + try { + for (int i = 0; i < found.size(); i++) { + repository.delete(found.get(i), "land"); + } + repository.entityManager("land").flush(); + for (int i = 0; i < messwerte.size(); i++) { + repository.create(messwerte.get(i), "land"); + } + } catch (SecurityException | + IllegalStateException | + PersistenceException e + ) { + // Restore messwerte. + logger.debug("exception: ", e); + for (int i = 0; i < found.size(); i++) { + repository.create(found.get(i), "land"); + } + } + return this; + } +} diff -r 6960275c4609 -r 625b0adcba45 src/main/java/de/intevation/lada/importer/ProbeIdentifier.java --- a/src/main/java/de/intevation/lada/importer/ProbeIdentifier.java Fri Sep 09 15:35:49 2016 +0200 +++ b/src/main/java/de/intevation/lada/importer/ProbeIdentifier.java Mon Sep 19 12:14:01 2016 +0200 @@ -13,7 +13,6 @@ import javax.management.modelmbean.InvalidTargetObjectTypeException; import de.intevation.lada.model.land.Probe; -import de.intevation.lada.model.land.ZusatzWert; import de.intevation.lada.util.annotation.RepositoryConfig; import de.intevation.lada.util.data.QueryBuilder; import de.intevation.lada.util.data.Repository; @@ -97,32 +96,4 @@ } } } - - // TODO move the following functions to the correct class to have a clean - // interface impl. - public boolean merge(Probe result, Probe tomerge) { - result.setBaId(tomerge.getBaId()); - result.setDatenbasisId(tomerge.getDatenbasisId()); - result.setErzeugerId(tomerge.getErzeugerId()); - result.setHauptprobenNr(tomerge.getHauptprobenNr()); - result.setLaborMstId(tomerge.getLaborMstId()); - result.setMedia(tomerge.getMedia()); - result.setMediaDesk(tomerge.getMediaDesk()); - result.setMittelungsdauer(tomerge.getMittelungsdauer()); - result.setMplId(tomerge.getMplId()); - result.setMprId(tomerge.getMprId()); - result.setProbeentnahmeBeginn(tomerge.getProbeentnahmeBeginn()); - result.setProbeentnahmeEnde(tomerge.getProbeentnahmeEnde()); - result.setProbenartId(tomerge.getProbenartId()); - result.setProbeNehmerId(tomerge.getProbeNehmerId()); - result.setSolldatumBeginn(tomerge.getSolldatumBeginn()); - result.setSolldatumEnde(tomerge.getSolldatumEnde()); - result.setTest(tomerge.getTest()); - result.setUmwId(tomerge.getUmwId()); - return true; - } - - public boolean mergeZusatzwerte(Probe probe, List zusatzwerte) { - return true; - } }