Mercurial > lada > lada-server
changeset 1261:dc7dde59bb54
Moved rules to create an ort object to ort factory.
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Fri, 27 Jan 2017 15:00:31 +0100 |
parents | 201cc62a1c57 |
children | 9dfb52db6a0f |
files | src/main/java/de/intevation/lada/factory/OrtFactory.java src/main/java/de/intevation/lada/importer/laf/LafObjectMapper.java |
diffstat | 2 files changed, 214 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/src/main/java/de/intevation/lada/factory/OrtFactory.java Fri Jan 27 13:27:08 2017 +0100 +++ b/src/main/java/de/intevation/lada/factory/OrtFactory.java Fri Jan 27 15:00:31 2017 +0100 @@ -27,7 +27,10 @@ import de.intevation.lada.importer.ReportItem; import de.intevation.lada.model.stammdaten.Ort; +import de.intevation.lada.model.stammdaten.Staat; +import de.intevation.lada.model.stammdaten.Verwaltungseinheit; 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; @@ -44,7 +47,7 @@ public void transformCoordinates(Ort ort) { errors = new ArrayList<ReportItem>(); - int kda = ort.getKdaId(); + Integer kda = ort.getKdaId(); String epsg = null; String xCoord = null; String yCoord = null; @@ -94,6 +97,141 @@ } } + /** + * Use given attribute to try to add other attributes. + * To set futher attributes at least one of the following attribute set + * need to be present: + * - kda, x, y + * - gemId + * - staat + * + * @param kda The koordinatenart + * @param x The x coordinate + * @param y The y coordinate + * @param gemId The gemeinde id + * @param staat The staat id + */ + public Ort completeOrt(Ort ort) { + QueryBuilder<Ort> builder = + new QueryBuilder<Ort>( + repository.entityManager("stamm"), + Ort.class); + logger.debug("try to make a complete ort"); + if (ort.getKdaId() != null && + ort.getKoordXExtern() != null && + ort.getKoordYExtern() != null + ) { + logger.debug("has koordinates"); + builder.and("kdaId", ort.getKdaId()); + builder.and("koordXExtern", ort.getKoordXExtern()); + builder.and("koordYExtern", ort.getKoordYExtern()); + builder.and("ozId", ort.getOzId()); + builder.and("netzbetreiberId", ort.getNetzbetreiberId()); + List<Ort> orte = repository.filterPlain(builder.getQuery(), "stamm"); + if (orte != null && orte.size() > 0) { + return orte.get(0); + } + } + else if (ort.getGemId() != null) { + logger.debug("has gemid"); + builder.and("gemId", ort.getGemId()); + builder.and("ozId", ort.getOzId()); + builder.and("netzbetreiberId", ort.getNetzbetreiberId()); + List<Ort> orte = repository.filterPlain(builder.getQuery(), "stamm"); + if (orte != null && orte.size() > 0) { + logger.debug("found ort: " + orte.get(0).getId()); + return orte.get(0); + } + } + else if (ort.getStaatId() != null && + ort.getStaatId() != 0 + ) { + logger.debug("has staat"); + builder.and("staatId", ort.getGemId()); + builder.and("ozId", ort.getOzId()); + builder.and("netzbetreiberId", ort.getNetzbetreiberId()); + List<Ort> orte = repository.filterPlain(builder.getQuery(), "stamm"); + if (orte != null && orte.size() > 0) { + return orte.get(0); + } + } + + logger.debug("no ort found"); + return createOrt(ort); + } + + private Ort createOrt(Ort ort) { + boolean hasKoord = false; + boolean hasGem = false; + boolean hasStaat = false; + if (ort.getKdaId() != null && + ort.getKoordXExtern() != null && + ort.getKoordYExtern() != null + ) { + logger.debug("transformCoordinates"); + transformCoordinates(ort); + hasKoord = true; + } + if (ort.getGemId() == null && hasKoord) { + logger.debug("findVerwaltungseinheit"); + findVerwaltungseinheit(ort); + } + if (ort.getGemId() != null){ + if (ort.getStaatId() == null) { + ort.setStaatId(0); + } + Verwaltungseinheit v = repository.getByIdPlain( + Verwaltungseinheit.class, + ort.getGemId(), + "stamm"); + if (!hasKoord) { + logger.debug("add coordinates"); + ort.setMpArt("V"); + ort.setKdaId(4); + ort.setKoordYExtern(String.valueOf(v.getMittelpunkt().getY())); + ort.setKoordXExtern(String.valueOf(v.getMittelpunkt().getX())); + } + if (ort.getKurztext() == null) { + ort.setKurztext(v.getBezeichnung()); + } + if (ort.getLangtext() == null) { + ort.setLangtext(v.getBezeichnung()); + } + if (ort.getBerichtstext() == null) { + ort.setBerichtstext(v.getBezeichnung()); + } + transformCoordinates(ort); + hasGem = true; + } + if (ort.getStaatId() != null && + ort.getStaatId() != 0 && + !hasKoord && + !hasGem + ) { + Staat staat = + repository.getByIdPlain(Staat.class, ort.getStaatId(), "stamm"); + ort.setKdaId(staat.getKdaId()); + ort.setKoordXExtern(staat.getKoordXExtern()); + ort.setKoordYExtern(staat.getKoordYExtern()); + ort.setKurztext(staat.getStaat()); + ort.setLangtext(staat.getStaat()); + if (staat.getStaatIso() != null) { + ort.setOrtId("Staat_" + staat.getStaatIso()); + } + ort.setBerichtstext(staat.getStaat()); + transformCoordinates(ort); + hasStaat = true; + } + return ort; + } + + /** + * Use the geom of an ort object to determine the verwaltungseinheit. + * If verwaltungseinheit was found the gemId is used as reference in the ort + * object. + * + * @param ort The ort object + */ public void findVerwaltungseinheit(Ort ort) { if (ort.getGeom() == null) { return; @@ -132,6 +270,6 @@ } public boolean hasErrors() { - return !errors.isEmpty(); + return !(errors == null) && !errors.isEmpty(); } }
--- a/src/main/java/de/intevation/lada/importer/laf/LafObjectMapper.java Fri Jan 27 13:27:08 2017 +0100 +++ b/src/main/java/de/intevation/lada/importer/laf/LafObjectMapper.java Fri Jan 27 15:00:31 2017 +0100 @@ -634,6 +634,11 @@ } private Ort findOrCreateOrt(Map<String, String> attributes, String type, Probe probe) { + Integer kda = null; + Integer x = null; + Integer y = null; + String gemId = null; + Ort o = new Ort(); // If laf contains coordinates, find a ort with matching coordinates or // create one. if ((attributes.get(type + "KOORDINATEN_ART") != null || @@ -641,12 +646,8 @@ attributes.get(type + "KOORDINATEN_X") != null && attributes.get(type + "KOORDINATEN_Y") != null ) { - QueryBuilder<Ort> builder = - new QueryBuilder<Ort>( - repository.entityManager("stamm"), - Ort.class); if (attributes.get(type + "KOORDINATEN_ART_S") != null) { - builder.and("kdaId", Integer.valueOf(attributes.get(type + "KOORDINATEN_ART_S"))); + o.setKdaId(Integer.valueOf(attributes.get(type + "KOORDINATEN_ART_S"))); } else { QueryBuilder<KoordinatenArt> kdaBuilder = @@ -663,21 +664,13 @@ currentErrors.add(err); return null; } - builder.and("kdaId", arten.get(0).getId()); + o.setKdaId(arten.get(0).getId()); } - builder.and("koordXExtern", attributes.get(type + "KOORDINATEN_X")); - builder.and("koordYExtern", attributes.get(type + "KOORDINATEN_Y")); - List<Ort> orte = repository.filterPlain(builder.getQuery(), "stamm"); - if (orte != null && orte.size() > 0) { - return orte.get(0); - } - else { - return createNewOrt(attributes, type, probe); - } + o.setKoordXExtern(attributes.get(type + "KOORDINATEN_X")); + o.setKoordYExtern(attributes.get(type + "KOORDINATEN_Y")); } // If laf contains gemeinde attributes, find a ort with matching gemId // or create one. - String gemId = null; if (attributes.get(type + "GEMEINDENAME") != null) { QueryBuilder<Verwaltungseinheit> builder = new QueryBuilder<Verwaltungseinheit>( @@ -687,24 +680,78 @@ List<Verwaltungseinheit> ves = repository.filterPlain(builder.getQuery(), "stamm"); if (ves != null && ves.size() > 0) { - gemId = ves.get(0).getId(); + o.setGemId(ves.get(0).getId()); } } else if (attributes.get(type + "GEMEINDESCHLUESSEL") != null) { - gemId = attributes.get(type + "GEMEINDESCHLUESSEL"); + o.setGemId(attributes.get(type + "GEMEINDESCHLUESSEL")); } - if (gemId != null) { - QueryBuilder<Ort> builder = - new QueryBuilder<Ort>( + String hLand = ""; + String staatFilter = ""; + if (attributes.get(type + "HERKUNFTSLAND_S") != null) { + staatFilter = "id"; + hLand = attributes.get(type + "HERKUNFTSLAND_S"); + } + else if (attributes.get(type + "HERKUNFTSLAND_KURZ") != null) { + staatFilter = "staatKurz"; + hLand = attributes.get(type + "HERKUNFTSLAND_KURZ"); + } + else if (attributes.get(type + "HERKUNFTSLAND_LANG") != null) { + staatFilter = "staat"; + hLand = attributes.get(type + "HERKUNFTSLAND_LANG"); + } + + if (staatFilter.length() > 0) { + QueryBuilder<Staat> builderStaat = + new QueryBuilder<Staat>( repository.entityManager("stamm"), - Ort.class); - builder.and("gemId", gemId); - List<Ort> orte = repository.filterPlain(builder.getQuery(), "stamm"); - if (orte != null && orte.size() > 0) { - return orte.get(0); + Staat.class); + builderStaat.and(staatFilter, hLand); + List<Staat> staat = + repository.filterPlain(builderStaat.getQuery(), "stamm"); + if (staat != null && staat.size() > 0) { + o.setStaatId(staat.get(0).getId()); } } - return createNewOrt(attributes, type, probe); + if (attributes.containsKey(type + "HOEHE_NN")) { + o.setHoeheUeberNn(Float.valueOf(attributes.get(type + "HOEHE_NN"))); + } + if (attributes.containsKey(type + "ORTS_ZUSATZCODE")) { + Ortszusatz zusatz = repository.getByIdPlain( + Ortszusatz.class, + attributes.get(type + "ORTS_ZUSATZCODE"), + "stamm"); + if (zusatz != null) { + o.setOzId(zusatz.getOzsId()); + } + } + MessStelle mst = repository.getByIdPlain(MessStelle.class, probe.getMstId(), "stamm"); + o.setNetzbetreiberId(mst.getNetzbetreiberId()); + o = ortFactory.completeOrt(o); + if (o == null) { + return null; + } + Violation violation = ortValidator.validate(o); + 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()) { + for (Entry<String, List<Integer>> err : + violation.getErrors().entrySet()) { + for (Integer code : err.getValue()) { + // Add to warnings because Probe object might be imported + currentWarnings.add( + new ReportItem("validation", err.getKey(), code)); + } + } + return null; + } + repository.create(o, "stamm"); + return o; } private Ort createNewOrt(Map<String, String> attributes, String type, Probe probe) {