Skip to content

Commit

Permalink
feat: add Standard duplicate data check
Browse files Browse the repository at this point in the history
OCD-4333
  • Loading branch information
Todd Young committed Nov 27, 2023
1 parent d7ff8ca commit ee68ca3
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
1 change: 1 addition & 0 deletions chpl/chpl-resources/src/main/resources/errors.properties
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,7 @@ listing.duplicatePromotingInteroperability=Listing contains duplicate Promoting
listing.criteria.duplicateTestToolName=Certification %s contains duplicate Test Tool: Name '%s'.
listing.criteria.duplicateTestToolNameAndVersion=Certification %s contains duplicate Test Tool: Name '%s', Version '%s'. The duplicates have been removed.
listing.criteria.duplicateFunctionalityTested=Certification %s contains duplicate Functionality Tested: Number '%s'. The duplicates have been removed.
listing.criteria.duplicateStandard=Certification %s contains duplicate Standard: Number '%s'. The duplicates have been removed.
listing.criteria.duplicateTestStandard=Certification %s contains duplicate Test Standard: Number '%s'. The duplicates have been removed.
listing.criteria.duplicateOptionalStandard=Certification %s contains duplicate Optional Standard: '%s'. The duplicates have been removed.
listing.criteria.duplicateSvap=Certification %s contains duplicate SVAP: '%s'. The duplicates have been removed.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import gov.healthit.chpl.validation.listing.reviewer.duplicate.OptionalStandardDuplicateReviewer;
import gov.healthit.chpl.validation.listing.reviewer.duplicate.PromotingInteroperabilityUserCountReviewer;
import gov.healthit.chpl.validation.listing.reviewer.duplicate.QmsStandardDuplicateReviewer;
import gov.healthit.chpl.validation.listing.reviewer.duplicate.StandardDuplicateReviewer;
import gov.healthit.chpl.validation.listing.reviewer.duplicate.SvapDuplicateReviewer;
import gov.healthit.chpl.validation.listing.reviewer.duplicate.TargetedUserDuplicateReviewer;
import gov.healthit.chpl.validation.listing.reviewer.duplicate.TestDataDuplicateReviewer;
Expand All @@ -27,6 +28,7 @@
@Component("duplicateDataReviewer")
public class DuplicateDataReviewer implements Reviewer {
private FunctionalityTestedDuplicateReviewer functionalityTestedDuplicateReviewer;
private StandardDuplicateReviewer standardDuplicateReviewer;
private TestDataDuplicateReviewer testDataDuplicateReviewer;
private TestToolDuplicateReviewer testToolDuplicateReviewer;
private ConformanceMethodDuplicateReviewer conformanceMethodDuplicateReviewer;
Expand All @@ -48,6 +50,7 @@ public class DuplicateDataReviewer implements Reviewer {
@SuppressWarnings("checkstyle:parameternumber")
public DuplicateDataReviewer(
@Qualifier("functionalityTestedDuplicateReviewer") FunctionalityTestedDuplicateReviewer functionalityTestedDuplicateReviewer,
@Qualifier("standardDuplicateReviewer") StandardDuplicateReviewer standardDuplicateReviewer,
@Qualifier("testDataDuplicateReviewer") TestDataDuplicateReviewer testDataDuplicateReviewer,
@Qualifier("testToolDuplicateReviewer") TestToolDuplicateReviewer testToolDuplicateReviewer,
@Qualifier("testProcedureDuplicateReviewer") TestProcedureDuplicateReviewer testProcedureDuplicateReviewer,
Expand All @@ -65,6 +68,7 @@ public DuplicateDataReviewer(
@Qualifier("promotingInteroperabilityUserCountDuplicateReviewer") PromotingInteroperabilityUserCountReviewer piuReviewer,
ValidationUtils validationUtils) {
this.functionalityTestedDuplicateReviewer = functionalityTestedDuplicateReviewer;
this.standardDuplicateReviewer = standardDuplicateReviewer;
this.testDataDuplicateReviewer = testDataDuplicateReviewer;
this.testToolDuplicateReviewer = testToolDuplicateReviewer;
this.testProcedureDuplicateReviewer = testProcedureDuplicateReviewer;
Expand Down Expand Up @@ -104,6 +108,7 @@ public void review(CertifiedProductSearchDetails listing) {
optionalStandardDuplicateReviewer.review(listing, cr);
svapDuplicateReviewer.review(listing, cr);
functionalityTestedDuplicateReviewer.review(listing, cr);
standardDuplicateReviewer.review(listing, cr);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package gov.healthit.chpl.validation.listing.reviewer.duplicate;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.BiPredicate;
import java.util.stream.Collectors;

import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import gov.healthit.chpl.domain.CertificationResult;
import gov.healthit.chpl.domain.CertifiedProductSearchDetails;
import gov.healthit.chpl.standard.CertificationResultStandard;
import gov.healthit.chpl.util.ErrorMessageUtil;
import gov.healthit.chpl.util.Util;
import gov.healthit.chpl.validation.DuplicateReviewResult;

@Component(value = "standardDuplicateReviewer")
public class StandardDuplicateReviewer {
private ErrorMessageUtil errorMessageUtil;

@Autowired
public StandardDuplicateReviewer(ErrorMessageUtil errorMessageUtil) {
this.errorMessageUtil = errorMessageUtil;
}

public void review(CertifiedProductSearchDetails listing, CertificationResult certificationResult) {

DuplicateReviewResult<CertificationResultStandard> standardDuplicateResults =
new DuplicateReviewResult<CertificationResultStandard>(getPredicate());

if (certificationResult.getStandards() != null) {
for (CertificationResultStandard crs : certificationResult.getStandards()) {
standardDuplicateResults.addObject(crs);
}
}

if (standardDuplicateResults.duplicatesExist()) {
listing.addAllWarningMessages(
getWarnings(
standardDuplicateResults.getDuplicateList(),
Util.formatCriteriaNumber(certificationResult.getCriterion()))
.stream()
.collect(Collectors.toSet()));
certificationResult.setStandards(standardDuplicateResults.getUniqueList());
}
}

private List<String> getWarnings(List<CertificationResultStandard> duplicates,
String criteria) {
List<String> warnings = new ArrayList<String>();
for (CertificationResultStandard duplicate : duplicates) {
String warning = errorMessageUtil.getMessage("listing.criteria.duplicateStandard",
criteria, duplicate.getStandard().getRegulatoryTextCitation());
warnings.add(warning);
}
return warnings;
}

private BiPredicate<CertificationResultStandard, CertificationResultStandard> getPredicate() {
return new BiPredicate<CertificationResultStandard, CertificationResultStandard>() {
@Override
public boolean test(CertificationResultStandard s1, CertificationResultStandard s2) {
return (ObjectUtils.allNotNull(s1.getStandard().getId(), s2.getStandard().getId())
&& Objects.equals(s1.getStandard().getId(), s2.getStandard().getId()))
|| Objects.equals(s1.getStandard().getRegulatoryTextCitation(), s2.getStandard().getRegulatoryTextCitation());
}
};
}

}

0 comments on commit ee68ca3

Please sign in to comment.