package uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.healthmap; import org.springframework.util.StringUtils; import uk.ac.ox.zoo.seeg.abraid.mp.dataacquisition.acquirers.healthmap.domain.HealthMapAlert; import java.util.List; /** * Validates a HealthMapAlert. * * Copyright (c) 2014 University of Oxford */ public class HealthMapAlertValidator { private static final String DISEASE_IDS_NOT_FOUND = "Missing disease IDs in HealthMap alert (alert ID %d)"; private static final String DISEASE_ID_NOT_FOUND_WITHIN_LIST = "Missing disease ID within list in HealthMap alert" + " (alert ID %d)"; private static final String DISEASES_NOT_FOUND = "Missing diseases in HealthMap alert (alert ID %d)"; private static final String DISEASE_IDS_DO_NOT_MATCH_NAMES = "HealthMap alert has %d disease ID(s) but %d " + "disease name(s) (alert ID %d)"; private static final String HAS_A_PLACE_CATEGORY_TO_IGNORE = "Ignoring HealthMap alert because it has place " + "category \"%s\" (alert ID %d)"; private static final String DATE_NOT_FOUND = "Missing date in HealthMap alert (alert ID %d)"; private static final String FEED_NOT_FOUND = "Missing feed in HealthMap alert (alert ID %d)"; private static final String FEED_ID_NOT_FOUND = "Missing feed ID in HealthMap alert (alert ID %d)"; private HealthMapAlert alert; private List<String> placeCategoriesToIgnore; public HealthMapAlertValidator(HealthMapAlert alert, List<String> placeCategoriesToIgnore) { this.alert = alert; this.placeCategoriesToIgnore = placeCategoriesToIgnore; } /** * Validate the alert. * @return An error message if invalid, or null if valid. */ public String validate() { String errorMessage = validateDiseaseIdsMissing(); errorMessage = (errorMessage != null) ? errorMessage : validateDiseaseIdMissingWithinList(); errorMessage = (errorMessage != null) ? errorMessage : validateDiseasesMissing(); errorMessage = (errorMessage != null) ? errorMessage : validateDiseaseIdsDoNotMatchNames(); errorMessage = (errorMessage != null) ? errorMessage : validatePlaceCategoriesAreNotToBeIgnored(); errorMessage = (errorMessage != null) ? errorMessage : validateDateMissing(); errorMessage = (errorMessage != null) ? errorMessage : validateFeedMissing(); errorMessage = (errorMessage != null) ? errorMessage : validateFeedIdMissing(); return errorMessage; } private String validateDiseaseIdsMissing() { if (alert.getDiseaseIds().size() == 0) { return String.format(DISEASE_IDS_NOT_FOUND, alert.getAlertId()); } return null; } private String validateDiseaseIdMissingWithinList() { if (alert.getDiseaseIds().contains(null)) { return String.format(DISEASE_ID_NOT_FOUND_WITHIN_LIST, alert.getAlertId()); } return null; } private String validateDiseasesMissing() { if (alert.getDiseases().size() == 0) { return String.format(DISEASES_NOT_FOUND, alert.getAlertId()); } return null; } private String validateDiseaseIdsDoNotMatchNames() { int diseaseIdsSize = alert.getDiseaseIds().size(); int diseasesSize = alert.getDiseases().size(); if (diseaseIdsSize != diseasesSize) { return String.format(DISEASE_IDS_DO_NOT_MATCH_NAMES, diseaseIdsSize, diseasesSize, alert.getAlertId()); } return null; } private String validatePlaceCategoriesAreNotToBeIgnored() { if (alert.getPlaceCategories() != null) { for (String category : alert.getPlaceCategories()) { if (StringUtils.hasText(category) && placeCategoriesToIgnore.contains(category.toLowerCase())) { return String.format(HAS_A_PLACE_CATEGORY_TO_IGNORE, category, alert.getAlertId()); } } } return null; } private String validateDateMissing() { if (alert.getDate() == null) { return String.format(DATE_NOT_FOUND, alert.getAlertId()); } return null; } private String validateFeedMissing() { if (!StringUtils.hasText(alert.getFeed())) { return String.format(FEED_NOT_FOUND, alert.getAlertId()); } return null; } private String validateFeedIdMissing() { if (alert.getFeedId() == null) { return String.format(FEED_ID_NOT_FOUND, alert.getAlertId()); } return null; } }