diff --git a/chpl/chpl-api/src/main/java/gov/healthit/chpl/CHPLConfig.java b/chpl/chpl-api/src/main/java/gov/healthit/chpl/CHPLConfig.java index 3240e2ca66..fc80aa7634 100644 --- a/chpl/chpl-api/src/main/java/gov/healthit/chpl/CHPLConfig.java +++ b/chpl/chpl-api/src/main/java/gov/healthit/chpl/CHPLConfig.java @@ -87,7 +87,7 @@ public class CHPLConfig implements WebMvcConfigurer, EnvironmentAware { private Boolean tryItOutEnabled; @Autowired - private DeprecatedResponseFieldAnnotationIntrospector deprecatedResponseFieldAnnotationIntrospector; + private IgnorableResponseFieldAnnotationIntrospector ignorableResponseFieldAnnotationIntrospector; @Lazy @Autowired @@ -117,7 +117,7 @@ public void setEnvironment(Environment e) { @Primary public JsonMapper jsonMapper() { JsonMapper mapper = JsonMapper.builder() - .annotationIntrospector(deprecatedResponseFieldAnnotationIntrospector) + .annotationIntrospector(ignorableResponseFieldAnnotationIntrospector) .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, diff --git a/chpl/chpl-api/src/main/java/gov/healthit/chpl/DeprecatedResponseFieldAnnotationIntrospector.java b/chpl/chpl-api/src/main/java/gov/healthit/chpl/DeprecatedResponseFieldAnnotationIntrospector.java deleted file mode 100644 index 02d10f5a8d..0000000000 --- a/chpl/chpl-api/src/main/java/gov/healthit/chpl/DeprecatedResponseFieldAnnotationIntrospector.java +++ /dev/null @@ -1,32 +0,0 @@ -package gov.healthit.chpl; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import gov.healthit.chpl.api.deprecatedUsage.DeprecatedResponseField; -import lombok.extern.log4j.Log4j2; -import tools.jackson.databind.cfg.MapperConfig; -import tools.jackson.databind.introspect.AnnotatedMember; -import tools.jackson.databind.introspect.JacksonAnnotationIntrospector; - -@Log4j2 -@Component -public class DeprecatedResponseFieldAnnotationIntrospector extends JacksonAnnotationIntrospector { - private static final long serialVersionUID = 7316344670464634840L; - - @Autowired - private Environment env; - - @Override - public boolean hasIgnoreMarker(MapperConfig config, AnnotatedMember m) { - Boolean returnDeprecatedFields = Boolean.valueOf(env.getProperty("response.returnDeprecatedFields")); - if (_findAnnotation(m, JsonIgnore.class) != null) { - return true; - } else { - return _findAnnotation(m, DeprecatedResponseField.class) != null && !returnDeprecatedFields; - } - } -} diff --git a/chpl/chpl-api/src/main/java/gov/healthit/chpl/IgnorableResponseFieldAnnotationIntrospector.java b/chpl/chpl-api/src/main/java/gov/healthit/chpl/IgnorableResponseFieldAnnotationIntrospector.java new file mode 100644 index 0000000000..a9cee86673 --- /dev/null +++ b/chpl/chpl-api/src/main/java/gov/healthit/chpl/IgnorableResponseFieldAnnotationIntrospector.java @@ -0,0 +1,48 @@ +package gov.healthit.chpl; + +import org.ff4j.FF4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import gov.healthit.chpl.api.deprecatedUsage.DeprecatedResponseField; +import gov.healthit.chpl.sed.SedSummaryData; +import gov.healthit.chpl.sed.SedTestTaskData; +import lombok.extern.log4j.Log4j2; +import tools.jackson.databind.cfg.MapperConfig; +import tools.jackson.databind.introspect.AnnotatedMember; +import tools.jackson.databind.introspect.JacksonAnnotationIntrospector; + +@Log4j2 +@Component +public class IgnorableResponseFieldAnnotationIntrospector extends JacksonAnnotationIntrospector { + private static final long serialVersionUID = 7316344670464634840L; + + @Autowired + private Environment env; + + @Autowired + private FF4j ff4j; + + @Override + public boolean hasIgnoreMarker(MapperConfig config, AnnotatedMember m) { + if (super.hasIgnoreMarker(config, m)) { + return true; + } else { + return isDeprecatedAndIgnorable(m) || isSedAndIgnorable(m); + } + } + + private boolean isDeprecatedAndIgnorable(AnnotatedMember m) { + Boolean returnDeprecatedFields = Boolean.valueOf(env.getProperty("response.returnDeprecatedFields")); + boolean isDeprecated = _findAnnotation(m, DeprecatedResponseField.class) != null; + return !returnDeprecatedFields && isDeprecated; + } + + private boolean isSedAndIgnorable(AnnotatedMember m) { + boolean isHti5Erd = ff4j.check(FeatureList.HTI_5_ERD); + boolean isSedSummary = _findAnnotation(m, SedSummaryData.class) != null; + boolean isSedTestTask = _findAnnotation(m, SedTestTaskData.class) != null; + return isHti5Erd && (isSedSummary || isSedTestTask); + } +} diff --git a/chpl/chpl-resources/src/main/resources/errors.properties b/chpl/chpl-resources/src/main/resources/errors.properties index 04016c54b7..e8159cf760 100644 --- a/chpl/chpl-resources/src/main/resources/errors.properties +++ b/chpl/chpl-resources/src/main/resources/errors.properties @@ -390,6 +390,7 @@ listing.criteria.badUcdProcess=Could not process UCD Process '%s'. listing.criteria.missingUcdProcess=Certification %s requires at least one UCD process. listing.criteria.ucdProcessNotFoundAndRemoved=UCD Process '%s' referenced by criteria %s was not found and was or will be removed. listing.ucdProcess.unattestedCriterionRemoved=The criterion %s is not attested to and has been removed from a UCD Process. +listing.ucdProcess.bothFieldsPresent=Either the UCD Process Name or UCD Process Details must be filled in, but not both for UCD Process %s. #Test Task And Participant Errors listing.criteria.testTasksNotApplicable=Test Tasks are not applicable for the criterion %s. diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/FeatureList.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/FeatureList.java index 0482168218..dd8d398a15 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/FeatureList.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/FeatureList.java @@ -6,6 +6,7 @@ private FeatureList() { public static final String CMS_DISABLED = "cms-disabled"; public static final String DEMOGRAPHIC_CHANGE_REQUEST = "demographic-change-request"; + public static final String HTI_5_ERD = "hti-5-erd"; public static final String INSIGHTS_DISPLAY = "insights-display"; public static final String SERVICE_BASE_URL_LIST_CHANGE_REQUEST = "sbul-change-request"; public static final String RWT_CHANGE_REQUEST = "rwt-change-request"; diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvDataWriter.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvDataWriter.java index 652824aba6..a5379107e8 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvDataWriter.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvDataWriter.java @@ -14,9 +14,11 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriteriaManager; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.certificationCriteria.CertificationCriterionWithAttributes; @@ -82,7 +84,8 @@ public class ListingCsvDataWriter { private static final int SED_TESTING_DATE_COL = 40; private static final int PARTICIPANT_START_COL = 41; private static final int TASK_START_COL = 50; - private static final int CRITERIA_START_COL = 65; + private static final int CRITERIA_START_COL_PRE_HTI5 = 65; + private static final int CRITERIA_START_COL = 38; private static final int ADDITIONAL_SOFTWARE_COL_COUNT = 5; private static final int UCD_PROCESS_COL_COUNT = 2; private static final int SED_TESTING_COL_COUNT = 2; @@ -90,11 +93,14 @@ public class ListingCsvDataWriter { private CertificationCriteriaManager criteriaManager; private StandardManager standardManager; private DateFormat dateFormat; + private FF4j ff4j; @Autowired - public ListingCsvDataWriter(CertificationCriteriaManager criteriaManager, StandardManager standardManager) { + public ListingCsvDataWriter(CertificationCriteriaManager criteriaManager, StandardManager standardManager, + FF4j ff4j) { this.criteriaManager = criteriaManager; this.standardManager = standardManager; + this.ff4j = ff4j; this.dateFormat = new SimpleDateFormat(ListingUploadHandlerUtil.UPLOAD_DATE_FORMAT); } @@ -121,11 +127,13 @@ public List> getCsvData(CertifiedProductSearchDetails listing, int addAccessibilityStandards(csvDataMatrix, listing.getAccessibilityStandards()); csvDataMatrix[0][K1_URL_COL] = listing.getMandatoryDisclosures(); addCqms(csvDataMatrix, listing.getCqmResults()); - csvDataMatrix[0][SED_REPORT_URL_COL] = listing.getSedReportFileLocation(); - csvDataMatrix[0][SED_INTENDED_USERS_COL] = listing.getSedIntendedUserDescription(); - csvDataMatrix[0][SED_TESTING_DATE_COL] = listing.getSedTestingEndDay() != null ? dateFormat.format(DateUtil.toDate(listing.getSedTestingEndDay())) : ""; - addParticipants(csvDataMatrix, listing.getSed()); - addTasks(csvDataMatrix, listing.getSed()); + if (!ff4j.check(FeatureList.HTI_5_ERD)) { + csvDataMatrix[0][SED_REPORT_URL_COL] = listing.getSedReportFileLocation(); + csvDataMatrix[0][SED_INTENDED_USERS_COL] = listing.getSedIntendedUserDescription(); + csvDataMatrix[0][SED_TESTING_DATE_COL] = listing.getSedTestingEndDay() != null ? dateFormat.format(DateUtil.toDate(listing.getSedTestingEndDay())) : ""; + addParticipants(csvDataMatrix, listing.getSed()); + addTasks(csvDataMatrix, listing.getSed()); + } addCertificationResults(csvDataMatrix, getAllAvailableCriteriaAsCertResults(listing), listing.getSed()); List> records = new ArrayList>(); @@ -445,7 +453,7 @@ private void addTasks(String[][] csvDataMatrix, CertifiedProductSed sed) { } private void addCertificationResults(String[][] csvDataMatrix, List certResults, CertifiedProductSed sed) { - int currCol = CRITERIA_START_COL; + int currCol = !ff4j.check(FeatureList.HTI_5_ERD) ? CRITERIA_START_COL_PRE_HTI5 : CRITERIA_START_COL; for (int i = 0; i < certResults.size(); i++) { int currCertResultStartCol = currCol; CertificationResult certResult = certResults.get(i); @@ -652,19 +660,21 @@ private int addSed(String[][] csvDataMatrix, CertificationResult certResult, Cer } currCol += UCD_PROCESS_COL_COUNT; - List testTasks = getTestTasksForCriterion(certResult.getCriterion(), sed); - if (!CollectionUtils.isEmpty(testTasks)) { - for (int i = 0; i < testTasks.size(); i++) { - int sedTestingCol = currCol; - TestTask testTask = testTasks.get(i); - csvDataMatrix[i][sedTestingCol++] = testTask.getFriendlyId(); - String participants = testTask.getTestParticipants().stream() - .map(participant -> participant.getFriendlyId()) - .collect(Collectors.joining(";")); - csvDataMatrix[i][sedTestingCol++] = participants; + if (!ff4j.check(FeatureList.HTI_5_ERD)) { + List testTasks = getTestTasksForCriterion(certResult.getCriterion(), sed); + if (!CollectionUtils.isEmpty(testTasks)) { + for (int i = 0; i < testTasks.size(); i++) { + int sedTestingCol = currCol; + TestTask testTask = testTasks.get(i); + csvDataMatrix[i][sedTestingCol++] = testTask.getFriendlyId(); + String participants = testTask.getTestParticipants().stream() + .map(participant -> participant.getFriendlyId()) + .collect(Collectors.joining(";")); + csvDataMatrix[i][sedTestingCol++] = participants; + } } + currCol += SED_TESTING_COL_COUNT; } - currCol += SED_TESTING_COL_COUNT; } return currCol; } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvHeadingWriter.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvHeadingWriter.java index 62aabab45f..1b807cb26b 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvHeadingWriter.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvHeadingWriter.java @@ -6,17 +6,20 @@ import java.util.stream.Stream; import org.apache.commons.collections.CollectionUtils; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriteriaManager; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.certificationCriteria.CertificationCriterionWithAttributes; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.standard.StandardManager; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.LegacyHeading; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; +import gov.healthit.chpl.upload.listing.HeadingPreHti5; +import gov.healthit.chpl.upload.listing.LegacyHeading; import lombok.extern.log4j.Log4j2; @Component @@ -26,85 +29,93 @@ public class ListingCsvHeadingWriter { private CertificationCriterionService criteriaService; private CertificationCriteriaManager criteriaManager; private StandardManager standardManager; + private FF4j ff4j; @Autowired public ListingCsvHeadingWriter(CertificationCriterionService criteriaService, CertificationCriteriaManager criteriaManager, - StandardManager standardManager) { + StandardManager standardManager, + FF4j ff4j) { this.criteriaService = criteriaService; this.criteriaManager = criteriaManager; this.standardManager = standardManager; + this.ff4j = ff4j; } public List getCsvHeadings(CertifiedProductSearchDetails listing) { List headings = Stream.of( - Heading.UNIQUE_ID.getHeading(), - Heading.DEVELOPER.getHeading(), - Heading.PRODUCT.getHeading(), - Heading.VERSION.getHeading(), - Heading.MEASURE_DOMAIN.getHeading(), - Heading.MEASURE_REQUIRED_TEST.getHeading(), - Heading.MEASURE_TYPE.getHeading(), - Heading.MEASURE_ASSOCIATED_CRITERIA.getHeading(), - Heading.ACB_CERTIFICATION_ID.getHeading(), - Heading.CERTIFICATION_BODY_NAME.getHeading(), - Heading.TESTING_LAB_NAME.getHeading(), - Heading.CERTIFICATION_DATE.getHeading(), - Heading.DEVELOPER_ADDRESS.getHeading(), - Heading.DEVELOPER_CITY.getHeading(), - Heading.DEVELOPER_STATE.getHeading(), - Heading.DEVELOPER_ZIP.getHeading(), - Heading.DEVELOPER_WEBSITE.getHeading(), - Heading.SELF_DEVELOPER.getHeading(), - Heading.DEVELOPER_EMAIL.getHeading(), - Heading.DEVELOPER_PHONE.getHeading(), - Heading.DEVELOPER_CONTACT_NAME.getHeading(), - Heading.SVAP_NOTICE_URL.getHeading(), - Heading.RWT_PLANS_URL.getHeading(), - Heading.RWT_PLANS_CHECK_DATE.getHeading(), - Heading.RWT_RESULTS_URL.getHeading(), - Heading.RWT_RESULTS_CHECK_DATE.getHeading(), - Heading.TARGETED_USERS.getHeading(), - Heading.QMS_STANDARD_NAME.getHeading(), - Heading.QMS_STANDARD_APPLICABLE_CRITERIA.getHeading(), - Heading.QMS_MODIFICATION.getHeading(), - Heading.ICS.getHeading(), - Heading.ICS_SOURCE.getHeading(), - Heading.ACCESSIBILITY_CERTIFIED.getHeading(), - Heading.ACCESSIBILITY_STANDARD.getHeading(), - Heading.K_1_URL.getHeading(), - Heading.CQM_NUMBER.getHeading(), - Heading.CQM_VERSION.getHeading(), - Heading.CQM_CRITERIA.getHeading(), - Heading.SED_REPORT_URL.getHeading(), - Heading.SED_INTENDED_USERS.getHeading(), - Heading.SED_TESTING_DATE.getHeading(), - Heading.PARTICIPANT_ID.getHeading(), - Heading.PARTICIPANT_GENDER.getHeading(), - Heading.PARTICIPANT_AGE.getHeading(), - Heading.PARTICIPANT_EDUCATION.getHeading(), - Heading.PARTICIPANT_OCCUPATION.getHeading(), - Heading.PARTICIPANT_PROFESSIONAL_EXPERIENCE.getHeading(), - Heading.PARTICIPANT_COMPUTER_EXPERIENCE.getHeading(), - Heading.PARTICIPANT_PRODUCT_EXPERIENCE.getHeading(), - Heading.PARTICIPANT_ASSISTIVE_TECH.getHeading(), - Heading.TASK_ID.getHeading(), - Heading.TASK_DESCRIPTION.getHeading(), - Heading.TASK_SUCCESS_MEAN.getHeading(), - Heading.TASK_SUCCESS_STDDEV.getHeading(), - Heading.TASK_PATH_DEV_OBS.getHeading(), - Heading.TASK_PATH_DEV_OPT.getHeading(), - Heading.TASK_TIME_MEAN.getHeading(), - Heading.TASK_TIME_STDDEV.getHeading(), - Heading.TASK_TIME_DEV_OBS.getHeading(), - Heading.TASK_TIME_DEV_OPT.getHeading(), - Heading.TASK_ERRORS_MEAN.getHeading(), - Heading.TASK_ERRORS_STDDEV.getHeading(), - Heading.TASK_RATING_SCALE.getHeading(), - Heading.TASK_RATING.getHeading(), - Heading.TASK_RATING_STDDEV.getHeading() + HeadingPostHti5.UNIQUE_ID.getHeading(), + HeadingPostHti5.DEVELOPER.getHeading(), + HeadingPostHti5.PRODUCT.getHeading(), + HeadingPostHti5.VERSION.getHeading(), + HeadingPostHti5.MEASURE_DOMAIN.getHeading(), + HeadingPostHti5.MEASURE_REQUIRED_TEST.getHeading(), + HeadingPostHti5.MEASURE_TYPE.getHeading(), + HeadingPostHti5.MEASURE_ASSOCIATED_CRITERIA.getHeading(), + HeadingPostHti5.ACB_CERTIFICATION_ID.getHeading(), + HeadingPostHti5.CERTIFICATION_BODY_NAME.getHeading(), + HeadingPostHti5.TESTING_LAB_NAME.getHeading(), + HeadingPostHti5.CERTIFICATION_DATE.getHeading(), + HeadingPostHti5.DEVELOPER_ADDRESS.getHeading(), + HeadingPostHti5.DEVELOPER_CITY.getHeading(), + HeadingPostHti5.DEVELOPER_STATE.getHeading(), + HeadingPostHti5.DEVELOPER_ZIP.getHeading(), + HeadingPostHti5.DEVELOPER_WEBSITE.getHeading(), + HeadingPostHti5.SELF_DEVELOPER.getHeading(), + HeadingPostHti5.DEVELOPER_EMAIL.getHeading(), + HeadingPostHti5.DEVELOPER_PHONE.getHeading(), + HeadingPostHti5.DEVELOPER_CONTACT_NAME.getHeading(), + HeadingPostHti5.SVAP_NOTICE_URL.getHeading(), + HeadingPostHti5.RWT_PLANS_URL.getHeading(), + HeadingPostHti5.RWT_PLANS_CHECK_DATE.getHeading(), + HeadingPostHti5.RWT_RESULTS_URL.getHeading(), + HeadingPostHti5.RWT_RESULTS_CHECK_DATE.getHeading(), + HeadingPostHti5.TARGETED_USERS.getHeading(), + HeadingPostHti5.QMS_STANDARD_NAME.getHeading(), + HeadingPostHti5.QMS_STANDARD_APPLICABLE_CRITERIA.getHeading(), + HeadingPostHti5.QMS_MODIFICATION.getHeading(), + HeadingPostHti5.ICS.getHeading(), + HeadingPostHti5.ICS_SOURCE.getHeading(), + HeadingPostHti5.ACCESSIBILITY_CERTIFIED.getHeading(), + HeadingPostHti5.ACCESSIBILITY_STANDARD.getHeading(), + HeadingPostHti5.K_1_URL.getHeading(), + HeadingPostHti5.CQM_NUMBER.getHeading(), + HeadingPostHti5.CQM_VERSION.getHeading(), + HeadingPostHti5.CQM_CRITERIA.getHeading() ).collect(Collectors.toList()); + if (!ff4j.check(FeatureList.HTI_5_ERD)) { + headings.addAll(Stream.of( + HeadingPreHti5.SED_REPORT_URL.getHeading(), + HeadingPreHti5.SED_INTENDED_USERS.getHeading(), + HeadingPreHti5.SED_TESTING_DATE.getHeading(), + HeadingPreHti5.PARTICIPANT_ID.getHeading(), + HeadingPreHti5.PARTICIPANT_GENDER.getHeading(), + HeadingPreHti5.PARTICIPANT_AGE.getHeading(), + HeadingPreHti5.PARTICIPANT_EDUCATION.getHeading(), + HeadingPreHti5.PARTICIPANT_OCCUPATION.getHeading(), + HeadingPreHti5.PARTICIPANT_PROFESSIONAL_EXPERIENCE.getHeading(), + HeadingPreHti5.PARTICIPANT_COMPUTER_EXPERIENCE.getHeading(), + HeadingPreHti5.PARTICIPANT_PRODUCT_EXPERIENCE.getHeading(), + HeadingPreHti5.PARTICIPANT_ASSISTIVE_TECH.getHeading(), + HeadingPreHti5.TASK_ID.getHeading(), + HeadingPreHti5.TASK_DESCRIPTION.getHeading(), + HeadingPreHti5.TASK_SUCCESS_MEAN.getHeading(), + HeadingPreHti5.TASK_SUCCESS_STDDEV.getHeading(), + HeadingPreHti5.TASK_PATH_DEV_OBS.getHeading(), + HeadingPreHti5.TASK_PATH_DEV_OPT.getHeading(), + HeadingPreHti5.TASK_TIME_MEAN.getHeading(), + HeadingPreHti5.TASK_TIME_STDDEV.getHeading(), + HeadingPreHti5.TASK_TIME_DEV_OBS.getHeading(), + HeadingPreHti5.TASK_TIME_DEV_OPT.getHeading(), + HeadingPreHti5.TASK_ERRORS_MEAN.getHeading(), + HeadingPreHti5.TASK_ERRORS_STDDEV.getHeading(), + HeadingPreHti5.TASK_RATING_SCALE.getHeading(), + HeadingPreHti5.TASK_RATING.getHeading(), + HeadingPreHti5.TASK_RATING_STDDEV.getHeading()) + .collect(Collectors.toList())); + } + headings.addAll(getCriteriaHeadings(listing)); return headings; } @@ -128,34 +139,34 @@ private List getCriterionHeadings(CertificationCriterion criterion) { LOGGER.error("Attributes for criterion with ID " + criterion.getId() + " could not be found. No attributes will be included in the file."); } else { if (criterionWithAttributes.getAttributes().isAdditionalSoftware()) { - criterionHeadings.add(Heading.HAS_ADDITIONAL_SOFTWARE.getHeading()); - criterionHeadings.add(Heading.ADDITIONAL_SOFTWARE_LISTING.getHeading()); - criterionHeadings.add(Heading.ADDITIONAL_SOFTWARE_LISTING_GROUPING.getHeading()); - criterionHeadings.add(Heading.ADDITIONAL_SOFTWARE_NONLISTING.getHeading()); - criterionHeadings.add(Heading.ADDITIONAL_SOFTWARE_NONLISTING_VERSION.getHeading()); - criterionHeadings.add(Heading.ADDITIONAL_SOFTWARE_NONLISTING_GROUPING.getHeading()); + criterionHeadings.add(HeadingPostHti5.HAS_ADDITIONAL_SOFTWARE.getHeading()); + criterionHeadings.add(HeadingPostHti5.ADDITIONAL_SOFTWARE_LISTING.getHeading()); + criterionHeadings.add(HeadingPostHti5.ADDITIONAL_SOFTWARE_LISTING_GROUPING.getHeading()); + criterionHeadings.add(HeadingPostHti5.ADDITIONAL_SOFTWARE_NONLISTING.getHeading()); + criterionHeadings.add(HeadingPostHti5.ADDITIONAL_SOFTWARE_NONLISTING_VERSION.getHeading()); + criterionHeadings.add(HeadingPostHti5.ADDITIONAL_SOFTWARE_NONLISTING_GROUPING.getHeading()); } if (criterionWithAttributes.getAttributes().isApiDocumentation()) { - criterionHeadings.add(Heading.API_DOCUMENTATION_LINK.getHeading()); + criterionHeadings.add(HeadingPostHti5.API_DOCUMENTATION_LINK.getHeading()); } if (criterionWithAttributes.getAttributes().isAttestationAnswer()) { - criterionHeadings.add(Heading.ATTESTATION_ANSWER.getHeading()); + criterionHeadings.add(HeadingPostHti5.ATTESTATION_ANSWER.getHeading()); } if (criterionWithAttributes.getAttributes().isCodeSet()) { - criterionHeadings.add(Heading.CODE_SET.getHeading()); + criterionHeadings.add(HeadingPostHti5.CODE_SET.getHeading()); } if (criterionWithAttributes.getAttributes().isConformanceMethod()) { - criterionHeadings.add(Heading.CONFORMANCE_METHOD.getHeading()); - criterionHeadings.add(Heading.CONFORMANCE_METHOD_VERSION.getHeading()); + criterionHeadings.add(HeadingPostHti5.CONFORMANCE_METHOD.getHeading()); + criterionHeadings.add(HeadingPostHti5.CONFORMANCE_METHOD_VERSION.getHeading()); } if (criterionWithAttributes.getAttributes().isDocumentationUrl()) { - criterionHeadings.add(Heading.DOCUMENTATION_URL.getHeading()); + criterionHeadings.add(HeadingPostHti5.DOCUMENTATION_URL.getHeading()); } if (criterionWithAttributes.getAttributes().isExportDocumentation()) { - criterionHeadings.add(Heading.EXPORT_DOCUMENTATION.getHeading()); + criterionHeadings.add(HeadingPostHti5.EXPORT_DOCUMENTATION.getHeading()); } if (criterionWithAttributes.getAttributes().isFunctionalityTested()) { - criterionHeadings.add(Heading.FUNCTIONALITIES_TESTED.getHeading()); + criterionHeadings.add(HeadingPostHti5.FUNCTIONALITIES_TESTED.getHeading()); } if (criterionWithAttributes.getAttributes().isG1Success()) { criterionHeadings.add(LegacyHeading.MACRA_MEASURE_G1.getHeading()); @@ -164,46 +175,48 @@ private List getCriterionHeadings(CertificationCriterion criterion) { criterionHeadings.add(LegacyHeading.MACRA_MEASURE_G2.getHeading()); } if (criterionWithAttributes.getAttributes().isOptionalStandard()) { - criterionHeadings.add(Heading.OPTIONAL_STANDARD.getHeading()); + criterionHeadings.add(HeadingPostHti5.OPTIONAL_STANDARD.getHeading()); } if (criterionWithAttributes.getAttributes().isPrivacySecurityFramework()) { - criterionHeadings.add(Heading.PRIVACY_AND_SECURITY.getHeading()); + criterionHeadings.add(HeadingPostHti5.PRIVACY_AND_SECURITY.getHeading()); } if (criterionWithAttributes.getAttributes().isRiskManagementSummaryInformation()) { - criterionHeadings.add(Heading.RISK_MANAGEMENT_SUMMARY_INFORMATION.getHeading()); + criterionHeadings.add(HeadingPostHti5.RISK_MANAGEMENT_SUMMARY_INFORMATION.getHeading()); } if (criterionWithAttributes.getAttributes().isSed()) { - criterionHeadings.add(Heading.UCD_PROCESS.getHeading()); - criterionHeadings.add(Heading.UCD_PROCESS_DETAILS.getHeading()); - criterionHeadings.add(Heading.TASK_ID.getHeading()); - criterionHeadings.add(Heading.PARTICIPANT_ID.getHeading()); + criterionHeadings.add(HeadingPostHti5.UCD_PROCESS.getHeading()); + criterionHeadings.add(HeadingPostHti5.UCD_PROCESS_DETAILS.getHeading()); + if (!ff4j.check(FeatureList.HTI_5_ERD)) { + criterionHeadings.add(HeadingPreHti5.TASK_ID.getHeading()); + criterionHeadings.add(HeadingPreHti5.PARTICIPANT_ID.getHeading()); + } } if (criterionWithAttributes.getAttributes().isServiceBaseUrlList()) { - criterionHeadings.add(Heading.SERVICE_BASE_URL_LIST.getHeading()); + criterionHeadings.add(HeadingPostHti5.SERVICE_BASE_URL_LIST.getHeading()); } if (criterionWithAttributes.getAttributes().isStandard() //we seem to list all criteria as eligible for standards, so here //we are also limiting the column presence by checking whether the criteria //has any standards available && !CollectionUtils.isEmpty(standardManager.getStandardsByCriteria(criterion.getId()))) { - criterionHeadings.add(Heading.STANDARD.getHeading()); + criterionHeadings.add(HeadingPostHti5.STANDARD.getHeading()); } if (criterionWithAttributes.getAttributes().isStandardsTested()) { criterionHeadings.add(LegacyHeading.TEST_STANDARD.getHeading()); } if (criterionWithAttributes.getAttributes().isSvap()) { - criterionHeadings.add(Heading.SVAP_REG_TEXT.getHeading()); + criterionHeadings.add(HeadingPostHti5.SVAP_REG_TEXT.getHeading()); } if (criterionWithAttributes.getAttributes().isTestProcedure()) { criterionHeadings.add(LegacyHeading.TEST_PROCEDURE.getHeading()); criterionHeadings.add(LegacyHeading.TEST_PROCEDURE_VERSION.getHeading()); } if (criterionWithAttributes.getAttributes().isTestTool()) { - criterionHeadings.add(Heading.TEST_TOOL_NAME.getHeading()); - criterionHeadings.add(Heading.TEST_TOOL_VERSION.getHeading()); + criterionHeadings.add(HeadingPostHti5.TEST_TOOL_NAME.getHeading()); + criterionHeadings.add(HeadingPostHti5.TEST_TOOL_VERSION.getHeading()); } if (criterionWithAttributes.getAttributes().isUseCases()) { - criterionHeadings.add(Heading.USE_CASES.getHeading()); + criterionHeadings.add(HeadingPostHti5.USE_CASES.getHeading()); } } return criterionHeadings; diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/ListingMergeService.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/ListingMergeService.java index 71d9c10d94..f9b2169ff0 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/ListingMergeService.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/ListingMergeService.java @@ -8,10 +8,12 @@ import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.Strings; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.codeset.CertificationResultCodeSet; import gov.healthit.chpl.conformanceMethod.domain.CertificationResultConformanceMethod; @@ -49,14 +51,17 @@ public class ListingMergeService { private ChplProductNumberUtil chplProductNumberUtil; private CertificationResultUpToDateService certResultUpToDateService; private ErrorMessageUtil msgUtil; + private FF4j ff4j; @Autowired public ListingMergeService(ChplProductNumberUtil chplProductNumberUtil, CertificationResultUpToDateService certResultUpToDateService, - ErrorMessageUtil msgUtil) { + ErrorMessageUtil msgUtil, + FF4j ff4j) { this.chplProductNumberUtil = chplProductNumberUtil; this.certResultUpToDateService = certResultUpToDateService; this.msgUtil = msgUtil; + this.ff4j = ff4j; } /** @@ -103,6 +108,12 @@ public void mergeWithListingFromChpl(CertifiedProductSearchDetails updatedListin updatedListing.setCountOpenSurveillance(currentListing.getCountOpenSurveillance()); updatedListing.setCountSurveillance(currentListing.getCountSurveillance()); + if (ff4j.check(FeatureList.HTI_5_ERD)) { + updatedListing.setSedIntendedUserDescription(currentListing.getSedIntendedUserDescription()); + updatedListing.setSedReportFileLocation(currentListing.getSedReportFileLocation()); + updatedListing.setSedTestingEndDay(currentListing.getSedTestingEndDay()); + } + setIcsChildren(updatedListing, currentListing.getIcs()); setIdsForQmsStandards(updatedListing, currentListing.getQmsStandards()); setIdsForAccessibilityStandards(updatedListing, currentListing.getAccessibilityStandards()); @@ -258,18 +269,21 @@ private void setCriteriaDataInUpdatedMeasure(CertificationCriterion updatedMeasu private void setIdsForSed(CertifiedProductSed updatedListingSed, CertifiedProductSed currListingSed) { //Note: We don't have a field for the internal database mapping ID between cert result -> UCD Process in //the listing details object. So there is nothing to fill in for UCD Process IDs. - - if (!CollectionUtils.isEmpty(updatedListingSed.getTestTasks())) { - updatedListingSed.getTestTasks().stream() - .forEach(updatedTestTask -> setIdForTestTask(updatedTestTask, currListingSed.getTestTasks())); - - Set currentTestParticipants = currListingSed.getTestTasks().stream() - .flatMap(currTestTask -> currTestTask.getTestParticipants().stream()) - .collect(Collectors.toSet()); - - updatedListingSed.getTestTasks().stream() - .flatMap(updatedTestTask -> updatedTestTask.getTestParticipants().stream()) - .forEach(updatedTestParticipant -> setIdForTestParticipant(updatedTestParticipant, currentTestParticipants)); + if (ff4j.check(FeatureList.HTI_5_ERD)) { + updatedListingSed.setTestTasks(currListingSed.getTestTasks()); + } else { + if (!CollectionUtils.isEmpty(updatedListingSed.getTestTasks())) { + updatedListingSed.getTestTasks().stream() + .forEach(updatedTestTask -> setIdForTestTask(updatedTestTask, currListingSed.getTestTasks())); + + Set currentTestParticipants = currListingSed.getTestTasks().stream() + .flatMap(currTestTask -> currTestTask.getTestParticipants().stream()) + .collect(Collectors.toSet()); + + updatedListingSed.getTestTasks().stream() + .flatMap(updatedTestTask -> updatedTestTask.getTestParticipants().stream()) + .forEach(updatedTestParticipant -> setIdForTestParticipant(updatedTestParticipant, currentTestParticipants)); + } } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/ListingService.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/ListingService.java index 598e4cd278..ed66b77bf5 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/ListingService.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/ListingService.java @@ -71,7 +71,6 @@ public class ListingService { private CertifiedProductTestingLabDAO certifiedProductTestingLabDao; private ListingGraphDAO listingGraphDao; - private CertificationEditionDAO editionDao; private CertifiedProductChplProductNumberHistoryDao chplProductNumberHistoryDao; private CertifiedProductQmsStandardDAO certifiedProductQmsStandardDao; private CertifiedProductTargetedUserDAO certifiedProductTargetedUserDao; @@ -120,7 +119,6 @@ public ListingService( this.piuService = piuService; this.chplProductNumberUtil = chplProductNumberUtil; this.survManager = survManager; - this.editionDao = editionDao; this.certifiedProductTestingLabDao = certifiedProductTestingLabDao; this.listingGraphDao = listingGraphDao; this.chplProductNumberHistoryDao = chplProductNumberHistoryDao; @@ -143,18 +141,17 @@ public ListingService( } public CertifiedProductSearchDetails createCertifiedSearchDetails(Long listingId) throws EntityRetrievalException { + CertifiedProductSearchDetails listing = createCertifiedProductSearchDetailsWithBasicDataOnly(certifiedProductSearchResultDAO.getById(listingId)); - CertifiedProductSearchDetails searchDetails = createCertifiedProductSearchDetailsWithBasicDataOnly(certifiedProductSearchResultDAO.getById(listingId)); - - searchDetails.setCertificationResults(certificationResultService.getCertificationResults(searchDetails)); - searchDetails.setCqmResults(cqmResultsService.getCqmResultDetails(searchDetails.getId(), - searchDetails.getEdition() != null ? searchDetails.getEdition().getName() : null)); - sortSed(searchDetails); + listing.setCertificationResults(certificationResultService.getCertificationResults(listing)); + listing.setCqmResults(cqmResultsService.getCqmResultDetails(listing.getId(), + listing.getEdition() != null ? listing.getEdition().getName() : null)); + sortSed(listing); // get first-level parents and children - searchDetails.getIcs().setParents(populateRelatedCertifiedProducts(getCertifiedProductParents(searchDetails.getId()))); - searchDetails.getIcs().setChildren(populateRelatedCertifiedProducts(getCertifiedProductChildren(searchDetails.getId()))); - return searchDetails; + listing.getIcs().setParents(populateRelatedCertifiedProducts(getCertifiedProductParents(listing.getId()))); + listing.getIcs().setChildren(populateRelatedCertifiedProducts(getCertifiedProductChildren(listing.getId()))); + return listing; } public CertifiedProductSearchDetails createCertifiedProductSearchDetailsBasic(Long listingId) throws EntityRetrievalException { diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/SedSynchronizationService.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/SedSynchronizationService.java index b2fb5f1ac5..b6555b56e6 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/SedSynchronizationService.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/certifiedproduct/service/SedSynchronizationService.java @@ -21,6 +21,8 @@ import gov.healthit.chpl.dao.CertificationResultDAO; import gov.healthit.chpl.domain.CertificationResult; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; +import gov.healthit.chpl.domain.CertifiedProductUcdProcess; +import gov.healthit.chpl.dto.CertificationResultUcdProcessDTO; import gov.healthit.chpl.exception.EntityCreationException; import gov.healthit.chpl.exception.EntityRetrievalException; import gov.healthit.chpl.sed.TestParticipant; @@ -45,11 +47,136 @@ public SedSynchronizationService(CertificationResultDAO certResultDao, this.testParticipantDao = testParticipantDao; } - //TODO: Add synchronization of UCD Processes here some time in the future when - //that is going to regression tested. + public int synchronizeUcdProcesses(CertifiedProductSearchDetails existingListing, + CertifiedProductSearchDetails updatedListing, + CertificationResult origCertResult, + CertificationResult updatedCertResult) throws EntityCreationException, EntityRetrievalException { + int numChanges = 0; + List origUcdsForCriteria = new ArrayList(); + List updatedUcdsForCriteria = new ArrayList(); + if (existingListing.getSed() != null && existingListing.getSed().getUcdProcesses() != null + && existingListing.getSed().getUcdProcesses().size() > 0) { + for (CertifiedProductUcdProcess existingUcd : existingListing.getSed().getUcdProcesses()) { + boolean ucdMeetsCriteria = false; + for (CertificationCriterion ucdCriteria : existingUcd.getCriteria()) { + if (ucdCriteria.getId().equals(updatedCertResult.getCriterion().getId()) + && origCertResult.getSed() != null && origCertResult.getSed()) { + ucdMeetsCriteria = true; + } + } + if (ucdMeetsCriteria) { + origUcdsForCriteria.add(existingUcd); + } + } + } + if (updatedListing.getSed() != null && updatedListing.getSed().getUcdProcesses() != null + && updatedListing.getSed().getUcdProcesses().size() > 0) { + for (CertifiedProductUcdProcess updatedUcd : updatedListing.getSed().getUcdProcesses()) { + boolean ucdMeetsCriteria = false; + for (CertificationCriterion ucdCriteria : updatedUcd.getCriteria()) { + if (ucdCriteria.getId().equals(updatedCertResult.getCriterion().getId()) + && updatedCertResult.getSed() != null && updatedCertResult.getSed()) { + ucdMeetsCriteria = true; + } + } + if (ucdMeetsCriteria) { + updatedUcdsForCriteria.add(updatedUcd); + } + } + } + + numChanges += updateUcdProcesses(updatedCertResult, origUcdsForCriteria, updatedUcdsForCriteria); + return numChanges; + } + + private int updateUcdProcesses(CertificationResult certResult, List existingUcdProcesses, + List updatedUcdProcesses) + throws EntityCreationException, EntityRetrievalException { + int numChanges = 0; + List ucdToAdd = new ArrayList(); + List ucdToUpdate = new ArrayList(); + List idsToRemove = new ArrayList(); + + // figure out which ucd processes to add + if (updatedUcdProcesses != null && updatedUcdProcesses.size() > 0) { + if (existingUcdProcesses == null || existingUcdProcesses.size() == 0) { + // existing listing has none, add all from the update + for (CertifiedProductUcdProcess updatedItem : updatedUcdProcesses) { + ucdToAdd.add(updatedItem); + } + } else if (existingUcdProcesses.size() > 0) { + // existing listing has some, compare to the update to see if + // any are different + for (CertifiedProductUcdProcess updatedItem : updatedUcdProcesses) { + boolean inExistingListing = false; + for (CertifiedProductUcdProcess existingItem : existingUcdProcesses) { + if (updatedItem.matches(existingItem)) { + inExistingListing = true; + ucdToUpdate.add(new CertificationResultUcdProcessPair(existingItem, updatedItem)); + } + } + + if (!inExistingListing) { + ucdToAdd.add(updatedItem); + } + } + } + } + + // figure out which ucd processes to remove + if (existingUcdProcesses != null && existingUcdProcesses.size() > 0) { + // if the updated listing has none, remove them all from existing + if (updatedUcdProcesses == null || updatedUcdProcesses.size() == 0) { + for (CertifiedProductUcdProcess existingItem : existingUcdProcesses) { + idsToRemove.add(existingItem.getId()); + } + } else if (updatedUcdProcesses.size() > 0) { + for (CertifiedProductUcdProcess existingItem : existingUcdProcesses) { + boolean inUpdatedListing = false; + for (CertifiedProductUcdProcess updatedItem : updatedUcdProcesses) { + inUpdatedListing = !inUpdatedListing ? existingItem.matches(updatedItem) : inUpdatedListing; + } + if (!inUpdatedListing) { + idsToRemove.add(existingItem.getId()); + } + } + } + } + + numChanges = ucdToAdd.size() + idsToRemove.size(); + + for (CertifiedProductUcdProcess toAdd : ucdToAdd) { + CertificationResultUcdProcessDTO toAddDto = new CertificationResultUcdProcessDTO(); + toAddDto.setCertificationResultId(certResult.getId()); + toAddDto.setUcdProcessId(toAdd.getId()); + toAddDto.setUcdProcessDetails(toAdd.getDetails()); + certResultDao.addUcdProcessMapping(toAddDto); + } + + for (CertificationResultUcdProcessPair toUpdate : ucdToUpdate) { + boolean hasChanged = false; + if (!Objects.equals(toUpdate.getOrig().getDetails(), toUpdate.getUpdated().getDetails())) { + hasChanged = true; + } + if (hasChanged) { + CertificationResultUcdProcessDTO toUpdateDto = new CertificationResultUcdProcessDTO(); + toUpdateDto.setId(toUpdate.getOrig().getId()); + toUpdateDto.setCertificationResultId(certResult.getId()); + toUpdateDto.setUcdProcessId(toUpdate.getUpdated().getId()); + toUpdateDto.setUcdProcessDetails(toUpdate.getUpdated().getDetails()); + certResultDao.updateUcdProcessMapping(toUpdateDto); + } + } + + for (Long idToRemove : idsToRemove) { + certResultDao.deleteUcdProcessMapping(certResult.getId(), idToRemove); + } + return numChanges; + } public int synchronizeTestTasks(CertifiedProductSearchDetails existingListing, - CertifiedProductSearchDetails updatedListing, List origTestTasks, + CertifiedProductSearchDetails updatedListing, + List origTestTasks, List newTestTasks) throws EntityCreationException, EntityRetrievalException { createNewTestTasksAndParticipants(newTestTasks); @@ -380,4 +507,23 @@ private Optional getMatchingItemInList(Long idToMatch, Collection id : false) .findAny(); } + + + private static class CertificationResultUcdProcessPair { + private CertifiedProductUcdProcess orig; + private CertifiedProductUcdProcess updated; + + CertificationResultUcdProcessPair(final CertifiedProductUcdProcess orig, final CertifiedProductUcdProcess updated) { + this.orig = orig; + this.updated = updated; + } + + public CertifiedProductUcdProcess getOrig() { + return orig; + } + + public CertifiedProductUcdProcess getUpdated() { + return updated; + } + } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/domain/CertifiedProductSearchDetails.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/domain/CertifiedProductSearchDetails.java index 12c7d24fe4..56dbc6ae93 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/domain/CertifiedProductSearchDetails.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/domain/CertifiedProductSearchDetails.java @@ -28,6 +28,7 @@ import gov.healthit.chpl.domain.surveillance.Surveillance; import gov.healthit.chpl.entity.CertificationStatusType; import gov.healthit.chpl.sed.CertifiedProductSed; +import gov.healthit.chpl.sed.SedSummaryData; import gov.healthit.chpl.targeteduser.CertifiedProductTargetedUser; import gov.healthit.chpl.util.CertificationStatusUtil; import gov.healthit.chpl.util.DateUtil; @@ -72,13 +73,16 @@ public class CertifiedProductSearchDetails implements Serializable { + "This variable is applicable to 2014 Edition. Fully qualified URL which is reachable via web browser validation and verification.") private String reportFileLocation; + @SedSummaryData @Schema(description = "Hyperlink to FULL Usability Test Report meeting all the SED requirements. " + "Fully qualified URL which is reachable via web browser validation and verification.") private String sedReportFileLocation; + @SedSummaryData @Schema(description = "For SED testing, a description of the intended users of the Health IT") private String sedIntendedUserDescription; + @SedSummaryData @Schema(description = "Date all SED testing was concluded for the Health IT. The format for the date is YYYMMDD") @JsonDeserialize(using = LocalDateDeserializer.class) @JsonSerialize(using = LocalDateSerializer.class) diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/domain/CertifiedProductUcdProcess.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/domain/CertifiedProductUcdProcess.java index 523e3cfe67..b5150992be 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/domain/CertifiedProductUcdProcess.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/domain/CertifiedProductUcdProcess.java @@ -2,8 +2,10 @@ import java.io.Serializable; import java.util.LinkedHashSet; +import java.util.stream.Stream; import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -21,6 +23,8 @@ @AllArgsConstructor public class CertifiedProductUcdProcess implements Serializable { private static final long serialVersionUID = 7248865611086710891L; + private static final String[] CUSTOM_UCD_PROCESS_NAMES = {"Custom", "Homegrown", "Home grown", "Internal", + "Internal Process", "Internal Process Used", "See User Centered Design Document", "See UCD", "See Document"}; private Long id; @@ -34,6 +38,9 @@ public class CertifiedProductUcdProcess implements Serializable { + "This is a string variable that does not take any restrictions on formatting or values.") private String details; + @Schema(description = "Either the standardized UCD Process Name or a description of the UCD process used.") + private String value; + @Builder.Default private LinkedHashSet criteria = new LinkedHashSet(); @@ -57,4 +64,23 @@ public boolean matches(CertifiedProductUcdProcess anotherUcd) { } return result; } + + public String getValue() { + if (!StringUtils.isBlank(name) && !StringUtils.isBlank(details)) { + if (isHomegrownish()) { + return details; + } + return name; + } else if (!StringUtils.isBlank(name)) { + return name; + } + return details; + } + + private boolean isHomegrownish() { + return Stream.of(CUSTOM_UCD_PROCESS_NAMES) + .filter(homegrownishName -> homegrownishName.equalsIgnoreCase(name)) + .findAny() + .isPresent(); + } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/manager/CertificationResultManager.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/manager/CertificationResultManager.java index 4d62e59d31..5998802dd7 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/manager/CertificationResultManager.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/manager/CertificationResultManager.java @@ -14,6 +14,7 @@ import org.springframework.transaction.annotation.Transactional; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; +import gov.healthit.chpl.certifiedproduct.service.SedSynchronizationService; import gov.healthit.chpl.codeset.CertificationResultCodeSetService; import gov.healthit.chpl.conformanceMethod.domain.CertificationResultConformanceMethod; import gov.healthit.chpl.dao.CertificationCriterionDAO; @@ -22,7 +23,6 @@ import gov.healthit.chpl.domain.CertificationResultAdditionalSoftware; import gov.healthit.chpl.domain.CertifiedProduct; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; -import gov.healthit.chpl.domain.CertifiedProductUcdProcess; import gov.healthit.chpl.dto.CertificationResultAdditionalSoftwareDTO; import gov.healthit.chpl.dto.CertificationResultDTO; import gov.healthit.chpl.dto.CertificationResultUcdProcessDTO; @@ -38,7 +38,6 @@ import gov.healthit.chpl.sed.CertificationResultTestTask; import gov.healthit.chpl.standard.CertificationResultStandardService; import gov.healthit.chpl.svap.domain.CertificationResultSvap; -import gov.healthit.chpl.testdata.CertificationResultTestData; import gov.healthit.chpl.testprocedure.CertificationResultTestProcedure; import gov.healthit.chpl.teststandard.CertificationResultTestStandard; import gov.healthit.chpl.teststandard.TestStandard; @@ -58,6 +57,7 @@ public class CertificationResultManager extends SecuredManager { private CertificationResultFunctionalityTestedService certResultFunctionalityTestedService; private CertificationResultStandardService certResultStandardService; private CertificationResultCodeSetService certificationResultCodeSetService; + private SedSynchronizationService sedSynchronizationService; @SuppressWarnings("checkstyle:parameternumber") @Autowired @@ -67,7 +67,8 @@ public CertificationResultManager(CertifiedProductUtil cpUtil, CertificationCrit CertificationResultTestToolService certResultTestToolService, CertificationResultFunctionalityTestedService certResultFunctionalityTestedService, CertificationResultStandardService certResultStandardService, - CertificationResultCodeSetService certificationResultCodeSetService) { + CertificationResultCodeSetService certificationResultCodeSetService, + SedSynchronizationService sedSynchronizationService) { this.cpUtil = cpUtil; this.criteriaDao = criteriaDao; this.certResultDAO = certResultDAO; @@ -76,6 +77,7 @@ public CertificationResultManager(CertifiedProductUtil cpUtil, CertificationCrit this.certResultFunctionalityTestedService = certResultFunctionalityTestedService; this.certResultStandardService = certResultStandardService; this.certificationResultCodeSetService = certificationResultCodeSetService; + this.sedSynchronizationService = sedSynchronizationService; } @SuppressWarnings({"checkstyle:methodlength", "checkstyle:linelength"}) @@ -127,40 +129,7 @@ public int createOrUpdate(CertifiedProductSearchDetails existingListing, Certifi numChanges += certResultStandardService.synchronizeStandards(updated, orig.getStandards(), updated.getStandards()); numChanges += updateSvap(updated, orig.getSvaps(), updated.getSvaps()); numChanges += certificationResultCodeSetService.synchronizeCodeSets(updated, orig.getCodeSets(), updated.getCodeSets()); - - List origUcdsForCriteria = new ArrayList(); - List updatedUcdsForCriteria = new ArrayList(); - if (existingListing.getSed() != null && existingListing.getSed().getUcdProcesses() != null - && existingListing.getSed().getUcdProcesses().size() > 0) { - for (CertifiedProductUcdProcess existingUcd : existingListing.getSed().getUcdProcesses()) { - boolean ucdMeetsCriteria = false; - for (CertificationCriterion ucdCriteria : existingUcd.getCriteria()) { - if (ucdCriteria.getId().equals(updated.getCriterion().getId()) - && orig.getSed() != null && orig.getSed()) { - ucdMeetsCriteria = true; - } - } - if (ucdMeetsCriteria) { - origUcdsForCriteria.add(existingUcd); - } - } - } - if (updatedListing.getSed() != null && updatedListing.getSed().getUcdProcesses() != null - && updatedListing.getSed().getUcdProcesses().size() > 0) { - for (CertifiedProductUcdProcess updatedUcd : updatedListing.getSed().getUcdProcesses()) { - boolean ucdMeetsCriteria = false; - for (CertificationCriterion ucdCriteria : updatedUcd.getCriteria()) { - if (ucdCriteria.getId().equals(updated.getCriterion().getId()) - && updated.getSed() != null && updated.getSed()) { - ucdMeetsCriteria = true; - } - } - if (ucdMeetsCriteria) { - updatedUcdsForCriteria.add(updatedUcd); - } - } - } - numChanges += updateUcdProcesses(updated, origUcdsForCriteria, updatedUcdsForCriteria); + numChanges += sedSynchronizationService.synchronizeUcdProcesses(existingListing, updatedListing, orig, updated); return numChanges; } @@ -293,91 +262,6 @@ private int updateAdditionalSoftware(CertificationResult certResult, return numChanges; } - private int updateUcdProcesses(CertificationResult certResult, List existingUcdProcesses, - List updatedUcdProcesses) - throws EntityCreationException, EntityRetrievalException { - int numChanges = 0; - List ucdToAdd = new ArrayList(); - List ucdToUpdate = new ArrayList(); - List idsToRemove = new ArrayList(); - - // figure out which ucd processes to add - if (updatedUcdProcesses != null && updatedUcdProcesses.size() > 0) { - if (existingUcdProcesses == null || existingUcdProcesses.size() == 0) { - // existing listing has none, add all from the update - for (CertifiedProductUcdProcess updatedItem : updatedUcdProcesses) { - ucdToAdd.add(updatedItem); - } - } else if (existingUcdProcesses.size() > 0) { - // existing listing has some, compare to the update to see if - // any are different - for (CertifiedProductUcdProcess updatedItem : updatedUcdProcesses) { - boolean inExistingListing = false; - for (CertifiedProductUcdProcess existingItem : existingUcdProcesses) { - if (updatedItem.matches(existingItem)) { - inExistingListing = true; - ucdToUpdate.add(new CertificationResultUcdProcessPair(existingItem, updatedItem)); - } - } - - if (!inExistingListing) { - ucdToAdd.add(updatedItem); - } - } - } - } - - // figure out which ucd processes to remove - if (existingUcdProcesses != null && existingUcdProcesses.size() > 0) { - // if the updated listing has none, remove them all from existing - if (updatedUcdProcesses == null || updatedUcdProcesses.size() == 0) { - for (CertifiedProductUcdProcess existingItem : existingUcdProcesses) { - idsToRemove.add(existingItem.getId()); - } - } else if (updatedUcdProcesses.size() > 0) { - for (CertifiedProductUcdProcess existingItem : existingUcdProcesses) { - boolean inUpdatedListing = false; - for (CertifiedProductUcdProcess updatedItem : updatedUcdProcesses) { - inUpdatedListing = !inUpdatedListing ? existingItem.matches(updatedItem) : inUpdatedListing; - } - if (!inUpdatedListing) { - idsToRemove.add(existingItem.getId()); - } - } - } - } - - numChanges = ucdToAdd.size() + idsToRemove.size(); - - for (CertifiedProductUcdProcess toAdd : ucdToAdd) { - CertificationResultUcdProcessDTO toAddDto = new CertificationResultUcdProcessDTO(); - toAddDto.setCertificationResultId(certResult.getId()); - toAddDto.setUcdProcessId(toAdd.getId()); - toAddDto.setUcdProcessDetails(toAdd.getDetails()); - certResultDAO.addUcdProcessMapping(toAddDto); - } - - for (CertificationResultUcdProcessPair toUpdate : ucdToUpdate) { - boolean hasChanged = false; - if (!Objects.equals(toUpdate.getOrig().getDetails(), toUpdate.getUpdated().getDetails())) { - hasChanged = true; - } - if (hasChanged) { - CertificationResultUcdProcessDTO toUpdateDto = new CertificationResultUcdProcessDTO(); - toUpdateDto.setId(toUpdate.getOrig().getId()); - toUpdateDto.setCertificationResultId(certResult.getId()); - toUpdateDto.setUcdProcessId(toUpdate.getUpdated().getId()); - toUpdateDto.setUcdProcessDetails(toUpdate.getUpdated().getDetails()); - certResultDAO.updateUcdProcessMapping(toUpdateDto); - } - } - - for (Long idToRemove : idsToRemove) { - certResultDAO.deleteUcdProcessMapping(certResult.getId(), idToRemove); - } - return numChanges; - } - private int updateConformanceMethods(CertifiedProductSearchDetails listing, CertificationResult certResult, List existingConformanceMethods, List updatedConformanceMethods) throws EntityCreationException { @@ -703,41 +587,4 @@ public CertificationResultAdditionalSoftware getUpdated() { } } - - private static class CertificationResultUcdProcessPair { - private CertifiedProductUcdProcess orig; - private CertifiedProductUcdProcess updated; - - CertificationResultUcdProcessPair(final CertifiedProductUcdProcess orig, final CertifiedProductUcdProcess updated) { - this.orig = orig; - this.updated = updated; - } - - public CertifiedProductUcdProcess getOrig() { - return orig; - } - - public CertifiedProductUcdProcess getUpdated() { - return updated; - } - } - - private static class CertificationResultTestDataPair { - private CertificationResultTestData orig; - private CertificationResultTestData updated; - - CertificationResultTestDataPair(final CertificationResultTestData orig, - final CertificationResultTestData updated) { - this.orig = orig; - this.updated = updated; - } - - public CertificationResultTestData getOrig() { - return orig; - } - - public CertificationResultTestData getUpdated() { - return updated; - } - } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/manager/CertifiedProductManager.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/manager/CertifiedProductManager.java index c91072e777..68c63160a5 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/manager/CertifiedProductManager.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/manager/CertifiedProductManager.java @@ -13,6 +13,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; +import org.ff4j.FF4j; import org.quartz.JobDataMap; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; @@ -24,8 +25,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import tools.jackson.core.JacksonException; - +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.accessibilityStandard.AccessibilityStandard; import gov.healthit.chpl.accessibilityStandard.AccessibilityStandardDAO; import gov.healthit.chpl.caching.CacheNames; @@ -101,6 +101,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.log4j.Log4j2; +import tools.jackson.core.JacksonException; @Log4j2 @Service("certifiedProductManager") @@ -136,6 +137,7 @@ public class CertifiedProductManager extends SecuredManager { private TransactionalDeveloperBanHelper txDeveloperBanHelper; private ChplTeamNotifier chplTeamNotifier; private Environment env; + private FF4j ff4j; private ChplHtmlEmailBuilder chplHtmlEmailBuilder; public CertifiedProductManager() { @@ -165,7 +167,9 @@ public CertifiedProductManager(ErrorMessageUtil msgUtil, CertifiedProductDAO cpD CertificationStatusEventsService certStatusEventsService, TransactionalDeveloperBanHelper txDeveloperBanHelper, ChplTeamNotifier chplteamNotifier, - Environment env, ChplHtmlEmailBuilder chplHtmlEmailBuilder) { + Environment env, + FF4j ff4j, + ChplHtmlEmailBuilder chplHtmlEmailBuilder) { this.msgUtil = msgUtil; this.cpDao = cpDao; @@ -198,6 +202,7 @@ public CertifiedProductManager(ErrorMessageUtil msgUtil, CertifiedProductDAO cpD this.txDeveloperBanHelper = txDeveloperBanHelper; this.chplTeamNotifier = chplteamNotifier; this.env = env; + this.ff4j = ff4j; this.chplHtmlEmailBuilder = chplHtmlEmailBuilder; } @@ -1074,6 +1079,9 @@ private int updateCqms(CertifiedProductSearchDetails listing, List getUrlTypesToExclude() { - return Stream.of(UrlType.SERVICE_BASE_URL_LIST).collect(Collectors.toList()); + List exclusions = Stream.of(UrlType.SERVICE_BASE_URL_LIST).collect(Collectors.toList()); + if (ff4j.check(FeatureList.HTI_5_ERD)) { + exclusions.add(UrlType.FULL_USABILITY_REPORT); + } + return exclusions; } /** diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/scheduler/presenter/Sed2015CsvPresenter.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/scheduler/presenter/Sed2015CsvPresenter.java index 96b808fdbb..91b6647991 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/scheduler/presenter/Sed2015CsvPresenter.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/scheduler/presenter/Sed2015CsvPresenter.java @@ -8,11 +8,14 @@ import java.util.ArrayList; import java.util.List; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.ff4j.FF4j; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.sed.TestParticipant; @@ -23,7 +26,11 @@ public class Sed2015CsvPresenter extends CertifiedProductPresenter implements Au private Logger logger; private OutputStreamWriter writer = null; private CSVPrinter csvPrinter = null; + private FF4j ff4j; + public Sed2015CsvPresenter(FF4j ff4j) { + this.ff4j = ff4j; + } @Override public void open(File file) throws IOException { getLogger().info("Opening file, initializing CSV doc."); @@ -71,81 +78,110 @@ protected List generateHeaderValues() { result.add("Product"); result.add("Version"); result.add("Certification Criteria"); - result.add("Task Description"); - result.add("Rating Scale"); - result.add("Task Rating"); - result.add("Task Rating - Standard Deviation"); - result.add("Task Time Mean (s)"); - result.add("Task Time - Standard Deviation (s)"); - result.add("Task Time Deviation - Observed (s)"); - result.add("Task Time Deviation - Optimal (s)"); - result.add("Task Success - Mean (%)"); - result.add("Task Success - Standard Deviation (%)"); - result.add("Task Errors - Mean (%)"); - result.add("Task Errors - Standard Deviation (%)"); - result.add("Task Path Deviation - Observed (# of Steps)"); - result.add("Task Path Deviation - Optimal (# of Steps)"); - result.add("Occupation"); - result.add("Education Type"); - result.add("Product Experience (Months)"); - result.add("Professional Experience (Months)"); - result.add("Computer Experience (Months)"); - result.add("Age (Years)"); - result.add("Gender"); - result.add("Assistive Technology Needs"); + if (ff4j.check(FeatureList.HTI_5_ERD)) { + result.add("UCD Process"); + } else { + result.add("Task Description"); + result.add("Rating Scale"); + result.add("Task Rating"); + result.add("Task Rating - Standard Deviation"); + result.add("Task Time Mean (s)"); + result.add("Task Time - Standard Deviation (s)"); + result.add("Task Time Deviation - Observed (s)"); + result.add("Task Time Deviation - Optimal (s)"); + result.add("Task Success - Mean (%)"); + result.add("Task Success - Standard Deviation (%)"); + result.add("Task Errors - Mean (%)"); + result.add("Task Errors - Standard Deviation (%)"); + result.add("Task Path Deviation - Observed (# of Steps)"); + result.add("Task Path Deviation - Optimal (# of Steps)"); + result.add("Occupation"); + result.add("Education Type"); + result.add("Product Experience (Months)"); + result.add("Professional Experience (Months)"); + result.add("Computer Experience (Months)"); + result.add("Age (Years)"); + result.add("Gender"); + result.add("Assistive Technology Needs"); + } return result; } protected List> generateRows(CertifiedProductSearchDetails listing) { - if (!hasTestTasks(listing)) { - return null; - } - - // each row corresponds to one participant of one test task - // and can result in many rows for a single listing List> result = new ArrayList>(); - for (TestTask testTask : listing.getSed().getTestTasks()) { - if (testTask.getTestParticipants() == null || testTask.getTestParticipants().size() == 0) { - getLogger().warn("No participants were found for listing " + listing.getChplProductNumber() - + " test task ID " + testTask.getId()); - } else { - for (TestParticipant participant : testTask.getTestParticipants()) { + if (ff4j.check(FeatureList.HTI_5_ERD)) { + if (listing.getSed() == null || CollectionUtils.isEmpty(listing.getSed().getUcdProcesses())) { + return null; + } + + listing.getSed().getUcdProcesses().stream() + .forEach(ucd -> { List row = new ArrayList(); row.add(listing.getChplProductNumber()); row.add(listing.getDeveloper().getName()); row.add(listing.getProduct().getName()); row.add(listing.getVersion().getVersion()); StringBuffer assocCriteriaStr = new StringBuffer(); - for (CertificationCriterion criteria : testTask.getCriteria()) { + for (CertificationCriterion criteria : ucd.getCriteria()) { if (assocCriteriaStr.length() > 0) { assocCriteriaStr.append(";"); } assocCriteriaStr.append(CertificationCriterionService.formatCriteriaNumber(criteria, true)); } row.add(assocCriteriaStr.toString()); - row.add(testTask.getDescription()); - row.add(testTask.getTaskRatingScale()); - row.add(String.valueOf(testTask.getTaskRating())); - row.add(String.valueOf(testTask.getTaskRatingStddev())); - row.add(String.valueOf(testTask.getTaskTimeAvg())); - row.add(String.valueOf(testTask.getTaskTimeStddev())); - row.add(String.valueOf(testTask.getTaskTimeDeviationObservedAvg())); - row.add(String.valueOf(testTask.getTaskTimeDeviationOptimalAvg())); - row.add(String.valueOf(testTask.getTaskSuccessAverage())); - row.add(String.valueOf(testTask.getTaskSuccessStddev())); - row.add(String.valueOf(testTask.getTaskErrors())); - row.add(String.valueOf(testTask.getTaskErrorsStddev())); - row.add(String.valueOf(testTask.getTaskPathDeviationObserved())); - row.add(String.valueOf(testTask.getTaskPathDeviationOptimal())); - row.add(participant.getOccupation()); - row.add(participant.getEducationType().getName()); - row.add(String.valueOf(participant.getProductExperienceMonths())); - row.add(String.valueOf(participant.getProfessionalExperienceMonths())); - row.add(String.valueOf(participant.getComputerExperienceMonths())); - row.add(participant.getAge().getName()); - row.add(participant.getGender()); - row.add(participant.getAssistiveTechnologyNeeds()); + row.add(ucd.getValue()); result.add(row); + }); + } else { + if (!hasTestTasks(listing)) { + return null; + } + + // each row corresponds to one participant of one test task + // and can result in many rows for a single listing + for (TestTask testTask : listing.getSed().getTestTasks()) { + if (testTask.getTestParticipants() == null || testTask.getTestParticipants().size() == 0) { + getLogger().warn("No participants were found for listing " + listing.getChplProductNumber() + + " test task ID " + testTask.getId()); + } else { + for (TestParticipant participant : testTask.getTestParticipants()) { + List row = new ArrayList(); + row.add(listing.getChplProductNumber()); + row.add(listing.getDeveloper().getName()); + row.add(listing.getProduct().getName()); + row.add(listing.getVersion().getVersion()); + StringBuffer assocCriteriaStr = new StringBuffer(); + for (CertificationCriterion criteria : testTask.getCriteria()) { + if (assocCriteriaStr.length() > 0) { + assocCriteriaStr.append(";"); + } + assocCriteriaStr.append(CertificationCriterionService.formatCriteriaNumber(criteria, true)); + } + row.add(assocCriteriaStr.toString()); + row.add(testTask.getDescription()); + row.add(testTask.getTaskRatingScale()); + row.add(String.valueOf(testTask.getTaskRating())); + row.add(String.valueOf(testTask.getTaskRatingStddev())); + row.add(String.valueOf(testTask.getTaskTimeAvg())); + row.add(String.valueOf(testTask.getTaskTimeStddev())); + row.add(String.valueOf(testTask.getTaskTimeDeviationObservedAvg())); + row.add(String.valueOf(testTask.getTaskTimeDeviationOptimalAvg())); + row.add(String.valueOf(testTask.getTaskSuccessAverage())); + row.add(String.valueOf(testTask.getTaskSuccessStddev())); + row.add(String.valueOf(testTask.getTaskErrors())); + row.add(String.valueOf(testTask.getTaskErrorsStddev())); + row.add(String.valueOf(testTask.getTaskPathDeviationObserved())); + row.add(String.valueOf(testTask.getTaskPathDeviationOptimal())); + row.add(participant.getOccupation()); + row.add(participant.getEducationType().getName()); + row.add(String.valueOf(participant.getProductExperienceMonths())); + row.add(String.valueOf(participant.getProfessionalExperienceMonths())); + row.add(String.valueOf(participant.getComputerExperienceMonths())); + row.add(participant.getAge().getName()); + row.add(participant.getGender()); + row.add(participant.getAssistiveTechnologyNeeds()); + result.add(row); + } } } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/CertifiedProductSed.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/CertifiedProductSed.java index 1ea4f83505..56767a7890 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/CertifiedProductSed.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/CertifiedProductSed.java @@ -26,6 +26,7 @@ public class CertifiedProductSed implements Serializable { @Builder.Default private List ucdProcesses = new ArrayList(); + @SedTestTaskData @Schema(description = "Tasks used for SED testing") @Builder.Default private List testTasks = new ArrayList(); @@ -49,9 +50,11 @@ public class CertifiedProductSed implements Serializable { //confirm - we have to make them "sticky" in the JSON so they are passed back in when clicking "Confirm", //otherwise we don't have the duplicates in the JSON and allow confirmation even if the listing had these errors. @Builder.Default + @SedTestTaskData private List duplicateTestTaskIds = new ArrayList(); @Builder.Default + @SedTestTaskData private List duplicateTestParticipantIds = new ArrayList(); public CertifiedProductSed() { diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/SedSummaryData.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/SedSummaryData.java new file mode 100644 index 0000000000..2902fc1474 --- /dev/null +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/SedSummaryData.java @@ -0,0 +1,12 @@ +package gov.healthit.chpl.sed; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ ElementType.FIELD, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface SedSummaryData { + +} diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/SedTestTaskData.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/SedTestTaskData.java new file mode 100644 index 0000000000..7b27e45d10 --- /dev/null +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/sed/SedTestTaskData.java @@ -0,0 +1,12 @@ +package gov.healthit.chpl.sed; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ ElementType.FIELD, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface SedTestTaskData { + +} diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/service/CertificationCriterionService.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/service/CertificationCriterionService.java index 80d268f065..5ea2a6003f 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/service/CertificationCriterionService.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/service/CertificationCriterionService.java @@ -2,7 +2,6 @@ import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -333,17 +332,6 @@ private List getReferenceSortingCriteriaList() { .collect(Collectors.toList()); } - public List getUscdiCriteria() { - return Arrays.asList( - get(Criteria2015.B_1_CURES), - get(Criteria2015.B_2_CURES), - get(Criteria2015.E_1_CURES), - get(Criteria2015.F_5_CURES), - get(Criteria2015.G_6_CURES), - get(Criteria2015.G_9_CURES), - get(Criteria2015.G_10)); - } - public static class Criteria2015 { public static final String A_1 = "criterion.170_315_a_1"; public static final String A_2 = "criterion.170_315_a_2"; diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/Heading.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/Heading.java new file mode 100644 index 0000000000..7de4c2c645 --- /dev/null +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/Heading.java @@ -0,0 +1,9 @@ +package gov.healthit.chpl.upload.listing; + +import java.util.List; + +public interface Heading { + public List getColNames(); + public String getHeading(); + public String getNamesAsString(); +} diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/HeadingPostHti5.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/HeadingPostHti5.java new file mode 100644 index 0000000000..d36f33cb9a --- /dev/null +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/HeadingPostHti5.java @@ -0,0 +1,106 @@ +package gov.healthit.chpl.upload.listing; + +import java.util.ArrayList; +import java.util.List; + +public enum HeadingPostHti5 implements Heading { + //while each heading can have multiple values that it matches to, + //the values have to be unique among all headings for this to work + UNIQUE_ID("UNIQUE_CHPL_ID__C", "UNIQUE_CHPL_ID_C", "UNIQUE_CHPL_ID", "CHPL_PRODUCT_NUMBER"), + RECORD_STATUS("RECORD_STATUS__C"), //included so we don't give errors of unrecognized col; should not used anywhere + DEVELOPER("VENDOR__C", "VENDOR_C", "VENDOR", "DEVELOPER__C", "DEVELOPER_C", "DEVELOPER"), + PRODUCT("PRODUCT__C", "PRODUCT_C", "PRODUCT"), + VERSION("VERSION__C", "VERSION_C", "VERSION"), + EDITION("CERT_YEAR__C", "CERT_YEAR_C", "CERT_YEAR", "EDITION__C", "EDITION_C", "EDITION"), + ACB_CERTIFICATION_ID("ACB_CERTIFICATION_ID__C", "ACB_CERTIFICATION_ID_C", "ACB_CERTIFICATION_ID"), + CERTIFICATION_BODY_NAME("CERTIFYING_ACB__C", "CERTIFYING_ACB_C", "CERTIFYING_ACB", "CERTIFICATION_BODY__C", "CERTIFICATION_BODY_C", "CERTIFICATION_BODY"), + TESTING_LAB_NAME("TESTING_ATL__C", "TESTING_ATL_C", "TESTING_ATL"), + CERTIFICATION_DATE("CERTIFICATION_DATE__C", "CERTIFICATION_DATE_C", "CERTIFICATION_DATE"), + DEVELOPER_ADDRESS("VENDOR_STREET_ADDRESS__C", "VENDOR_STREET_ADDRESS_C", "VENDOR_STREET_ADDRESS", "DEVELOPER_STREET_ADDRESS__C", "DEVELOPER_STREET_ADDRESS_C", "DEVELOPER_STREET_ADDRESS"), + DEVELOPER_ADDRESS_LINE_2("VENDOR_STREET_ADDRESS_2__C", "VENDOR_STREET_ADDRESS_2_C", "VENDOR_STREET_ADDRESS_2", "DEVELOPER_STREET_ADDRESS_2__C", "DEVELOPER_STREET_ADDRESS_2_C", "DEVELOPER_STREET_ADDRESS_2"), + DEVELOPER_STATE("VENDOR_STATE__C", "VENDOR_STATE_C", "VENDOR_STATE", "DEVELOPER_STATE__C", "DEVELOPER_STATE_C", "DEVELOPER_STATE"), + DEVELOPER_CITY("VENDOR_CITY__C", "VENDOR_CITY_C", "VENDOR_CITY", "DEVELOPER_CITY__C", "DEVELOPER_CITY_C", "DEVELOPER_CITY"), + DEVELOPER_ZIP("VENDOR_ZIP__C", "VENDOR_ZIP_C", "VENDOR_ZIP", "DEVELOPER_ZIP__C", "DEVELOPER_ZIP_C", "DEVELOPER_ZIP"), + DEVELOPER_WEBSITE("VENDOR_WEBSITE__C", "VENDOR_WEBSITE_C", "VENDOR_WEBSITE", "DEVELOPER_WEBSITE__C", "DEVELOPER_WEBSITE_C", "DEVELOPER_WEBSITE"), + SELF_DEVELOPER("SELF_DEVELOPER__C", "SELF_DEVELOPER_C", "SELF_DEVELOPER", "SELF-DEVELOPER"), + DEVELOPER_EMAIL("VENDOR_EMAIL__C", "VENDOR_EMAIL_C", "VENDOR_EMAIL", "DEVELOPER_EMAIL__C", "DEVELOPER_EMAIL_C", "DEVELOPER_EMAIL"), + DEVELOPER_PHONE("VENDOR_PHONE__C", "VENDOR_PHONE_C", "VENDOR_PHONE", "DEVELOPER_PHONE__C", "DEVELOPER_PHONE_C", "DEVELOPER_PHONE"), + DEVELOPER_CONTACT_NAME("VENDOR_CONTACT_NAME__C", "VENDOR_CONTACT_NAME_C", "VENDOR_CONTACT_NAME", "DEVELOPER_CONTACT_NAME__C", "DEVELOPER_CONTACT_NAME_C", "DEVELOPER_CONTACT_NAME"), + TARGETED_USERS("Developer-Identified Target Users", "Developer_Identified_Target_Users"), + QMS_STANDARD_NAME("QMS Standard", "QMS_STANDARD"), + QMS_STANDARD_APPLICABLE_CRITERIA("QMS Standard Applicable Criteria"), + QMS_MODIFICATION("QMS Modification Description"), + ICS("ICS"), + ICS_SOURCE("ICS Source"), + ACCESSIBILITY_CERTIFIED("Accessibility Certified"), + ACCESSIBILITY_STANDARD("Accessibility Standard"), + K_1_URL("170.523(k)(1) URL", "170.523 (k)(1) URL"), + SVAP_NOTICE_URL("SVAP Notice URL"), + RWT_PLANS_URL("RWT Plans URL", "RWT_Plans_URL"), + RWT_PLANS_CHECK_DATE("RWT Plans Check Date"), + RWT_RESULTS_URL("RWT Results URL", "RWT_Results_URL"), + RWT_RESULTS_CHECK_DATE("RWT Results Check Date"), + CQM_NUMBER("CQM Number", "CQM_NUMBER"), + CQM_VERSION("CQM Version", "CQM_VERSION"), + CQM_CRITERIA("CQM Criteria", "CQM_CRITERIA"), + MEASURE_DOMAIN("Measure Domain"), + MEASURE_REQUIRED_TEST("Measure Required Test"), + MEASURE_TYPE("Measure Type"), + MEASURE_ASSOCIATED_CRITERIA("Measure Associated Criteria"), + PRIVACY_AND_SECURITY("Privacy and Security Framework"), + FUNCTIONALITIES_TESTED("Functionality Tested"), + OPTIONAL_STANDARD("Standard Tested Against", "Optional Standard"), + HAS_ADDITIONAL_SOFTWARE("Additional Software"), + ADDITIONAL_SOFTWARE_LISTING("CP Source"), + ADDITIONAL_SOFTWARE_LISTING_GROUPING("CP Source Grouping"), + ADDITIONAL_SOFTWARE_NONLISTING("Non CP Source"), + ADDITIONAL_SOFTWARE_NONLISTING_VERSION("Non CP Source Version"), + ADDITIONAL_SOFTWARE_NONLISTING_GROUPING("Non CP Source Grouping"), + CONFORMANCE_METHOD("Conformance Method"), + CONFORMANCE_METHOD_VERSION("Conformance Method Version"), + TEST_TOOL_NAME("Test tool name"), + TEST_TOOL_VERSION("Test tool version"), + EXPORT_DOCUMENTATION("Export Documentation"), + ATTESTATION_ANSWER("Attestation Answer"), + DOCUMENTATION_URL("Documentation URL"), + USE_CASES("Use Cases"), + SERVICE_BASE_URL_LIST("Service Base URL List"), + API_DOCUMENTATION_LINK("API Documentation Link"), + UCD_PROCESS("UCD Process Selected"), + UCD_PROCESS_DETAILS("UCD Process Details"), + SVAP_REG_TEXT("SVAP Reg Text Citation", "Regulatory Text Citation", "SVAP_REG_TEXT"), + RISK_MANAGEMENT_SUMMARY_INFORMATION("Risk Management Summary Information"), + STANDARD("Standard", "Standards", "standard", "standards"), + CODE_SET("Code Set", "Code Sets", "Codeset", "CodeSet", "Codesets", "CodeSets", "codeset", "codesets"); + + private List colNames; + + HeadingPostHti5(String... csvColNames) { + colNames = new ArrayList(); + for (String csvColName : csvColNames) { + colNames.add(csvColName); + } + } + + public List getColNames() { + return colNames; + } + + public String getHeading() { + return this.colNames.get(0); + } + + public String getNamesAsString() { + String names = ""; + for (int i = 0; i < this.colNames.size(); i++) { + if (i == this.colNames.size() - 1) { + names += " or "; + } + names += this.colNames.get(i); + if (i < this.colNames.size() - 1) { + names += ", "; + } + } + return names; + } +} diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/HeadingPreHti5.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/HeadingPreHti5.java new file mode 100644 index 0000000000..b81f8f4dc9 --- /dev/null +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/HeadingPreHti5.java @@ -0,0 +1,133 @@ +package gov.healthit.chpl.upload.listing; + +import java.util.ArrayList; +import java.util.List; + +public enum HeadingPreHti5 implements Heading { + //while each heading can have multiple values that it matches to, + //the values have to be unique among all headings for this to work + UNIQUE_ID("UNIQUE_CHPL_ID__C", "UNIQUE_CHPL_ID_C", "UNIQUE_CHPL_ID", "CHPL_PRODUCT_NUMBER"), + RECORD_STATUS("RECORD_STATUS__C"), //included so we don't give errors of unrecognized col; should not used anywhere + DEVELOPER("VENDOR__C", "VENDOR_C", "VENDOR", "DEVELOPER__C", "DEVELOPER_C", "DEVELOPER"), + PRODUCT("PRODUCT__C", "PRODUCT_C", "PRODUCT"), + VERSION("VERSION__C", "VERSION_C", "VERSION"), + EDITION("CERT_YEAR__C", "CERT_YEAR_C", "CERT_YEAR", "EDITION__C", "EDITION_C", "EDITION"), + ACB_CERTIFICATION_ID("ACB_CERTIFICATION_ID__C", "ACB_CERTIFICATION_ID_C", "ACB_CERTIFICATION_ID"), + CERTIFICATION_BODY_NAME("CERTIFYING_ACB__C", "CERTIFYING_ACB_C", "CERTIFYING_ACB", "CERTIFICATION_BODY__C", "CERTIFICATION_BODY_C", "CERTIFICATION_BODY"), + TESTING_LAB_NAME("TESTING_ATL__C", "TESTING_ATL_C", "TESTING_ATL"), + CERTIFICATION_DATE("CERTIFICATION_DATE__C", "CERTIFICATION_DATE_C", "CERTIFICATION_DATE"), + DEVELOPER_ADDRESS("VENDOR_STREET_ADDRESS__C", "VENDOR_STREET_ADDRESS_C", "VENDOR_STREET_ADDRESS", "DEVELOPER_STREET_ADDRESS__C", "DEVELOPER_STREET_ADDRESS_C", "DEVELOPER_STREET_ADDRESS"), + DEVELOPER_ADDRESS_LINE_2("VENDOR_STREET_ADDRESS_2__C", "VENDOR_STREET_ADDRESS_2_C", "VENDOR_STREET_ADDRESS_2", "DEVELOPER_STREET_ADDRESS_2__C", "DEVELOPER_STREET_ADDRESS_2_C", "DEVELOPER_STREET_ADDRESS_2"), + DEVELOPER_STATE("VENDOR_STATE__C", "VENDOR_STATE_C", "VENDOR_STATE", "DEVELOPER_STATE__C", "DEVELOPER_STATE_C", "DEVELOPER_STATE"), + DEVELOPER_CITY("VENDOR_CITY__C", "VENDOR_CITY_C", "VENDOR_CITY", "DEVELOPER_CITY__C", "DEVELOPER_CITY_C", "DEVELOPER_CITY"), + DEVELOPER_ZIP("VENDOR_ZIP__C", "VENDOR_ZIP_C", "VENDOR_ZIP", "DEVELOPER_ZIP__C", "DEVELOPER_ZIP_C", "DEVELOPER_ZIP"), + DEVELOPER_WEBSITE("VENDOR_WEBSITE__C", "VENDOR_WEBSITE_C", "VENDOR_WEBSITE", "DEVELOPER_WEBSITE__C", "DEVELOPER_WEBSITE_C", "DEVELOPER_WEBSITE"), + SELF_DEVELOPER("SELF_DEVELOPER__C", "SELF_DEVELOPER_C", "SELF_DEVELOPER", "SELF-DEVELOPER"), + DEVELOPER_EMAIL("VENDOR_EMAIL__C", "VENDOR_EMAIL_C", "VENDOR_EMAIL", "DEVELOPER_EMAIL__C", "DEVELOPER_EMAIL_C", "DEVELOPER_EMAIL"), + DEVELOPER_PHONE("VENDOR_PHONE__C", "VENDOR_PHONE_C", "VENDOR_PHONE", "DEVELOPER_PHONE__C", "DEVELOPER_PHONE_C", "DEVELOPER_PHONE"), + DEVELOPER_CONTACT_NAME("VENDOR_CONTACT_NAME__C", "VENDOR_CONTACT_NAME_C", "VENDOR_CONTACT_NAME", "DEVELOPER_CONTACT_NAME__C", "DEVELOPER_CONTACT_NAME_C", "DEVELOPER_CONTACT_NAME"), + TARGETED_USERS("Developer-Identified Target Users", "Developer_Identified_Target_Users"), + QMS_STANDARD_NAME("QMS Standard", "QMS_STANDARD"), + QMS_STANDARD_APPLICABLE_CRITERIA("QMS Standard Applicable Criteria"), + QMS_MODIFICATION("QMS Modification Description"), + ICS("ICS"), + ICS_SOURCE("ICS Source"), + ACCESSIBILITY_CERTIFIED("Accessibility Certified"), + ACCESSIBILITY_STANDARD("Accessibility Standard"), + K_1_URL("170.523(k)(1) URL", "170.523 (k)(1) URL"), + SVAP_NOTICE_URL("SVAP Notice URL"), + RWT_PLANS_URL("RWT Plans URL", "RWT_Plans_URL"), + RWT_PLANS_CHECK_DATE("RWT Plans Check Date"), + RWT_RESULTS_URL("RWT Results URL", "RWT_Results_URL"), + RWT_RESULTS_CHECK_DATE("RWT Results Check Date"), + CQM_NUMBER("CQM Number", "CQM_NUMBER"), + CQM_VERSION("CQM Version", "CQM_VERSION"), + CQM_CRITERIA("CQM Criteria", "CQM_CRITERIA"), + SED_REPORT_URL("SED Report Hyperlink", "SED Report URL", "SED_REPORT_URL"), + SED_INTENDED_USERS("Description of the Intended Users"), + SED_TESTING_DATE("Date SED Testing was Concluded"), + PARTICIPANT_ID("Participant Identifier"), + PARTICIPANT_GENDER("Participant Gender"), + PARTICIPANT_AGE("Participant Age"), + PARTICIPANT_EDUCATION("Participant Education"), + PARTICIPANT_OCCUPATION("Participant Occupation/Role", "Participant Occupation", "Participant Role"), + PARTICIPANT_PROFESSIONAL_EXPERIENCE("Participant Professional Experience"), + PARTICIPANT_COMPUTER_EXPERIENCE("Participant Computer Experience"), + PARTICIPANT_PRODUCT_EXPERIENCE("Participant Product Experience"), + PARTICIPANT_ASSISTIVE_TECH("Participant Assistive Technology Needs"), + TASK_ID("Task Identifier"), + TASK_DESCRIPTION("Task Description"), + TASK_SUCCESS_MEAN("Task Success - Mean (%)", "Task Success Mean"), + TASK_SUCCESS_STDDEV("Task Success - Standard Deviation (%)", "Task Success Standard Deviation"), + TASK_PATH_DEV_OBS("Task Path Deviation - Observed #", "Task Path Deviation Observed"), + TASK_PATH_DEV_OPT("Task Path Deviation - Optimal #", "Task Path Deviation Optimal"), + TASK_TIME_MEAN("Task Time - Mean (seconds)", "Task Time Mean"), + TASK_TIME_STDDEV("Task Time - Standard Deviation (seconds)", "Task Time Standard Deviation"), + TASK_TIME_DEV_OBS("Task Time Deviation - Observed Seconds", "Task Time Deviation - Mean Observed Seconds", "Task Time Deviation Observed"), + TASK_TIME_DEV_OPT("Task Time Deviation - Optimal Seconds", "Task Time Deviation - Mean Optimal Seconds", "Task Time Deviation Optimal"), + TASK_ERRORS_MEAN("Task Errors Mean(%)", "Task Errors Mean(%)", "Task Errors Mean"), + TASK_ERRORS_STDDEV("Task Errors - Standard Deviation (%)", "Task Errors Standard Deviation"), + TASK_RATING_SCALE("Task Rating - Scale Type", "Task Rating Scale Type"), + TASK_RATING("Task Rating"), + TASK_RATING_STDDEV("Task Rating - Standard Deviation", "Task Rating Standard Deviation"), + MEASURE_DOMAIN("Measure Domain"), + MEASURE_REQUIRED_TEST("Measure Required Test"), + MEASURE_TYPE("Measure Type"), + MEASURE_ASSOCIATED_CRITERIA("Measure Associated Criteria"), + PRIVACY_AND_SECURITY("Privacy and Security Framework"), + FUNCTIONALITIES_TESTED("Functionality Tested"), + OPTIONAL_STANDARD("Standard Tested Against", "Optional Standard"), + HAS_ADDITIONAL_SOFTWARE("Additional Software"), + ADDITIONAL_SOFTWARE_LISTING("CP Source"), + ADDITIONAL_SOFTWARE_LISTING_GROUPING("CP Source Grouping"), + ADDITIONAL_SOFTWARE_NONLISTING("Non CP Source"), + ADDITIONAL_SOFTWARE_NONLISTING_VERSION("Non CP Source Version"), + ADDITIONAL_SOFTWARE_NONLISTING_GROUPING("Non CP Source Grouping"), + CONFORMANCE_METHOD("Conformance Method"), + CONFORMANCE_METHOD_VERSION("Conformance Method Version"), + TEST_TOOL_NAME("Test tool name"), + TEST_TOOL_VERSION("Test tool version"), + EXPORT_DOCUMENTATION("Export Documentation"), + ATTESTATION_ANSWER("Attestation Answer"), + DOCUMENTATION_URL("Documentation URL"), + USE_CASES("Use Cases"), + SERVICE_BASE_URL_LIST("Service Base URL List"), + API_DOCUMENTATION_LINK("API Documentation Link"), + UCD_PROCESS("UCD Process Selected"), + UCD_PROCESS_DETAILS("UCD Process Details"), + SVAP_REG_TEXT("SVAP Reg Text Citation", "Regulatory Text Citation", "SVAP_REG_TEXT"), + RISK_MANAGEMENT_SUMMARY_INFORMATION("Risk Management Summary Information"), + STANDARD("Standard", "Standards", "standard", "standards"), + CODE_SET("Code Set", "Code Sets", "Codeset", "CodeSet", "Codesets", "CodeSets", "codeset", "codesets"); + + private List colNames; + + HeadingPreHti5(String... csvColNames) { + colNames = new ArrayList(); + for (String csvColName : csvColNames) { + colNames.add(csvColName); + } + } + + public List getColNames() { + return colNames; + } + + public String getHeading() { + return this.colNames.get(0); + } + + public String getNamesAsString() { + String names = ""; + for (int i = 0; i < this.colNames.size(); i++) { + if (i == this.colNames.size() - 1) { + names += " or "; + } + names += this.colNames.get(i); + if (i < this.colNames.size() - 1) { + names += ", "; + } + } + return names; + } +} diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/LegacyHeading.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/LegacyHeading.java new file mode 100644 index 0000000000..50e989cc8e --- /dev/null +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/LegacyHeading.java @@ -0,0 +1,27 @@ +package gov.healthit.chpl.upload.listing; + +import java.util.ArrayList; +import java.util.List; + +public enum LegacyHeading { + MACRA_MEASURE_G1("Measure Successfully Tested for G1"), + MACRA_MEASURE_G2("Measure Successfully Tested for G2"), + //This was always called "Standards" which is now used for "Standards" + //but "Test Standards" are something different, so I'm not sure if we need this but maybe. + TEST_STANDARD("Test Standards"), + TEST_PROCEDURE("Test procedure"), + TEST_PROCEDURE_VERSION("Test procedure version"); + + private List colNames; + + LegacyHeading(String... csvColNames) { + colNames = new ArrayList(); + for (String csvColName : csvColNames) { + colNames.add(csvColName); + } + } + + public String getHeading() { + return this.colNames.get(0); + } +} diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingConfirmationManager.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingConfirmationManager.java index 96ecea9dc9..62b5b1a5f6 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingConfirmationManager.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingConfirmationManager.java @@ -9,13 +9,13 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Component; -import tools.jackson.core.JacksonException; - +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.caching.CacheNames; import gov.healthit.chpl.caching.ListingSearchCacheRefresh; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; @@ -53,6 +53,7 @@ import gov.healthit.chpl.util.DateUtil; import jakarta.transaction.Transactional; import lombok.extern.log4j.Log4j2; +import tools.jackson.core.JacksonException; @Component @Log4j2 @@ -75,7 +76,7 @@ public class ListingConfirmationManager { private CertificationStatusEventDAO statusEventDao; private ActivityManager activityManager; private CertifiedProductDetailsManager cpDetailsManager; - + private FF4j ff4j; private CertificationStatus activeStatus; @Autowired @@ -92,7 +93,8 @@ public ListingConfirmationManager(DeveloperManager developerManager, CertificationStatusDAO certStatusDao, CertificationStatusEventDAO statusEventDao, CertifiedProductDetailsManager cpDetailsManager, ActivityManager activityManager, CertificationResultStandardDAO certResultStandardDao, - CertificationResultCodeSetDAO certResultCodeSetDao) { + CertificationResultCodeSetDAO certResultCodeSetDao, + FF4j ff4j) { this.developerManager = developerManager; this.productManager = productManager; this.versionManager = versionManager; @@ -111,6 +113,7 @@ public ListingConfirmationManager(DeveloperManager developerManager, this.activityManager = activityManager; this.certResultStandardDao = certResultStandardDao; this.certResultCodeSetDao = certResultCodeSetDao; + this.ff4j = ff4j; activeStatus = certStatusDao.getByStatusName(CertificationStatusType.Active.toString()); } @@ -321,6 +324,9 @@ private void saveUcdProcess(CertifiedProductSearchDetails listing, CertifiedProd } private void saveTestTask(CertifiedProductSearchDetails listing, TestTask testTask, List allTestTasks) throws EntityCreationException { + if (ff4j.check(FeatureList.HTI_5_ERD)) { + return; + } List certResultIds = testTask.getCriteria().stream() .map(criterion -> getCertificationResultId(listing, criterion)) .filter(crId -> crId != null) diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadHandlerUtil.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadHandlerUtil.java index b2764a4ae1..d5ea121519 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadHandlerUtil.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadHandlerUtil.java @@ -29,7 +29,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; import gov.healthit.chpl.util.DateUtil; import gov.healthit.chpl.util.ErrorMessageUtil; import jakarta.validation.ValidationException; @@ -356,8 +355,8 @@ private int getColumnIndexOfHeading(Heading heading, CSVRecord headingRecord) { String currHeadingValue = iter.next(); String normalizedCurrHeading = StringUtils.normalizeSpace(currHeadingValue); if (normalizedCurrHeading != null - && ListingUploadHeadingUtil.getHeading(normalizedCurrHeading) != null - && ListingUploadHeadingUtil.getHeading(normalizedCurrHeading).equals(heading)) { + && uploadHeadingUtil.getHeading(normalizedCurrHeading) != null + && CollectionUtils.containsAny(uploadHeadingUtil.getHeading(normalizedCurrHeading).getColNames(), heading.getColNames())) { return index; } index++; diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadHeadingUtil.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadHeadingUtil.java index 810582dce7..cdd8884c94 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadHeadingUtil.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadHeadingUtil.java @@ -1,37 +1,55 @@ package gov.healthit.chpl.upload.listing; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.lang3.StringUtils; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.service.CertificationCriterionService; @Component public class ListingUploadHeadingUtil { private CertificationCriterionService criteriaService; + private FF4j ff4j; @Autowired - public ListingUploadHeadingUtil(CertificationCriterionService criteriaService) { + public ListingUploadHeadingUtil(CertificationCriterionService criteriaService, + FF4j ff4j) { this.criteriaService = criteriaService; + this.ff4j = ff4j; } - public static List getRequiredHeadings() { - return Arrays.asList(Heading.UNIQUE_ID, Heading.DEVELOPER, Heading.PRODUCT, Heading.VERSION); + public List getRequiredHeadings() { + if (ff4j.check(FeatureList.HTI_5_ERD)) { + return Arrays.asList(HeadingPostHti5.UNIQUE_ID, HeadingPostHti5.DEVELOPER, HeadingPostHti5.PRODUCT, HeadingPostHti5.VERSION); + } else { + return Arrays.asList(HeadingPreHti5.UNIQUE_ID, HeadingPreHti5.DEVELOPER, HeadingPreHti5.PRODUCT, HeadingPreHti5.VERSION); + } } - public static Heading getHeading(String colName) { + public Heading getHeading(String colName) { if (StringUtils.isEmpty(colName)) { return null; } - for (Heading heading : Heading.values()) { - if (heading.colNames.stream() - .anyMatch(headingColName -> headingColName.equalsIgnoreCase(colName.trim()))) { - return heading; + + if (ff4j.check(FeatureList.HTI_5_ERD)) { + for (HeadingPostHti5 heading : HeadingPostHti5.values()) { + if (heading.getColNames().stream() + .anyMatch(headingColName -> headingColName.equalsIgnoreCase(colName.trim()))) { + return heading; + } + } + } else { + for (HeadingPreHti5 heading : HeadingPreHti5.values()) { + if (heading.getColNames().stream() + .anyMatch(headingColName -> headingColName.equalsIgnoreCase(colName.trim()))) { + return heading; + } } } return null; @@ -39,7 +57,7 @@ public static Heading getHeading(String colName) { public List getHeadingOptions(String heading) { if (getHeading(heading) != null) { - return getHeading(heading).colNames; + return getHeading(heading).getColNames(); } else if (isCriterionHeading(heading)) { //TODO This really should return the list of other headings that could be used for a criterion, //but I don't have a good way of mapping from one heading to all the other headings that could be used. @@ -60,152 +78,4 @@ public boolean isCriterionHeading(String heading) { } return false; } - - public enum Heading { - //while each heading can have multiple values that it matches to, - //the values have to be unique among all headings for this to work - UNIQUE_ID("UNIQUE_CHPL_ID__C", "UNIQUE_CHPL_ID_C", "UNIQUE_CHPL_ID", "CHPL_PRODUCT_NUMBER"), - RECORD_STATUS("RECORD_STATUS__C"), //included so we don't give errors of unrecognized col; should not used anywhere - DEVELOPER("VENDOR__C", "VENDOR_C", "VENDOR", "DEVELOPER__C", "DEVELOPER_C", "DEVELOPER"), - PRODUCT("PRODUCT__C", "PRODUCT_C", "PRODUCT"), - VERSION("VERSION__C", "VERSION_C", "VERSION"), - EDITION("CERT_YEAR__C", "CERT_YEAR_C", "CERT_YEAR", "EDITION__C", "EDITION_C", "EDITION"), - ACB_CERTIFICATION_ID("ACB_CERTIFICATION_ID__C", "ACB_CERTIFICATION_ID_C", "ACB_CERTIFICATION_ID"), - CERTIFICATION_BODY_NAME("CERTIFYING_ACB__C", "CERTIFYING_ACB_C", "CERTIFYING_ACB", "CERTIFICATION_BODY__C", "CERTIFICATION_BODY_C", "CERTIFICATION_BODY"), - TESTING_LAB_NAME("TESTING_ATL__C", "TESTING_ATL_C", "TESTING_ATL"), - CERTIFICATION_DATE("CERTIFICATION_DATE__C", "CERTIFICATION_DATE_C", "CERTIFICATION_DATE"), - DEVELOPER_ADDRESS("VENDOR_STREET_ADDRESS__C", "VENDOR_STREET_ADDRESS_C", "VENDOR_STREET_ADDRESS", "DEVELOPER_STREET_ADDRESS__C", "DEVELOPER_STREET_ADDRESS_C", "DEVELOPER_STREET_ADDRESS"), - DEVELOPER_ADDRESS_LINE_2("VENDOR_STREET_ADDRESS_2__C", "VENDOR_STREET_ADDRESS_2_C", "VENDOR_STREET_ADDRESS_2", "DEVELOPER_STREET_ADDRESS_2__C", "DEVELOPER_STREET_ADDRESS_2_C", "DEVELOPER_STREET_ADDRESS_2"), - DEVELOPER_STATE("VENDOR_STATE__C", "VENDOR_STATE_C", "VENDOR_STATE", "DEVELOPER_STATE__C", "DEVELOPER_STATE_C", "DEVELOPER_STATE"), - DEVELOPER_CITY("VENDOR_CITY__C", "VENDOR_CITY_C", "VENDOR_CITY", "DEVELOPER_CITY__C", "DEVELOPER_CITY_C", "DEVELOPER_CITY"), - DEVELOPER_ZIP("VENDOR_ZIP__C", "VENDOR_ZIP_C", "VENDOR_ZIP", "DEVELOPER_ZIP__C", "DEVELOPER_ZIP_C", "DEVELOPER_ZIP"), - DEVELOPER_WEBSITE("VENDOR_WEBSITE__C", "VENDOR_WEBSITE_C", "VENDOR_WEBSITE", "DEVELOPER_WEBSITE__C", "DEVELOPER_WEBSITE_C", "DEVELOPER_WEBSITE"), - SELF_DEVELOPER("SELF_DEVELOPER__C", "SELF_DEVELOPER_C", "SELF_DEVELOPER", "SELF-DEVELOPER"), - DEVELOPER_EMAIL("VENDOR_EMAIL__C", "VENDOR_EMAIL_C", "VENDOR_EMAIL", "DEVELOPER_EMAIL__C", "DEVELOPER_EMAIL_C", "DEVELOPER_EMAIL"), - DEVELOPER_PHONE("VENDOR_PHONE__C", "VENDOR_PHONE_C", "VENDOR_PHONE", "DEVELOPER_PHONE__C", "DEVELOPER_PHONE_C", "DEVELOPER_PHONE"), - DEVELOPER_CONTACT_NAME("VENDOR_CONTACT_NAME__C", "VENDOR_CONTACT_NAME_C", "VENDOR_CONTACT_NAME", "DEVELOPER_CONTACT_NAME__C", "DEVELOPER_CONTACT_NAME_C", "DEVELOPER_CONTACT_NAME"), - TARGETED_USERS("Developer-Identified Target Users", "Developer_Identified_Target_Users"), - QMS_STANDARD_NAME("QMS Standard", "QMS_STANDARD"), - QMS_STANDARD_APPLICABLE_CRITERIA("QMS Standard Applicable Criteria"), - QMS_MODIFICATION("QMS Modification Description"), - ICS("ICS"), - ICS_SOURCE("ICS Source"), - ACCESSIBILITY_CERTIFIED("Accessibility Certified"), - ACCESSIBILITY_STANDARD("Accessibility Standard"), - K_1_URL("170.523(k)(1) URL", "170.523 (k)(1) URL"), - SVAP_NOTICE_URL("SVAP Notice URL"), - RWT_PLANS_URL("RWT Plans URL", "RWT_Plans_URL"), - RWT_PLANS_CHECK_DATE("RWT Plans Check Date"), - RWT_RESULTS_URL("RWT Results URL", "RWT_Results_URL"), - RWT_RESULTS_CHECK_DATE("RWT Results Check Date"), - CQM_NUMBER("CQM Number", "CQM_NUMBER"), - CQM_VERSION("CQM Version", "CQM_VERSION"), - CQM_CRITERIA("CQM Criteria", "CQM_CRITERIA"), - SED_REPORT_URL("SED Report Hyperlink", "SED Report URL", "SED_REPORT_URL"), - SED_INTENDED_USERS("Description of the Intended Users"), - SED_TESTING_DATE("Date SED Testing was Concluded"), - PARTICIPANT_ID("Participant Identifier"), - PARTICIPANT_GENDER("Participant Gender"), - PARTICIPANT_AGE("Participant Age"), - PARTICIPANT_EDUCATION("Participant Education"), - PARTICIPANT_OCCUPATION("Participant Occupation/Role", "Participant Occupation", "Participant Role"), - PARTICIPANT_PROFESSIONAL_EXPERIENCE("Participant Professional Experience"), - PARTICIPANT_COMPUTER_EXPERIENCE("Participant Computer Experience"), - PARTICIPANT_PRODUCT_EXPERIENCE("Participant Product Experience"), - PARTICIPANT_ASSISTIVE_TECH("Participant Assistive Technology Needs"), - TASK_ID("Task Identifier"), - TASK_DESCRIPTION("Task Description"), - TASK_SUCCESS_MEAN("Task Success - Mean (%)", "Task Success Mean"), - TASK_SUCCESS_STDDEV("Task Success - Standard Deviation (%)", "Task Success Standard Deviation"), - TASK_PATH_DEV_OBS("Task Path Deviation - Observed #", "Task Path Deviation Observed"), - TASK_PATH_DEV_OPT("Task Path Deviation - Optimal #", "Task Path Deviation Optimal"), - TASK_TIME_MEAN("Task Time - Mean (seconds)", "Task Time Mean"), - TASK_TIME_STDDEV("Task Time - Standard Deviation (seconds)", "Task Time Standard Deviation"), - TASK_TIME_DEV_OBS("Task Time Deviation - Observed Seconds", "Task Time Deviation - Mean Observed Seconds", "Task Time Deviation Observed"), - TASK_TIME_DEV_OPT("Task Time Deviation - Optimal Seconds", "Task Time Deviation - Mean Optimal Seconds", "Task Time Deviation Optimal"), - TASK_ERRORS_MEAN("Task Errors Mean(%)", "Task Errors Mean(%)", "Task Errors Mean"), - TASK_ERRORS_STDDEV("Task Errors - Standard Deviation (%)", "Task Errors Standard Deviation"), - TASK_RATING_SCALE("Task Rating - Scale Type", "Task Rating Scale Type"), - TASK_RATING("Task Rating"), - TASK_RATING_STDDEV("Task Rating - Standard Deviation", "Task Rating Standard Deviation"), - MEASURE_DOMAIN("Measure Domain"), - MEASURE_REQUIRED_TEST("Measure Required Test"), - MEASURE_TYPE("Measure Type"), - MEASURE_ASSOCIATED_CRITERIA("Measure Associated Criteria"), - PRIVACY_AND_SECURITY("Privacy and Security Framework"), - FUNCTIONALITIES_TESTED("Functionality Tested"), - OPTIONAL_STANDARD("Standard Tested Against", "Optional Standard"), - HAS_ADDITIONAL_SOFTWARE("Additional Software"), - ADDITIONAL_SOFTWARE_LISTING("CP Source"), - ADDITIONAL_SOFTWARE_LISTING_GROUPING("CP Source Grouping"), - ADDITIONAL_SOFTWARE_NONLISTING("Non CP Source"), - ADDITIONAL_SOFTWARE_NONLISTING_VERSION("Non CP Source Version"), - ADDITIONAL_SOFTWARE_NONLISTING_GROUPING("Non CP Source Grouping"), - CONFORMANCE_METHOD("Conformance Method"), - CONFORMANCE_METHOD_VERSION("Conformance Method Version"), - TEST_TOOL_NAME("Test tool name"), - TEST_TOOL_VERSION("Test tool version"), - EXPORT_DOCUMENTATION("Export Documentation"), - ATTESTATION_ANSWER("Attestation Answer"), - DOCUMENTATION_URL("Documentation URL"), - USE_CASES("Use Cases"), - SERVICE_BASE_URL_LIST("Service Base URL List"), - API_DOCUMENTATION_LINK("API Documentation Link"), - UCD_PROCESS("UCD Process Selected"), - UCD_PROCESS_DETAILS("UCD Process Details"), - SVAP_REG_TEXT("SVAP Reg Text Citation", "Regulatory Text Citation", "SVAP_REG_TEXT"), - RISK_MANAGEMENT_SUMMARY_INFORMATION("Risk Management Summary Information"), - STANDARD("Standard", "Standards", "standard", "standards"), - CODE_SET("Code Set", "Code Sets", "Codeset", "CodeSet", "Codesets", "CodeSets", "codeset", "codesets"); - - private List colNames; - - Heading(String... csvColNames) { - colNames = new ArrayList(); - for (String csvColName : csvColNames) { - colNames.add(csvColName); - } - } - - public String getHeading() { - return this.colNames.get(0); - } - - public String getNamesAsString() { - String names = ""; - for (int i = 0; i < this.colNames.size(); i++) { - if (i == this.colNames.size() - 1) { - names += " or "; - } - names += this.colNames.get(i); - if (i < this.colNames.size() - 1) { - names += ", "; - } - } - return names; - } - } - - public enum LegacyHeading { - MACRA_MEASURE_G1("Measure Successfully Tested for G1"), - MACRA_MEASURE_G2("Measure Successfully Tested for G2"), - //This was always called "Standards" which is now used for "Standards" - //but "Test Standards" are something different, so I'm not sure if we need this but maybe. - TEST_STANDARD("Test Standards"), - TEST_PROCEDURE("Test procedure"), - TEST_PROCEDURE_VERSION("Test procedure version"); - - private List colNames; - - LegacyHeading(String... csvColNames) { - colNames = new ArrayList(); - for (String csvColName : csvColNames) { - colNames.add(csvColName); - } - } - - public String getHeading() { - return this.colNames.get(0); - } - } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadManager.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadManager.java index fb56d1b453..e299fc6a9f 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadManager.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/ListingUploadManager.java @@ -49,7 +49,6 @@ import gov.healthit.chpl.manager.ActivityManager; import gov.healthit.chpl.manager.SchedulerManager; import gov.healthit.chpl.scheduler.job.ListingUploadValidationJob; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; import gov.healthit.chpl.upload.listing.handler.CertificationDateHandler; import gov.healthit.chpl.upload.listing.handler.ListingDetailsUploadHandler; import gov.healthit.chpl.upload.listing.normalizer.BaselineStandardAsOfCertificationDayNormalizer; @@ -71,6 +70,7 @@ public class ListingUploadManager { private CertificationDateHandler certDateHandler; private ListingDetailsNormalizer listingNormalizer; private ListingUploadHandlerUtil uploadUtil; + private ListingUploadHeadingUtil uploadHeadingUtil; private ChplProductNumberUtil chplProductNumberUtil; private ListingUploadDao listingUploadDao; private ListingUploadValidator listingUploadValidator; @@ -89,6 +89,7 @@ public class ListingUploadManager { public ListingUploadManager(ListingDetailsUploadHandler listingDetailsHandler, CertificationDateHandler certDateHandler, ListingDetailsNormalizer listingNormalizer, ListingUploadValidator listingUploadValidator, ListingUploadHandlerUtil uploadUtil, + ListingUploadHeadingUtil uploadHeadingUtil, ChplProductNumberUtil chplProductNumberUtil, ListingUploadDao listingUploadDao, CertificationBodyDAO acbDao, UserDAO userDao, ListingConfirmationManager listingConfirmationManager, SchedulerManager schedulerManager, @@ -101,6 +102,7 @@ public ListingUploadManager(ListingDetailsUploadHandler listingDetailsHandler, this.listingNormalizer = listingNormalizer; this.listingUploadValidator = listingUploadValidator; this.uploadUtil = uploadUtil; + this.uploadHeadingUtil = uploadHeadingUtil; this.chplProductNumberUtil = chplProductNumberUtil; this.listingUploadDao = listingUploadDao; this.acbDao = acbDao; @@ -410,7 +412,7 @@ private List> groupRecordsByListing(CSVRecord headingRecord, Lis } private void checkRequiredHeadings(CSVRecord headingRecord) throws ValidationException { - List missingRequiredHeadings = ListingUploadHeadingUtil.getRequiredHeadings().stream() + List missingRequiredHeadings = uploadHeadingUtil.getRequiredHeadings().stream() .filter(heading -> !uploadUtil.hasHeading(heading, headingRecord)) .map(headingVal -> headingVal.getNamesAsString()) .collect(Collectors.toList()); @@ -421,7 +423,7 @@ private void checkRequiredHeadings(CSVRecord headingRecord) throws ValidationExc } private void checkRequiredFields(CSVRecord headingRecord, List listingRecords) throws ValidationException { - List headingsWithMissingData = ListingUploadHeadingUtil.getRequiredHeadings().stream() + List headingsWithMissingData = uploadHeadingUtil.getRequiredHeadings().stream() .filter(heading -> StringUtils.isEmpty(uploadUtil.parseSingleRowField(heading, headingRecord, listingRecords))) .map(headingVal -> headingVal.getNamesAsString()) .collect(Collectors.toList()); @@ -437,7 +439,7 @@ private String parseRequiredField(Heading heading, CSVRecord headingRecord, List value = uploadUtil.parseRequiredSingleRowField( heading, headingRecord, listingRecords); } catch (Exception ex) { - LOGGER.error("Could not parse required field " + heading.name() + ": " + ex.getMessage()); + LOGGER.error("Could not parse required field " + Util.joinListGrammatically(heading.getColNames()) + ": " + ex.getMessage()); } return value; } @@ -445,7 +447,7 @@ private String parseRequiredField(Heading heading, CSVRecord headingRecord, List private CertificationBody determineAcb(CSVRecord headingRecord, List listingRecords, String chplProductNumber) { CertificationBody acb = null; // first look for an ACB name in the file - String acbName = uploadUtil.parseSingleRowField(Heading.CERTIFICATION_BODY_NAME, headingRecord, listingRecords); + String acbName = uploadUtil.parseSingleRowField(HeadingPostHti5.CERTIFICATION_BODY_NAME, headingRecord, listingRecords); if (!StringUtils.isEmpty(acbName)) { CertificationBody acbByName = acbDao.getByName(acbName); if (acbByName != null) { @@ -471,7 +473,7 @@ private List getNextListingRecordGroup(int startRow, CSVRecord headin while (listingCsvRecordsIter.hasNext()) { CSVRecord record = listingCsvRecordsIter.next(); String recordUniqueId = uploadUtil.parseRequiredSingleRowField( - Heading.UNIQUE_ID, headingRecord, record); + HeadingPostHti5.UNIQUE_ID, headingRecord, record); if (chplProductNumber == null) { chplProductNumber = new String(recordUniqueId); listingCsvRecords.add(record); @@ -486,10 +488,10 @@ private ListingUpload createListingUploadMetadata(CSVRecord headingRecord, List< ListingUpload listingUploadMetadata = new ListingUpload(); listingUploadMetadata.getRecords().add(headingRecord); listingUploadMetadata.getRecords().addAll(listingCsvRecords); - listingUploadMetadata.setChplProductNumber(parseRequiredField(Heading.UNIQUE_ID, headingRecord, listingCsvRecords)); - listingUploadMetadata.setDeveloper(parseRequiredField(Heading.DEVELOPER, headingRecord, listingCsvRecords)); - listingUploadMetadata.setProduct(parseRequiredField(Heading.PRODUCT, headingRecord, listingCsvRecords)); - listingUploadMetadata.setVersion(parseRequiredField(Heading.VERSION, headingRecord, listingCsvRecords)); + listingUploadMetadata.setChplProductNumber(parseRequiredField(HeadingPostHti5.UNIQUE_ID, headingRecord, listingCsvRecords)); + listingUploadMetadata.setDeveloper(parseRequiredField(HeadingPostHti5.DEVELOPER, headingRecord, listingCsvRecords)); + listingUploadMetadata.setProduct(parseRequiredField(HeadingPostHti5.PRODUCT, headingRecord, listingCsvRecords)); + listingUploadMetadata.setVersion(parseRequiredField(HeadingPostHti5.VERSION, headingRecord, listingCsvRecords)); CertificationBody acb = null; try { acb = determineAcb(headingRecord, listingCsvRecords, listingUploadMetadata.getChplProductNumber()); diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/AccessibilityStandardsUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/AccessibilityStandardsUploadHandler.java index 30d0018e9d..ea272487ee 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/AccessibilityStandardsUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/AccessibilityStandardsUploadHandler.java @@ -8,8 +8,8 @@ import org.springframework.stereotype.Component; import gov.healthit.chpl.domain.CertifiedProductAccessibilityStandard; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("accessibilityStandardsUploadHandler") public class AccessibilityStandardsUploadHandler { @@ -35,7 +35,7 @@ public List handle(CSVRecord headingRecor private List parseAccessibilityStandardNames(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowFieldWithoutEmptyValues( - Heading.ACCESSIBILITY_STANDARD, headingRecord, listingRecords); + HeadingPostHti5.ACCESSIBILITY_STANDARD, headingRecord, listingRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/AdditionalSoftwareUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/AdditionalSoftwareUploadHandler.java index cbf5e11183..0a29f4181f 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/AdditionalSoftwareUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/AdditionalSoftwareUploadHandler.java @@ -13,8 +13,8 @@ import org.springframework.stereotype.Component; import gov.healthit.chpl.domain.CertificationResultAdditionalSoftware; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("additionalSoftwareUploadHandler") public class AdditionalSoftwareUploadHandler { @@ -111,43 +111,43 @@ private List buildAdditionalSoftware(int private Boolean parseHasAdditionalSoftware(CSVRecord certResultHeading, List certResultRecords) { Boolean result = null; try { - result = uploadUtil.parseSingleRowFieldAsBoolean(Heading.HAS_ADDITIONAL_SOFTWARE, certResultHeading, certResultRecords); + result = uploadUtil.parseSingleRowFieldAsBoolean(HeadingPostHti5.HAS_ADDITIONAL_SOFTWARE, certResultHeading, certResultRecords); } catch (Exception e) { } return result; } private String parseHasAdditionalSoftwareStr(CSVRecord certResultHeading, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.HAS_ADDITIONAL_SOFTWARE, certResultHeading, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.HAS_ADDITIONAL_SOFTWARE, certResultHeading, certResultRecords); } private List parseListingSources(CSVRecord certResultHeading, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.ADDITIONAL_SOFTWARE_LISTING, certResultHeading, certResultRecords); + HeadingPostHti5.ADDITIONAL_SOFTWARE_LISTING, certResultHeading, certResultRecords); return values; } private List parseListingGroupings(CSVRecord certResultHeading, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.ADDITIONAL_SOFTWARE_LISTING_GROUPING, certResultHeading, certResultRecords); + HeadingPostHti5.ADDITIONAL_SOFTWARE_LISTING_GROUPING, certResultHeading, certResultRecords); return values; } private List parseNonListingSources(CSVRecord certResultHeading, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.ADDITIONAL_SOFTWARE_NONLISTING, certResultHeading, certResultRecords); + HeadingPostHti5.ADDITIONAL_SOFTWARE_NONLISTING, certResultHeading, certResultRecords); return values; } private List parseNonListingVersions(CSVRecord certResultHeading, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.ADDITIONAL_SOFTWARE_NONLISTING_VERSION, certResultHeading, certResultRecords); + HeadingPostHti5.ADDITIONAL_SOFTWARE_NONLISTING_VERSION, certResultHeading, certResultRecords); return values; } private List parseNonListingGroupings(CSVRecord certResultHeading, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.ADDITIONAL_SOFTWARE_NONLISTING_GROUPING, certResultHeading, certResultRecords); + HeadingPostHti5.ADDITIONAL_SOFTWARE_NONLISTING_GROUPING, certResultHeading, certResultRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CertificationDateHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CertificationDateHandler.java index 104166130d..b0a6bb4153 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CertificationDateHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CertificationDateHandler.java @@ -13,8 +13,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; import gov.healthit.chpl.util.ChplProductNumberUtil; import jakarta.validation.ValidationException; import lombok.extern.log4j.Log4j2; @@ -47,7 +47,7 @@ public LocalDate handle(CSVRecord headingRecord, List listingRecords) private LocalDate readCertificationDateFromFile(CSVRecord headingRecord, List listingRecords) { LocalDate certificationDate = null; try { - Date certDateFromFile = uploadUtil.parseSingleRowFieldAsDate(Heading.CERTIFICATION_DATE, headingRecord, listingRecords); + Date certDateFromFile = uploadUtil.parseSingleRowFieldAsDate(HeadingPostHti5.CERTIFICATION_DATE, headingRecord, listingRecords); if (certDateFromFile != null) { certificationDate = certDateFromFile.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); } @@ -58,7 +58,7 @@ private LocalDate readCertificationDateFromFile(CSVRecord headingRecord, List listingRecords) { LocalDate certificationDate = null; try { - String chplProductNumber = uploadUtil.parseRequiredSingleRowField(Heading.UNIQUE_ID, headingRecord, listingRecords); + String chplProductNumber = uploadUtil.parseRequiredSingleRowField(HeadingPostHti5.UNIQUE_ID, headingRecord, listingRecords); if (!StringUtils.isEmpty(chplProductNumber)) { String certDateCode = chplProductNumberUtil.getCertificationDateCode(chplProductNumber); if (!StringUtils.isEmpty(certDateCode) && certDateCode.matches("[0-9]{6}")) { diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CertificationResultUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CertificationResultUploadHandler.java index 9c6abac3c7..3472acf4e9 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CertificationResultUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CertificationResultUploadHandler.java @@ -19,8 +19,8 @@ import gov.healthit.chpl.standard.CertificationResultStandard; import gov.healthit.chpl.standard.Standard; import gov.healthit.chpl.svap.domain.CertificationResultSvap; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; import jakarta.validation.ValidationException; @Component("certificationResultUploadHandler") @@ -93,61 +93,61 @@ private String parseSuccessStr(CSVRecord certHeadingRecord, List cert private Boolean parseHasAdditionalSoftware(CSVRecord certHeadingRecord, List certResultRecords) { Boolean result = null; try { - result = uploadUtil.parseSingleRowFieldAsBoolean(Heading.HAS_ADDITIONAL_SOFTWARE, certHeadingRecord, certResultRecords); + result = uploadUtil.parseSingleRowFieldAsBoolean(HeadingPostHti5.HAS_ADDITIONAL_SOFTWARE, certHeadingRecord, certResultRecords); } catch (Exception e) { } return result; } private String parseHasAdditionalSoftwareStr(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.HAS_ADDITIONAL_SOFTWARE, certHeadingRecord, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.HAS_ADDITIONAL_SOFTWARE, certHeadingRecord, certResultRecords); } private String parsePrivacyAndSecurityFramework(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.PRIVACY_AND_SECURITY, certHeadingRecord, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.PRIVACY_AND_SECURITY, certHeadingRecord, certResultRecords); } private String parseExportDocumentation(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.EXPORT_DOCUMENTATION, certHeadingRecord, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.EXPORT_DOCUMENTATION, certHeadingRecord, certResultRecords); } private Boolean parseAttestationAnswer(CSVRecord certHeadingRecord, List certResultRecords) { Boolean result = null; try { - result = uploadUtil.parseSingleRowFieldAsBoolean(Heading.ATTESTATION_ANSWER, certHeadingRecord, certResultRecords); + result = uploadUtil.parseSingleRowFieldAsBoolean(HeadingPostHti5.ATTESTATION_ANSWER, certHeadingRecord, certResultRecords); } catch (Exception e) { } return result; } private String parseAttestationAnswerStr(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.ATTESTATION_ANSWER, certHeadingRecord, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.ATTESTATION_ANSWER, certHeadingRecord, certResultRecords); } private String parseDocumentationUrl(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.DOCUMENTATION_URL, certHeadingRecord, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.DOCUMENTATION_URL, certHeadingRecord, certResultRecords); } private String parseUseCases(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.USE_CASES, certHeadingRecord, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.USE_CASES, certHeadingRecord, certResultRecords); } private String parseServiceBaseUrlList(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.SERVICE_BASE_URL_LIST, certHeadingRecord, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.SERVICE_BASE_URL_LIST, certHeadingRecord, certResultRecords); } private String parseRiskManagementSummaryInformation(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.RISK_MANAGEMENT_SUMMARY_INFORMATION, certHeadingRecord, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.RISK_MANAGEMENT_SUMMARY_INFORMATION, certHeadingRecord, certResultRecords); } private String parseApiDocumentation(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseSingleRowField(Heading.API_DOCUMENTATION_LINK, certHeadingRecord, certResultRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.API_DOCUMENTATION_LINK, certHeadingRecord, certResultRecords); } private List parseFunctionalitiesTested(CSVRecord certHeadingRecord, List certResultRecords) { List functionalitiesTested = new ArrayList(); List functionalitiesTestedNames = uploadUtil.parseMultiRowFieldWithoutEmptyValues( - Heading.FUNCTIONALITIES_TESTED, certHeadingRecord, certResultRecords); + HeadingPostHti5.FUNCTIONALITIES_TESTED, certHeadingRecord, certResultRecords); if (functionalitiesTestedNames != null && functionalitiesTestedNames.size() > 0) { functionalitiesTestedNames.stream().forEach(functionalityTestedName -> { CertificationResultFunctionalityTested functionalityTested = CertificationResultFunctionalityTested.builder() @@ -165,7 +165,7 @@ private List parseOptionalStandards( CSVRecord certHeadingRecord, List certResultRecords) { List optionalStandards = new ArrayList(); List optionalStandardNames = uploadUtil.parseMultiRowFieldWithoutEmptyValues( - Heading.OPTIONAL_STANDARD, certHeadingRecord, certResultRecords); + HeadingPostHti5.OPTIONAL_STANDARD, certHeadingRecord, certResultRecords); if (!CollectionUtils.isEmpty(optionalStandardNames)) { optionalStandardNames.stream().forEach(optionalStandardName -> { CertificationResultOptionalStandard optionalStandard = CertificationResultOptionalStandard.builder() @@ -182,7 +182,7 @@ private List parseOptionalStandards( private List parseSvaps(CSVRecord certHeadingRecord, List certResultRecords) { List svaps = new ArrayList(); List regulatoryTextCitations = uploadUtil.parseMultiRowFieldWithoutEmptyValues( - Heading.SVAP_REG_TEXT, certHeadingRecord, certResultRecords); + HeadingPostHti5.SVAP_REG_TEXT, certHeadingRecord, certResultRecords); if (!CollectionUtils.isEmpty(regulatoryTextCitations)) { regulatoryTextCitations.stream().forEach(regulatoryTextCitation -> { CertificationResultSvap svap = CertificationResultSvap.builder() @@ -197,7 +197,7 @@ private List parseSvaps(CSVRecord certHeadingRecord, Li private List parseStandards(CSVRecord certHeadingRecord, List certResultRecords) { List standards = new ArrayList(); List regulatoryTextCitations = uploadUtil.parseMultiRowFieldWithoutEmptyValues( - Heading.STANDARD, certHeadingRecord, certResultRecords); + HeadingPostHti5.STANDARD, certHeadingRecord, certResultRecords); if (!CollectionUtils.isEmpty(regulatoryTextCitations)) { regulatoryTextCitations.stream().forEach(regulatoryTextCitation -> { CertificationResultStandard standard = CertificationResultStandard.builder() @@ -214,7 +214,7 @@ private List parseStandards(CSVRecord certHeadingRe private List parseCodeSets(CSVRecord certHeadingRecord, List certResultRecords) { List codeSets = new ArrayList(); List codeSetsText = uploadUtil.parseMultiRowFieldWithoutEmptyValues( - Heading.CODE_SET, certHeadingRecord, certResultRecords); + HeadingPostHti5.CODE_SET, certHeadingRecord, certResultRecords); if (!CollectionUtils.isEmpty(codeSetsText)) { codeSetsText.stream().forEach(codeSetText -> { CertificationResultCodeSet codeSet = CertificationResultCodeSet.builder() diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/ConformanceMethodUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/ConformanceMethodUploadHandler.java index 641d50fdc4..0563f71e3f 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/ConformanceMethodUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/ConformanceMethodUploadHandler.java @@ -14,8 +14,8 @@ import gov.healthit.chpl.conformanceMethod.domain.CertificationResultConformanceMethod; import gov.healthit.chpl.conformanceMethod.domain.ConformanceMethod; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("conformanceMethodUploadHandler") public class ConformanceMethodUploadHandler { @@ -67,13 +67,13 @@ private CertificationResultConformanceMethod buildConformanceMethod(int index, L private List parseConformanceMethodNames(CSVRecord certHeadingRecord, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.CONFORMANCE_METHOD, certHeadingRecord, certResultRecords); + HeadingPostHti5.CONFORMANCE_METHOD, certHeadingRecord, certResultRecords); return values; } private List parseConformanceMethodVersions(CSVRecord certHeadingRecord, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.CONFORMANCE_METHOD_VERSION, certHeadingRecord, certResultRecords); + HeadingPostHti5.CONFORMANCE_METHOD_VERSION, certHeadingRecord, certResultRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CqmUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CqmUploadHandler.java index 16068bec6c..858706094f 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CqmUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/CqmUploadHandler.java @@ -18,8 +18,8 @@ import gov.healthit.chpl.cqm.CQMCriterion; import gov.healthit.chpl.cqm.CQMResultCertification; import gov.healthit.chpl.cqm.CQMResultDetails; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("cqmUploadHandler") public class CqmUploadHandler { @@ -117,19 +117,19 @@ private String getFormattedCqmVersion(String ver) { private List parseCqmNumbers(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.CQM_NUMBER, headingRecord, listingRecords); + HeadingPostHti5.CQM_NUMBER, headingRecord, listingRecords); return values; } private List parseCqmVersions(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.CQM_VERSION, headingRecord, listingRecords); + HeadingPostHti5.CQM_VERSION, headingRecord, listingRecords); return values; } private List parseCqmCriteria(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.CQM_CRITERIA, headingRecord, listingRecords); + HeadingPostHti5.CQM_CRITERIA, headingRecord, listingRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/DeveloperDetailsUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/DeveloperDetailsUploadHandler.java index 890107af9f..16e502eedd 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/DeveloperDetailsUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/DeveloperDetailsUploadHandler.java @@ -9,8 +9,8 @@ import gov.healthit.chpl.domain.Address; import gov.healthit.chpl.domain.Developer; import gov.healthit.chpl.domain.contact.PointOfContact; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("developerDetailsUploadHandler") public class DeveloperDetailsUploadHandler { @@ -27,42 +27,42 @@ public Developer handle(CSVRecord headingRecord, List listingRecords) } Developer developer = Developer.builder() - .userEnteredName(uploadUtil.parseSingleRowField(Heading.DEVELOPER, headingRecord, listingRecords)) - .userEnteredWebsite(uploadUtil.parseSingleRowField(Heading.DEVELOPER_WEBSITE, headingRecord, listingRecords)) + .userEnteredName(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER, headingRecord, listingRecords)) + .userEnteredWebsite(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER_WEBSITE, headingRecord, listingRecords)) .userEnteredSelfDeveloper(parseSelfDeveloperStr(headingRecord, listingRecords)) .build(); Address address = Address.builder() - .line1(uploadUtil.parseSingleRowField(Heading.DEVELOPER_ADDRESS, headingRecord, listingRecords)) - .line2(uploadUtil.parseSingleRowField(Heading.DEVELOPER_ADDRESS_LINE_2, headingRecord, listingRecords)) - .city(uploadUtil.parseSingleRowField(Heading.DEVELOPER_CITY, headingRecord, listingRecords)) - .state(uploadUtil.parseSingleRowField(Heading.DEVELOPER_STATE, headingRecord, listingRecords)) - .zipcode(uploadUtil.parseSingleRowField(Heading.DEVELOPER_ZIP, headingRecord, listingRecords)) + .line1(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER_ADDRESS, headingRecord, listingRecords)) + .line2(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER_ADDRESS_LINE_2, headingRecord, listingRecords)) + .city(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER_CITY, headingRecord, listingRecords)) + .state(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER_STATE, headingRecord, listingRecords)) + .zipcode(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER_ZIP, headingRecord, listingRecords)) .build(); developer.setUserEnteredAddress(address); PointOfContact contact = PointOfContact.builder() - .fullName(uploadUtil.parseSingleRowField(Heading.DEVELOPER_CONTACT_NAME, headingRecord, listingRecords)) - .email(uploadUtil.parseSingleRowField(Heading.DEVELOPER_EMAIL, headingRecord, listingRecords)) - .phoneNumber(uploadUtil.parseSingleRowField(Heading.DEVELOPER_PHONE, headingRecord, listingRecords)) + .fullName(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER_CONTACT_NAME, headingRecord, listingRecords)) + .email(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER_EMAIL, headingRecord, listingRecords)) + .phoneNumber(uploadUtil.parseSingleRowField(HeadingPostHti5.DEVELOPER_PHONE, headingRecord, listingRecords)) .build(); developer.setUserEnteredPointOfContact(contact); return developer; } private String parseSelfDeveloperStr(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.SELF_DEVELOPER, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.SELF_DEVELOPER, headingRecord, listingRecords); } private boolean hasNoDeveloperFields(CSVRecord headingRecord) { - return !uploadUtil.hasHeading(Heading.DEVELOPER, headingRecord) - && !uploadUtil.hasHeading(Heading.DEVELOPER_WEBSITE, headingRecord) - && !uploadUtil.hasHeading(Heading.SELF_DEVELOPER, headingRecord) - && !uploadUtil.hasHeading(Heading.DEVELOPER_ADDRESS, headingRecord) - && !uploadUtil.hasHeading(Heading.DEVELOPER_ADDRESS_LINE_2, headingRecord) - && !uploadUtil.hasHeading(Heading.DEVELOPER_CITY, headingRecord) - && !uploadUtil.hasHeading(Heading.DEVELOPER_STATE, headingRecord) - && !uploadUtil.hasHeading(Heading.DEVELOPER_ZIP, headingRecord) - && !uploadUtil.hasHeading(Heading.DEVELOPER_CONTACT_NAME, headingRecord) - && !uploadUtil.hasHeading(Heading.DEVELOPER_EMAIL, headingRecord) - && !uploadUtil.hasHeading(Heading.DEVELOPER_PHONE, headingRecord); + return !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER_WEBSITE, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.SELF_DEVELOPER, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER_ADDRESS, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER_ADDRESS_LINE_2, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER_CITY, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER_STATE, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER_ZIP, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER_CONTACT_NAME, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER_EMAIL, headingRecord) + && !uploadUtil.hasHeading(HeadingPostHti5.DEVELOPER_PHONE, headingRecord); } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/IcsUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/IcsUploadHandler.java index dab26f8663..be3c29ef4d 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/IcsUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/IcsUploadHandler.java @@ -9,8 +9,8 @@ import gov.healthit.chpl.domain.CertifiedProduct; import gov.healthit.chpl.domain.InheritedCertificationStatus; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("icsUploadHandler") public class IcsUploadHandler { @@ -36,19 +36,19 @@ public InheritedCertificationStatus handle(CSVRecord headingRecord, List listingRecords) { Boolean result = null; try { - result = uploadUtil.parseSingleRowFieldAsBoolean(Heading.ICS, headingRecord, listingRecords); + result = uploadUtil.parseSingleRowFieldAsBoolean(HeadingPostHti5.ICS, headingRecord, listingRecords); } catch (Exception e) { } return result; } private String parseInheritsStr(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.ICS, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.ICS, headingRecord, listingRecords); } private List parseParents(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowFieldWithoutEmptyValues( - Heading.ICS_SOURCE, headingRecord, listingRecords); + HeadingPostHti5.ICS_SOURCE, headingRecord, listingRecords); List cps = new ArrayList(); if (values != null) { values.stream().forEach(value -> { @@ -62,7 +62,7 @@ private List parseParents(CSVRecord headingRecord, List listingRecor String chplId = null; try { chplId = uploadUtil.parseRequiredSingleRowField( - Heading.UNIQUE_ID, headingRecord, listingRecords); + HeadingPostHti5.UNIQUE_ID, headingRecord, listingRecords); } catch (ValidationException ex) { } return chplId; } @@ -142,14 +143,14 @@ private Boolean parseAccessibilityCertified(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.ACCESSIBILITY_CERTIFIED, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.ACCESSIBILITY_CERTIFIED, headingRecord, listingRecords); } private Long parseCertificationDateMillis(CSVRecord headingRecord, List listingRecords) { @@ -169,11 +170,11 @@ private Long parseCertificationDateMillis(CSVRecord headingRecord, List listingRecords) { return uploadUtil.parseSingleRowField( - Heading.CERTIFICATION_DATE, headingRecord, listingRecords); + HeadingPostHti5.CERTIFICATION_DATE, headingRecord, listingRecords); } private Product parseProduct(CSVRecord headingRecord, List listingRecords) { - String productName = uploadUtil.parseSingleRowField(Heading.PRODUCT, headingRecord, listingRecords); + String productName = uploadUtil.parseSingleRowField(HeadingPostHti5.PRODUCT, headingRecord, listingRecords); if (productName == null) { return null; } @@ -184,7 +185,7 @@ private Product parseProduct(CSVRecord headingRecord, List listingRec } private ProductVersion parseVersion(CSVRecord headingRecord, List listingRecords) { - String versionName = uploadUtil.parseSingleRowField(Heading.VERSION, headingRecord, listingRecords); + String versionName = uploadUtil.parseSingleRowField(HeadingPostHti5.VERSION, headingRecord, listingRecords); if (versionName == null) { return null; } @@ -196,7 +197,7 @@ private ProductVersion parseVersion(CSVRecord headingRecord, List lis } private Map parseAcb(CSVRecord headingRecord, List listingRecords) { - String acbName = uploadUtil.parseSingleRowField(Heading.CERTIFICATION_BODY_NAME, headingRecord, listingRecords); + String acbName = uploadUtil.parseSingleRowField(HeadingPostHti5.CERTIFICATION_BODY_NAME, headingRecord, listingRecords); if (acbName == null) { return null; } @@ -211,7 +212,7 @@ private Map parseAcb(CSVRecord headingRecord, List li private List parseAtls(CSVRecord headingRecord, List listingRecords) { List atls = new ArrayList(); List atlNames = uploadUtil.parseMultiRowFieldWithoutEmptyValues( - Heading.TESTING_LAB_NAME, headingRecord, listingRecords); + HeadingPostHti5.TESTING_LAB_NAME, headingRecord, listingRecords); if (atlNames != null && atlNames.size() > 0) { atlNames.stream().forEach(atlName -> { CertifiedProductTestingLab atl = CertifiedProductTestingLab.builder() @@ -226,48 +227,48 @@ private List parseAtls(CSVRecord headingRecord, List } private String parseMandatoryDisclosures(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.K_1_URL, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.K_1_URL, headingRecord, listingRecords); } private String parseSvapNoticeUrl(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.SVAP_NOTICE_URL, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.SVAP_NOTICE_URL, headingRecord, listingRecords); } private String parseRwtPlansUrl(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.RWT_PLANS_URL, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.RWT_PLANS_URL, headingRecord, listingRecords); } private String parseRwtPlansCheckDate(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.RWT_PLANS_CHECK_DATE, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.RWT_PLANS_CHECK_DATE, headingRecord, listingRecords); } private String parseRwtResultsUrl(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.RWT_RESULTS_URL, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.RWT_RESULTS_URL, headingRecord, listingRecords); } private String parseRwtResultsCheckDate(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.RWT_RESULTS_CHECK_DATE, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPostHti5.RWT_RESULTS_CHECK_DATE, headingRecord, listingRecords); } private String parseSedReportLocationUrl(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.SED_REPORT_URL, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPreHti5.SED_REPORT_URL, headingRecord, listingRecords); } private String parseSedIntendedUserDescription(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.SED_INTENDED_USERS, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPreHti5.SED_INTENDED_USERS, headingRecord, listingRecords); } private LocalDate parseSedTestingDay(CSVRecord headingRecord, List listingRecords) { LocalDate sedTestingDate = null; try { sedTestingDate = uploadUtil.parseSingleRowFieldAsLocalDate( - Heading.SED_TESTING_DATE, headingRecord, listingRecords); + HeadingPreHti5.SED_TESTING_DATE, headingRecord, listingRecords); } catch (Exception ex) { } return sedTestingDate; } private String parseSedTestingDayStr(CSVRecord headingRecord, List listingRecords) { - return uploadUtil.parseSingleRowField(Heading.SED_TESTING_DATE, headingRecord, listingRecords); + return uploadUtil.parseSingleRowField(HeadingPreHti5.SED_TESTING_DATE, headingRecord, listingRecords); } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/MeasuresUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/MeasuresUploadHandler.java index 6bfa76577e..359dc5b833 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/MeasuresUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/MeasuresUploadHandler.java @@ -19,8 +19,8 @@ import gov.healthit.chpl.domain.Measure; import gov.healthit.chpl.domain.MeasureDomain; import gov.healthit.chpl.domain.MeasureType; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; import jakarta.validation.ValidationException; import lombok.extern.log4j.Log4j2; @@ -68,25 +68,25 @@ public List parseAsMeasures(CSVRecord headingRecord, List parseMeasureDomains(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.MEASURE_DOMAIN, headingRecord, listingRecords); + HeadingPostHti5.MEASURE_DOMAIN, headingRecord, listingRecords); return values; } private List parseMeasureRequiredTests(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.MEASURE_REQUIRED_TEST, headingRecord, listingRecords); + HeadingPostHti5.MEASURE_REQUIRED_TEST, headingRecord, listingRecords); return values; } private List parseMeasureTypeValues(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.MEASURE_TYPE, headingRecord, listingRecords); + HeadingPostHti5.MEASURE_TYPE, headingRecord, listingRecords); return values; } private List parseMeasureAssociatedCriteria(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.MEASURE_ASSOCIATED_CRITERIA, headingRecord, listingRecords); + HeadingPostHti5.MEASURE_ASSOCIATED_CRITERIA, headingRecord, listingRecords); return values; } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/QmsUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/QmsUploadHandler.java index 94d44e0d1b..f3395594ac 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/QmsUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/QmsUploadHandler.java @@ -13,8 +13,8 @@ import org.springframework.stereotype.Component; import gov.healthit.chpl.domain.CertifiedProductQmsStandard; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("qmsUploadHandler") public class QmsUploadHandler { @@ -74,19 +74,19 @@ private CertifiedProductQmsStandard buildQmsStandard(int index, List qms private List parseQmsStandardNames(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.QMS_STANDARD_NAME, headingRecord, listingRecords); + HeadingPostHti5.QMS_STANDARD_NAME, headingRecord, listingRecords); return values; } private List parseQmsApplicableCriteria(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.QMS_STANDARD_APPLICABLE_CRITERIA, headingRecord, listingRecords); + HeadingPostHti5.QMS_STANDARD_APPLICABLE_CRITERIA, headingRecord, listingRecords); return values; } private List parseQmsModifications(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.QMS_MODIFICATION, headingRecord, listingRecords); + HeadingPostHti5.QMS_MODIFICATION, headingRecord, listingRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/SedUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/SedUploadHandler.java index 9ee9e332a8..d641d73a44 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/SedUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/SedUploadHandler.java @@ -14,17 +14,19 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.csv.CSVRecord; import org.apache.commons.lang3.StringUtils; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.domain.CertifiedProductUcdProcess; import gov.healthit.chpl.sed.CertifiedProductSed; import gov.healthit.chpl.sed.TestParticipant; import gov.healthit.chpl.sed.TestTask; +import gov.healthit.chpl.upload.listing.HeadingPreHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; import jakarta.validation.ValidationException; import lombok.extern.log4j.Log4j2; @@ -36,18 +38,21 @@ public class SedUploadHandler { private TestParticipantsUploadHandler testParticipantHandler; private UcdProcessUploadHandler ucdHandler; private ListingUploadHandlerUtil uploadUtil; + private FF4j ff4j; @Autowired public SedUploadHandler(CertificationCriterionUploadHandler criterionHandler, TestTaskUploadHandler testTaskHandler, TestParticipantsUploadHandler testParticipantHandler, UcdProcessUploadHandler ucdHandler, - ListingUploadHandlerUtil uploadUtil) { + ListingUploadHandlerUtil uploadUtil, + FF4j ff4j) { this.criterionHandler = criterionHandler; this.testTaskHandler = testTaskHandler; this.testParticipantHandler = testParticipantHandler; this.ucdHandler = ucdHandler; this.uploadUtil = uploadUtil; + this.ff4j = ff4j; } public CertifiedProductSed parseAsSed(CSVRecord headingRecord, List listingRecords, @@ -62,8 +67,8 @@ public CertifiedProductSed parseAsSed(CSVRecord headingRecord, List l .map(part -> part.getFriendlyId()) .collect(Collectors.toList()); List testTasks = new ArrayList(); - List allUcdProcessesOnListing = new ArrayList(); + List allUcdProcessesOnListing = new ArrayList(); int prevCertResultIndex = -1; int nextCertResultIndex = uploadUtil.getNextIndexOfCertificationResult(0, headingRecord); while (nextCertResultIndex >= 0 && prevCertResultIndex != nextCertResultIndex) { @@ -76,9 +81,11 @@ public CertifiedProductSed parseAsSed(CSVRecord headingRecord, List l parsedCertResultRecords.subList(1, parsedCertResultRecords.size())); updateUcdProcessList(allUcdProcessesOnListing, certResultUcdProcesses, criterion); - List certResultTestTasks = parseTestTaskIdsWithParticipantIds( - certHeadingRecord, parsedCertResultRecords.subList(1, parsedCertResultRecords.size())); - updateTaskList(testTasks, certResultTestTasks, criterion, availableTestTasks, availableTestParticipants); + if (!ff4j.check(FeatureList.HTI_5_ERD)) { + List certResultTestTasks = parseTestTaskIdsWithParticipantIds( + certHeadingRecord, parsedCertResultRecords.subList(1, parsedCertResultRecords.size())); + updateTaskList(testTasks, certResultTestTasks, criterion, availableTestTasks, availableTestParticipants); + } } prevCertResultIndex = nextCertResultIndex; nextCertResultIndex = uploadUtil.getNextIndexOfCertificationResult( @@ -283,10 +290,10 @@ private boolean isReferenced(List allTestTasks, TestParticipant partic } private List parseTaskIds(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseMultiRowFieldWithoutEmptyValues(Heading.TASK_ID, certHeadingRecord, certResultRecords); + return uploadUtil.parseMultiRowFieldWithoutEmptyValues(HeadingPreHti5.TASK_ID, certHeadingRecord, certResultRecords); } private List parseParticipantIds(CSVRecord certHeadingRecord, List certResultRecords) { - return uploadUtil.parseMultiRowFieldWithoutEmptyValues(Heading.PARTICIPANT_ID, certHeadingRecord, certResultRecords); + return uploadUtil.parseMultiRowFieldWithoutEmptyValues(HeadingPreHti5.PARTICIPANT_ID, certHeadingRecord, certResultRecords); } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TargetedUsersUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TargetedUsersUploadHandler.java index 0b3dad0244..b6443fcd60 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TargetedUsersUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TargetedUsersUploadHandler.java @@ -8,8 +8,8 @@ import org.springframework.stereotype.Component; import gov.healthit.chpl.targeteduser.CertifiedProductTargetedUser; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("targetedUsersUploadHandler") public class TargetedUsersUploadHandler { @@ -35,7 +35,7 @@ public List handle(CSVRecord headingRecord, List parseTargetedUserNames(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowFieldWithoutEmptyValues( - Heading.TARGETED_USERS, headingRecord, listingRecords); + HeadingPostHti5.TARGETED_USERS, headingRecord, listingRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestParticipantsUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestParticipantsUploadHandler.java index 8b98f6b7f1..87939c1412 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestParticipantsUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestParticipantsUploadHandler.java @@ -9,27 +9,36 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.csv.CSVRecord; import org.apache.commons.lang3.StringUtils; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.sed.AgeRange; import gov.healthit.chpl.sed.EducationType; import gov.healthit.chpl.sed.TestParticipant; +import gov.healthit.chpl.upload.listing.HeadingPreHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; import lombok.extern.log4j.Log4j2; @Component("testParticipantsUploadHandler") @Log4j2 public class TestParticipantsUploadHandler { private ListingUploadHandlerUtil uploadUtil; + private FF4j ff4j; @Autowired - public TestParticipantsUploadHandler(ListingUploadHandlerUtil uploadUtil) { + public TestParticipantsUploadHandler(ListingUploadHandlerUtil uploadUtil, + FF4j ff4j) { this.uploadUtil = uploadUtil; + this.ff4j = ff4j; } public List handle(CSVRecord headingRecord, List listingRecords) { + if (ff4j.check(FeatureList.HTI_5_ERD)) { + return new ArrayList(); + } + List testParticipants = new ArrayList(); List ids = parseIds(headingRecord, listingRecords); List genders = parseGenders(headingRecord, listingRecords); @@ -138,55 +147,55 @@ private final int calculateMaxListSize(List... lists) { private List parseIds(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.PARTICIPANT_ID, headingRecord, listingRecords); + HeadingPreHti5.PARTICIPANT_ID, headingRecord, listingRecords); return values; } private List parseGenders(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.PARTICIPANT_GENDER, headingRecord, listingRecords); + HeadingPreHti5.PARTICIPANT_GENDER, headingRecord, listingRecords); return values; } private List parseAges(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.PARTICIPANT_AGE, headingRecord, listingRecords); + HeadingPreHti5.PARTICIPANT_AGE, headingRecord, listingRecords); return values; } private List parseEducations(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.PARTICIPANT_EDUCATION, headingRecord, listingRecords); + HeadingPreHti5.PARTICIPANT_EDUCATION, headingRecord, listingRecords); return values; } private List parseOccupations(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.PARTICIPANT_OCCUPATION, headingRecord, listingRecords); + HeadingPreHti5.PARTICIPANT_OCCUPATION, headingRecord, listingRecords); return values; } private List parseProfessionalExperience(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.PARTICIPANT_PROFESSIONAL_EXPERIENCE, headingRecord, listingRecords); + HeadingPreHti5.PARTICIPANT_PROFESSIONAL_EXPERIENCE, headingRecord, listingRecords); return values; } private List parseComputerExperience(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.PARTICIPANT_COMPUTER_EXPERIENCE, headingRecord, listingRecords); + HeadingPreHti5.PARTICIPANT_COMPUTER_EXPERIENCE, headingRecord, listingRecords); return values; } private List parseProductExperience(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.PARTICIPANT_PRODUCT_EXPERIENCE, headingRecord, listingRecords); + HeadingPreHti5.PARTICIPANT_PRODUCT_EXPERIENCE, headingRecord, listingRecords); return values; } private List parseAssistiveTechnologyNeeds(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.PARTICIPANT_ASSISTIVE_TECH, headingRecord, listingRecords); + HeadingPreHti5.PARTICIPANT_ASSISTIVE_TECH, headingRecord, listingRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestTaskUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestTaskUploadHandler.java index fd248c5e92..e668f6ab18 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestTaskUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestTaskUploadHandler.java @@ -9,25 +9,33 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.csv.CSVRecord; import org.apache.commons.lang3.StringUtils; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.sed.TestTask; +import gov.healthit.chpl.upload.listing.HeadingPreHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; import lombok.extern.log4j.Log4j2; @Component("testTasksUploadHandler") @Log4j2 public class TestTaskUploadHandler { private ListingUploadHandlerUtil uploadUtil; + private FF4j ff4j; @Autowired - public TestTaskUploadHandler(ListingUploadHandlerUtil uploadUtil) { + public TestTaskUploadHandler(ListingUploadHandlerUtil uploadUtil, + FF4j ff4j) { this.uploadUtil = uploadUtil; + this.ff4j = ff4j; } public List handle(CSVRecord headingRecord, List listingRecords) { + if (ff4j.check(FeatureList.HTI_5_ERD)) { + return new ArrayList(); + } List testTasks = new ArrayList(); List ids = parseIds(headingRecord, listingRecords); List descriptions = parseDescription(headingRecord, listingRecords); @@ -282,91 +290,91 @@ private final int calculateMaxListSize(List... lists) { private List parseIds(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_ID, headingRecord, listingRecords); + HeadingPreHti5.TASK_ID, headingRecord, listingRecords); return values; } private List parseDescription(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_DESCRIPTION, headingRecord, listingRecords); + HeadingPreHti5.TASK_DESCRIPTION, headingRecord, listingRecords); return values; } private List parseTaskSuccessAvg(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_SUCCESS_MEAN, headingRecord, listingRecords); + HeadingPreHti5.TASK_SUCCESS_MEAN, headingRecord, listingRecords); return values; } private List parseTaskSuccessStdDev(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_SUCCESS_STDDEV, headingRecord, listingRecords); + HeadingPreHti5.TASK_SUCCESS_STDDEV, headingRecord, listingRecords); return values; } private List parseTaskPathDeviationObserved(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_PATH_DEV_OBS, headingRecord, listingRecords); + HeadingPreHti5.TASK_PATH_DEV_OBS, headingRecord, listingRecords); return values; } private List parseTaskPathDeviationOptimal(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_PATH_DEV_OPT, headingRecord, listingRecords); + HeadingPreHti5.TASK_PATH_DEV_OPT, headingRecord, listingRecords); return values; } private List parseTaskTimeAvg(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_TIME_MEAN, headingRecord, listingRecords); + HeadingPreHti5.TASK_TIME_MEAN, headingRecord, listingRecords); return values; } private List parseTaskTimeStdDev(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_TIME_STDDEV, headingRecord, listingRecords); + HeadingPreHti5.TASK_TIME_STDDEV, headingRecord, listingRecords); return values; } private List parseTaskTimeDeviationObserved(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_TIME_DEV_OBS, headingRecord, listingRecords); + HeadingPreHti5.TASK_TIME_DEV_OBS, headingRecord, listingRecords); return values; } private List parseTaskTimeDeviationOptimal(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_TIME_DEV_OPT, headingRecord, listingRecords); + HeadingPreHti5.TASK_TIME_DEV_OPT, headingRecord, listingRecords); return values; } private List parseTaskErrorsAvg(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_ERRORS_MEAN, headingRecord, listingRecords); + HeadingPreHti5.TASK_ERRORS_MEAN, headingRecord, listingRecords); return values; } private List parseTaskErrorsStdDev(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_ERRORS_STDDEV, headingRecord, listingRecords); + HeadingPreHti5.TASK_ERRORS_STDDEV, headingRecord, listingRecords); return values; } private List parseTaskRatingScale(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_RATING_SCALE, headingRecord, listingRecords); + HeadingPreHti5.TASK_RATING_SCALE, headingRecord, listingRecords); return values; } private List parseTaskRating(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_RATING, headingRecord, listingRecords); + HeadingPreHti5.TASK_RATING, headingRecord, listingRecords); return values; } private List parseTaskRatingStdDev(CSVRecord headingRecord, List listingRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TASK_RATING_STDDEV, headingRecord, listingRecords); + HeadingPreHti5.TASK_RATING_STDDEV, headingRecord, listingRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestToolUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestToolUploadHandler.java index 7c5135cee0..0b5bf0b0b0 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestToolUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/TestToolUploadHandler.java @@ -14,8 +14,8 @@ import gov.healthit.chpl.testtool.CertificationResultTestTool; import gov.healthit.chpl.testtool.TestTool; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("testToolUploadHandler") public class TestToolUploadHandler { @@ -68,13 +68,13 @@ private CertificationResultTestTool buildTestTool(int index, List testTo private List parseTestToolNames(CSVRecord certHeadingRecord, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TEST_TOOL_NAME, certHeadingRecord, certResultRecords); + HeadingPostHti5.TEST_TOOL_NAME, certHeadingRecord, certResultRecords); return values; } private List parseTestToolVersions(CSVRecord certHeadingRecord, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.TEST_TOOL_VERSION, certHeadingRecord, certResultRecords); + HeadingPostHti5.TEST_TOOL_VERSION, certHeadingRecord, certResultRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/UcdProcessUploadHandler.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/UcdProcessUploadHandler.java index 029693f847..ebbe43c694 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/UcdProcessUploadHandler.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/handler/UcdProcessUploadHandler.java @@ -13,8 +13,8 @@ import org.springframework.stereotype.Component; import gov.healthit.chpl.domain.CertifiedProductUcdProcess; +import gov.healthit.chpl.upload.listing.HeadingPostHti5; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; @Component("ucdProcessUploadHandler") public class UcdProcessUploadHandler { @@ -65,13 +65,13 @@ private CertifiedProductUcdProcess buildUcdProcess(int index, List ucdNa private List parseUcdNames(CSVRecord certHeadingRecord, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.UCD_PROCESS, certHeadingRecord, certResultRecords); + HeadingPostHti5.UCD_PROCESS, certHeadingRecord, certResultRecords); return values; } private List parseUcdDetails(CSVRecord certHeadingRecord, List certResultRecords) { List values = uploadUtil.parseMultiRowField( - Heading.UCD_PROCESS_DETAILS, certHeadingRecord, certResultRecords); + HeadingPostHti5.UCD_PROCESS_DETAILS, certHeadingRecord, certResultRecords); return values; } } diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestParticipantReviewer.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestParticipantReviewer.java index 544e3e3b61..cd8188d827 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestParticipantReviewer.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestParticipantReviewer.java @@ -8,9 +8,11 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.sed.TestParticipant; import gov.healthit.chpl.sed.TestTask; @@ -21,14 +23,17 @@ public class TestParticipantReviewer { private static final String DEFAULT_PARTICIPANT_DECRIPTION = ""; private ErrorMessageUtil msgUtil; + private FF4j ff4j; @Autowired - public TestParticipantReviewer(ErrorMessageUtil msgUtil) { + public TestParticipantReviewer(ErrorMessageUtil msgUtil, + FF4j ff4j) { this.msgUtil = msgUtil; + this.ff4j = ff4j; } public void review(CertifiedProductSearchDetails listing) { - if (listing.getSed() == null || CollectionUtils.isEmpty(listing.getSed().getTestTasks())) { + if (ff4j.check(FeatureList.HTI_5_ERD) || listing.getSed() == null || CollectionUtils.isEmpty(listing.getSed().getTestTasks())) { return; } listing.getSed().getTestTasks().stream() diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestTaskReviewer.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestTaskReviewer.java index 488a1c04ca..b896b165fd 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestTaskReviewer.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestTaskReviewer.java @@ -11,10 +11,12 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.domain.CertificationResult; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; @@ -34,6 +36,7 @@ public class TestTaskReviewer { private CertificationResultRules certResultRules; private ValidationUtils validationUtils; private ErrorMessageUtil msgUtil; + private FF4j ff4j; private List testTaskCriteria = new ArrayList(); @Autowired @@ -41,10 +44,12 @@ public TestTaskReviewer(CertificationCriterionService criterionService, ValidationUtils validationUtils, CertificationResultRules certResultRules, @Value("${sedCriteria}") String testTaskCriteria, - ErrorMessageUtil msgUtil) { + ErrorMessageUtil msgUtil, + FF4j ff4j) { this.certResultRules = certResultRules; this.validationUtils = validationUtils; this.msgUtil = msgUtil; + this.ff4j = ff4j; this.testTaskCriteria = Arrays.asList(testTaskCriteria.split(",")).stream() .map(id -> criterionService.get(Long.parseLong(id))) @@ -52,9 +57,10 @@ public TestTaskReviewer(CertificationCriterionService criterionService, } public void review(CertifiedProductSearchDetails listing) { - if (listing.getSed() == null) { + if (ff4j.check(FeatureList.HTI_5_ERD) || listing.getSed() == null) { return; } + reviewAllTestTaskCriteriaAreAllowed(listing); reviewCertResultsHaveTestTasksIfRequired(listing); reviewTestTaskFields(listing); diff --git a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/UcdProcessReviewer.java b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/UcdProcessReviewer.java index 441af73353..b392b9e9cb 100644 --- a/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/UcdProcessReviewer.java +++ b/chpl/chpl-service/src/main/java/gov/healthit/chpl/upload/listing/validation/reviewer/UcdProcessReviewer.java @@ -10,10 +10,12 @@ import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Strings; +import org.ff4j.FF4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.domain.CertificationResult; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; @@ -31,6 +33,7 @@ public class UcdProcessReviewer implements Reviewer { private CertificationResultRules certResultRules; private ValidationUtils validationUtils; private ErrorMessageUtil msgUtil; + private FF4j ff4j; private List ucdProcessCriteria = new ArrayList(); @Autowired @@ -38,10 +41,12 @@ public UcdProcessReviewer(CertificationCriterionService criterionService, ValidationUtils validationUtils, CertificationResultRules certResultRules, ErrorMessageUtil msgUtil, + FF4j ff4j, @Value("${sedCriteria}") String ucdProcessCriteria) { this.certResultRules = certResultRules; this.validationUtils = validationUtils; this.msgUtil = msgUtil; + this.ff4j = ff4j; this.ucdProcessCriteria = Arrays.asList(ucdProcessCriteria.split(",")).stream() .map(id -> criterionService.get(Long.parseLong(id))) @@ -56,6 +61,9 @@ public void review(CertifiedProductSearchDetails listing) { removeUcdProcessesNotFound(listing); reviewAllUcdProcessCriteriaAreAllowed(listing); reviewCertResultsHaveUcdProcessesIfRequired(listing); + if (ff4j.check(FeatureList.HTI_5_ERD)) { + reviewOnlyOneUcdProcessFieldFilledIn(listing); + } addFuzzyMatchWarnings(listing); } @@ -126,6 +134,14 @@ private void reviewCertResultsHaveUcdProcessesIfRequired(CertifiedProductSearchD .forEach(certResult -> reviewCertResultHasUcdProcessIfRequired(listing, certResult)); } + private void reviewOnlyOneUcdProcessFieldFilledIn(CertifiedProductSearchDetails listing) { + List ucdProcessesWithBothFieldsFilledIn = listing.getSed().getUcdProcesses().stream() + .filter(ucd -> !StringUtils.isBlank(ucd.getName()) && !StringUtils.isBlank(ucd.getDetails())) + .collect(Collectors.toList()); + ucdProcessesWithBothFieldsFilledIn.stream() + .forEach(ucd -> listing.addBusinessErrorMessage(msgUtil.getMessage("listing.ucdProcess.bothFieldsPresent", ucd.getUserEnteredName()))); + } + private CertificationResult getCertificationResultForCriterion(CertifiedProductSearchDetails listing, CertificationCriterion criterionToReview) { Optional certResultToReviewOpt = listing.getCertificationResults().stream() .filter(certResult -> certResult.getCriterion().getId().equals(criterionToReview.getId())) diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvDataWriterTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvDataWriterTest.java index a9b3364635..3791aef696 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvDataWriterTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/certifiedproduct/csv/ListingCsvDataWriterTest.java @@ -8,11 +8,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriteriaManager; import gov.healthit.chpl.domain.CertificationStatus; import gov.healthit.chpl.domain.CertificationStatusEvent; @@ -32,8 +34,9 @@ public void setup() { CertificationCriteriaManager criteriaManager = Mockito.mock(CertificationCriteriaManager.class); StandardManager standardManager = Mockito.mock(StandardManager.class); Mockito.when(standardManager.getStandardsByCriteria(ArgumentMatchers.anyLong())).thenReturn(List.of()); - - writer = new ListingCsvDataWriter(criteriaManager, standardManager); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + writer = new ListingCsvDataWriter(criteriaManager, standardManager, ff4j); } @Test diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/manager/CertifiedProductManagerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/manager/CertifiedProductManagerTest.java index bfb439025a..e43e559ec7 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/manager/CertifiedProductManagerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/manager/CertifiedProductManagerTest.java @@ -11,6 +11,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; @@ -145,6 +146,7 @@ public void before() { Mockito.mock(TransactionalDeveloperBanHelper.class), Mockito.mock(ChplTeamNotifier.class), Mockito.mock(Environment.class), + Mockito.mock(FF4j.class), Mockito.mock(ChplHtmlEmailBuilder.class)); } diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/ListingUploadHandlerUtilTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/ListingUploadHandlerUtilTest.java index 2bb6bc304e..52c32f24ea 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/ListingUploadHandlerUtilTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/ListingUploadHandlerUtilTest.java @@ -17,16 +17,17 @@ import org.apache.commons.csv.CSVRecord; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.exception.EntityCreationException; import gov.healthit.chpl.exception.EntityRetrievalException; import gov.healthit.chpl.exception.InvalidArgumentsException; import gov.healthit.chpl.service.CertificationCriterionService; -import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil.Heading; import gov.healthit.chpl.util.ErrorMessageUtil; import jakarta.validation.ValidationException; @@ -49,13 +50,15 @@ public void setup() throws InvalidArgumentsException, EntityRetrievalException, EntityCreationException, IOException, FileNotFoundException { loadFile(); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); CertificationCriterionService criteriaService = Mockito.mock(CertificationCriterionService.class); Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_A_2__C", "CRITERIA_170_315_A_3__C", "CRITERIA_170_315_A_4__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C", "CRITERIA_170_315_D_11__C", "CRITERIA_170_315_D_12_Cures__C", "CRITERIA_170_315_B_3__C", "CRITERIA_170_314_B_5A__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); msgUtil = Mockito.mock(ErrorMessageUtil.class); @@ -768,7 +771,7 @@ public void getChplProductNumber_NoChplProductNumberHeading_ThrowsException() List listingRecords = ListingUploadTestUtil.getRecordsFromString(LISTING_ROW); Exception exception = assertThrows(ValidationException.class, () -> { - handlerUtil.parseRequiredSingleRowField(Heading.UNIQUE_ID, headingRecords.get(0), listingRecords); + handlerUtil.parseRequiredSingleRowField(HeadingPreHti5.UNIQUE_ID, headingRecords.get(0), listingRecords); }); assertNotNull(exception); } @@ -780,7 +783,7 @@ public void getChplProductNumber_EmptyData_ReturnsNullValue() assertNotNull(headingRecords); assertEquals(1, headingRecords.size()); String chplProductNumber = handlerUtil.parseRequiredSingleRowField( - Heading.UNIQUE_ID, headingRecords.get(0), new ArrayList()); + HeadingPreHti5.UNIQUE_ID, headingRecords.get(0), new ArrayList()); assertNull(chplProductNumber); } @@ -792,7 +795,7 @@ public void getChplProductNumber_EmptyStringData_ReturnsEmptyValue() assertEquals(1, headingRecords.size()); List listingRecords = ListingUploadTestUtil.getRecordsFromString(",,"); String chplProductNumber = handlerUtil.parseRequiredSingleRowField( - Heading.UNIQUE_ID, headingRecords.get(0), listingRecords); + HeadingPreHti5.UNIQUE_ID, headingRecords.get(0), listingRecords); assertNotNull(chplProductNumber); assertEquals("", chplProductNumber); } @@ -805,7 +808,7 @@ public void getChplProductNumber_MultiRowData_ReturnsCorrectValue() assertEquals(1, headingRecords.size()); List listingRecords = ListingUploadTestUtil.getRecordsFromString(LISTING_ROW); String chplProductNumber = handlerUtil.parseRequiredSingleRowField( - Heading.UNIQUE_ID, headingRecords.get(0), listingRecords); + HeadingPreHti5.UNIQUE_ID, headingRecords.get(0), listingRecords); assertNotNull(chplProductNumber); assertEquals("15.02.02.3007.A056.01.00.0.180214", chplProductNumber); } @@ -818,7 +821,7 @@ public void getChplProductNumber_ExtraSpacesData_ReturnsTrimmedValue() assertEquals(1, headingRecords.size()); List listingRecords = ListingUploadTestUtil.getRecordsFromString(" extra spaces ,new,dev"); String chplProductNumber = handlerUtil.parseRequiredSingleRowField( - Heading.UNIQUE_ID, headingRecords.get(0), listingRecords); + HeadingPreHti5.UNIQUE_ID, headingRecords.get(0), listingRecords); assertNotNull(chplProductNumber); assertEquals("extra spaces", chplProductNumber); } @@ -831,7 +834,7 @@ public void getChplProductNumber_ExtraSpacesHeaderAndData_ReturnsTrimmedValue() assertEquals(1, headingRecords.size()); List listingRecords = ListingUploadTestUtil.getRecordsFromString(" extra spaces ,new"); String chplProductNumber = handlerUtil.parseRequiredSingleRowField( - Heading.UNIQUE_ID, headingRecords.get(0), listingRecords); + HeadingPreHti5.UNIQUE_ID, headingRecords.get(0), listingRecords); assertNotNull(chplProductNumber); assertEquals("extra spaces", chplProductNumber); } @@ -844,7 +847,7 @@ public void getChplProductNumber_DuplicateHeaders_ReturnsFirstValue() assertEquals(1, headingRecords.size()); List listingRecords = ListingUploadTestUtil.getRecordsFromString("first,second,status"); String chplProductNumber = handlerUtil.parseRequiredSingleRowField( - Heading.UNIQUE_ID, headingRecords.get(0), listingRecords); + HeadingPreHti5.UNIQUE_ID, headingRecords.get(0), listingRecords); assertNotNull(chplProductNumber); assertEquals("first", chplProductNumber); } diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/ListingUploadManagerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/ListingUploadManagerTest.java index 33d47e1f4c..d4a0c38938 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/ListingUploadManagerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/ListingUploadManagerTest.java @@ -16,6 +16,7 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; @@ -24,6 +25,7 @@ import org.mockito.stubbing.Answer; import org.springframework.mock.web.MockMultipartFile; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certifiedproduct.service.CertificationResultUpToDateService; import gov.healthit.chpl.dao.CertificationBodyDAO; import gov.healthit.chpl.dao.auth.UserDAO; @@ -69,13 +71,16 @@ public void setup() throws InvalidArgumentsException, EntityRetrievalException, EntityCreationException, IOException, FileNotFoundException { loadFiles(); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + CertificationCriterionService criteriaService = Mockito.mock(CertificationCriterionService.class); Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_A_2__C", "CRITERIA_170_315_A_3__C", "CRITERIA_170_315_A_4__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C", "CRITERIA_170_315_D_11__C", "CRITERIA_170_315_D_12_Cures__C", "CRITERIA_170_315_B_3__C", "CRITERIA_170_314_B_5A__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); msgUtil = Mockito.mock(ErrorMessageUtil.class); acbDao = Mockito.mock(CertificationBodyDAO.class); @@ -102,7 +107,8 @@ public void setup() throws InvalidArgumentsException, certDateHandler, listingNormalizer, listingUploadValidator, - uploadUtil, chplProductNumberUtil, listingUploadDao, acbDao, + uploadUtil, uploadHeadingUtil, + chplProductNumberUtil, listingUploadDao, acbDao, Mockito.mock(UserDAO.class), listingConfirmationManager, Mockito.mock(SchedulerManager.class), diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/AccessibilityStandardsUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/AccessibilityStandardsUploadHandlerTest.java index d74ba364b5..45ae398ba8 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/AccessibilityStandardsUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/AccessibilityStandardsUploadHandlerTest.java @@ -1,17 +1,20 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.CertifiedProductAccessibilityStandard; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -32,7 +35,11 @@ public void setup() { CertificationCriterionService criteriaService = Mockito.mock(CertificationCriterionService.class); Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/AdditionalSoftwareUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/AdditionalSoftwareUploadHandlerTest.java index a2345d9440..22caacda5d 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/AdditionalSoftwareUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/AdditionalSoftwareUploadHandlerTest.java @@ -1,18 +1,21 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.CertificationResultAdditionalSoftware; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -31,7 +34,10 @@ public void setup() { CertificationCriterionService criteriaService = Mockito.mock(CertificationCriterionService.class); Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CertificationDateHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CertificationDateHandlerTest.java index 9835bf5d58..39ee29390a 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CertificationDateHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CertificationDateHandlerTest.java @@ -1,8 +1,8 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.time.LocalDate; import java.time.Month; @@ -10,10 +10,13 @@ import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; import gov.healthit.chpl.upload.listing.ListingUploadHeadingUtil; @@ -35,7 +38,10 @@ public void setup() { CertificationCriterionService criteriaService = Mockito.mock(CertificationCriterionService.class); Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); msgUtil = Mockito.mock(ErrorMessageUtil.class); handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CertificationResultUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CertificationResultUploadHandlerTest.java index 757202816e..d61b88db91 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CertificationResultUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CertificationResultUploadHandlerTest.java @@ -10,11 +10,13 @@ import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.CertificationResult; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.functionalitytested.CertificationResultFunctionalityTested; @@ -40,7 +42,11 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); msgUtil = Mockito.mock(ErrorMessageUtil.class); listing = CertifiedProductSearchDetails.builder() diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/ConformanceMethodUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/ConformanceMethodUploadHandlerTest.java index 1e2f68a5aa..62c64d6671 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/ConformanceMethodUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/ConformanceMethodUploadHandlerTest.java @@ -1,19 +1,22 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.conformanceMethod.domain.CertificationResultConformanceMethod; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -33,7 +36,11 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CqmUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CqmUploadHandlerTest.java index cef826e4c3..01310f9a3f 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CqmUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/CqmUploadHandlerTest.java @@ -1,19 +1,22 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Iterator; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.cqm.CQMResultCertification; import gov.healthit.chpl.cqm.CQMResultDetails; import gov.healthit.chpl.service.CertificationCriterionService; @@ -35,7 +38,11 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/DeveloperDetailsUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/DeveloperDetailsUploadHandlerTest.java index 7572b981dc..a1a7b1fae3 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/DeveloperDetailsUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/DeveloperDetailsUploadHandlerTest.java @@ -1,17 +1,20 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.Address; import gov.healthit.chpl.domain.Developer; import gov.healthit.chpl.domain.contact.PointOfContact; @@ -33,7 +36,11 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/IcsUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/IcsUploadHandlerTest.java index 52a113f807..e61ec75611 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/IcsUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/IcsUploadHandlerTest.java @@ -1,19 +1,22 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.InheritedCertificationStatus; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -34,7 +37,11 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/ListingDetailsUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/ListingDetailsUploadHandlerTest.java index 6593c3adbc..d62d59c530 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/ListingDetailsUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/ListingDetailsUploadHandlerTest.java @@ -14,11 +14,13 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.domain.CertifiedProductTestingLab; import gov.healthit.chpl.service.CertificationCriterionService; @@ -42,7 +44,11 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); msgUtil = Mockito.mock(ErrorMessageUtil.class); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/MeasuresUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/MeasuresUploadHandlerTest.java index 3e232aa457..b8735bec38 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/MeasuresUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/MeasuresUploadHandlerTest.java @@ -1,17 +1,20 @@ package gov.healthit.chpl.upload.listing.handler; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import java.util.Iterator; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.domain.ListingMeasure; import gov.healthit.chpl.service.CertificationCriterionService; @@ -32,7 +35,10 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/QmsUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/QmsUploadHandlerTest.java index 1a64316114..66b4bdb0ef 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/QmsUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/QmsUploadHandlerTest.java @@ -1,18 +1,21 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.CertifiedProductQmsStandard; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -32,7 +35,9 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/SedUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/SedUploadHandlerTest.java index 4a2c01338c..3ffbd6dcd6 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/SedUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/SedUploadHandlerTest.java @@ -1,8 +1,8 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.LocalDate; @@ -10,11 +10,13 @@ import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.sed.CertifiedProductSed; @@ -55,21 +57,24 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); CertificationCriterionUploadHandler criterionHandler = Mockito.mock(CertificationCriterionUploadHandler.class); Mockito.when(criterionHandler.handle(ArgumentMatchers.any())) .thenReturn(buildCriterion(1L, "170.315 (a)(1)", "a title")); - TestTaskUploadHandler testTaskHandler = new TestTaskUploadHandler(handlerUtil); - TestParticipantsUploadHandler participantHandler = new TestParticipantsUploadHandler(handlerUtil); + TestTaskUploadHandler testTaskHandler = new TestTaskUploadHandler(handlerUtil, ff4j); + TestParticipantsUploadHandler participantHandler = new TestParticipantsUploadHandler(handlerUtil, ff4j); UcdProcessUploadHandler ucdHandler = new UcdProcessUploadHandler(handlerUtil); handler = new SedUploadHandler(criterionHandler, testTaskHandler, participantHandler, ucdHandler, - handlerUtil); + handlerUtil, + ff4j); } @Test diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TargetedUsersUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TargetedUsersUploadHandlerTest.java index ddccc1695a..f3419e1482 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TargetedUsersUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TargetedUsersUploadHandlerTest.java @@ -1,17 +1,20 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.targeteduser.CertifiedProductTargetedUser; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -33,7 +36,9 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestParticipantUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestParticipantUploadHandlerTest.java index 37c655853e..96a48e27e5 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestParticipantUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestParticipantUploadHandlerTest.java @@ -1,18 +1,21 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.sed.TestParticipant; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -37,11 +40,13 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); - handler = new TestParticipantsUploadHandler(handlerUtil); + handler = new TestParticipantsUploadHandler(handlerUtil, ff4j); } @Test diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestTaskUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestTaskUploadHandlerTest.java index df4a802ba4..d067d90216 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestTaskUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestTaskUploadHandlerTest.java @@ -1,18 +1,21 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.sed.TestTask; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -44,11 +47,13 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); - handler = new TestTaskUploadHandler(handlerUtil); + handler = new TestTaskUploadHandler(handlerUtil, ff4j); } @Test diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestToolUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestToolUploadHandlerTest.java index d531f860d1..b2bed75890 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestToolUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/TestToolUploadHandlerTest.java @@ -1,8 +1,8 @@ package gov.healthit.chpl.upload.listing.handler; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -10,10 +10,13 @@ import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.testtool.CertificationResultTestTool; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -33,7 +36,9 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/UcdProcessUploadHandlerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/UcdProcessUploadHandlerTest.java index d5166e8f76..0658a7878d 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/UcdProcessUploadHandlerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/handler/UcdProcessUploadHandlerTest.java @@ -1,18 +1,21 @@ package gov.healthit.chpl.upload.listing.handler; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; import java.util.List; import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.CertifiedProductUcdProcess; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -31,7 +34,9 @@ public void setup() { Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C", "CRITERIA_170_315_D_4__C", "CRITERIA_170_315_D_4_Cures__C", "CRITERIA_170_315_B_3_Cures__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); ListingUploadHandlerUtil handlerUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, msgUtil); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/normalizer/DeveloperNormalizerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/normalizer/DeveloperNormalizerTest.java index 659ebf67e7..d5a9b7f4e5 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/normalizer/DeveloperNormalizerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/normalizer/DeveloperNormalizerTest.java @@ -1,17 +1,19 @@ package gov.healthit.chpl.upload.listing.normalizer; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.stream.Stream; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.dao.DeveloperDAO; import gov.healthit.chpl.domain.Address; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; @@ -33,7 +35,9 @@ public void setup() { CertificationCriterionService criteriaService = Mockito.mock(CertificationCriterionService.class); Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); developerDao = Mockito.mock(DeveloperDAO.class); ErrorMessageUtil msgUtil = Mockito.mock(ErrorMessageUtil.class); diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/CsvHeaderReviewerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/CsvHeaderReviewerTest.java index fab043bb29..2127a99933 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/CsvHeaderReviewerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/CsvHeaderReviewerTest.java @@ -7,11 +7,13 @@ import java.util.stream.Stream; import org.apache.commons.csv.CSVRecord; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.domain.ListingUpload; import gov.healthit.chpl.service.CertificationCriterionService; @@ -34,7 +36,9 @@ public void setup() { criteriaService = Mockito.mock(CertificationCriterionService.class); Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_8__C", "CRITERIA_170_315_A_8_C", "CRITERIA_170_315_A_9__C", "CRITERIA_170_315_A_1__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); errorMessageUtil = Mockito.mock(ErrorMessageUtil.class); Mockito.when(errorMessageUtil.getMessage(ArgumentMatchers.eq("listing.upload.unrecognizedHeading"), ArgumentMatchers.anyString())) diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/DeveloperReviewerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/DeveloperReviewerTest.java index de7f44c286..509a479065 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/DeveloperReviewerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/DeveloperReviewerTest.java @@ -1,16 +1,18 @@ package gov.healthit.chpl.upload.listing.validation.reviewer; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.LocalDate; import java.util.stream.Stream; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.Address; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.domain.Developer; @@ -53,7 +55,9 @@ public void setup() { CertificationCriterionService criteriaService = Mockito.mock(CertificationCriterionService.class); Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); errorMessageUtil = Mockito.mock(ErrorMessageUtil.class); Mockito.when(errorMessageUtil.getMessage(ArgumentMatchers.eq("listing.developer.userAndSystemMismatch"), ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString())) diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestParticipantReviewerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestParticipantReviewerTest.java index cc91abe23e..91d33bc33f 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestParticipantReviewerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestParticipantReviewerTest.java @@ -1,7 +1,7 @@ package gov.healthit.chpl.upload.listing.validation.reviewer; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.LocalDate; import java.util.LinkedHashSet; @@ -9,11 +9,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.sed.AgeRange; @@ -35,6 +37,9 @@ public class TestParticipantReviewerTest { @SuppressWarnings("checkstyle:magicnumber") public void setup() { errorMessageUtil = Mockito.mock(ErrorMessageUtil.class); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + Mockito.when(errorMessageUtil.getMessage(ArgumentMatchers.eq("listing.criteria.roundedParticipantNumber"), ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString())) .thenAnswer(i -> String.format(TEST_PARTICIPANT_FIELD_ROUNDED, i.getArgument(1), i.getArgument(2), i.getArgument(3), i.getArgument(4))); @@ -58,7 +63,7 @@ public void setup() { .certificationEdition("2015") .build(); - reviewer = new TestParticipantReviewer(errorMessageUtil); + reviewer = new TestParticipantReviewer(errorMessageUtil, ff4j); } @Test diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestTaskReviewerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestTaskReviewerTest.java index 25dc356e0c..c74f754c32 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestTaskReviewerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/TestTaskReviewerTest.java @@ -1,7 +1,7 @@ package gov.healthit.chpl.upload.listing.validation.reviewer; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.LocalDate; import java.util.ArrayList; @@ -10,11 +10,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.domain.CertificationResult; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; @@ -43,6 +45,9 @@ public class TestTaskReviewerTest { @SuppressWarnings("checkstyle:magicnumber") public void setup() { errorMessageUtil = Mockito.mock(ErrorMessageUtil.class); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + Mockito.when(errorMessageUtil.getMessage(ArgumentMatchers.eq("listing.criteria.testTasksNotApplicable"), ArgumentMatchers.anyString())) .thenAnswer(i -> String.format(TEST_TASK_NOT_APPLICABLE, i.getArgument(1), "")); @@ -113,7 +118,7 @@ public void setup() { .thenReturn(true); reviewer = new TestTaskReviewer(criteriaService, new ValidationUtils(), certResultRules, "1,2", - errorMessageUtil); + errorMessageUtil, ff4j); } @Test diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/UcdProcessReviewerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/UcdProcessReviewerTest.java index 2bc159ecd0..786136a292 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/UcdProcessReviewerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/upload/listing/validation/reviewer/UcdProcessReviewerTest.java @@ -1,18 +1,20 @@ package gov.healthit.chpl.upload.listing.validation.reviewer; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.LocalDate; import java.util.LinkedHashSet; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.certificationCriteria.CertificationCriterion; import gov.healthit.chpl.domain.CertificationResult; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; @@ -29,10 +31,12 @@ public class UcdProcessReviewerTest { private static final String UCD_NOT_FOUND_AND_REMOVED = "UCD Process '%s' referenced by criteria %s was not found and has been removed."; private static final String MISSING_UCD_PROCESS = "Certification %s requires at least one UCD process."; private static final String FUZZY_MATCH_REPLACEMENT = "The %s value was changed from %s to %s."; + private static final String UCD_BOTH_FIELDS = "Either the UCD Process Name or UCD Process Details must be filled in, but not both for UCD Process %s."; private CertificationResultRules certResultRules; private CertificationCriterionService criteriaService; private ErrorMessageUtil errorMessageUtil; + private FF4j ff4j; private CertificationCriterion a1, a2, a3, a6; private UcdProcessReviewer reviewer; @@ -40,6 +44,9 @@ public class UcdProcessReviewerTest { @SuppressWarnings("checkstyle:magicnumber") public void setup() { errorMessageUtil = Mockito.mock(ErrorMessageUtil.class); + ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + Mockito.when(errorMessageUtil.getMessage(ArgumentMatchers.eq("listing.criteria.ucdProcessNotApplicable"), ArgumentMatchers.anyString())) .thenAnswer(i -> String.format(UCD_NOT_APPLICABLE, i.getArgument(1), "")); @@ -52,6 +59,9 @@ public void setup() { Mockito.when(errorMessageUtil.getMessage(ArgumentMatchers.eq("listing.fuzzyMatch"), ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString())) .thenAnswer(i -> String.format(FUZZY_MATCH_REPLACEMENT, i.getArgument(1), i.getArgument(2), i.getArgument(3))); + Mockito.when(errorMessageUtil.getMessage(ArgumentMatchers.eq("listing.ucdProcess.bothFieldsPresent"), + ArgumentMatchers.anyString())) + .thenAnswer(i -> String.format(UCD_BOTH_FIELDS, i.getArgument(1), "")); criteriaService = Mockito.mock(CertificationCriterionService.class); a1 = CertificationCriterion.builder() @@ -98,7 +108,7 @@ public void setup() { Mockito.when(certResultRules.hasCertOption(ArgumentMatchers.eq(a6.getId()), ArgumentMatchers.eq(CertificationResultRules.SED))) .thenReturn(false); - reviewer = new UcdProcessReviewer(criteriaService, new ValidationUtils(), certResultRules, errorMessageUtil, "1,2"); + reviewer = new UcdProcessReviewer(criteriaService, new ValidationUtils(), certResultRules, errorMessageUtil, ff4j, "1,2"); } @Test @@ -480,6 +490,47 @@ public void review_ucdProcessesValid_noError() { assertEquals(0, listing.getErrorMessages().size()); } + @Test + public void review_ucdProcessesBothFieldsFilledInPostHti5_hasError() { + Mockito.when(ff4j.check(FeatureList.HTI_5_ERD)).thenReturn(true); + CertifiedProductSearchDetails listing = CertifiedProductSearchDetails.builder() + .certificationResult(CertificationResult.builder() + .success(true) + .criterion(a1) + .sed(true) + .build()) + .certificationResult(CertificationResult.builder() + .success(true) + .criterion(a2) + .sed(true) + .build()) + .certificationResult(CertificationResult.builder() + .success(true) + .criterion(a3) + .sed(false) + .build()) + .sed(CertifiedProductSed.builder().build()) + .build(); + listing.getSed().getUcdProcesses().add(CertifiedProductUcdProcess.builder() + .id(1L) + .criteria(Stream.of(a1, a2).collect(Collectors.toCollection(LinkedHashSet::new))) + .name("UCD Name 1") + .details("some details") + .userEnteredName("UCD Name 1") + .build()); + listing.getSed().getUcdProcesses().add(CertifiedProductUcdProcess.builder() + .id(2L) + .criteria(Stream.of(a2).collect(Collectors.toCollection(LinkedHashSet::new))) + .name("UCD Name 2") + .details(null) + .build()); + reviewer.review(listing); + + assertEquals(0, listing.getWarningMessages().size()); + assertEquals(1, listing.getErrorMessages().size()); + assertTrue(listing.getErrorMessages().contains(String.format(UCD_BOTH_FIELDS, "UCD Name 1"))); + } + @Test public void review_hasIdAndUcdProcessNameDifferentThanUserEnteredName_hasFuzzyMatchWarning() { CertifiedProductSearchDetails listing = CertifiedProductSearchDetails.builder() diff --git a/chpl/chpl-service/src/test/java/gov/healthit/chpl/validation/listing/reviewer/CertificationDateReviewerTest.java b/chpl/chpl-service/src/test/java/gov/healthit/chpl/validation/listing/reviewer/CertificationDateReviewerTest.java index c6915e011c..b0cc4d93bf 100644 --- a/chpl/chpl-service/src/test/java/gov/healthit/chpl/validation/listing/reviewer/CertificationDateReviewerTest.java +++ b/chpl/chpl-service/src/test/java/gov/healthit/chpl/validation/listing/reviewer/CertificationDateReviewerTest.java @@ -1,17 +1,19 @@ package gov.healthit.chpl.validation.listing.reviewer; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.text.ParseException; import java.util.Calendar; import java.util.stream.Stream; +import org.ff4j.FF4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; +import gov.healthit.chpl.FeatureList; import gov.healthit.chpl.domain.CertifiedProductSearchDetails; import gov.healthit.chpl.service.CertificationCriterionService; import gov.healthit.chpl.upload.listing.ListingUploadHandlerUtil; @@ -32,7 +34,9 @@ public void setup() { CertificationCriterionService criteriaService = Mockito.mock(CertificationCriterionService.class); Mockito.when(criteriaService.getAllowedCriterionHeadingsForNewListing()) .thenReturn(Stream.of("CRITERIA_170_315_A_1__C").toList()); - ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService); + FF4j ff4j = Mockito.mock(FF4j.class); + Mockito.when(ff4j.check(ArgumentMatchers.eq(FeatureList.HTI_5_ERD))).thenReturn(false); + ListingUploadHeadingUtil uploadHeadingUtil = new ListingUploadHeadingUtil(criteriaService, ff4j); errorMessageUtil = Mockito.mock(ErrorMessageUtil.class); uploadUtil = new ListingUploadHandlerUtil(uploadHeadingUtil, errorMessageUtil);