aboutsummaryrefslogtreecommitdiff
path: root/connector/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'connector/src/main')
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/controller/AdresssucheController.java69
-rw-r--r--connector/src/main/resources/templates/residency.html26
2 files changed, 63 insertions, 32 deletions
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<AdresssucheResult> search(@RequestParam("municipality") String municipality,
+ public ResponseEntity<AdresssucheResult> 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<AdresssucheOutput> 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<AdresssucheOutput> 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<AdresssucheOutput> results;
private final int resultCount;
- private final boolean moreResults;
- private final String detailLevel;
-
}
@Data
@AllArgsConstructor
public static class AdresssucheOutput implements Comparable<AdresssucheOutput> {
+ 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($("<tr>")
+ .append($("<td>").text(output["postleitzahl"] !== null ? output["postleitzahl"] : ""))
.append($("<td>").text(output["municipality"] !== null ? output["municipality"] : ""))
.append($("<td>").text(output["village"] !== null ? output["village"] : ""))
.append($("<td>").text(output["street"] !== null ? output["street"] : ""))
.append($("<td>").text(output["number"] !== null ? output["number"] : ""))
.append($("<td>").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);
})
@@ -107,6 +114,10 @@
th:attr="action=@{${submitEndpoint}}">
<div th:text="#{gui.residency.header.help}">Please enter a Municipality or Village first</div>
<div>
+ <label for="inputPostleitzahl" th:text="#{gui.residency.input.postleitzahl}">Postleitzahl</label>
+ <input type="text" id="inputPostleitzahl" name="postleitzahl" value=""/>
+ </div>
+ <div>
<label for="inputMunicipality" th:text="#{gui.residency.input.municipality}">Municipality</label>
<input type="text" id="inputMunicipality" name="municipality" value=""/>
</div>
@@ -134,8 +145,8 @@
<button type="button" class="block" th:attr="value=#{gui.residency.proceed}">Proceed</button>
</div>
<div>
- <img id="loading" src="$contextPath/static/img/ajax-loader.gif"
- th:attr="src=@{/static/img/ajax-loader.gif}" />
+ <img id="loading" src="$contextPath/static/img/ajax-loader.gif"
+ th:attr="src=@{/static/img/ajax-loader.gif}"/>
</div>
<input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
</form>
@@ -148,6 +159,7 @@
<table id="tableResult">
<thead>
<tr>
+ <th th:text="#{gui.residency.input.postleitzahl}">Postleitzahl</th>
<th th:text="#{gui.residency.input.municipality}">Municipality</th>
<th th:text="#{gui.residency.input.village}">Village</th>
<th th:text="#{gui.residency.input.street}">Street</th>