From ac56869c2a981e40d6cf4637fb8fd46c06207c9d Mon Sep 17 00:00:00 2001 From: Christian Kollmann Date: Thu, 2 Dec 2021 16:05:57 +0100 Subject: Add PLZ to search for adresses in ZMR --- .../controller/AdresssucheController.java | 69 ++++++++++++++-------- .../src/main/resources/templates/residency.html | 26 +++++--- 2 files changed, 63 insertions(+), 32 deletions(-) (limited to 'connector/src/main') diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/AdresssucheController.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/AdresssucheController.java index c35aa8b9..f71917c3 100644 --- a/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/AdresssucheController.java +++ b/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/AdresssucheController.java @@ -30,11 +30,12 @@ import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenti import at.gv.bmi.namespace.zmr_su.zrm._20040201_.address.Adressdaten; import at.gv.e_government.reference.namespace.persondata.de._20040201.PostAdresseTyp; import at.gv.e_government.reference.namespace.persondata.de._20040201.ZustelladresseTyp; -import at.gv.egiz.eaaf.core.api.gui.IGuiBuilderConfiguration; import at.gv.egiz.eaaf.core.api.gui.ISpringMvcGuiFormBuilder; import at.gv.egiz.eaaf.core.api.idp.IConfiguration; import at.gv.egiz.eaaf.core.api.utils.IPendingRequestIdGenerationStrategy; +import at.gv.egiz.eaaf.core.exceptions.EaafException; import at.gv.egiz.eaaf.core.exceptions.GuiBuildException; +import at.gv.egiz.eaaf.core.exceptions.PendingReqIdValidationException; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -51,7 +52,10 @@ import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; /** @@ -78,9 +82,13 @@ public class AdresssucheController { @Autowired private IPendingRequestIdGenerationStrategy pendingReqGeneration; + /** + * Show the "residency.html" directly. + * TODO Remove this after testing. + */ @RequestMapping(value = {"/test"}, method = {RequestMethod.GET}) - public void test(HttpServletRequest request, HttpServletResponse response) throws GuiBuildException { - final IGuiBuilderConfiguration config = new StaticGuiBuilderConfiguration( + public void test(HttpServletRequest request, HttpServletResponse response) throws GuiBuildException, EaafException { + final StaticGuiBuilderConfiguration config = new StaticGuiBuilderConfiguration( basicConfig, "http://localhost:8080/ms_connector/", basicConfig.getBasicConfiguration(//TODO @@ -88,26 +96,34 @@ public class AdresssucheController { MsEidasNodeConstants.TEMPLATE_HTML_RESIDENCY), MsEidasNodeConstants.ENDPOINT_RESIDENCY_INPUT, resourceLoader); - // TODO Set the pendingId somehow + config.putCustomParameter(null, "pendingid", pendingReqGeneration.generateExternalPendingRequestId()); guiBuilder.build(request, response, config, "Query Austrian residency"); } + /** + * Performs search for addresses in ZMR. + */ @RequestMapping(value = {"/residency/search"}, method = {RequestMethod.POST}) - public ResponseEntity search(@RequestParam("municipality") String municipality, + public ResponseEntity search(@RequestParam("postleitzahl") String postleitzahl, + @RequestParam("municipality") String municipality, @RequestParam("village") String village, @RequestParam("street") String street, @RequestParam("number") String number, @RequestParam("pendingid") String pendingId) { - log.info("Search with '{}', '{}', '{}'", municipality, street, number); - // TODO validate pendingId -// try { -// pendingReqGeneration.validateAndGetPendingRequestId(pendingId); -// } catch (PendingReqIdValidationException e) { -// log.warn("Search with pendingId '{}' is not valid", pendingId); -// return ResponseEntity.badRequest().build(); -// } + log.info("Search with '{}', '{}', '{}', '{}', '{}'", + postleitzahl.replaceAll("[\r\n]", ""), + municipality.replaceAll("[\r\n]", ""), + village.replaceAll("[\r\n]", ""), + street.replaceAll("[\r\n]", ""), + number.replaceAll("[\r\n]", "")); try { - Adressdaten searchInput = buildSearchInput(municipality, village, street, number); + pendingReqGeneration.validateAndGetPendingRequestId(pendingId); + } catch (PendingReqIdValidationException e) { + log.warn("Search with pendingId '{}' is not valid", pendingId.replaceAll("[\r\n]", "")); + return ResponseEntity.badRequest().build(); + } + try { + Adressdaten searchInput = buildSearchInput(postleitzahl, municipality, village, street, number); ZmrAddressSoapClient.AddressInfo searchOutput = client.searchAddress(searchInput); AdresssucheResult output = buildResponse(searchOutput); return ResponseEntity.ok(output); @@ -120,24 +136,28 @@ public class AdresssucheController { private AdresssucheResult buildResponse(ZmrAddressSoapClient.AddressInfo searchOutput) { if (searchOutput.getPersonResult().isEmpty()) { log.warn("No result from ZMR"); - return new AdresssucheResult(Collections.emptyList(), 0, false, null); + return new AdresssucheResult(Collections.emptyList(), 0); } - boolean moreResults = false; - new HashSet<>(); log.info("Result level is {}", searchOutput.getLevel()); Set result = searchOutput.getPersonResult().stream() .map(Adressdaten::getPostAdresse) - .map(it -> new AdresssucheOutput(it.getGemeinde(), it.getOrtschaft(), + .map(it -> new AdresssucheOutput(it.getPostleitzahl(), it.getGemeinde(), it.getOrtschaft(), it.getZustelladresse().getStrassenname(), it.getZustelladresse().getOrientierungsnummer())) .collect(Collectors.toSet()); // TODO Add configuration option for the limit of 30 List sorted = result.stream().sorted().limit(30).collect(Collectors.toList()); - return new AdresssucheResult(sorted, result.size(), moreResults, searchOutput.getLevel().name()); + return new AdresssucheResult(sorted, result.size()); } - @NotNull - private Adressdaten buildSearchInput(String municipality, String village, String street, String number) { + private Adressdaten buildSearchInput(String postleitzahl, + String municipality, + String village, + String street, + String number) { PostAdresseTyp postAdresse = new PostAdresseTyp(); + if (StringUtils.isNotBlank(postleitzahl)) { + postAdresse.setPostleitzahl(postleitzahl); + } if (StringUtils.isNotBlank(municipality)) { postAdresse.setGemeinde(municipality); } @@ -164,14 +184,12 @@ public class AdresssucheController { public static class AdresssucheResult { private final Collection results; private final int resultCount; - private final boolean moreResults; - private final String detailLevel; - } @Data @AllArgsConstructor public static class AdresssucheOutput implements Comparable { + private final String postleitzahl; private final String municipality; private final String village; private final String street; @@ -180,6 +198,7 @@ public class AdresssucheController { @Override public int compareTo(@NotNull AdresssucheOutput o) { return new CompareToBuilder() + .append(this.postleitzahl, o.postleitzahl) .append(this.municipality, o.municipality) .append(this.village, o.village) .append(this.street, o.street) diff --git a/connector/src/main/resources/templates/residency.html b/connector/src/main/resources/templates/residency.html index 3f0532dd..b434b9f9 100644 --- a/connector/src/main/resources/templates/residency.html +++ b/connector/src/main/resources/templates/residency.html @@ -33,7 +33,8 @@ let foundText = /*[[#{gui.residency.found}]]*/ 'Found {0}'; let uniqueText = /*[[#{gui.residency.unique}]]*/ 'Unique'; let invalidInputText = /*[[#{gui.residency.header.inputinvalid}]]*/ 'Invalid'; - if (!$("#inputForm #inputMunicipality").val().trim() && !$("#inputForm #inputVillage").val().trim()) { + if (!$("#inputForm #inputMunicipality").val().trim() && !$("#inputForm #inputPostleitzahl").val().trim() && + !$("#inputForm #inputVillage").val().trim()) { $("#textResult").show().text(invalidInputText); return; } @@ -46,6 +47,7 @@ $("#textResult").show().text(uniqueText); $("#tableResult tbody").empty(); $("#tableResult").hide(); + $("#inputForm #inputPostleitzahl").val(data["results"][0]["postleitzahl"]); $("#inputForm #inputMunicipality").val(data["results"][0]["municipality"]); $("#inputForm #inputVillage").val(data["results"][0]["village"]); $("#inputForm #inputStreet").val(data["results"][0]["street"]); @@ -58,20 +60,25 @@ $.each(data.results, function (i, output) { $("#tableResult tbody") .append($("") + .append($("").text(output["postleitzahl"] !== null ? output["postleitzahl"] : "")) .append($("").text(output["municipality"] !== null ? output["municipality"] : "")) .append($("").text(output["village"] !== null ? output["village"] : "")) .append($("").text(output["street"] !== null ? output["street"] : "")) .append($("").text(output["number"] !== null ? output["number"] : "")) .append($("").text(applyText).attr("href", "#").click(function () { - $("#inputForm #inputMunicipality").val($(this).parent().children("td:nth-child(1)").text()); - $("#inputForm #inputVillage").val($(this).parent().children("td:nth-child(2)").text()); - $("#inputForm #inputStreet").val($(this).parent().children("td:nth-child(3)").text()); - $("#inputForm #inputNumber").val($(this).parent().children("td:nth-child(4)").text()); + $("#inputForm #inputPostleitzahl").val($(this).parent().children("td:nth-child(1)").text()); + $("#inputForm #inputMunicipality").val($(this).parent().children("td:nth-child(2)").text()); + $("#inputForm #inputVillage").val($(this).parent().children("td:nth-child(3)").text()); + $("#inputForm #inputStreet").val($(this).parent().children("td:nth-child(4)").text()); + $("#inputForm #inputNumber").val($(this).parent().children("td:nth-child(5)").text()); $("#textResult").show().text(updatedText); search(); })) ); }) + if (data.results.length == 0) { + $("#tableResult").hide(); + } }).fail(function (jqXHR, textStatus, errorThrown) { $("#textResult").show().text(errorText); }) @@ -106,6 +113,10 @@
Please enter a Municipality or Village first
+
+ + +
@@ -134,8 +145,8 @@
- +
@@ -148,6 +159,7 @@ + -- cgit v1.2.3
Postleitzahl Municipality Village Street