Mercurial > lada > lada-server
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 } |