rrenkert@310: package de.intevation.lada.data.importer; rrenkert@310: rrenkert@321: import java.math.BigInteger; rrenkert@321: import java.util.HashMap; rrenkert@321: import java.util.List; rrenkert@321: import java.util.Map; rrenkert@321: rrenkert@321: import javax.ejb.Stateless; rrenkert@321: import javax.ejb.TransactionAttribute; rrenkert@321: import javax.ejb.TransactionAttributeType; rrenkert@321: import javax.inject.Inject; rrenkert@310: import javax.inject.Named; rrenkert@321: import javax.persistence.EntityManager; rrenkert@321: import javax.persistence.Query; rrenkert@310: rrenkert@310: import de.intevation.lada.auth.AuthenticationResponse; rrenkert@321: import de.intevation.lada.data.Repository; rrenkert@321: import de.intevation.lada.model.LKommentarM; rrenkert@321: import de.intevation.lada.model.LKommentarP; rrenkert@321: import de.intevation.lada.model.LMessung; rrenkert@321: import de.intevation.lada.model.LMesswert; rrenkert@321: import de.intevation.lada.model.LOrt; rrenkert@321: import de.intevation.lada.model.LProbe; rrenkert@310: import de.intevation.lada.rest.Response; rrenkert@321: import de.intevation.lada.validation.ValidationException; rrenkert@321: import de.intevation.lada.validation.Validator; rrenkert@310: rrenkert@310: @Named("lafimporter") rrenkert@321: @Stateless rrenkert@310: public class LAFImporter rrenkert@310: implements Importer rrenkert@310: { rrenkert@321: rrenkert@321: @Inject rrenkert@321: private EntityManager em; rrenkert@321: rrenkert@321: @Inject rrenkert@321: private LAFParser parser; rrenkert@321: rrenkert@321: @Inject rrenkert@321: @Named("lprobevalidator") rrenkert@321: private Validator probeValidator; rrenkert@321: @Inject rrenkert@321: @Named("lmessungvalidator") rrenkert@321: private Validator messungValidator; rrenkert@321: @Inject rrenkert@321: @Named("lortvalidator") rrenkert@321: private Validator ortValidator; rrenkert@321: @Inject rrenkert@321: @Named("lmesswertvalidator") rrenkert@321: private Validator messwertValidator; rrenkert@321: rrenkert@321: @Inject rrenkert@321: @Named("lproberepository") rrenkert@321: private Repository probeRepository; rrenkert@321: @Inject rrenkert@321: @Named("lmessungrepository") rrenkert@321: private Repository messungRepository; rrenkert@321: @Inject rrenkert@321: @Named("lortrepository") rrenkert@321: private Repository ortRepository; rrenkert@321: @Inject rrenkert@321: @Named("lkommentarRepository") rrenkert@321: private Repository pKommentarRepository; rrenkert@321: @Inject rrenkert@321: @Named("lkommentarmrepository") rrenkert@321: private Repository mKommentarRepository; rrenkert@321: @Inject rrenkert@321: @Named("lmesswertrepository") rrenkert@321: private Repository messwertRepository; rrenkert@321: rrenkert@321: private Map> warnings; rrenkert@321: private Map> errors; rrenkert@321: rrenkert@321: public LAFImporter() { rrenkert@321: warnings = new HashMap>(); rrenkert@321: errors = new HashMap>(); rrenkert@321: } rrenkert@321: rrenkert@321: /** rrenkert@321: * @return the warnings rrenkert@321: */ rrenkert@321: public Map> getWarnings() { rrenkert@321: return warnings; rrenkert@321: } rrenkert@321: rrenkert@321: /** rrenkert@321: * @return the errors rrenkert@321: */ rrenkert@321: public Map> getErrors() { rrenkert@321: return errors; rrenkert@321: } rrenkert@321: rrenkert@310: @Override rrenkert@321: public boolean importData(String content, AuthenticationResponse auth) { rrenkert@321: try { rrenkert@321: boolean success = parser.parse(content); rrenkert@321: if (success) { rrenkert@321: List proben = parser.getProben(); rrenkert@321: List messungen = parser.getMessungen(); rrenkert@321: List orte = parser.getOrte(); rrenkert@321: List pKommentare = parser.getProbeKommentare(); rrenkert@321: List mKommentare = parser.getMessungKommentare(); rrenkert@321: List messwerte = parser.getMesswerte(); rrenkert@321: writeProben(auth, proben); rrenkert@321: writeMessungen(auth, messungen); rrenkert@321: //writeOrte(auth, orte); rrenkert@321: writePKommentare(auth, pKommentare); rrenkert@321: writeMKommentare(auth, mKommentare); rrenkert@321: writeMesswerte(auth, messwerte); rrenkert@321: } rrenkert@321: else { rrenkert@321: Map err = new HashMap(); rrenkert@321: err.put("no success", 660); rrenkert@321: errors.put("parser", err); rrenkert@321: return false; rrenkert@321: } rrenkert@321: } rrenkert@321: catch (LAFParserException e) { rrenkert@321: Map err = new HashMap(); rrenkert@321: err.put(e.getMessage(), 660); rrenkert@321: errors.put("parser", err); rrenkert@321: return false; rrenkert@321: } rrenkert@321: Map>> data = rrenkert@321: new HashMap>>(); rrenkert@321: data.put("warnings", warnings); rrenkert@321: data.put("errors", errors); rrenkert@321: return true; rrenkert@321: } rrenkert@321: rrenkert@321: private void writeMessungen( rrenkert@321: AuthenticationResponse auth, rrenkert@321: List messungen rrenkert@321: ) { rrenkert@321: for(LMessung messung: messungen) { rrenkert@321: try { rrenkert@321: rrenkert@321: Map warn = rrenkert@321: messungValidator.validate(messung, false); rrenkert@321: messungRepository.create(messung); rrenkert@321: if (warn != null) { rrenkert@321: warnings.put( rrenkert@321: messung.getMessungsId().toString(), rrenkert@321: warn); rrenkert@321: } rrenkert@321: } rrenkert@321: catch (ValidationException e) { rrenkert@321: errors.put(messung.getProbeId(), e.getErrors()); rrenkert@321: warnings.put( rrenkert@321: messung.getProbeId(), rrenkert@321: e.getWarnings()); rrenkert@321: } rrenkert@321: } rrenkert@321: } rrenkert@321: rrenkert@321: @TransactionAttribute(TransactionAttributeType.REQUIRED) rrenkert@321: private void writeMesswerte( rrenkert@321: AuthenticationResponse auth, rrenkert@321: List messwerte rrenkert@321: ) { rrenkert@321: for(LMesswert messwert: messwerte) { rrenkert@321: try { rrenkert@321: Map warn = rrenkert@321: messwertValidator.validate(messwert, false); rrenkert@321: Response r = messwertRepository.create(messwert); rrenkert@321: if (warn != null) { rrenkert@321: warnings.put( rrenkert@321: messwert.getProbeId(), rrenkert@321: warn); rrenkert@321: } rrenkert@321: } rrenkert@321: catch (ValidationException e) { rrenkert@321: errors.put(messwert.getProbeId(), e.getErrors()); rrenkert@321: warnings.put( rrenkert@321: messwert.getProbeId(), rrenkert@321: e.getWarnings()); rrenkert@321: } rrenkert@321: } rrenkert@321: } rrenkert@321: rrenkert@321: @TransactionAttribute(TransactionAttributeType.REQUIRED) rrenkert@321: private void writePKommentare( rrenkert@321: AuthenticationResponse auth, rrenkert@321: List kommentare rrenkert@321: ) { rrenkert@321: for(LKommentarP kommentar: kommentare) { rrenkert@321: try { rrenkert@321: pKommentarRepository.create(kommentar); rrenkert@321: } rrenkert@321: catch(Exception e) { rrenkert@321: Map err = new HashMap(); rrenkert@321: err.put( rrenkert@321: kommentar.getProbeId() + " - " + rrenkert@321: kommentar.getkId(), 661); rrenkert@321: errors.put("lkommentarp", err); rrenkert@321: } rrenkert@321: } rrenkert@321: } rrenkert@321: rrenkert@321: @TransactionAttribute(TransactionAttributeType.REQUIRED) rrenkert@321: private void writeMKommentare( rrenkert@321: AuthenticationResponse auth, rrenkert@321: List kommentare rrenkert@321: ) { rrenkert@321: for(LKommentarM kommentar: kommentare) { rrenkert@321: Query q = rrenkert@321: em.createNativeQuery( rrenkert@321: "select nextval('kommentar_m_id_seq')"); rrenkert@321: BigInteger seqId = (BigInteger)q.getSingleResult(); rrenkert@321: kommentar.getId().setKId(seqId.intValue()); rrenkert@321: mKommentarRepository.create(kommentar); rrenkert@321: } rrenkert@321: } rrenkert@321: rrenkert@321: @TransactionAttribute(TransactionAttributeType.REQUIRED) rrenkert@321: private void writeOrte( rrenkert@321: AuthenticationResponse auth, rrenkert@321: List orte rrenkert@321: ) { rrenkert@321: for(LOrt ort: orte) { rrenkert@321: try { rrenkert@321: Map warn = rrenkert@321: ortValidator.validate(ort, false); rrenkert@321: ortRepository.create(ort); rrenkert@321: if (warn != null) { rrenkert@321: warnings.put(String.valueOf(ort.getOrtId()), warn); rrenkert@321: } rrenkert@321: } rrenkert@321: catch (ValidationException e) { rrenkert@321: errors.put(String.valueOf(ort.getOrtId()), e.getErrors()); rrenkert@321: warnings.put( rrenkert@321: String.valueOf(ort.getOrtId()), rrenkert@321: e.getWarnings()); rrenkert@321: } rrenkert@321: } rrenkert@321: } rrenkert@321: rrenkert@321: @TransactionAttribute(TransactionAttributeType.REQUIRED) rrenkert@321: private void writeProben(AuthenticationResponse auth, List proben) { rrenkert@321: for (LProbe probe: proben) { rrenkert@321: if (!authorized(probe, auth)) { rrenkert@321: Map err = new HashMap(); rrenkert@321: err.put("not authorized", 699); rrenkert@321: errors.put(probe.getProbeId(), err); rrenkert@321: continue; rrenkert@321: } rrenkert@321: try { rrenkert@321: Map warn = rrenkert@321: probeValidator.validate(probe, false); rrenkert@321: if (warn != null) { rrenkert@321: warnings.put(probe.getProbeId(), warn); rrenkert@321: } rrenkert@321: } rrenkert@321: catch (ValidationException e) { rrenkert@321: errors.put(probe.getProbeId(), e.getErrors()); rrenkert@321: warnings.put(probe.getProbeId(), e.getWarnings()); rrenkert@321: continue; rrenkert@321: } rrenkert@321: persist(probe); rrenkert@321: } rrenkert@321: } rrenkert@321: rrenkert@321: private boolean authorized(LProbe probe, AuthenticationResponse auth) { rrenkert@321: if (auth.getNetzbetreiber().contains(probe.getNetzbetreiberId()) && rrenkert@321: auth.getMst().contains(probe.getMstId())) { rrenkert@321: return true; rrenkert@321: } rrenkert@321: return false; rrenkert@321: } rrenkert@321: rrenkert@321: @TransactionAttribute(TransactionAttributeType.REQUIRED) rrenkert@321: private void persist(LProbe probe) { rrenkert@321: String queryColumns = "insert into l_probe (probe_id, ba_id, test," + rrenkert@321: " datenbasis_id, netzbetreiber_id, mst_id, probenart_id, umw_id"; rrenkert@321: String queryParameter = " values (:probe_id, :ba_id, :test," + rrenkert@321: " :datenbasis_id, :netzbetreiber_id, :mst_id, :probenart_id," + rrenkert@321: " :umw_id"; rrenkert@321: if (probe.getErzeugerId() != null) { rrenkert@321: queryColumns += ", erzeuger_id"; rrenkert@321: queryParameter += ", :erzeuger_id"; rrenkert@321: } rrenkert@321: if (probe.getHauptprobenNr() != null) { rrenkert@321: queryColumns += ", hauptproben_nr"; rrenkert@321: queryParameter += ", :hauptproben_nr"; rrenkert@321: } rrenkert@321: if (probe.getLetzteAenderung() != null) { rrenkert@321: queryColumns += ", letzte_aenderung"; rrenkert@321: queryParameter += ", :letzte_aenderung"; rrenkert@321: } rrenkert@321: if (probe.getMedia() != null) { rrenkert@321: queryColumns += ", media"; rrenkert@321: queryParameter += ", :media"; rrenkert@321: } rrenkert@321: if (probe.getMediaDesk() != null) { rrenkert@321: queryColumns += ", media_desk"; rrenkert@321: queryParameter += ", :media_desk"; rrenkert@321: } rrenkert@321: if (probe.getMittelungsdauer() != null) { rrenkert@321: queryColumns += ", mittelungsdauer"; rrenkert@321: queryParameter += ", :mittelungsdauer"; rrenkert@321: } rrenkert@321: if (probe.getMpKat() != null) { rrenkert@321: queryColumns += ", mp_kat"; rrenkert@321: queryParameter += ", mp_kat"; rrenkert@321: } rrenkert@321: if (probe.getMplId() != null) { rrenkert@321: queryColumns += ", mpl_id"; rrenkert@321: queryParameter += ", :mpl_id"; rrenkert@321: } rrenkert@321: if (probe.getMprId() != null) { rrenkert@321: queryColumns += ", mpr_id"; rrenkert@321: queryParameter += ", :mpr_id"; rrenkert@321: } rrenkert@321: if (probe.getProbeNehmerId() != null) { rrenkert@321: queryColumns += ", probe_nehmer_id"; rrenkert@321: queryParameter += ", :probe_nehmer_id"; rrenkert@321: } rrenkert@321: if (probe.getProbeentnahmeBeginn() != null) { rrenkert@321: queryColumns += ", probeentnahme_beginn"; rrenkert@321: queryParameter += ", :probeentnahme_beginn"; rrenkert@321: } rrenkert@321: if (probe.getProbeentnahmeEnde() != null) { rrenkert@321: queryColumns += ", probeentnahme_ende"; rrenkert@321: queryParameter += ", :probeentnahme_ende"; rrenkert@321: } rrenkert@321: if (probe.getSolldatumBeginn() != null) { rrenkert@321: queryColumns += ", solldatum_beginn"; rrenkert@321: queryParameter += ", :solldatum_beginn"; rrenkert@321: } rrenkert@321: if (probe.getSolldatumEnde() != null) { rrenkert@321: queryColumns += ", solldatum_ende"; rrenkert@321: queryParameter += ", :solldatum_ende"; rrenkert@321: } rrenkert@321: queryColumns += ") " + queryParameter + ")"; rrenkert@321: rrenkert@321: Query insert = em.createNativeQuery(queryColumns); rrenkert@321: insert.setParameter("probe_id", probe.getProbeId()); rrenkert@321: insert.setParameter("ba_id", probe.getBaId()); rrenkert@321: insert.setParameter("datenbasis_id", probe.getDatenbasisId()); rrenkert@321: insert.setParameter("mst_id", probe.getMstId()); rrenkert@321: insert.setParameter("netzbetreiber_id", probe.getNetzbetreiberId()); rrenkert@321: insert.setParameter("probenart_id", probe.getProbenartId()); rrenkert@321: insert.setParameter("test", probe.isTest()); rrenkert@321: insert.setParameter("umw_id", probe.getUmwId()); rrenkert@321: if (probe.getErzeugerId() != null) { rrenkert@321: insert.setParameter("erzeuger_id", probe.getErzeugerId()); rrenkert@321: } rrenkert@321: if (probe.getHauptprobenNr() != null) { rrenkert@321: insert.setParameter("hauptproben_nr", probe.getHauptprobenNr()); rrenkert@321: } rrenkert@321: if (probe.getLetzteAenderung() != null) { rrenkert@321: insert.setParameter("letzte_aenderung", probe.getLetzteAenderung()); rrenkert@321: } rrenkert@321: if (probe.getMedia() != null) { rrenkert@321: insert.setParameter("media", probe.getMedia()); rrenkert@321: } rrenkert@321: if (probe.getMediaDesk() != null) { rrenkert@321: insert.setParameter("media_desk", probe.getMediaDesk()); rrenkert@321: } rrenkert@321: if (probe.getMittelungsdauer() != null) { rrenkert@321: insert.setParameter("mittelungsdauer", probe.getMittelungsdauer()); rrenkert@321: } rrenkert@321: if (probe.getMpKat() != null) { rrenkert@321: insert.setParameter("mp_kat", probe.getMpKat()); rrenkert@321: } rrenkert@321: if (probe.getMplId() != null) { rrenkert@321: insert.setParameter("mpl_id", probe.getMplId()); rrenkert@321: } rrenkert@321: if (probe.getMprId() != null) { rrenkert@321: insert.setParameter("mpr_id", probe.getMprId()); rrenkert@321: } rrenkert@321: if (probe.getProbeNehmerId() != null) { rrenkert@321: insert.setParameter("probe_nehmer_id", probe.getProbeNehmerId()); rrenkert@321: } rrenkert@321: if (probe.getProbeentnahmeBeginn() != null) { rrenkert@321: insert.setParameter("probeentnahme_beginn", probe.getProbeentnahmeBeginn()); rrenkert@321: } rrenkert@321: if (probe.getProbeentnahmeEnde() != null) { rrenkert@321: insert.setParameter("probeentnahme_ende", probe.getProbeentnahmeEnde()); rrenkert@321: } rrenkert@321: if (probe.getSolldatumBeginn() != null) { rrenkert@321: insert.setParameter("solldatum_beginn", probe.getSolldatumBeginn()); rrenkert@321: } rrenkert@321: if (probe.getSolldatumEnde() != null) { rrenkert@321: insert.setParameter("solldatum_ende", probe.getSolldatumEnde()); rrenkert@321: } rrenkert@321: int res = insert.executeUpdate(); rrenkert@321: int i = res; rrenkert@310: } rrenkert@310: }