comparison src/main/java/de/intevation/lada/importer/laf/LafObjectMapper.java @ 1146:5eb9d35aa47a

Parse, map and merge orte.
author Raimund Renkert <raimund.renkert@intevation.de>
date Mon, 07 Nov 2016 10:09:22 +0100
parents c1713b7fbfa0
children 7a9bc3fe0efd
comparison
equal deleted inserted replaced
1145:cbdeac32465c 1146:5eb9d35aa47a
25 import de.intevation.lada.importer.ReportItem; 25 import de.intevation.lada.importer.ReportItem;
26 import de.intevation.lada.model.land.KommentarM; 26 import de.intevation.lada.model.land.KommentarM;
27 import de.intevation.lada.model.land.KommentarP; 27 import de.intevation.lada.model.land.KommentarP;
28 import de.intevation.lada.model.land.Messung; 28 import de.intevation.lada.model.land.Messung;
29 import de.intevation.lada.model.land.Messwert; 29 import de.intevation.lada.model.land.Messwert;
30 import de.intevation.lada.model.land.Ortszuordnung;
30 import de.intevation.lada.model.land.Probe; 31 import de.intevation.lada.model.land.Probe;
31 import de.intevation.lada.model.land.StatusProtokoll; 32 import de.intevation.lada.model.land.StatusProtokoll;
32 import de.intevation.lada.model.land.ZusatzWert; 33 import de.intevation.lada.model.land.ZusatzWert;
33 import de.intevation.lada.model.stammdaten.Datenbasis; 34 import de.intevation.lada.model.stammdaten.Datenbasis;
35 import de.intevation.lada.model.stammdaten.KoordinatenArt;
34 import de.intevation.lada.model.stammdaten.MessEinheit; 36 import de.intevation.lada.model.stammdaten.MessEinheit;
35 import de.intevation.lada.model.stammdaten.MessStelle; 37 import de.intevation.lada.model.stammdaten.MessStelle;
36 import de.intevation.lada.model.stammdaten.Messgroesse; 38 import de.intevation.lada.model.stammdaten.Messgroesse;
37 import de.intevation.lada.model.stammdaten.MessprogrammKategorie; 39 import de.intevation.lada.model.stammdaten.MessprogrammKategorie;
38 import de.intevation.lada.model.stammdaten.MessprogrammTransfer; 40 import de.intevation.lada.model.stammdaten.MessprogrammTransfer;
41 import de.intevation.lada.model.stammdaten.Ort;
42 import de.intevation.lada.model.stammdaten.Ortszusatz;
39 import de.intevation.lada.model.stammdaten.ProbenZusatz; 43 import de.intevation.lada.model.stammdaten.ProbenZusatz;
40 import de.intevation.lada.model.stammdaten.Probenart; 44 import de.intevation.lada.model.stammdaten.Probenart;
45 import de.intevation.lada.model.stammdaten.Staat;
41 import de.intevation.lada.model.stammdaten.StatusKombi; 46 import de.intevation.lada.model.stammdaten.StatusKombi;
42 import de.intevation.lada.model.stammdaten.Umwelt; 47 import de.intevation.lada.model.stammdaten.Umwelt;
48 import de.intevation.lada.model.stammdaten.Verwaltungseinheit;
43 import de.intevation.lada.util.annotation.AuthorizationConfig; 49 import de.intevation.lada.util.annotation.AuthorizationConfig;
44 import de.intevation.lada.util.annotation.RepositoryConfig; 50 import de.intevation.lada.util.annotation.RepositoryConfig;
45 import de.intevation.lada.util.auth.Authorization; 51 import de.intevation.lada.util.auth.Authorization;
46 import de.intevation.lada.util.auth.AuthorizationType; 52 import de.intevation.lada.util.auth.AuthorizationType;
47 import de.intevation.lada.util.auth.UserInfo; 53 import de.intevation.lada.util.auth.UserInfo;
181 for (Entry<String, List<Integer>> warn : violation.getWarnings().entrySet()) { 187 for (Entry<String, List<Integer>> warn : violation.getWarnings().entrySet()) {
182 for (Integer code : warn.getValue()) { 188 for (Integer code : warn.getValue()) {
183 currentWarnings.add(new ReportItem("validation", warn.getKey(), code)); 189 currentWarnings.add(new ReportItem("validation", warn.getKey(), code));
184 } 190 }
185 } 191 }
186 if (!violation.hasErrors()) { 192 Response created = repository.create(probe, "land");
187 Response created = repository.create(probe, "land"); 193 newProbe = ((Probe)created.getData());
188 newProbe = ((Probe)created.getData());
189 }
190 } 194 }
191 } catch (InvalidTargetObjectTypeException e) { 195 } catch (InvalidTargetObjectTypeException e) {
192 ReportItem err = new ReportItem(); 196 ReportItem err = new ReportItem();
193 err.setCode(604); 197 err.setCode(604);
194 err.setKey("not known"); 198 err.setKey("not known");
202 warnings.put(object.getIdentifier(), 206 warnings.put(object.getIdentifier(),
203 new ArrayList<ReportItem>(currentWarnings)); 207 new ArrayList<ReportItem>(currentWarnings));
204 } 208 }
205 return; 209 return;
206 } 210 }
207 if (newProbe != null) { 211 if (newProbe == null) {
208 // Create kommentar objects 212 // Only occurs if object type is not probe
209 List<KommentarP> kommentare = new ArrayList<KommentarP>(); 213 return;
210 for (int i = 0; i < object.getKommentare().size(); i++) { 214 }
211 KommentarP tmp = createProbeKommentar( 215 // Create kommentar objects
212 object.getKommentare().get(i), newProbe.getId()); 216 List<KommentarP> kommentare = new ArrayList<KommentarP>();
213 if (tmp != null) { 217 for (int i = 0; i < object.getKommentare().size(); i++) {
214 kommentare.add(tmp); 218 KommentarP tmp = createProbeKommentar(object.getKommentare().get(i), newProbe.getId());
215 } 219 if (tmp != null) {
216 } 220 kommentare.add(tmp);
217 // Persist kommentar objects 221 }
218 merger.mergeKommentare(newProbe, kommentare); 222 }
219 223 // Persist kommentar objects
220 // Create zusatzwert objects 224 merger.mergeKommentare(newProbe, kommentare);
221 List<ZusatzWert> zusatzwerte = new ArrayList<ZusatzWert>(); 225
222 for (int i = 0; i < object.getZusatzwerte().size(); i++) { 226 // Create zusatzwert objects
223 ZusatzWert tmp = createZusatzwert( 227 List<ZusatzWert> zusatzwerte = new ArrayList<ZusatzWert>();
224 object.getZusatzwerte().get(i), newProbe.getId()); 228 for (int i = 0; i < object.getZusatzwerte().size(); i++) {
225 if (tmp != null) { 229 ZusatzWert tmp = createZusatzwert(object.getZusatzwerte().get(i), newProbe.getId());
226 zusatzwerte.add(tmp); 230 if (tmp != null) {
227 } 231 zusatzwerte.add(tmp);
228 } 232 }
229 // Persist zusatzwert objects 233 }
230 merger.mergeZusatzwerte(newProbe, zusatzwerte); 234 // Persist zusatzwert objects
231 235 merger.mergeZusatzwerte(newProbe, zusatzwerte);
232 // Create messung objects 236
233 for (LafRawData.Messung messung : object.getMessungen()) { 237 // Merge entnahmeOrt
234 create(messung, newProbe.getId(), newProbe.getMstId()); 238 createEntnahmeOrt(object.getEntnahmeOrt(), newProbe.getId());
235 } 239
236 } 240 // Create ursprungsOrte
237 241 List<Ortszuordnung> uOrte = new ArrayList<Ortszuordnung>();
242 for (int i = 0; i < object.getUrsprungsOrte().size(); i++) {
243 Ortszuordnung tmp = createUrsprungsOrt(object.getUrsprungsOrte().get(i), newProbe.getId());
244 if (tmp != null) {
245 uOrte.add(tmp);
246 }
247 }
248 // Persist ursprungsOrte
249 merger.mergeUrsprungsOrte(newProbe.getId(), uOrte);
250
251 // Create messung objects
252 for (int i = 0; i < object.getMessungen().size(); i++) {
253 create(object.getMessungen().get(i), newProbe.getId(), newProbe.getMstId());
254 }
238 if (currentErrors.size() > 0) { 255 if (currentErrors.size() > 0) {
239 errors.put(object.getIdentifier(), 256 errors.put(object.getIdentifier(),
240 new ArrayList<ReportItem>(currentErrors)); 257 new ArrayList<ReportItem>(currentErrors));
241 } 258 }
242 if (currentWarnings.size() > 0) { 259 if (currentWarnings.size() > 0) {
571 } 588 }
572 if (last != null) { 589 if (last != null) {
573 messung.setStatus(last.getId()); 590 messung.setStatus(last.getId());
574 repository.update(messung, "land"); 591 repository.update(messung, "land");
575 } 592 }
593 }
594
595 private Ortszuordnung createUrsprungsOrt(
596 Map<String, String> ursprungsOrt,
597 Integer id
598 ) {
599 Ortszuordnung ort = new Ortszuordnung();
600 ort.setOrtszuordnungTyp("U");
601 ort.setProbeId(id);
602
603 Ort o = findOrCreateOrt(ursprungsOrt, "U_");
604 if (o == null) {
605 return null;
606 }
607 ort.setOrtId(Long.valueOf(o.getId()));
608 if (ursprungsOrt.containsKey("U_ORTS_ZUSATZTEXT")) {
609 ort.setOrtszusatztext(ursprungsOrt.get("U_ORTS_ZUSATZTEXT"));
610 }
611 if (ursprungsOrt.containsKey("U_ORTS_ZUSATZCODE")) {
612 Ortszusatz zusatz = repository.getByIdPlain(
613 Ortszusatz.class,
614 ursprungsOrt.get("U_ORTS_ZUSATZCODE"),
615 "stamm");
616 if (zusatz != null) {
617 o.setOzId(zusatz.getOzsId());
618 repository.update(o, "stamm");
619 }
620 }
621 return ort;
622 }
623
624 private void createEntnahmeOrt(
625 Map<String, String> entnahmeOrt,
626 Integer id
627 ) {
628 Ortszuordnung ort = new Ortszuordnung();
629 ort.setOrtszuordnungTyp("E");
630 ort.setProbeId(id);
631
632 Ort o = findOrCreateOrt(entnahmeOrt, "P_");
633 if (o == null) {
634 return;
635 }
636 ort.setOrtId(Long.valueOf(o.getId()));
637 if (entnahmeOrt.containsKey("P_ORTS_ZUSATZTEXT")) {
638 ort.setOrtszusatztext(entnahmeOrt.get("P_ORTS_ZUSATZTEXT"));
639 }
640 merger.mergeEntnahmeOrt(id, ort);
641 }
642
643 private Ort findOrCreateOrt(Map<String, String> attributes, String type) {
644 // If laf contains coordinates, find a ort with matching coordinates or
645 // create one.
646 for (Entry<String, String> entry : attributes.entrySet()) {
647 logger.debug(entry.getKey() + ": " + entry.getValue());
648 }
649 if ((attributes.get(type + "KOORDINATEN_ART") != null ||
650 attributes.get(type + "KOORDINATEN_ART_S") != null) &&
651 attributes.get(type + "KOORDINATEN_X") != null &&
652 attributes.get(type + "KOORDINATEN_Y") != null
653 ) {
654 QueryBuilder<Ort> builder =
655 new QueryBuilder<Ort>(
656 repository.entityManager("stamm"),
657 Ort.class);
658 if (attributes.get(type + "KOORDINATEN_ART_S") != null) {
659 builder.and("kdaId", Integer.valueOf(attributes.get(type + "KOORDINATEN_ART_S")));
660 }
661 else {
662 QueryBuilder<KoordinatenArt> kdaBuilder =
663 new QueryBuilder<KoordinatenArt>(
664 repository.entityManager("stamm"),
665 KoordinatenArt.class);
666 kdaBuilder.and("koordinatenart", attributes.get(type + "KOORDINATEN_ART"));
667 List<KoordinatenArt> arten = repository.filterPlain(kdaBuilder.getQuery(), "stamm");
668 if (arten == null || arten.isEmpty()) {
669 ReportItem err = new ReportItem();
670 err.setCode(632);
671 err.setKey("KoordinatenArt");
672 err.setValue("Not found");
673 currentErrors.add(err);
674 return null;
675 }
676 logger.debug("kda: " + arten.get(0).getId());
677 builder.and("kdaId", arten.get(0).getId());
678 }
679 builder.and("koordXExtern", attributes.get(type + "KOORDINATEN_X"));
680 builder.and("koordYExtern", attributes.get(type + "KOORDINATEN_Y"));
681 List<Ort> orte = repository.filterPlain(builder.getQuery(), "stamm");
682 logger.debug(attributes.get(type + "KOORDINATEN_ART_S"));
683 logger.debug(attributes.get(type + "KOORDINATEN_X"));
684 logger.debug(attributes.get(type + "KOORDINATEN_Y"));
685 logger.debug(orte.size());
686 if (orte != null && orte.size() > 0) {
687 return orte.get(0);
688 }
689 else {
690 return createNewOrt(attributes, type);
691 }
692 }
693 // If laf contains gemeinde attributes, find a ort with matching gemId
694 // or create one.
695 String gemId = null;
696 if (attributes.get(type + "GEMEINDENAME") != null) {
697 QueryBuilder<Verwaltungseinheit> builder =
698 new QueryBuilder<Verwaltungseinheit>(
699 repository.entityManager("stamm"),
700 Verwaltungseinheit.class);
701 builder.and("bezeichnung", attributes.get(type + "GEMEINDENAME"));
702 List<Verwaltungseinheit> ves =
703 repository.filterPlain(builder.getQuery(), "stamm");
704 if (ves != null && ves.size() > 0) {
705 gemId = ves.get(0).getId();
706 }
707 }
708 else if (attributes.get(type + "GEMEINDESCHLUESSEL") != null) {
709 gemId = attributes.get(type + "GEMEINDESCHLUESSEL");
710 }
711 if (gemId != null) {
712 QueryBuilder<Ort> builder =
713 new QueryBuilder<Ort>(
714 repository.entityManager("stamm"),
715 Ort.class);
716 builder.and("gemId", gemId);
717 List<Ort> orte = repository.filterPlain(builder.getQuery(), "stamm");
718 if (orte != null && orte.size() > 0) {
719 return orte.get(0);
720 }
721 else {
722 return createNewOrt(attributes, type);
723 }
724 }
725 else {
726 // Create a new ort.
727 }
728 return createNewOrt(attributes, type);
729 }
730
731 private Ort createNewOrt(Map<String, String> attributes, String type) {
732 Ort ort = new Ort();
733 ort.setOrtTyp(1);
734 String hLand = "";
735 String staatFilter = "";
736 if (attributes.get(type + "HERKUNFTSLAND_S") != null) {
737 staatFilter = "staatIso";
738 hLand = attributes.get(type + "HERKUNFTSLAND_S");
739 }
740 else if (attributes.get(type + "HERKUNFTSLAND_KURZ") != null) {
741 staatFilter = "staatKurz";
742 hLand = attributes.get(type + "HERKUNFTSLAND_KURZ");
743 }
744 else if (attributes.get(type + "HERKUNFTSLAND_LANG") != null) {
745 staatFilter = "staat";
746 hLand = attributes.get(type + "HERKUNFTSLAND_LANG");
747 }
748 QueryBuilder<Staat> builderStaat =
749 new QueryBuilder<Staat>(
750 repository.entityManager("stamm"),
751 Staat.class);
752 if (staatFilter.length() > 0) {
753 builderStaat.and(staatFilter, hLand);
754 List<Staat> staat =
755 repository.filterPlain(builderStaat.getQuery(), "stamm");
756 if (staat != null && staat.size() > 0) {
757 ort.setStaatId(staat.get(0).getId());
758 }
759 }
760
761 String gemId = null;
762 if (attributes.get(type + "GEMEINDENAME") != null) {
763 QueryBuilder<Verwaltungseinheit> builder =
764 new QueryBuilder<Verwaltungseinheit>(
765 repository.entityManager("stamm"),
766 Verwaltungseinheit.class);
767 builder.and("bezeichnung", attributes.get(type + "GEMEINDENAME"));
768 List<Verwaltungseinheit> ves =
769 repository.filterPlain(builder.getQuery(), "stamm");
770 if (ves != null && ves.size() > 0) {
771 gemId = ves.get(0).getId();
772 }
773 }
774 else if (attributes.get(type + "GEMEINDESCHLUESSEL") != null) {
775 gemId = attributes.get(type + "GEMEINDESCHLUESSEL");
776 }
777 if (gemId != null) {
778 ort.setGemId(gemId);
779 }
780 if ((attributes.get(type + "KOORDINATEN_ART") != null ||
781 attributes.get(type + "KOORDINATEN_ART_S") != null) &&
782 attributes.get(type + "KOORDINATEN_X") != null &&
783 attributes.get(type + "KOORDINATEN_Y") != null
784 ) {
785 if (attributes.get(type + "KOORDINATEN_ART_S") != null) {
786 }
787 }
788 // repository.create(ort, "stamm");
789 // return ort;
790 return null;
576 } 791 }
577 792
578 private void logProbe(Probe probe) { 793 private void logProbe(Probe probe) {
579 logger.debug("%PROBE%"); 794 logger.debug("%PROBE%");
580 logger.debug("datenbasis: " + probe.getDatenbasisId()); 795 logger.debug("datenbasis: " + probe.getDatenbasisId());
651 probe.setMprId(v); 866 probe.setMprId(v);
652 } 867 }
653 868
654 if ("MESSSTELLE".equals(key)) { 869 if ("MESSSTELLE".equals(key)) {
655 probe.setMstId(value.toString()); 870 probe.setMstId(value.toString());
656
657 /* MESSLABOR is optional in LAF but probe.labor_mst_id is
658 * NOT NULL in the LADA database */
659 if (probe.getLaborMstId() == null) {
660 probe.setLaborMstId(value.toString());
661 }
662 } 871 }
663 872
664 if ("MESSLABOR".equals(key)) { 873 if ("MESSLABOR".equals(key)) {
665 probe.setLaborMstId(value.toString()); 874 probe.setLaborMstId(value.toString());
666 } 875 }
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)