Added avc code to the interceptors

This commit is contained in:
Nick Goupinets 2021-04-28 10:15:38 -04:00
parent a1604c95c9
commit 418c1aa2c6
3 changed files with 31 additions and 16 deletions

View File

@ -38,6 +38,11 @@ public interface IAddressValidator {
*/
public static final String ADDRESS_QUALITY_EXTENSION_URL = "http://hapifhir.org/StructureDefinition/ext-validation-address-quality";
/**
* URL for address verification extensions that may be added to addresses.
*/
public static final String ADDRESS_VERIFICATION_CODE_EXTENSION_URL = "http://hapifhir.org/StructureDefinition/ext-validation-address-verification";
/**
* FHIR Geolocation extension URL
*/

View File

@ -21,7 +21,6 @@ package ca.uhn.fhir.rest.server.interceptor.validation.address.impl;
*/
import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.rest.server.interceptor.validation.address.AddressValidationException;
import ca.uhn.fhir.rest.server.interceptor.validation.address.AddressValidationResult;
import ca.uhn.fhir.rest.server.interceptor.validation.helpers.AddressHelper;
import ca.uhn.fhir.util.ExtensionUtil;
@ -48,6 +47,9 @@ import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static ca.uhn.fhir.rest.server.interceptor.validation.address.IAddressValidator.ADDRESS_QUALITY_EXTENSION_URL;
import static ca.uhn.fhir.rest.server.interceptor.validation.address.IAddressValidator.ADDRESS_VERIFICATION_CODE_EXTENSION_URL;
/**
* For more details regarind the API refer to
* <a href="https://www.loqate.com/resources/support/cleanse-api/international-batch-cleanse/">
@ -60,6 +62,7 @@ public class LoquateAddressValidator extends BaseRestfulValidator {
public static final String PROPERTY_GEOCODE = "service.geocode";
public static final String LOQUATE_AQI = "AQI";
public static final String LOQUATE_AVC = "AVC";
protected static final String[] DUPLICATE_FIELDS_IN_ADDRESS_LINES = {"Locality", "AdministrativeArea", "PostalCode"};
protected static final String DEFAULT_DATA_CLEANSE_ENDPOINT = "https://api.addressy.com/Cleansing/International/Batch/v1.00/json4.ws";
@ -102,17 +105,17 @@ public class LoquateAddressValidator extends BaseRestfulValidator {
}
protected boolean isValid(JsonNode theMatch) {
String addressQualityIndex = getAqi(theMatch);
String addressQualityIndex = getField(theMatch, LOQUATE_AQI);
return "A".equals(addressQualityIndex) || "B".equals(addressQualityIndex);
}
private String getAqi(JsonNode theMatch) {
String addressQualityIndex = null;
if (theMatch.has(LOQUATE_AQI)) {
addressQualityIndex = theMatch.get(LOQUATE_AQI).asText();
private String getField(JsonNode theMatch, String theFieldName) {
String field = null;
if (theMatch.has(theFieldName)) {
field = theMatch.get(theFieldName).asText();
}
ourLog.debug("Address quality index {}", addressQualityIndex);
return addressQualityIndex;
ourLog.debug("Found {}={}", theFieldName, field);
return field;
}
protected IBase toAddress(JsonNode match, FhirContext theFhirContext) {
@ -136,21 +139,23 @@ public class LoquateAddressValidator extends BaseRestfulValidator {
helper.setState(getString(match, "AdministrativeArea"));
helper.setPostalCode(getString(match, "PostalCode"));
helper.setCountry(getString(match, "CountryName"));
toQualityIndex(match, helper, theFhirContext);
addExtension(match, LOQUATE_AQI, ADDRESS_QUALITY_EXTENSION_URL, helper, theFhirContext);
addExtension(match, LOQUATE_AVC, ADDRESS_VERIFICATION_CODE_EXTENSION_URL, helper, theFhirContext);
return helper.getAddress();
}
private void toQualityIndex(JsonNode theMatch, AddressHelper theHelper, FhirContext theFhirContext) {
String addressQuality = getAqi(theMatch);
private void addExtension(JsonNode theMatch, String theMatchField, String theExtUrl, AddressHelper theHelper, FhirContext theFhirContext) {
String addressQuality = getField(theMatch, theMatchField);
if (StringUtils.isEmpty(addressQuality)) {
ourLog.debug("AQI is not provided on {}", theMatch);
ourLog.debug("{} is not found in {}", theMatchField, theMatch);
return;
}
IBase address = theHelper.getAddress();
ExtensionUtil.clearExtensionsByUrl(address, ADDRESS_QUALITY_EXTENSION_URL);
IBaseExtension addressQualityExt = ExtensionUtil.addExtension(address, ADDRESS_QUALITY_EXTENSION_URL);
ExtensionUtil.clearExtensionsByUrl(address, theExtUrl);
IBaseExtension addressQualityExt = ExtensionUtil.addExtension(address, theExtUrl);
addressQualityExt.setValue(TerserUtil.newElement(theFhirContext, "string", addressQuality));
}

View File

@ -92,6 +92,7 @@ class LoquateAddressValidatorTest {
" \"Matches\": [\n" +
" {\n" +
" \"AQI\": \"A\",\n" +
" \"AVC\": \"V44-I44-P6-100\",\n" +
" \"Address\": \"My Valid Address\",\n" +
" \"Latitude\": \"-32.94217742803439\",\n" +
" \"Longitude\": \"-60.640132034941836\"\n" +
@ -219,7 +220,7 @@ class LoquateAddressValidatorTest {
}
@Test
public void testSuccessfulResponsesWithGeocode() throws Exception {
public void testSuccessfulResponsesWithGeocodeAndQuality() throws Exception {
myValidator.getProperties().setProperty(PROPERTY_GEOCODE, "true");
AddressValidationResult res = myValidator.getValidationResult(new AddressValidationResult(),
new ObjectMapper().readTree(RESPONSE_VALID_ADDRESS_W_GEO), ourCtx);
@ -235,6 +236,10 @@ class LoquateAddressValidatorTest {
IBaseExtension quality = ExtensionUtil.getExtensionByUrl(address, IAddressValidator.ADDRESS_QUALITY_EXTENSION_URL);
assertNotNull(quality);
assertEquals("A", quality.getValue().toString());
IBaseExtension verificationCode = ExtensionUtil.getExtensionByUrl(address, IAddressValidator.ADDRESS_VERIFICATION_CODE_EXTENSION_URL);
assertNotNull(verificationCode);
assertEquals("V44-I44-P6-100", verificationCode.getValue().toString());
}
@Test